Delphi Indy TIdHTTP网站识别机器人

3

我尝试向网站发送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吗? - Jens Borrisholt
@JensBorrisholt 很抱歉,我不能这样做。 - RepeatUntil
那么很难帮助您,因为我无法自己测试。 - Jens Borrisholt
但是你可以尝试在HTTP头中发送一个虚假的IP地址。但是它是否有效,我无法确定,因为我无法亲自尝试。 - Jens Borrisholt
1个回答

3

我认为这是真实网址:

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;

你能解释一下你做了什么改变以及为什么认为它会起作用吗? - Rob Kennedy
@jens-borrisholt 它只能工作一次或两次,我不确定,之后结果会显示为机器人。 - RepeatUntil
@RobKennedy,正如您所看到的,我在HTTP头中添加了一个虚假的IP地址(X-Forwarded-For)和UserAgent。这将欺骗某些网站,例如IMDB.com和Youtube.com。但正如我在回答中写的那样,这只是一个猜测,因为我无法拥有真实的URL。 - Jens Borrisholt
重新使用不同的IP进行测试,它允许发送请求。每个IP都允许通过机器人发送5个请求,然后该页面将出现。当我测试您的答案时,我已经因其他原因更改了我的IP。 - RepeatUntil
@AbdulrahmanAljehani,就像我说的,如果使用真实的URL,我将无法再做更多的事情。 - Jens Borrisholt
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接