|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Доброго дня!
Есть задача: получить капчу Яндекса и отправить введенные символы на сервер. С первой частью задачи - получением изображения капчи - кое-как удалось справиться. Со второй проблемы. Впервые делаю пост-запрос. Не могу понять, как он создается, какие данные отправлять и на какой сервер. Суть такая: на сервер (Яндекс.Директ) поочередно посылаются поисковые запросы, через компонент TWebBrowser. Когда очередь доходит до 100-го запроса, Яндекс блокирует его и ставит капчу. У капчи есть key, который генерируется при каждом обновлении страницы. Не пойму, как отправить ПОСТ-запрос на ту же страницу, с которой получают изображение. Функция, реализующая ПОСТ-зарос через TWebBrowser: Код:
procedure PostWebBrowser(wb:twebbrowser; PostString: string; URL: OleVariant); var PostData: OleVariant; Heads: OleVariant; i:integer; begin PostData := VarArrayCreate([0, Length(PostString) - 1], varByte); for i := 1 to Length(PostString) do PostData[i-1] := Ord(PostString[i]); Heads :='Content-Type: application/x-www-form-urlencoded' + #10#13; WB.Navigate(URL, EmptyParam, EmptyParam, PostData, Heads); end; Код по клику на кнопке: Код:
procedure TMainForm.Button1Click(Sender: TObject); var RegExp: TRegExpr; html: WideString; Stream: TMemoryStream; gif: TGIFImage; ImgUrl, CaptchaKey: string; i: integer; begin try RegExp := TRegExpr.Create; i:=0; // Для примера отправляю один и тот же запрос многократно (купить+часы) repeat inc(i); WBCaptcha.Navigate('https://direct.yandex.ru/search?text=%D0%BA%D1%83%D0%BF%D0%B8%D1%82%D1%8C+%D1%87%D0%B0%D1%81%D1%8B'); repeat Application.ProcessMessages; until WBCaptcha.ReadyState = 4; // Получаю код в Memo1 Memo1.Lines.Text := WB_GetHTMLCode(WBCaptcha, TEncoding.UTF8); Caption := 'The query # ' + IntToStr(i); until Pos('Контрольные цифры', Memo1.Lines.Text) <> 0; html := Memo1.Lines.Text; // Получаем ссылку на изображение (ImgUrl) RegExp.InputString := html; RegExp.Expression := '<img src="(.*?)"\salt'; if RegExp.Exec(RegExp.InputString) then ImgUrl := RegExp.Match[1]; Caption := ImgUrl; Stream:=TMemoryStream.Create(); IdHTTP1.Request.ContentRangeEnd:=9999999; IdHTTP1.Get(ImgUrl, Stream); Stream.Position:=0; gif := TGIFImage.Create; gif.LoadFromStream(Stream); Image1.Picture.Assign(gif); // Получаем ключ key RegExp.Expression := 'key=(.*?)"\salt'; if RegExp.Exec(RegExp.InputString) then CaptchaKey := RegExp.Match[1]; Edit1.Text := InputBox('DirectAssistant', 'Enter captcha', ''); // Делаю ПОСТ-запрос (param1=value1¶m2=value2¶m3=value3 и т.д.) PostWebBrowser(WBCaptcha,'key=' + CaptchaKey + '&action=sendcapcha&rep=' + Edit1.Text, 'http://yandex.ru/checkcaptcha?key=' + CaptchaKey + '&retpath=https://direct.yandex.ru/search?text=%D0%BA%D1%83%D0%BF%D0%B8%D1%82%D1%8C+%D1%87%D0%B0%D1%81%D1%8Bsite%3D%26rstr%3D%26lang%3Dall%26within%3D0%' + '26from_day%3D%26from_month%3D%26from_year%3D%26to_day%3D%26to_month%3D%26to_year%3D%26mime%3Dall%26numdoc%3D50%26lr%3D213&rep=' + Edit1.Text); ShowMessage('OK'); Stream.Free; gif.Free; RegExp.Free; except on e:Exception do begin Stream.Free; gif.Free; RegExp.Free; end; end; end; Проблема наверное еще в этой ссылке, потому что я не знаю даже, куда отправлять (прочитал на одном форуме) Код:
'http://yandex.ru/checkcaptcha?key=' + CaptchaKey + '&retpath=https://direct.yandex.ru/search?text=%D0%BA%D1%83%D0%BF%D0%B8%D1%82%D1%8C+%D1%87%D0%B0%D1%81%D1%8Bsite%3D%26rstr%3D%26lang%3Dall%26within%3D0%' + '26from_day%3D%26from_month%3D%26from_year%3D%26to_day%3D%26to_month%3D%26to_year%3D%26mime%3Dall%26numdoc%3D50%26lr%3D213&rep=' + Edit1.Text Какие тут параметры и что они означают, не знаю. Установил HTTP Analyzer v7, но не понимаю, что он показывает, может проблема еще и в куки, вот данные от этой программы Request Headers: (Request-Line):POST /checkcaptcha?key=c2BoTnylwW8weiXPmvA8AXkDbXAwy0RE& retpath=https://direct.yandex.ru/search?text=%D0%BA%D1%83%D0%BF%D0%B8%D1%82%D1%8C+% D1%87%D0%B0%D1%81%D1%8Bsite%3D%26rstr%3D%26lang%3D all%26within%3D0%26from_day%3D%26from_month%3D%26f rom_year%3D%26to_day%3D%26to_month%3D%26to_year%3D %26mime%3Dall%26numdoc%3D50%26lr%3D213&rep=593443 HTTP/1.1 Accept:image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */* Accept-Language:en-US,en;q=0.7,ru;q=0.3 Content-Type:application/x-www-form-urlencoded Accept-Encoding:gzip, deflate User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; ASU2JS) Host:yandex.ru Connection:Keep-Alive Cache-Control:no-cache Cookie:yandexuid=1761778471399369113; yabs-frequency=/4/Dne001HIZLG00000/63smS2mSHyGKht0i74S8mWSg8nmy0001/; spravka=dD0xNDE4MjM2NTAyO2k9ODIuMjA4LjEyNC4xMDQ7dT 0xNDE4MjM2NTAyMTE2NjEwMzU1O2g9YjQxZTYxMTAxNjRjZGYw ODhhMWM0ZmFiMGVmY2RkNDc= Content-Length:65 Response Headers Value Content-Length 0 Allow GET (Status-Line) HTTP/1.1 405 Method not allowed И скриншот в приложении. Прошу, помогите, кто чем сможет! Никто не может помочь? Неужели никто с этой проблемой не сталкивался при отправке запросов на Яндекс? Доброй ночи! Помогите, пожалуйста, отправить запрос на сервер яндекса, при многократной отправке запросов появляется картинка, от которой никуда не уйти. Пробую отправлять такой запрос (предварительно получаю картинку в Image и ключ (CaptchaId) картинки Код:
'http://yandex.ru/checkcaptcha?date=&text=' + ConvertedQuery + '&lr=225&site=&rstr=&zone=all&wordforms=all&lang=all&within=0&from_day=&from_month=&from_year=&to_day=&to_month=&to_year=&mime=all&numdoc=50&key=' + CaptchaId + '&rep=' + Convert(CaptchaCode) CaptchaCode - символы с картинки, там русский текст, соответственно конвертирую его в формат для ссылки. В чем у меня ошибка? Подскажите, пожалуйста, что можно сделать? ОЧЕНЬ нужна ваша помощь!:wall: Другие темы желательно не предлагать, нужна помощь именно по моему запросу. Последний раз редактировалось M.A.D.M.A.N., 17.12.2014 в 00:16. |