想实现的功能是,先登录上该网站,然后以登录的用户身份去浏览该网站的其它内容。此前问过该问题,再叙述一遍,装了Indy 10,
用IdHTTP.post() 返回的结果是connection closed gracefully,
只得用IdHTTP.get(),显示登录成功。为IdHTTP添加了一个IdCookieManager, 在IdCookieManager的newcookie事件里记录下了cookie的全部内容,存在cookieStr里。 登录顺序大概如下:
{
IdHTTP1.Get("http://example.com/login.php?name=myname&pwd=abcd");
//--触发cookiemanager.onnewcookie, 取得cookie的内容
idhttp1.request.customer.headers.text="cookie:"+cookieStr;
}以上完成后,就用idhttp1.get("其它网页"), 但是这种get()只发送了10个左右,不管间隔是多久(5秒或30秒),就失去了在线状态。//---
我怀疑的问题是,
每发一个新的IdHTTP1.get("example")时,是否cookie的内容又被更新,下一次发get()时,request.headers.text是否需要再次更新?因为我只在登录的时候,给headers.text赋过一次值。
请高手指点。
用IdHTTP.post() 返回的结果是connection closed gracefully,
只得用IdHTTP.get(),显示登录成功。为IdHTTP添加了一个IdCookieManager, 在IdCookieManager的newcookie事件里记录下了cookie的全部内容,存在cookieStr里。 登录顺序大概如下:
{
IdHTTP1.Get("http://example.com/login.php?name=myname&pwd=abcd");
//--触发cookiemanager.onnewcookie, 取得cookie的内容
idhttp1.request.customer.headers.text="cookie:"+cookieStr;
}以上完成后,就用idhttp1.get("其它网页"), 但是这种get()只发送了10个左右,不管间隔是多久(5秒或30秒),就失去了在线状态。//---
我怀疑的问题是,
每发一个新的IdHTTP1.get("example")时,是否cookie的内容又被更新,下一次发get()时,request.headers.text是否需要再次更新?因为我只在登录的时候,给headers.text赋过一次值。
请高手指点。
AWorkMode: TWorkMode);
var
i: Integer;
tmp, cookie: String;
begin
exit;
//获得服务器端响应Respoonse中的cookie,并添加到IdHTTP1的request中
cookie := '';
for i := 0 to IdHTTP1.Response.ExtraHeaders.Count - 1 do
begin
tmp := IdHTTP1.Response.ExtraHeaders[i];
if pos('set-cookie: ', LowerCase(tmp)) = 0 then Continue;
tmp := Trim(Copy(tmp, Pos('Set-cookie: ', tmp) + Length('Set-cookie: '), Length(tmp)));
tmp := Trim(Copy(tmp, 0, Pos(';', tmp) - 1));
if cookie = '' then cookie := tmp else cookie := cookie + '; ' + tmp;
end;
if cookie <> '' then
begin
for i := 0 to IdHTTP1.Request.ExtraHeaders.Count - 1 do
begin
tmp := IdHTTP1.Request.ExtraHeaders[i];
if Pos('cookie', LowerCase(tmp)) = 0 then Continue;
IdHTTP1.Request.ExtraHeaders.Delete(i);
Break;
end;
IdHTTP1.Request.ExtraHeaders.Add('cookie: ' + cookie);
end;end;
每次get()的确是触发很多次NewCookie事件,因为Cookie包含了好几个项。但我的每个Get()之间有一定的时间差(比如10秒),可以保证最后获得的Cookie是上一次get()触发的最后一次NewCookie事件更新的Cookie值。然后我在下一次Get()前,再把更新过的Cookie值赋给request.customheaders.不是说目前这种程序完全不成功,我不太明白的是,为什么一开始可以,但get()几次之后就不行了。我认真分析过断线前后的request.header值,但没有发现明显的异常。不知道是不是因为网站本身的原因?我想不应该。
//---------------------------------------
object IdHTTP1: TIdHTTP
AllowCookies = True
ProxyParams.BasicAuthentication = False
ProxyParams.ProxyPort = 0
Request.ContentLength = -1
Request.ContentType = 'application/x-www-form-urlencoded'
Request.Accept = 'text/html, */*'
Request.BasicAuthentication = False
Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
HTTPOptions = [hoForceEncodeParams]
CookieManager = IdCookieManager1
Left = 584
Top = 16
end
object IdCookieManager1: TIdCookieManager
OnNewCookie = IdCookieManager1NewCookie
Left = 584
Top = 56
end
//-------------------------------------------------------2、主要代码:
//------------------登录到网站-------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{Memo1->Text=IdHTTP1->Get("http://www.example.com/dologin.php?pre_url=http%3A//www.example.com&name=tom&password=123456&login.value=10");Timer1->Enabled=true;
}//------------------------计时器事件--------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{ if(IdHTTP1->Request->CustomHeaders->Text.Pos("Cookie:")>0)
IdHTTP1->Request->CustomHeaders->Values["Cookie"]=CookieStr;
else
IdHTTP1->Request->CustomHeaders->Text+="Cookie:"+CookieStr;randomize();
int rndid=random(60);
String tmpid=Userid[rndid]; //Userid[]为全局字符串数组
Memo1->Text=Utf8ToAnsi(IdHTTP1->Get("http://www.example.com/user.php?userid="+tmpid)); //我通过返回的字符串来检索是否在线//--------------------NewCookie事件---------------------------------------------------
void __fastcall TForm1::IdCookieManager1NewCookie(TObject *ASender,
TIdCookieRFC2109 *ACookie, bool &VAccept)
{ int i;
CookieStr=""; //CookieStr为全局字符串变量
for(i=0;i<IdCookieManager1->CookieCollection->Count;i++)
{ CookieStr=CookieStr+IdCookieManager1->CookieCollection->Items[i]->CookieText; }
}
//-----------------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
IdHTTP1->Request->CustomHeaders->Clear();
IdHTTP1->Request->CustomHeaders->Text="Cookie:"+CookieStr;randomize();
int rndid=random(60);
String tmpid=Userid[rndid]; //Userid[]为全局字符串数组
Memo1->Text=Utf8ToAnsi(IdHTTP1->Get("http://www.example.com/user.php?userid="+tmpid)); //我通过返回的字符串来检索是否在线