2

我正在开发一个项目以在我的路由器管理页面中自动登录......但它在源代码中使用 cookie。当我使用我的网络浏览器 (Chrome) 执行 GET 时,我得到了这个:

GET http://192.168.1.1/ HTTP/1.1
Host: 192.168.1.1
Proxy-Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: FirstMenu=Admin_0; SecondMenu=Admin_0_0; ThirdMenu=Admin_0_0_0; Language=en

当我使用 Indy 进行 GET 时,结果是:

GET http://192.168.1.1/ HTTP/1.1
Host: 192.168.1.1
Accept: text/html, */*
Accept-Encoding: identity
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV2)

好的,我想以与 HTML 表单相同的方式登录 POST,并传递相同的参数,但结果是,我得到一个页面说“未知错误”......这是我在做 POST 的时候在我的 Chrome 浏览器中:

POST http://192.168.1.1/index/login.cgi HTTP/1.1
Host: 192.168.1.1
Proxy-Connection: keep-alive
Content-Length: 34
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Origin: http://192.168.1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://192.168.1.1/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: SessionID_R3=479900075; FirstMenu=Admin_0; SecondMenu=Admin_0_0; ThirdMenu=Admin_0_0_0; Language=en

Username=admin&Password=YWRtaW4%3D

这是我在 Indy 项目中的帖子:

POST http://192.168.1.1/index/login.cgi HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
Proxy-Connection: keep-alive
Host: 192.168.1.1
Accept: text/html, */*
Accept-Encoding: identity
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV2)

Username=admin&Password=YWRtaW4%3D

好的,我几乎可以肯定,由于 cookie,我收到了这个“未知错误”。但是这里真的需要它们吗?我将如何设置它们?我尝试使用 cookie 管理器但没有成功,而且我在 Delphi 2010 中,不知道 Indy 的 Cookies Manager 在这个版本中是否可以正常工作。这是我的项目的代码:

 http := TIDHttp.Create(nil);
  PostData:= TStringList.Create;
  AnswerData:= TStringStream.Create('');
  http.ReadTimeout := 5000;
  http.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV2)';
  http.ProxyParams.ProxyServer:= '127.0.0.1';
  http.ProxyParams.ProxyPort:= 8080;
  PostData.Text:= 'Username=admin&Password=YWRtaW4=';
  try
    http.Post('http://192.168.1.1/index/login.cgi', PostData, AnswerData);
  except
    on E: EIdHTTPProtocolException do
      begin
        HttpCode:= HTTP.ResponseCode;
        HttpHeader:= HTTP.Response.RawHeaders.Values['Server'];
      end;
  end;
  Memo1.Lines.Add(AnswerData.DataString);
end;
4

2 回答 2

1

Web 浏览器的请求包括您显然尚未收到的先前收到的 cookie。您需要从 Web 浏览器开始接收 cookie 的同一起始页面开始。此外,由于您要发送多个请求,因此您需要确保每次都重用相同的 TIdCookieManager 实例,以便 cookie 在请求之间持续存在。如果您没有将 TIdCookieManager 分配给 TIdHTTP.CookieManager 属性,则 TIdHTTP 会在内部创建一个,因此您需要为每个请求重新使用相同的 TIdHTTP,或者您需要创建一个分配给您创建的每个 TIdHTTP 的单个 TIdCookieManager .

于 2013-07-07T03:34:22.970 回答
1

在这种情况下,我刚刚创建了一个“假”cookie,只是在标头中传递了与浏览器相同的参数...路由器页面使用了 javascript cookie,因此 Indy 无法使用它们,如果出现,我需要手动添加它们必要的。但对我来说是这样工作的:

http.Request.CustomHeaders.Text:= 'Cookie: FirstMenu=Admin_0; SecondMenu=Admin_0_0; ThirdMenu=Admin_0_0_0; Language=en';

我只是把cookie作为标题,实际上我没有cookie管理器,只有这个假标题......对我来说它解决了。

于 2013-07-08T18:14:01.803 回答