вторник, 7 апреля 2015 г.

Распознавание капчи сервисом антигейт

Допустим имеем дело с такими капчами:



или сложнее. В качестве решения может служить сервис "автоматического" получения текста с картинок http://antigate.com (ручное распознавание настоящими людьми, отсюда плата по баксу за 1000 картинок).

Этапы работы с сервисом следующие:
  1. Загрузка капчи на сервер antigate.
  2. Получение ID.
  3. Проверка готовности.
  4. Получение результата распознавания.
Рассмотрим запрос к сервису распознавания (при наличии ApiKey - кода доступа):
uses IdMultipartFormData, IdBaseComponent, IdComponent, IdHTTP;


function recognize(filename: string; apikey: string; is_phrase, is_regsense, is_numeric, is_russian: boolean; min_len: integer; max_len: integer): string;
var
   ftype,tmpstr,captcha_id: String;
   i: integer;

   http: TIdHTTP;
   multi: Tidmultipartformdatastream;
begin
   if not FileExists(filename) then begin result:='ERROR: file not found'; exit; end;
   result:='ERROR_TIMEOUT';

   // формат капчи
   ftype:='image/pjpeg';
   if strpos(Pchar(filename), 'jpg')<>nil then ftype:='image/pjpeg';
   if strpos(Pchar(filename), 'gif')<>nil then ftype:='image/gif';
   if strpos(Pchar(filename), 'png')<>nil then ftype:='image/png';

   // формирование запроса к сервису AntiGate (отправляем капчу)
   multi:= Tidmultipartformdatastream.Create;
   multi.AddFormField('method', 'post');
   multi.AddFormField('key', apikey);
   multi.AddFile('file', filename, ftype);

   // содержится ли фраза в капче
   if (is_phrase) then multi.AddFormField('phrase', '1');
   // учитывать регистр
   if (is_regsense) then multi.AddFormField('regsense', '1');
   // цифровая ли капча
   if (is_numeric) then multi.AddFormField('numeric', '1');
   // отправлять ли капчу русскому сотруднику
   if (is_russian) then multi.AddFormField('russian', '0');
   // минимальная длина
   if min_len>0 then multi.AddFormField('min_len', inttostr(min_len));
   // максимальная длина
   if max_len>0 then multi.AddFormField('max_len', inttostr(max_len));

   http:= TIdHTTP.Create(nil);  
   tmpstr:= http.Post('http://antigate.com/in.php', multi);
   http.Free;

   // читаем результат распознавания
   captcha_id:= '';
   if strpos(Pchar(tmpstr),'ERROR_')<>nil then begin result:=tmpstr; exit; end;
   if strpos(Pchar(tmpstr),'OK|')<>nil then captcha_id:= AnsiReplaceStr(tmpstr, 'OK|', '');
   if captcha_id='' then result:='ERROR: bad captcha id';

   for i:=0 to 20 do begin
     Application.ProcessMessages; // г-код :)
     sleep(5000);
     http:=TIdHttp.Create(nil);
     tmpstr:= http.Get('http://antigate.com/res.php?key=' + apikey + '&action=get&id=' + captcha_id);
     http.Free;
 
     if strpos(Pchar(tmpstr),'ERROR_')<>nil then begin result:= tmpstr; exit end;
     if strpos(Pchar(tmpstr),'OK|')<>nil then begin
      result:= AnsiReplaceStr(tmpstr, 'OK|', '');
      exit;
    end;
  end;

  FreeAndNil(multi);

  SetFileAttributes(pchar(filename), faVolumeID);
  deletefile(filename) // убиваем распознанную капчу
end;
Пример запроса: 
recognize('1.gif', apikey, false, false, true, false, 0, 6);
Также сервис предоставляет набор готовых скриптов.

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.