Home > Інше > клас для роботи з антикапчею на C#

клас для роботи з антикапчею на C#

готовий, зручний клас для роботи з антикапчою на шарпі.. клас і опис під катом =)
доречі, вітаю прекрасну половину людства з 8м березням )
http://cs9724.vkontakte.ru/u9781421/37948367/x_09c0b47a.jpg

змінні:
    public bool debug = false;
        режим дебагу: якшо активний - "клас" буде вас сповіщати про всі свої дії )
    public string host = "antigate.com";
        хост сервісу
    public string key;
        ваш ключ
    public string proxy = "";
    public string proxy_username = "";
    public string proxy_password = "";
        проксі з можливістю авторизації по логін\пароль

    public int phrase = 0;
        якшо в капчі 2-4 слова, ставте 1
    public int regsense = 0;
        якшо текст капчи чутливий до регістру, ставте 1
    public int numeric = 0;
        якшо капча складається тільки з чисел, ставимо 1, если на капче немає чисел = 2
    public int calc = 0;
        якшо числа на капчі повинні бути сплюсовані, ставимо 1
    public int min_len = 0;
        мінімальна довжина капчі
    public int max_len = 0;
        максимальна довжина капчі

функции:
    public string rec(string filename)
        відправка капчі , і отримання результату
    public string get_balance()
        отримуємо баланс на антикапчі
    public string get_balance(string key)
        отримуємо баланс на антикапчі для любого ключа
    public bool reportbad(string cap_id)
        відправка абузи на капчу з ID = cap_id , якшо вона розпізналася невірно

гарний код: http://paste.ly/Jq

зразу вибачаюсь на “оформення коду”.. винен вордпрес.. )
і все ж таки, ось він:

/*
 * AntiCaptcha class 
 * itspoma(c) v0.1
 * 08.03.2010
 * icq 144463
 */

class anticaptcha
{
    public bool debug = false;
    public string host = "antigate.com";
    public string key;
    public string proxy = "";
    public string proxy_username = "";
    public string proxy_password = "";

    public int phrase = 0;    // у капчи 2-4 слова = 1
    public int regsense = 0;  // текст капчи чувствителен к регистру = 1
    public int numeric = 0;   // капча состоит только с цифр = 1,
                              // на капче нет цифр = 2
    public int calc = 0;      // цифры на капче должны быть сплюсованы = 1
    public int min_len = 0;   // минимальная длину текста капчи
    public int max_len = 0;   // максимальная длина текста капчи

    private string proxy_host = "";
    private int proxy_port;
    private string result_headers;
    private string result_page;
    private HttpWebRequest ua;
    private string last_cap_id;

    public string rec(string filename)
    {
        ua = browser("http://" + host + "/in.php");
        ua.Method = "POST";

        string ext = "pjpeg";
        try
        {
            ext = new Regex(@"^.+?\.(\w+)$").Match(filename).Groups[1].Value;
        }
        catch
        {}

        string sBoundary = DateTime.Now.Ticks.ToString("x");
        ua.ContentType = "multipart/form-data; boundary=" + sBoundary;
        string sPostMultiString = "";
        sPostMultiString += MultiFormData("method""post", sBoundary);
        sPostMultiString += MultiFormData("key"this.key, sBoundary);
        sPostMultiString += MultiFormData("soft_id""65", sBoundary);
        sPostMultiString += MultiFormData("file", filename, sBoundary);
        sPostMultiString += MultiFormData("phrase", Convert.ToString(phrase), sBoundary);
        sPostMultiString += MultiFormData("regsense", Convert.ToString(regsense), sBoundary);
        sPostMultiString += MultiFormData("numeric", Convert.ToString(numeric), sBoundary);
        sPostMultiString += MultiFormData("calc", Convert.ToString(calc), sBoundary);
        sPostMultiString += MultiFormData("min_len", Convert.ToString(min_len), sBoundary);
        sPostMultiString += MultiFormData("max_len", Convert.ToString(max_len), sBoundary);

        string sFileContent = "";
        using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open), Encoding.Default))
        {
            byte[] ba = new byte[32768];
            int pos = 0;
            byte b;
            while (true)
            {
                try
                { b = br.ReadByte(); }
                catch (EndOfStreamException ex)
                {
                    break;
                }
                ba[pos] = b;
                pos++;
            }
            byte[] ba2 = new byte[pos];
            for (int k = 0; k < pos; k++)
            {
                ba2[k] = ba[k];
            }
            sFileContent = Encoding.Default.GetString(ba2);
        }

        sPostMultiString += MultiFormDataFile("file", sFileContent, filename, "image/" + ext, sBoundary);
        sPostMultiString += "--" + sBoundary + "--\r\n\r\n";
        byte[] byteArray = Encoding.Default.GetBytes(sPostMultiString);
        ua.ContentLength = byteArray.Length;
        ua.GetRequestStream().Write(byteArray, 0, byteArray.Length);

        try
        {
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)ua.GetResponse();
            StreamReader myStreamReadermy = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));
            result_page = myStreamReadermy.ReadToEnd();
            //result_headers = myHttpWebResponse.Headers.ToString();

            string[] result = result_page.Split(new char[1] { '|' });
            last_cap_id = result[1];
            dbg("req " + last_cap_id + ": uploaded!");
            while (1 == 1)
            {
                string captcha = get(last_cap_id);
                if (captcha == "")
                {
                    Thread.Sleep(2000);
                }
                else
                {
                    return captcha;
                }
            }
        }
        catch (WebException ex)
        {
            //Console.WriteLine(ex);
            return "";
        }
    }
    public string get(string cap_id)
    {
        if (this.req("http://" + host + "/res.php?key=" + key + "&action=get&id=" + cap_id + "&"))
        {
            dbg("get " + cap_id + " : " + result_page);
            try
            {
                string[] result = result_page.Split(new char[1] { '|' });
                dbg("recorgenized " + cap_id + " : " + result[1]);
                return result[1];
            }
            catch
            {
                return "";
            }
        }
        return "";
    }
    public string get_balance()
    {
        string key = this.key;
        return get_balance(key);
    }
    public string get_balance(string key)
    {
        if (this.req("http://" + host + "/res.php?key=" + key + "&action=getbalance"))
        {
            dbg("get_balance: " + result_page);
            return result_page;
        }
        return "-1";
    }
    public bool reportbad()
    {
        return reportbad(last_cap_id);
    }
    public bool reportbad(string cap_id)
    {
        if (this.req("http://" + host + "/res.php?key=" + key + "&action=reportbad&id=" + cap_id))
        {
            dbg("reportbad " + cap_id + ": " + result_page);
            if (result_page.IndexOf("ERROR") >= 0)
            {
                return false;
            }
            return true;
        }
        return false;
    }
    public void dbg(string s)
    {
        if (this.debug == true)
        {
            Console.WriteLine("AC: " + s);
        }
    }
    private bool req(string url)
    {
        ua = browser(url);
        ua.Method = "GET";
        ua.KeepAlive = true;
        try
        {
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)ua.GetResponse();
            StreamReader myStreamReadermy = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));
            result_page = myStreamReadermy.ReadToEnd();
            result_headers = myHttpWebResponse.Headers.ToString();
            return true;
        }
        catch (WebException ex)
        {
            //Console.WriteLine(ex);
            return false;
        }
    }
    private HttpWebRequest browser(string url)
    {
        HttpWebRequest ua = (HttpWebRequest)System.Net.WebRequest.Create(url);
        if (use_proxy())
        {
            WebProxy myProxy = new WebProxy(proxy_host, proxy_port);
            myProxy.Credentials = new NetworkCredential(proxy_username, proxy_password);
            ua.Proxy = myProxy;
        }
        ua.AllowAutoRedirect = true;
        ua.Timeout = 10000;
        ua.UserAgent = "C# Anticaptcha Class (elw)";
        ua.Accept = "*/*";
        return ua;
    }
    private bool use_proxy()
    {
        if (String.IsNullOrEmpty(proxy))
        {
            return false;
        }
        string[] aProxy = proxy.Split(new char[1] { ':' });
        proxy_host = aProxy[0];
        proxy_port = int.Parse(aProxy[1]);
        return true;
    }
    public static string MultiFormData(string Key, string Value, string Boundary)
    {
        string output = "--" + Boundary + "\r\n"; output += "Content-Disposition: form-data; name=\"" + Key + "\"\r\n\r\n";
        output += Value + "\r\n";
        return output;
    }
    public static string MultiFormDataFile(string Key, string Value, string FileName, string FileType, string Boundary)
    {
        string output = "--" + Boundary + "\r\n";
        output += "Content-Disposition: form-data; name=\"" + Key + "\"; filename=\"" + FileName + "\"\r\n";
        output += "Content-Type: " + FileType + " \r\n\r\n";
        output += Value + "\r\n";
        return output;
    }
}

/* пример использования /*
using System.Threading;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
..............    
        anticaptcha ac = new anticaptcha();
        ac.host = "antigate.com";
        ac.key = "dd5c63473..ваш.ключ..b67d96b3754a";
             
        // проверяем баланс
        string balance = ac.get_balance();
        Console.WriteLine("current balance = " + balance);
        
        // отправляем капчу
        string cap = ac.rec("some_captcha.jpg");
        // можем отправить жалобу, если капча роспозналась неверно
        ac.reportbad();
.............. 

Categories: Інше Tags: , ,
  1. March 8th, 2010 at 20:35 | #1

    Я й не знав що ти з C# бавишся ). Дякую за лібу.

  1. No trackbacks yet.