клас для роботи з антикапчею на C#
готовий, зручний клас для роботи з антикапчою на шарпі.. клас і опис під катом =)
доречі, вітаю прекрасну половину людства з 8м березням )

змінні:
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();
..............
Я й не знав що ти з C# бавишся ). Дякую за лібу.