我试图登录到一个网站通过德尔菲/印第。目前,我只有一个按钮(用来发送密码/用户名),它调用这个过程。
procedure TForm5.Login(name: string; Pass: string);
var
UserID :string;
Password :string;
res :TStringStream;
details :Tstringlist;
multiformupload: TIdMultiPartFormDataStream;
begin
//create ini file to hold password / usesr name
UserID:=name;
Password:=pass;
Res := TStringStream.Create();
MultiFormUpload := TIdMultiPartFormDataStream.Create;
MultiFormUpload.AddFormField('user',UserID);
MultiformUpload.AddFormField('pass',Password);
idhttp1.Request.ContentType := '8bit';
//idhttp1.Get('http://codeelf.com',res);
idhttp1.Post('http://codeelf.com/games/the-grid-2/grid',Multiformupload,res);
memo1.Lines.LoadFromStream(res);
res.Free;
end;当我看网站代码时,我有这个。
<form id="gridForm" action="" method="post" onsubmit="return checkLoginForm()">
<table align="left" border="0" cellspacing="2" cellpadding="2">
<tr>
<td align="left" id="my_username">Username:</td>
<td align="right"><input type="text" id="user" name="user" maxlength="12" autocomplete="off" /></td>
</tr>
<tr>
<td align="left" id="my_password">Password:</td>
<td align="right"><input type="password" id="pass" name="pass" maxlength="20" /></td>
</tr>
<tr>
<td colspan="2" align="right">
</td>
</tr>
<tr>
<td colspan="2" align="right">
<input id="submission" type="submit" class="button" name="sublogin" value="Login" /></td>
</tr>所以提交按钮值只是登录。因此,我不知道在哪里张贴数据。我怎么才能找到这个?一旦我找到了url,我就可以将它添加到idhttp1.Post中了,对吗?
发布于 2014-07-09 18:31:11
您的代码有几个问题:
name和id值。有些服务器需要该按钮值。TIdHTTP.Request.ContentType设置为无效值。但是,TIdHTTP.Post(TIdMultipartFormDataStream)会忽略用户提供的ContentType,而使用TIdMultipartFormDataStream.RequestContentType属性。因此,这不会影响您的登录,但它仍然是您的代码中的一个缺陷。TMemo中时,您忽略了响应的字符集。您应该使用重载版本的TIdHTTP.Post(),该版本返回String并将其分配给TMemo.Text属性。让TIdHTTP为您处理字符集解码。TIdMultipartFormDataStream对象。试试这个:
procedure TForm5.Login(name: string; Pass: string);
var
MultiFormUpload: TIdMultiPartFormDataStream;
begin
MultiFormUpload := TIdMultiPartFormDataStream.Create;
try
MultiFormUpload.AddFormField('user', name);
MultiFormUpload.AddFormField('pass', pass);
MultiFormUpload.AddFormField('sublogin', 'Login');
//IdHTTP1.Get('http://codeelf.com');
Memo1.Text := IdHTTP1.Post('http://codeelf.com/games/the-grid-2/grid', MultiFormUpload);
finally
MultiFormUpload.Free;
end;
end;尽管如此,有些服务器在客户机请求登录页面时向它发送cookie,然后需要将这些cookie作为登录过程的一部分发送回来。如果投递到登录URL本身不起作用,请尝试首先检索登录页面,然后发布登录凭据,让TIdHTTP为您处理cookies:
procedure TForm5.Login(name: string; Pass: string);
var
MultiFormUpload: TIdMultiPartFormDataStream;
begin
MultiFormUpload := TIdMultiPartFormDataStream.Create;
try
MultiFormUpload.AddFormField('user', name);
MultiFormUpload.AddFormField('pass', pass);
MultiFormUpload.AddFormField('sublogin', 'Login');
IdHTTP1.Get('http://codeelf.com/games/the-grid-2/grid', TStream(nil));
Memo1.Text := IdHTTP1.Post('http://codeelf.com/games/the-grid-2/grid', MultiFormUpload);
finally
MultiFormUpload.Free;
end;
end;更新:原始代码还有另一个问题。HTML表单一开始并不要求发布multipart/form-data帖子,因此TIdMultipartFormDataStream是使用的错误类。使用TStringList代替,这样TIdHTTP.Post()就会发送一个application/x-www-form-urlencoded帖子:
procedure TForm5.Login(name: string; Pass: string);
var
Params: TStringList;
begin
Params := TStringList.Create;
try
Params.Add('user='+name);
Params.Add('pass='+pass);
Params.Add('sublogin=Login');
//IdHTTP1.Get('http://codeelf.com');
Memo1.Text := IdHTTP1.Post('http://codeelf.com/games/the-grid-2/grid', Params);
finally
Params.Free;
end;
end;发布于 2014-07-09 09:09:12
当action属性为空时,POST必须转到检索HTML页面的同一个URL。
根据服务器的不同,成功的登录将将cookie发送回客户端,这些客户端需要包含在下一个请求中。
如果分析与Firebug或HTTP代理工具(如Fiddler )之间的浏览器/客户端通信,是否使用了cookies。
如果服务器使用代理,则需要向客户端代码添加cookie支持。Indy透明地支持HTTP (TIdCookieManager)。
https://stackoverflow.com/questions/24646725
复制相似问题