delphi7中idhttp接收与提交cookie的问题(200分)

  • 主题发起人 主题发起人 yannqi
  • 开始时间 开始时间
Y

yannqi

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用idhttp连接一个接收cookie的站点,例如一个支持cookie的论坛。
连接后代码中应该包含cookie中的信息,我指定了AllowCookies为true,还要怎么作才能将cookie发送给服务器呢?

谁有源代码,帮帮我!!!!!!!!!!!!
 
下面是简单的介绍:
首先在Form上放idHttp, IdCookieManager,并将两者联系在一起
(通过idHttp的CookieManager),剩下的 你就专心实现你要完成
的东西就可以啦。
不知道你玩过KOK没有,下面的代码是登陆KOK注册页面的部分代码:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, IdCookieManager, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

type
TForm1 = class(TForm)
http: TIdHTTP;
CookieMngr: TIdCookieManager;
edtUserName: TLabeledEdit;
edtPassword: TLabeledEdit;
btnLogin: TButton;
Cookies: TMemo;
Memo1: TMemo;
btnInfor: TButton;
Button1: TButton;
edtSN: TLabeledEdit;
procedure btnLoginClick(Sender: TObject);
procedure btnInforClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

//这个函数是登陆页面,
procedure TForm1.btnLoginClick(Sender: TObject);
var
s, s1: TStringStream;
i: Integer;
begin
s := TStringStream.Create('');
s1 := TStringStream.Create('');
try
//{
s.WriteString('action=LOGIN&gameSelect=gkk&');
s.WriteString('acct=' + edtUserName.Text + '&');
s.WriteString('pwd=' + edtPassword.Text);
http.Request.ContentType := 'application/x-www-form-urlencoded';

try
http.Post('http://register.kok.com.cn/billing/servlet/walletServlet', s, s1)
except
http.Get(http.Response.Location, s1);
end;
//}
Memo1.Lines.Text := s1.DataString;
//下面的是显示cookies信息的代码
Cookies.Clear;
for i := 0 to CookieMngr.CookieCollection.Count - 1 do
Cookies.Lines.Add(CookieMngr.CookieCollection.Items.CookieText);
finally
s.Free;
s1.Free;
end;

end;
//这是KOK注册页面中,显示帐户信息的函数
procedure TForm1.btnInforClick(Sender: TObject);
var
s, s1: TStringStream;
i: Integer;
begin
{
<form action=../servlet/walletServlet method=post>
<input type=submit value="修改个人资料">
<input type=hidden name=action value=INFO>
</form>
}

s := TStringStream.Create('');
s1 := TStringStream.Create('');
try
s.WriteString('action=INFO');
http.Request.ContentType := 'application/x-www-form-urlencoded';
try
http.Post('http://register.kok.com.cn/billing/servlet/walletServlet', s, s1)
except
http.Get(http.Response.Location, s1);
end;
Memo1.Lines.Text := s1.DataString;
Cookies.Clear;
for i := 0 to CookieMngr.CookieCollection.Count - 1 do
Cookies.Lines.Add(CookieMngr.CookieCollection.Items.CookieText);
finally
s.Free;
s1.Free;
end;

end;

end.
 
to:andy263

我按照你的代码访问我的一个asp网页好像不行!

KOK我没有玩过,能否给个登录某个asp的cookie的论坛的例子,如asp动网先锋的论坛。

谢谢!
 
procedure TForm1.Button1Click(Sender: TObject);
const
DFW_LOGIN_URL = 'http://www.delphibbs.com/delphibbs/chkuser.asp';
UserName = '你的用户名';
Password = '你的密码'; //晕,刚才把密码写出来了,得改一下了
var
Params: TStrings;
HTML: String;
begin
Params:=TStringList.Create;
try
Params.Add('URL='+'/delphibbs/collections.asp');
//登录成功后跳转到的URL,这里直接转到"我收藏的问题"
Params.Add('QUERY_STRING='); //登录成功后跳转URL的参数
Params.Add('txtName='+UserName);
Params.Add('txtPass='+Password);
//Params.Add('chkSave='); //是否记住我的密码

IdHttp.HandleRedirects:=True;
HTML:=IdHttp.Post(DFW_LOGIN_URL,Params);
if Pos('<USER Name="" />',HTML)>0 then
ShowMessage('登录失败!') //登录失败则用户名为空
else
ShowMessage('登录成功!');
//分析HTML,取出每一条收藏贴子的URL,下载保存
finally
Params.Free;
end;
end;
 
to:andy263
您上面的程序是通过querystring传递的参数
 
搞了几天,终于有了点眉目,以下是我登录一个asp站点的delphi程序,使用了IDHttp控件和IDCookieManager控件,在delphi7(带indy9)+win2k pro调试通过。

有不当之处请指正,如转载请注明作者:yannqi。

1、网站asp程序:
判断如果有cookie显示用户名和邮件;如果没有将获得的用户名和邮件写入cookie。
<%
if (request.Cookies("name")="" or request.Cookies("email")="") then

Response.Cookies("name") = request("name")
Response.Cookies("email") = request("email")
Response.write(request("name")+","+request("email")+",写入cookie")
else
Response.write("Name:"+request.Cookies("name"))
Response.write("<br/>email:"+request.Cookies("email"))
end if
%>

2、delphi form
object Form1: TForm1
Left = 258
Top = 154
Width = 650
Height = 388
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object btnLogin: TButton
Left = 256
Top = 24
Width = 75
Height = 25
Caption = '提交'
TabOrder = 0
OnClick = btnLoginClick
end
object edtUserName: TLabeledEdit
Left = 0
Top = 24
Width = 121
Height = 21
EditLabel.Width = 50
EditLabel.Height = 13
EditLabel.Caption = 'UserName'
TabOrder = 1
Text = 'yannqi'
end
object edtPassword: TLabeledEdit
Left = 128
Top = 24
Width = 121
Height = 21
EditLabel.Width = 25
EditLabel.Height = 13
EditLabel.Caption = 'Email'
TabOrder = 2
Text = 'xayahe@163.com'
end
object Memo1: TMemo
Left = 312
Top = 64
Width = 321
Height = 281
Lines.Strings = (
'Memo1')
TabOrder = 3
end
object Cookies: TMemo
Left = 8
Top = 64
Width = 297
Height = 281
Lines.Strings = (
'Cookies')
TabOrder = 4
end
object btnInfor: TButton
Left = 336
Top = 24
Width = 75
Height = 25
Caption = '测试'
TabOrder = 5
OnClick = btnInforClick
end
object Button3: TButton
Left = 416
Top = 24
Width = 43
Height = 25
Caption = '清空'
TabOrder = 6
OnClick = Button3Click
end
object http: TIdHTTP
MaxLineAction = maException
ReadTimeout = 0
AllowCookies = False
ProxyParams.BasicAuthentication = False
ProxyParams.ProxyPort = 0
Request.ContentLength = -1
Request.ContentRangeEnd = 0
Request.ContentRangeStart = 0
Request.ContentType = 'text/html'
Request.Accept = 'text/html, */*'
Request.BasicAuthentication = False
Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
HTTPOptions = [hoForceEncodeParams]
CookieManager = CookieMngr
Left = 120
Top = 96
end
object CookieMngr: TIdCookieManager
Left = 152
Top = 96
end
end

3、unit1。pas
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, IdCookieManager, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

type
TForm1 = class(TForm)
http: TIdHTTP;
CookieMngr: TIdCookieManager;
edtUserName: TLabeledEdit;
edtPassword: TLabeledEdit;
btnLogin: TButton;
Cookies: TMemo;
Memo1: TMemo;
btnInfor: TButton;
Button3: TButton;
procedure btnLoginClick(Sender: TObject);
procedure btnInforClick(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.btnLoginClick(Sender: TObject);
var
s, s1: TStringStream;
i: Integer;
begin
s := TStringStream.Create('');
s1 := TStringStream.Create('');
try
s.WriteString('name=' + edtUserName.Text + '&');
s.WriteString('email=' + edtPassword.Text);
http.Request.ContentType := 'application/x-www-form-urlencoded';

try
http.Post('http://localhost/cookietest.asp', s, s1)
except
http.Get(http.Response.Location, s1);
end;
//}
Memo1.Lines.Text := s1.DataString;
//下面的是显示cookies信息的代码
Cookies.Clear;
Cookies.Lines.Add(inttostr(CookieMngr.CookieCollection.Count));
for i := 0 to CookieMngr.CookieCollection.Count - 1 do
Cookies.Lines.Add(CookieMngr.CookieCollection.Items.CookieText);
finally
s.Free;
s1.Free;
end;

end;

procedure TForm1.btnInforClick(Sender: TObject);
var
s, s1: TStringStream;
i: Integer;
begin
s := TStringStream.Create('');
s1 := TStringStream.Create('');
try
http.Request.ContentType := 'application/x-www';
http.AllowCookies:=true;
try
http.Post('http://localhost/cookietest.asp', s, s1)
except
http.Get(http.Response.Location, s1);
end;
Memo1.Lines.Text := s1.DataString;
Cookies.Clear;
for i := 0 to CookieMngr.CookieCollection.Count - 1 do
Cookies.Lines.Add(CookieMngr.CookieCollection.Items.CookieText);
finally
s.Free;
s1.Free;
end;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
cookies.Clear;
Memo1.Clear;
end;

end.
 
接受答案了.
 
后退
顶部