【问题标题】:INDY - I really need cookies here?INDY - 我真的需要饼干吗?
【发布时间】:2013-07-04 13:14:42
【问题描述】:

我正在开发一个项目以在我的路由器管理页面中自动登录...但它在源代码中使用 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 表单相同的方式在 URL 中进行 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

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

 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;

【问题讨论】:

    标签: delphi cookies delphi-2010 indy


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在这种情况下,我刚刚创建了一个“假”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 管理器,只有这个假标题......对我来说它解决了。

      【讨论】:

        猜你喜欢
        • 2012-03-13
        • 2020-01-29
        • 2011-01-28
        • 1970-01-01
        • 2016-07-26
        • 1970-01-01
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        相关资源
        最近更新 更多