Каратель12
Юзер
Каратель12
Юзер
- 21 Окт 2015
- 299
- 102
Последнее время пишу на C#, для всяких парсеров/постеров использую удобный фреймворк Viking.Engine, который позволяет легко работать с HTTP-протоколом и многопоточностью. Но, к сожалению, в этом модуле частенько встречаются баги, то глобальные куки не работаю, то рандомизатор текста, а код библиотеки закрытый.
Так вот, там есть функция распознавания капчи через сервис AntiGate.com, но она не обрабатывает ошибку антикапчи ERROR_CAPTCHA_UNSOLVABLE (капчу не смогли разгадать 5 разных работников), в связи с чем бывают случаи, когда модуль перестает реагировать на внешние раздражители (зацикливается).
В поисках решения я находил в сети много разных вариантов, но все они слишком навороченные и идут в виде отдельных библиотек, а я бы не хотел перегружать проект лишними файлами, тем более для такого простого функционала.
Поэтому решил написать простой, маленький класс для работы с AntiGate.com. Функционал такой же, как в модуле для антикапчи на Дельфи
Для работы этого класса достаточно добавить в Ваш проект файл SimpleAntiGate.cs и подключить:
Модуль может распознавать капчу из файла, по ссылке, из массива байт (byte[]), из потока (Stream) и из объекта типа Image.
Описание функций:
Recognize – основная функция распознавания.
GetBalance – выводит текущий баланс на сервисе AntiGate.com
ReportBad – отправляет жалобу о неверно распознанной капче на сервис AntiGate.com
Пример использования:
Так же в функции распознавания можно использовать дополнительные настройки такие как:
Например
Для работы с HTTP-протоколом используется класс WebClient
Основная функция распознавания в классе, которая делает за Вас всю работу
В архиве с классом прилагаются примеры его использования
ВТ не нужно ехе файлы удалил все
Автор темы: Geograph
Так вот, там есть функция распознавания капчи через сервис AntiGate.com, но она не обрабатывает ошибку антикапчи ERROR_CAPTCHA_UNSOLVABLE (капчу не смогли разгадать 5 разных работников), в связи с чем бывают случаи, когда модуль перестает реагировать на внешние раздражители (зацикливается).
В поисках решения я находил в сети много разных вариантов, но все они слишком навороченные и идут в виде отдельных библиотек, а я бы не хотел перегружать проект лишними файлами, тем более для такого простого функционала.
Поэтому решил написать простой, маленький класс для работы с AntiGate.com. Функционал такой же, как в модуле для антикапчи на Дельфи
Для работы этого класса достаточно добавить в Ваш проект файл SimpleAntiGate.cs и подключить:
Код:
using SimpleAntiGate;
Описание функций:
Recognize – основная функция распознавания.
GetBalance – выводит текущий баланс на сервисе AntiGate.com
ReportBad – отправляет жалобу о неверно распознанной капче на сервис AntiGate.com
Пример использования:
Код:
// Объект класса создавать не нужно, все функции статичные
AntiGate.AntiGateKey = "c54fa68f4d5s6df245s4d5c1a4s5d8f4"; // Ключ достаточно указать один раз, но при необходимости его можно указать и в самой функции
AntiGate.AntiGateServer = "antigate.com"; // Можно изменить домен сервиса, если планируется использовать не AntiGate
string myBalance = AntiGate.GetBalance(); // Получить баланс
string captchaAnswer = AntiGate.Recognize("http://upload.wikimedia.org/wikipedia/commons/6/69/Captcha.jpg"); // Распознавание по ссылке
string captchaAnswer2 = AntiGate.Recognize("captcha.jpg"); // Распознавание из файла
// LastCaptchaId - содержит номер последней разгаданной капчи
string result = AntiGate.ReportBad(AntiGate.LastCaptchaId); // Жалоба на неправильно разгаданную капчу
Код:
minLen - Минимальная длина текста
maxLen - Максимальная длина текста
isNumeric - Капча состоит только из цифр
isPhrase - Капча состоит из нескольких слов
isRegSense - Капча чувствительна к регистру букв
isCalc - Цифры на капче нужно сосчитать
isRussian - В капчи присутствует только русский текст
Код:
// Ключ антикапчи указываем прямо в функции
// Параметр isRussian - капча содержит только русские буквы
string captchaResult = AntiGate.Recognize("captcha.jpg", isRussian:true, antiGateKey: "c54fa68f4d5s6df245s4d5c1a4s5d8f4");
Основная функция распознавания в классе, которая делает за Вас всю работу
Код:
public static string Recognize(byte[] imageData, int minLen = 0, int maxLen = 0, bool isNumeric = false, bool isPhrase = false, bool isRegSense = false, bool isCalc = false, bool isRussian = false, string antiGateKey = null)
{
antiGateKey = antiGateKey ?? AntiGateKey;
var postValues = new NameValueCollection
{
{ "key", antiGateKey },
{ "method", "base64" },
{ "soft_id", "597" },
{ "body", Convert.ToBase64String(imageData) },
};
if (minLen > 0) postValues.Add("min_len", minLen.ToString());
if (maxLen > 0) postValues.Add("max_len", maxLen.ToString());
if (isNumeric) postValues.Add("numeric", "1");
if (isPhrase) postValues.Add("phrase", "1");
if (isRegSense) postValues.Add("regsense", "1");
if (isCalc) postValues.Add("calc", "1");
if (isRussian) postValues.Add("is_russian", "1");
var result = "";
using (var webClient = new WebClient())
{
for (var i = 0; i < TryCount; i++)
{
result = Encoding.UTF8.GetString(webClient.UploadValues("http://" + AntiGateServer + "/in.php", postValues));
if (result.Contains("OK|")) break;
if (result.Contains("ERROR_NO_SLOT_AVAILABLE"))
{
Thread.Sleep(WaitMillisecBeforeRequest);
continue;
}
if (result.Contains("ERROR_")) return result;
if (!result.Contains("OK|")) return "UNKNOWN_ERROR: " + result;
}
if (result.Contains("ERROR_")) return result;
var captchaId = result.Replace("OK|", "").Trim();
LastCaptchaId = captchaId;
for (var i = 0; i < TryCount; i++)
{
Thread.Sleep(WaitMillisecBeforeRequest);
result = webClient.DownloadString(string.Format("http://{0}/res.php?key={1}&action=get&id={2}", AntiGateServer, antiGateKey, captchaId));
if (result.Contains("ERROR_NO_SLOT_AVAILABLE")) continue;
if (result.Contains("ERROR_")) return result;
if (result.Contains("OK|")) return result.Replace("OK|", "").Trim();
}
}
return result;
}
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
ВТ не нужно ехе файлы удалил все
Автор темы: Geograph