Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2012, 21:05   #1
Florento
Пользователь
 
Регистрация: 05.02.2011
Сообщений: 35
По умолчанию Antigate в потоке

Приветствую всех

Столкнулся с проблемой - не могу выполнить функцию от сервиса Antigate.com в потоке. Поток запускаю через Synchronize.

Вот файл Antigate:

Код:
unit AntiGate;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

// Распознать картинку их потока
function RecognizeAG(ImageData:       TMemoryStream;
                     AGKey:           String;
                     var CaptchaRes:  String;
                     MinLen:          integer=0;
                     MaxLen:          integer=0;
                     Numeric:         integer=0;
                     Phrase:          integer=0;
                     RegSense:        integer=0;
                     Calc:            integer=0;
                     Russian:         integer=0
                     ): Integer; overload;

var Bound, ftype:  String;
    s, CaptchaID: String;
    i:             Integer;
    Resp:          TStringList;
    Image:         TMemoryStream;
    HTTP:          THTTPSend;

begin

  Result := 0;
  ftype := 'image/pjpeg';

  Resp := TStringList.Create;
  Image := TMemoryStream.Create;
  Image.LoadFromStream(ImageData);

  HTTP := THTTPSend.Create;

  Randomize;
  Bound := '-----' + IntToHex(random(65535), 8) + '_boundary';

  Resp.Text := GetFormValue(Bound, 'method', 'post');
  Resp.Text := Resp.Text + GetFormValue(Bound, 'key', AGKey);
  Resp.Text := Resp.Text + GetFormValue(Bound, 'soft_id', '248');
  if (MinLen > 0)        then Resp.Text := Resp.Text + GetFormValue(Bound, 'min_len',   IntToStr(MinLen));
  if (MaxLen > 0)        then Resp.Text := Resp.Text + GetFormValue(Bound, 'max_len',   IntToStr(MaxLen));
  if (Numeric > 0)       then Resp.Text := Resp.Text + GetFormValue(Bound, 'numeric',   IntToStr(Numeric));
  if (Phrase > 0)        then Resp.Text := Resp.Text + GetFormValue(Bound, 'phrase',    IntToStr(Phrase));
  if (RegSense > 0)      then Resp.Text := Resp.Text + GetFormValue(Bound, 'regsense',  IntToStr(RegSense));
  if (Calc > 0)          then Resp.Text := Resp.Text + GetFormValue(Bound, 'calc',      IntToStr(Calc));
  if (Russian > 0)       then Resp.Text := Resp.Text + GetFormValue(Bound, 'is_russian',IntToStr(Russian));
  Resp.Text := Resp.Text + '--' + Bound + CRLF;

  Resp.Text := Resp.Text + 'Content-Disposition: form-data; name="file"; filename="image.jpg"' + 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);

  CaptchaRes := 'ERROR_IN_AG_MODULE';

  HTTP.MimeType := 'multipart/form-data; boundary=' + Bound;
  if (HTTP.HTTPMethod('POST', 'http://' + AntiServer + '/in.php')) then
  begin
    Resp.LoadFromStream(HTTP.Document);
    s := Resp.Strings[0];
    CaptchaRes := 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 := StrToInt(CaptchaID);
        for i := 0 to 20 do
        begin
          Sleep(3000);
          HTTP.Clear;
          if (HTTP.HTTPMethod('GET', 'http://' + AntiServer + '/res.php?key=' +
              AGKey + '&action=get&id=' + CaptchaID)) then
          begin
            Resp.LoadFromStream(HTTP.Document);
            s := Resp.Strings[0];
            if (Pos('ERROR_', s) > 0) then
            begin
              CaptchaRes := s;
              break;
            end;
            if (Pos('OK|', s) > 0) then
            begin
              CaptchaRes := StringReplace(s, 'OK|', '', [rfReplaceAll]);
              break;
            end;
          end;
          CaptchaRes := 'ERROR_TIMEOUT';
        end;
      end else CaptchaRes := 'ERROR_BAD_CAPTCHA_ID';
    end;
  end else CaptchaRes := 'ERROR_CONNECT';

  Resp.Free;
  Image.Free;
  HTTP.Free;
end;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)

end.

вот что делаю я в потоке:

Код:
RecognizeAG(CaptchaStream, key, captchaText);
На этом поток умирает.
Подскажите в чем дело? Никак не пойму, почему поток умирает.
Florento вне форума Ответить с цитированием
Старый 19.12.2012, 21:32   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Не вижу, что вы что-то в потоке делаете.
Далее ставите бряк и трассировкой заходите и построчно выверяете где обрывается.

А да, весьма глупо не проверять на не правильное решение капчи.
Вы деньги теряете из-за кого-то кто не разгадал капчу.
Человек_Борща вне форума Ответить с цитированием
Старый 19.12.2012, 23:09   #3
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Код:
try  
  RecognizeAG(CaptchaStream, key, captchaText);
except
  on e:exception do begin
    MessageBox(0, 'Я, поток, умру вот почему', PChar(e.classname + ' ' + e.message), mb_ok);
    raise;
  end;
end;
xoodoo вне форума Ответить с цитированием
Старый 19.12.2012, 23:40   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Ставьте бряк внутри вашей процедуры трассировкой ищите где падает.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание/изменение/удаление файлов в потоке. Мониторинг файлов в потоке. The Real Kos Общие вопросы Delphi 5 22.10.2012 23:58
Antigate впихнуть alex0097 Общие вопросы Delphi 5 03.10.2012 09:53
Antigate alex0097 Общие вопросы Delphi 3 18.09.2012 18:07
Как работать с antigate.com? Ruslasy Работа с сетью в Delphi 3 27.03.2012 19:43
событие в потоке filin2323 C# (си шарп) 4 20.07.2011 22:14