Simple Anti Gate – простой класс антикапчи для C#

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time
21 Окт 2015
299
102
Последнее время пишу на C#, для всяких парсеров/постеров использую удобный фреймворк Viking.Engine, который позволяет легко работать с HTTP-протоколом и многопоточностью. Но, к сожалению, в этом модуле частенько встречаются баги, то глобальные куки не работаю, то рандомизатор текста, а код библиотеки закрытый.
Так вот, там есть функция распознавания капчи через сервис AntiGate.com, но она не обрабатывает ошибку антикапчи ERROR_CAPTCHA_UNSOLVABLE (капчу не смогли разгадать 5 разных работников), в связи с чем бывают случаи, когда модуль перестает реагировать на внешние раздражители (зацикливается).
В поисках решения я находил в сети много разных вариантов, но все они слишком навороченные и идут в виде отдельных библиотек, а я бы не хотел перегружать проект лишними файлами, тем более для такого простого функционала.
Поэтому решил написать простой, маленький класс для работы с AntiGate.com. Функционал такой же, как в модуле для антикапчи на Дельфи
Для работы этого класса достаточно добавить в Ваш проект файл SimpleAntiGate.cs и подключить:
Код:
using SimpleAntiGate;
Модуль может распознавать капчу из файла, по ссылке, из массива байт (byte[]), из потока (Stream) и из объекта типа Image.
Описание функций:
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");
Для работы с HTTP-протоколом используется класс WebClient
Основная функция распознавания в классе, которая делает за Вас всю работу
Код:
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
 
  • Лайк
Reactions: ZiEND

О нас

  • Наше сообщество существует уже много лет и гордится тем, что предлагает непредвзятое, критическое обсуждение различных тем среди людей разных слоев общества. Мы работаем каждый день, чтобы убедиться, что наше сообщество является одним из лучших.

    Dark-Time 2015 - 2022

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя