Привет всем помогите первыйраз столнулся с этим пищу приложения работает 10 потоков и нужно отправить 10 капчий Code: id_c:=Pars('captcha","',responseres.Text,'"]'); FS:=TFileStream.Create('captcha.jpg',FMCreate); HTTP.Get('http://site.ru/get_image?id='+id_c,FS); FS.Free; но так картинки заменяються как правильно в сделать чтоб водельном потоке отправлялась капча....
Можно отправлять капчу из рабочего потока, и когда придет ответ сразу же продолжать работу. Такой вариант не подходит? По поводу проблемы: используй TMemoryStream вместо TFileStream.
помогите разабраться Code: Jpg:=TJPEGImage.Create; MStr:=TMemoryStream.Create; HTTP.Get('http://site.ru/get_image?id='+id_c,MStr); MStr.Seek(0,soFromBeginning); Jpg.LoadFromStream(MStr); captcha := recognize(ExtractFilePath(Application.ExeName) + '\captcha.jpg', Form1.Edit1.Text, false, false, false, 0, 0); вместо captcha.jpg что делать
Да какой номер потока? ТС, если ты используешь функцию recognize из программы-примера работы с antigate, то тебе ее придется немного изменить.
Code: function recognize(filename: string; apikey: string; is_phrase: boolean; is_regsense: boolean; is_numeric: Boolean; min_len: integer; max_len: integer): string; var ftype, tmpstr, captcha_id: string; i: integer; http: TIdHTTP; multi: Tidmultipartformdatastream; begin if FileExists(filename) = false then begin result := 'ERROR: file not found'; exit; end; result := 'ERROR'; 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'; multi := Tidmultipartformdatastream.Create; multi.AddFormField('method', 'post'); multi.AddFormField('key', apikey); multi.AddFile('file', filename, ftype); if is_phrase = true then multi.AddFormField('phrase', '1'); if is_regsense = true then multi.AddFormField('regsense', '1'); if is_numeric = true then multi.AddFormField('numeric', '1'); 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; multi.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; Application.ProcessMessages; end; result := 'ERROR_TIMEOUT'; 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;
В объявлении функции вместо Code: filename: string; напиши Code: Stream: TStream; и далее при вызове функции recognize первым параметром передавай TMemoryStream с капчей. Вот это все стоит убрать: Code: 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'; И вместо этой строчки: Code: multi.AddFile('file', filename, ftype); нужно записать: Code: multi.AddObject('file', 'application/octet-stream', '', Stream, 'captcha.jpg'); Если на последней поправке будет выдавать ошибку - обнови Indy, так как метод AddObject с такими параметрами появился в последних версиях.
Скачивай с id_c в название и загружай так же на антикапчу в delphi не разу не писал, но из своего опыта c# должно получиться что-то вроде этого. Code: captcha := recognize(ExtractFilePath(Application.ExeName) + '\' + id_c + '.jpg', Form1.Edit1.Text, false, false, false, 0, 0);
Code: if FileExists(filename) = false then begin result := 'ERROR: file not found'; exit; end; это тоже удалить ругаеться и indy щас обновлю проверю..
Все остальные строчки, где встречается filename можешь закомментировать или удалить, так как они уже не играют весомой роли.
Code: captcha := recognize( что сюда то пихать, Form1.Edit1.Text, false, false, false, 0, 0); ругаеться или я не правильно ее вызываю.. малость уже туплю
Объект типа TMemoryStream с телом капчи. Судя по предыдущим постам, он в вас называется MStr. Дальше пробуйте сами разбираться.
Спасибо разабрался... последний касяк обновил инди пишет "Error reading IdHTTP1.AuthRetries если кто может помочь что за фигня
Я может не заметил, но какая у Вас Delphi\Rad ??? Вообще делается всё просто в каждом потоке создается собственная локальная переменная например Code: procedure MY; var HTTP : TIdHTTP; begin HTTP := TIdHTTP.Create(nil); try { Здесь получаем капчу например обычным HTTP который вы создали локально - т.е. у каждого потока свой HTTP } HTTP.Get('mycaptcha.ru', MS); // MS -> TMemoryStream; CodeCaptcha := SendCaptcha(MS1, KeyAntiGate, false, false, false, 0, 0); finally HTTP.Free; end; end; Функция распознания: Code: function SendCaptcha(MS: TMemoryStream; apikey: string; is_phrase, is_regsense, is_numeric: boolean; min_len, max_len: integer): string; var tmpstr,captcha_id: String; i: integer; http: TIdHTTP; multi: Tidmultipartformdatastream; begin multi:=Tidmultipartformdatastream.Create; multi.AddFormField('method','post'); multi.AddFormField('key',apikey); //multi.AddFile('file',filename,ftype); multi.AddObject('file', 'image/pjpeg', MS, 'captcha.jpg' ); if is_phrase=true then multi.AddFormField('phrase','1'); if is_regsense=true then multi.AddFormField('regsense','1'); if is_numeric=true then multi.AddFormField('numeric','1'); 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; multi.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 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; result:='ERROR_TIMEOUT'; end; По уму ставишь в цикл пока капча не будет введена верно как только верная, т.е. сервер глотнул её выходим из цикла. P.S. Тип файла переделай, а то я делал только под Jpeg да бы уменьшить немного код да и мне остальные расширения были не нужны)