首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用idhttp登录网站

使用idhttp登录网站
EN

Stack Overflow用户
提问于 2014-07-09 06:27:26
回答 2查看 2.9K关注 0票数 0

我试图登录到一个网站通过德尔菲/印第。目前,我只有一个按钮(用来发送密码/用户名),它调用这个过程。

代码语言:javascript
复制
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;

当我看网站代码时,我有这个。

代码语言:javascript
复制
 <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">
              &nbsp;</td>
         </tr>
         <tr>
            <td colspan="2" align="right">
               <input id="submission" type="submit" class="button" name="sublogin" value="Login" /></td>
         </tr>

所以提交按钮值只是登录。因此,我不知道在哪里张贴数据。我怎么才能找到这个?一旦我找到了url,我就可以将它添加到idhttp1.Post中了,对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-09 18:31:11

您的代码有几个问题:

  1. 您没有提交登录表单中的所有内容。你必须这样做。这包括登录按钮本身的值,因为它分配了nameid值。有些服务器需要该按钮值。
  2. 您正在将TIdHTTP.Request.ContentType设置为无效值。但是,TIdHTTP.Post(TIdMultipartFormDataStream)会忽略用户提供的ContentType,而使用TIdMultipartFormDataStream.RequestContentType属性。因此,这不会影响您的登录,但它仍然是您的代码中的一个缺陷。
  3. 在将响应数据加载到TMemo中时,您忽略了响应的字符集。您应该使用重载版本的TIdHTTP.Post(),该版本返回String并将其分配给TMemo.Text属性。让TIdHTTP为您处理字符集解码。
  4. 您正在泄漏TIdMultipartFormDataStream对象。

试试这个:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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帖子:

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2014-07-09 09:09:12

当action属性为空时,POST必须转到检索HTML页面的同一个URL。

根据服务器的不同,成功的登录将将cookie发送回客户端,这些客户端需要包含在下一个请求中。

如果分析与Firebug或HTTP代理工具(如Fiddler )之间的浏览器/客户端通信,是否使用了cookies。

如果服务器使用代理,则需要向客户端代码添加cookie支持。Indy透明地支持HTTP (TIdCookieManager)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24646725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档