【问题标题】:Delphi Indy TIdHTTP Website recognize robotsDelphi Indy TIdHTTP 网站识别机器人
【发布时间】:2015-11-09 11:55:11
【问题描述】:

我正在尝试向网站发送 Get 请求。问题是,如果请求者是机器人,网站就会重新识别

const _URL = 'https://www.URL.com/';
var
  sSessionID:String;
  Params: TStringList;
  IdSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
  try
    IdHTTP1.IOHandler := IdSSL;
    IdHTTP1.AllowCookies := True;
    IdHTTP1.HandleRedirects := True;
    IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0';
    IdHTTP1.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
    IdHTTP1.Request.AcceptLanguage := 'en-GB,en;q=0.5';
    IdHTTP1.Request.Connection := 'keep-alive';
    IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
    sSessionID := IdHTTP1.Get(_URL);
    {....
        extracting SessionID
            Params.Add('SessionID=' + 'sSessionID');
                IdHTTP1.Post(_URL, Params);
                    .....}
  finally
    IdSSL.Free;
  end; 

IdHTTP.get 的结果是 <!DOCTYPE html><head><META NAME="ROBOTS"..... 它是空的,我无法获得会话 ID。

http 请求头与我的浏览器发送的相同。

【问题讨论】:

  • 是否有您尝试调用的真实 URL?
  • @JensBorrisholt 不幸的是我做不到
  • 那我很难帮你,因为我无法测试自己。
  • 但是您可以尝试在 HTTP 标头中发送假 IP 地址。但它是否有效我无法说,因为我无法亲自尝试。

标签: delphi http-post indy idhttp


【解决方案1】:

因为我可以得到真实的 URL,这是我最好的猜测:

uses
  Math;
...
    const
      _URL = 'https://www.url.com/';
    var
      sSessionID: string;
      Params: TStringList;
      IdSSL: TIdSSLIOHandlerSocketOpenSSL;
    begin
      IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
      try
        IdHTTP1.IOHandler := IdSSL;
        IdHTTP1.AllowCookies := True;
        IdHTTP1.HandleRedirects := True;
        IdHTTP1.Request.CustomHeaders.AddValue('X-Forwarded-For', Format('%d.%d.%d.%d', [Random(255), Random(255), Random(255), Random(255)]));
        IdHTTP1.Request.UserAgent := Format('Mozilla/%d.0 (Windows NT %d.%d; rv:2.0.1) Gecko/20100101 Firefox/%d.%d.%d', [RandomRange(3, 5), RandomRange(3, 5), Random(2), RandomRange(3, 5), Random(5), Random(5)]);
        IdHTTP1.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
        IdHTTP1.Request.AcceptLanguage := 'en-GB,en;q=0.5';
        IdHTTP1.Request.Connection := 'keep-alive';
        IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
        sSessionID := IdHTTP1.Get(_URL);
    ...
      finally
        ...
      end;

【讨论】:

  • 你能解释一下你做了什么改变以及为什么你认为它会奏效吗?
  • @jens-borrisholt 它只工作了一次或两次,我不确定在结果返回显示为机器人之后。
  • @RobKennedy 您可能会看到我在 HTTP 标头中放入了一个假的 IP 地址(X-Forwarded-For)和 UserAgent。这将愚弄一些网站。外汇。 IMDB.com 和 Youtube.com。但是正如我在回答中所写的那样,这是一个猜测,因为我无法拥有真实的 URL
  • 用它允许的不同 IP 再次测试.. 它在每个 IP 上都相同,您允许通过机器人发送 5 个请求,然后该页面将出现..当我测试您的答案时,我已经更改了我的 IP出于另一个原因。
  • @AbdulrahmanAljehani 正如我所说的真实网址,我不能再做任何事情了。
猜你喜欢
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多