INDY - 我真的需要饼干吗?

时间:2013-07-06 18:12:35

标签: delphi cookies delphi-2010 indy

我正在开发一个在我的路由器管理页面中自动登录的项目......但是它在源代码中使用了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中使用与HTML表单相同的方式登录POST,传递相同的参数,但结果是,我得到一个页面说'未知错误'... 这是我在Chrome浏览器中进行POST的时间:

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

好吧,我几乎可以肯定我因为饼干而得到这个'未知错误'。但他们真的需要在这里吗?我将如何设置它们?我尝试过使用cookies管理器但没有成功,我在Delphi 2010中,不知道Indy的Cookies管理器是否在这个版本中工作正常。这是我项目的代码:

 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;

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

在这种情况下,我只是创建了一个'假'cookie,只是在浏览器中传递与浏览器相同的参数...路由器页面使用了javascript cookies,因此Indy无法使用它们,我需要添加如果需要,他们手动。但对我来说,就是以这种方式工作:

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

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