Indy - IdHttp, как обрабатывать перенаправления страниц? - PullRequest
7 голосов
/ 29 декабря 2010

Использование: Delphi 2010, последняя версия Indy

Я пытаюсь очистить данные с веб-страницы Googles Adsense с целью получения отчетов. Однако до сих пор у меня не получилось. Он останавливается после первого запроса и не продолжается.

Используя Fiddler для отладки трафика / запросов к веб-сайту Google Adsense и веб-браузер для загрузки страницы Adsense, я вижу, что запрос (из веб-браузера) генерирует количество перенаправлений до загрузки страницы.

Однако мое приложение Delphi генерирует только пару запросов, прежде чем оно остановится.

Вот шаги, которые я выполнил:

  1. Удалите IdHTTP и компонент IdSSLIOHandlerSocketOpenSSL1 в форме.
  2. Установите для свойств компонента IdHTTP AllowCookies и HandleRedirects значение True, а для свойства IOHandler значение IdSSLIOHandlerSocketOpenSSL1.
  3. Установка свойства компонента IdSSLIOHandlerSocketOpenSSL1. Метод: = 'sslvSSLv23'

Наконец-то у меня есть этот код:

procedure TfmMain.GetUrlToFile(AURL, AFile : String);
var
 Output : TMemoryStream;
begin
  Output := TMemoryStream.Create;
  try
    IdHTTP1.Get(FURL, Output);
    Output.SaveToFile(AFile);
  finally
    Output.Free;
  end;
end;

Тем не менее, он не попадает на страницу входа в систему, как ожидалось. Я ожидал бы, что он будет вести себя так, как если бы он был веб-браузером, и проходил бы через перенаправления, пока не найдет последнюю страницу.

Это вывод заголовков из Fiddler:

HTTP/1.1 302 Found
Location: https://encrypted.google.com/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=5166063f01b64b03:FF=0:TM=1293571783:LM=1293571783:S=a5OtsOqxu_GiV3d6; expires=Thu, 27-Dec-2012 21:29:43 GMT; path=/; domain=.google.com
Set-Cookie: NID=42=XFUwZdkyF0TJKmoJjqoGgYNtGyOz-Irvz7ivao2z0--pCBKPpAvCGUeaa5GXLneP41wlpse-yU5UuC57pBfMkv434t7XB1H68ET0ZgVDNEPNmIVEQRVj7AA1Lnvv2Aez; expires=Wed, 29-Jun-2011 21:29:43 GMT; path=/; domain=.google.com; HttpOnly
Date: Tue, 28 Dec 2010 21:29:43 GMT
Server: gws
Content-Length: 226
X-XSS-Protection: 1; mode=block

Во-первых, что-то не так с этим выводом?

Есть ли что-то еще, что я должен сделать, чтобы компонент IdHTTP продолжал перенаправлять до последней страницы?

Ответы [ 3 ]

7 голосов
/ 01 января 2011

Значения свойств компонента IdHTTP до вызова:

    Name := 'IdHTTP1';
    IOHandler := IdSSLIOHandlerSocketOpenSSL1;
    AllowCookies := True;
    HandleRedirects := True;
    RedirectMaximum := 35;
    Request.UserAgent := 
      'Mozilla/5.0 (Windows NT 5.1; rv:2.0b8) Gecko/20100101 Firefox/4.' +
      '0b8';
    HTTPOptions := [hoForceEncodeParams];
    OnRedirect := IdHTTP1Redirect;
    CookieManager := IdCookieManager1;

Обработчик события перенаправления:

procedure TfmMain.IdHTTP1Redirect(Sender: TObject; var dest: string; var
    NumRedirect: Integer; var Handled: Boolean; var VMethod: string);
begin
   Handled := True;
end;

Как сделать звонок:

  FURL := 'https://www.google.com';

  GetUrlToFile( (FURL + '/adsense/'), 'a.html');




  procedure TfmMain.GetUrlToFile(AURL, AFile : String);
  var
   Output : TMemoryStream;
  begin
    Output := TMemoryStream.Create;
    try
      try
       IdHTTP1.Get(AURL, Output);
       IdHTTP1.Disconnect;
      except

      end;
      Output.SaveToFile(AFile);
    finally
      Output.Free;
    end;
  end;





Вот вывод (заголовки запроса и ответа) из Fiddler:

alt text

1 голос
/ 29 декабря 2010

Начало переадресации

TIdHTTP.HandleRedirects := True, поэтому он автоматически начинает обработку перенаправлений.

TIdHTTP.RedirectMaximum используется, чтобы установить, сколько последовательных перенаправлений должно быть обработано.


В качестве альтернативы вы можете назначить TIdHTTP.OnRedirect и установить Handled := True из этого обработчика. Это то, что я делаю в проекте, который должен читать данные с веб-сайта WikiMedia (мой собственный сайт).

Об ответе HTTP

Ничего плохого в этом ответе, это очень простой перенаправление на https://encrypted.google.com/. TIdHTTP должен перейти на указанную страницу в ответ Он также устанавливает некоторые куки.

Другие предложения

Не забудьте назначить CookieManager и убедиться, что вы используете тот же CookieManager для всех последующих запросов. Если вы этого не сделаете, вы, вероятно, будете перенаправлены на страницу входа снова и снова.

0 голосов
/ 14 июля 2016

В моем случае мне нужно было исправить dest, потому что каким-то образом я имел;в нем!

procedure Tfrm1.IdHTTP1Redirect(Sender: TObject; var dest: string;
  var NumRedirect: Integer; var Handled: Boolean; var VMethod: string);
var
  i: Integer;
begin

  i := Pos(';', dest);
  if i > 0 then
  begin
    dest := Copy(dest,1, i - 1);
  end;

  Handled := True;
end;
...