Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
модуль для разгадывания обычной и гугл каптчи сразу через 2 сервиса: anti-captcha.com и rucaptcha.com на основе синапса!
Последний параметр в обеих функциях отвечает за сервис, если TRUE то рукаптча, если FALSE то антикаптча.
Пример для рекаптчи вк:
Пример для обычной каптчи вк:
Исходный код модуля:
Последний параметр в обеих функциях отвечает за сервис, если TRUE то рукаптча, если FALSE то антикаптча.
Пример для рекаптчи вк:
Код:
Result:=RecognizeRC('6Le00B8TAAAAACHiybbHy8tMOiJhM5vh88JVtP4c', 'http://vk.com/', 'ваш_API_ключ', TRUE);
Код:
procedure Captcha(sid: string; var Answer: string);
var fm:TmemoryStream; HTTP:THTTPSend;
begin
fm:=TMemoryStream.Create;
HTTP:=THTTPSend.Create;
HTTP.AddPortNumberToHost:=false;
HTTP.UserAgent:='Mozilla/5.0 (Windows NT 5.1; rv:28.0) Gecko/20100101 Firefox/58.0';
HTTP.Protocol:='1.1';
HTTP.HTTPMethod('GET', 'https://vk.com/captcha.php?sid='+sid);
fm.LoadFromStream(HTTP.Document);
fm.Position:=0;
Answer:=Recognize(fm, 'ваш_API_ключ', TRUE);
HTTP.Free;
fm.Free;
end;
Код:
unit antigate;
interface
uses HTTPSend, SSL_OpenSSL, Classes, SysUtils, SynAUtil;
function Recognize(capa: TMemoryStream; Key:string; rucaptcha:boolean):string;
function RecognizeRC(SiteKey, PageURL, APIKey:string; rucaptcha:boolean):string;
const
CRLF=#$0D#$0A;
sleep_ms = 5000;
implementation
function GetFormValue(Bound, Parametr, Value:String): String;
begin
Result:='--'+Bound+CRLF+'Content-Disposition: form-data; name="'+Parametr+'"'+CRLF+CRLF+Value+CRLF;
end;
function Recognize(capa: TMemoryStream; Key:string; rucaptcha:boolean):string;
var Bound, ftype, s, CaptchaID, url:string; soft_id:integer;
i:Integer;
Resp:TStringList;
Image:TMemoryStream;
HTTP:THTTPSend;
begin
ftype:='image/png';
if rucaptcha then begin
url:='http://rucaptcha.com/';
soft_id:=902;
end else begin
url:='http://antigate.com/';
soft_id:=362;
end;
Resp:=TStringList.Create;
Image:=TMemoryStream.Create;
Image.LoadFromStream(capa);
HTTP:=THTTPSend.Create;
Randomize;
Bound:='-----' +IntToHex(random(65535), 8)+'_boundary';
Resp.Text:=GetFormValue(Bound, 'method', 'post');
Resp.Text:=Resp.Text+GetFormValue(Bound, 'key', key);
Resp.Text:=Resp.Text+GetFormValue(Bound, 'soft_id', IntToStr(soft_id));
Resp.Text:=Resp.Text+'--'+Bound+CRLF;
Resp.Text:=Resp.Text+'Content-Disposition: form-data; name="file"; filename="image.gif"'+CRLF+'Content-Type: '+ftype+CRLF+CRLF;
WriteStrToStream(HTTP.Document, Resp.Text);
HTTP.Document.CopyFrom(Image, 0);
Resp.Text:=CRLF+'--'+Bound+'--'+CRLF;
WriteStrToStream(HTTP.Document, Resp.Text);
HTTP.MimeType:='multipart/form-data; boundary='+Bound;
if (HTTP.HTTPMethod('POST', url+'in.php')) then begin
Resp.LoadFromStream(HTTP.Document);
s:=Resp.Strings[0];
Result:=s;
CaptchaID:='';
if (Pos('ERROR_', s) < 1) then begin
if (Pos('OK|', s) > 0) then CaptchaID:=StringReplace(s, 'OK|', '', [rfReplaceAll]);
if (CaptchaID <> '') then begin
Result:=CaptchaID;
for i:=0 to 20 do begin
Sleep(sleep_ms);
HTTP.Clear;
if (HTTP.HTTPMethod('GET', url+'res.php?key='+key+'&action=get&id='+CaptchaID)) then begin
Resp.LoadFromStream(HTTP.Document);
s:=Resp.Strings[0];
if (Pos('ERROR_', s) > 0) then begin
result:= s;
break;
end;
if (Pos('OK|', s) > 0) then begin
result:=StringReplace(s, 'OK|', '', [rfReplaceAll]);
break;
end;
end;
result:= 'ERROR_TIMEOUT';
end;
end else result:= 'ERROR_BAD_CAPTCHA_ID';
end;
end else result:= 'ERROR_CONNECT';
Resp.Free;
Image.Free;
HTTP.Free;
end;
function Pars(T_, ForS, _T:string):string;
var a, b:integer;
begin
Result := '';
if (T_='') or (ForS='') or (_T='') then Exit;
a:=Pos(T_, ForS);
if a=0 then Exit else a:=a+Length(T_);
ForS:=Copy(ForS, a, Length(ForS)-a+1);
b:=Pos(_T, ForS);
if b>0 then
Result:=Copy(ForS, 1, b - 1);
end;
function RecognizeRC(SiteKey, PageURL, APIKey:string; rucaptcha:boolean):string;
var page, CaptchaID:string; soft_id, i:integer;
Resp:TStringList; send:TStringStream; HTTP:THTTPSend;
begin
if rucaptcha then begin
soft_id:=902;
end else begin
soft_id:=362;
end;
case soft_id of
902:begin
HTTP:=THTTPSend.Create;
HTTP.Protocol:='1.1';
HTTP.HTTPMethod('GET', 'http://rucaptcha.com/in.php?soft_id='+IntToStr(soft_id)+'&key='+APIKey+'&method=userrecaptcha&googlekey='+SiteKey+'&pageurl='+PageURL);
Resp:=TStringList.Create;
Resp.LoadFromStream(HTTP.Document);
CaptchaID:=Copy(Resp[0], 4, Length(Resp[0]));
Resp.Free;
HTTP.Free;
for i:=0 to 20 do begin
sleep(sleep_ms);
HTTP:=THTTPSend.Create;
HTTP.Protocol:='1.1';
HTTP.HTTPMethod('GET', 'http://rucaptcha.com/res.php?key='+APIKey+'&action=get&id='+CaptchaID);
Resp:=TStringList.Create;
Resp.LoadFromStream(HTTP.Document);
result:=Resp[0];
Resp.Free;
HTTP.Free;
if pos('OK|', result)>0 then begin
Delete(result, 1, 3);
break;
end;
end;
end;
362:begin
Resp:=TStringList.Create;
HTTP:=THTTPSend.Create;
HTTP.AddPortNumberToHost:=false;
HTTP.Protocol:='1.1';
HTTP.MimeType:='application/x-www-form-urlencoded';
send:=TStringStream.Create('');
send.WriteString('{'+
'"clientKey":"'+APIKey+'",'+
'"task":{'+
'"type":"NoCaptchaTaskProxyless",'+
'"websiteURL":"'+StringReplace(PageURL, '/', '\/', [rfReplaceAll])+'",'+
'"websiteKey":"'+SiteKey+'"'+
'},'+
'"softId":'+IntToStr(soft_id)+','+
'"languagePool":"en"'+
'}');
HTTP.Document.LoadFromStream(send);
send.Free;
if (HTTP.HTTPMethod('POST', 'https://api.anti-captcha.com/createTask')) then begin
Resp.LoadFromStream(HTTP.Document);
page:=StringReplace(Resp[0], ' ', '', [rfReplaceAll]);
if pos('"errorId":0', page)>0 then begin
CaptchaID:=Pars('"taskId":', page, '}');
send:=TStringStream.Create('');
send.WriteString('{"clientKey":"'+APIKey+'","taskId":'+CaptchaID+'}');
for i:=0 to 20 do begin
sleep(sleep_ms);
HTTP.Document.Clear;
HTTP.Headers.Clear;
HTTP.Document.LoadFromStream(send);
HTTP.HTTPMethod('POST', 'https://api.anti-captcha.com/getTaskResult');
Resp:=TStringList.Create;
Resp.LoadFromStream(HTTP.Document);
page:=Resp.Text;
Resp.Free;
if pos('"status":"ready"', page)>0 then begin
result:=Pars('"gRecaptchaResponse":"', page, '"');
break;
end;
end;
send.Free;
end else begin
result:= 'ERROR_'+Pars('"errorId":', page, ',');
end;
end else result:= 'ERROR_CONNECT';
HTTP.Free;
end;
end;
end;
end.