Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.12.2014, 12:24
max_delphi max_delphi вне форума
Прохожий
 
Регистрация: 27.03.2014
Адрес: На Земле
Сообщения: 21
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Доброго дня!

Есть задача: получить капчу Яндекса и отправить введенные символы на сервер. С первой частью задачи - получением изображения капчи - кое-как удалось справиться. Со второй проблемы. Впервые делаю пост-запрос. Не могу понять, как он создается, какие данные отправлять и на какой сервер.

Суть такая: на сервер (Яндекс.Директ) поочередно посылаются поисковые запросы, через компонент 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&param2=value2&param3=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:

Другие темы желательно не предлагать, нужна помощь именно по моему запросу.
Изображения
Тип файла: png data.png (173.0 Кбайт, 0 просмотров)

Последний раз редактировалось M.A.D.M.A.N., 17.12.2014 в 00:16.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter