На этой странице будут рассмотрены примеры использования библиотеки Antigate.NET на примере языка программирования C# для решения капчи с использованием сервиса antigate.com.
Все входящие параметры функций всех классов библиотеки проверяются на соответствие ожидаемым данным и в случае обнаружения ошибки выбрасывается System.ArgumentException исключение с соответствующим сообщением.
Рассмотрим процесс простой отправки изображения капчи на сервер Antigate и получение ответа:
try
{
AntiCaptcha anticap = new AntiCaptcha("СЕКРЕТНЫЙ_КЛЮЧ");
// Отправляем изображение captcha.png и ждем решения капчи
string answer = anticap.GetAnswer("./captcha.png");
if(answer != null)
Console.WriteLine("Ответ: {0}", answer);
}
catch (AntigateErrorException aee)
{
// Antigate ответил одной из документированных в API ошибкой
Console.WriteLine("Ошибка Antigate: {0}", aee.Message);
}
catch (Exception e) {} // исключение иного рода
Программный код выше загрузит изображение captcha.png в каталоге с программой на сервер antigate для его решения, дождется выполнения процесса и выведет результат (или ошибку) в консоль.
Создавая объект класса AntiCaptcha обязательным параметром конструктора является ваш секретный ключ в система antigate:
AntiCaptcha anticap = new AntiCaptcha("СЕКРЕТНЫЙ_КЛЮЧ");
Именно этот ключ будет использоваться для последующей загрузки капч.
Для удобства работы класс AntiCaptcha имеет дополнительные настройки для таймаутов и повторных попыток подключения к серверам antigate.
anticap.CheckDelay = 10000; // Задержка проверки готовности капчи. Стандартно: 15000. (15 сек.) anticap.CheckRetryCount = 20; // Кол-во попыток проверки готовности капчи. Стандартно: 30 anticap.SlotRetry = 5; // Кол-во попыток получения нового слота. Стандартно: 3 anticap.SlotRetryDelay = 800; // Задержка повторной попытки получения слота на Antigate. Стандартно: 1000Все задержки указываются в миллисекундах, включены по умолчанию и имеют свои стандартные значения.
Сервис antigate.com поддерживает обработку дополнительных (опциональных) параметров при загрузке капчи. Работа с ними в Antigate.NET реализована следующим образом:
anticap.Parameters.Set("min_len", "2"); // минимальная длина текста на капче
anticap.Parameters.Set("max_len", "10"); // максимальная длина текста на капче
anticap.Parameters.Set("is_russian", "1"); // показать капчу русского работнику
Список поддерживаемых параметров расположен тут: http://antigate.com/panel.php?action=api
Отправка капчи поддерживает несколько режимов работы. В примере выше мы использовали путь к файлу изображения для его отправки:
string answer = anticap.GetAnswer("./captcha.png");
Всего существует 3 режима работы:
public string GetAnswer(byte[] ImageData); // изображение в виде массива данных public string GetAnswer(Image Img); // изображение в виде объекта Image public string GetAnswer(string ImageFilePath); // путь к файлу на диске
Оповещения antigate о не верно разгаданной капче осуществляется вызовом функции AntiCaptcha.FalseCaptcha() следующим образом:
AntiCaptcha anticap = new AntiCaptcha("СЕКРЕТНЫЙ_КЛЮЧ");
...
// загрузка капчи и её проверка
...
if(captchaIsFalse)
anticap.FalseCaptcha();
Осуществляется лишь одна попытка выполнения запроса. В случае неудачи - будет выброшено System.Net.WebException исключение.
В ходе тестов могут возникнуть различные ошибки, начинающиеся на ERROR (см. тут). Это означает что ваша капча не принята.
Обрабатываются они следующим образом: В случае возникновения ошибки функция выбрасывает исключение Akumu.Antigate.AntigateErrorException с пояснительным сообщением.
Суммируя всё выше-перечисленное напишем программный код, использующий большинство возможностей библиотеки:
AntiCaptcha anticap = new AntiCaptcha(apiKey.Text);
// пользовательские настройки
anticap.CheckDelay = 10000;
anticap.CheckRetryCount = 20;
anticap.SlotRetry = 5;
anticap.SlotRetryDelay = 800;
// доп. параметры капчи
anticap.Parameters.Set("min_len", "2");
anticap.Parameters.Set("max_len", "10");
if(isRusCaptcha)
anticap.Parameters.Set("is_russian", "1");
try
{
// отправляем файл и ждем ответа
string answer = anticap.GetAnswer("./captcha.png");
if (answer != null)
Console.WriteLine("Ответ: {0}", answer);
else
Console.WriteLine("Ответ не получен.");
if(!answer.Equals("abcdef")) // пример
anticap.FalseCaptcha();
}
catch (AntigateErrorException aee)
{
Console.WriteLine("Ошибка antigate: {0}", aee.Message);
}
catch (Exception e)
{
Console.WriteLine("Ошибка: {0}", e.Message);
}
Статический класс: Akumu.Antigate.Tools.ReCaptcha
Доступные функции:
// Функция возвращает string массив с ссылками на JS скрипты всех капч на странице. // Контент этих страниц можно передавать функции ReCaptcha.GetObject(string) public static string[] GetObjectsUrlsOnPage(string PageContent) // Функция возвращает объект ReCaptchaObject, содержащий в себе URL изображения капчи // и recaptcha_challenge_field. public static ReCaptchaObject GetObject(string ScriptPage)
Пример использования:
using (WebClient client = new WebClient())
{
// загружаем страницу содержащую ReCaptcha
string page = client.DownloadString("http://www.google.com/recaptcha/demo/");
try
{
// массив ссылок на js капч
string[] js = ReCaptcha.GetObjectsUrlsOnPage(page);
if (js == null)
Console.WriteLine("ReCaptcha не обнаружена на указанной странице");
else
{
// работаем с первым js на странице
ReCaptchaObject rco = ReCaptcha.GetObject(client.DownloadString(js[0]));
if (rco == null)
Console.WriteLine("ReCaptcha на странице содержит ошибку");
else
{
Console.WriteLine("URL капчи: {0}", rco.ImageURL);
Console.WriteLine("Challenge: {0}", rco.Challenge);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Ошибка: {0}", ex.Message);
}
}