我用idhttp.post(postURL,Fpost,res);
为什么不行?
postURL是论坛的回复提交页面
Fpost的参数如何取得?又如何设置?谢谢

解决方案 »

  1.   

    首先要在uses中引用mshtml单元.  代码及分析如下: varhform:IHTMLFormelement;hdoc:ihtmldocument2;hall:ihtmlelementcollection;Hinput:IHTMLinputelement;iw:iwebbrowser2;hlen,tmploop:integer;vk:oleVariant;dispatch:Idispatch;beginif Assigned(webbrowse1) then ///保证网页里有内容;即已经打开一个网页!beginhdoc:=webbrowse1.document as ihtmldocument2;hall:=hdoc.get_all;hlen:=hall.get_length;////以上几步的操作为:将浏览器控件里的内容赋给hdoc.取其所有标识,并算出总数;////下面的操作为:按总数循环找到用户名和密码的edit;并赋值;for tmploop:=0 to hlen-1 dobeginvk:=tmploop;dispatch:=hall.item(vk,0);if succeeded(Dispatch.QueryInterface(IHTMLInputelement,hinput)) then///如果此标识是一个edit控件…..begin ////下面这里的uppercase是必需的!防止因大小写的不同而判断失误!///下面的"TEXT"是由网页里的内容来确定的.也就是说你要判断就必需根据具体网页代码来!///密码框和用户名处是一样的!if uppercase(hinput.Type_)='TEXT' then hinput.value:='tresss'else if uppercase(hinput.type_)='PASSWORD' then hinput.value:='tresss';end;if succeeded(dispatch.QueryInterface(IHTMLFormElement,hform)) and (uppercase(hform.name)='THEFORM') 
    then///此处是form提交.如果从html发现只有一个form的话那第二个条件是非必需的!///而且也不一定要判断name属性,也可以根据其它属性来判断.Hform.submit;end; ////for end;end; //if end;end; 到此,,一个自动登陆的例子就作好了..如果要实现灌水的话,,可以将hinput:ihtmlinputelement换成htext:ihtmltextareaelement,也就相当于memo控件.将用户名的赋值换成是发言的赋值就好;当然这里还可以换成是其它的,如单选等…具体内容可以查看mshtml里的列表! 
      

  2.   

    谢谢!
    不过我想用idhttp实现 怎么处理呢?
      

  3.   

    我不知道我编写的是否已经登陆 如何知道呢?
        IdHttp1.Get(BaseURL+'login.asp');
        Params.Add('username='+UserName);
        Params.Add('password='+Password);
        Params.Add('CookieDate='+InttoStr(CookieNone));
        Params.Add('userhidden='+InttoStr(UserNormal));
        Params.Add('comeurl='+BASEURL+'index.asp');
        HTML:=IdHttp1.Post(BaseURL+'login.asp?action=chk',Params);
        showmessage(HTML);
        if Pos(BASEURL+'index.asp',HTML)=0 then
        begin
          ShowMessage('登录失败');
          Exit;
        end;
      

  4.   

    我也有类似的想法.
     有人告诉我用idhttp可以。主要是HTTP头的问题。
      

  5.   

    这个我做过,主要是要先读网页的源代码,分析出需要的参数,然后模拟提交就可以了。如:
    登录:
      URL := 'http://bbs.*****.com/logging.php';
      ParamList.Clear;
      ParamList.Add('action=login');
      ParamList.Add('formhash=3bd8bc0a');
      ParamList.Add('referer=main.php');
      ParamList.Add('loginfield=username');
      ParamList.Add('username=' + Trim(EdtUserName.Text));  // 帐号
      ParamList.Add('password=' + Trim(EdtPasWrd.Text)); //
      ParamList.Add('questionid=0');
      ParamList.Add('answer=');
      ParamList.Add('cookietime=315360000');  
      ParamList.Add('loginmode=normal');
      ParamList.Add('styleid=1');
      ParamList.Add('loginsubmit=提   交');
      MemoRunInfo.Lines.Add('尝试登录.....');
      Application.ProcessMessages;
      try
        aStrList.Text := IdHTTP1.Post(URL,ParamList);
      except
        aStrList.Text := 'Error!';
      end;
      if Pos(aStrList.Text,UpperCase(Trim(EdtUserName.Text))) > 0 then
        MemoRunInfo.Lines.Add('登录成功!');
    ........回帖:
      MemoRunInfo.Lines.Add('尝试回复 帖子.....');
      URL := 'http://bbs.******.com/post.php';
      ParamList.Clear;
      ParamList.Add('action=reply');
      ParamList.Add('fid=13');
      ParamList.Add('tid=9046');
      ParamList.Add('extra=page%3D1');
      ParamList.Add('formhash=da3a8b23');
      ParamList.Add('subject=' + Sbj);//回帖标题
      ParamList.Add('parseurloff=1');
      ParamList.Add('smileyoff=1');
      ParamList.Add('bbcodeoff=1');
      ParamList.Add('usesig=1');
      ParamList.Add('emailnotify=1');
      ParamList.Add('message=' + Msg); //回帖内容
      ParamList.Add('replysubmit=发表回复');
      ParamList.Add('wysiwyg=0');
      ParamList.Add('fid=13');
      try
        aStrList.Text := IdHTTP1.Post(URL,ParamList);
      except
      end;
      if VerifyRel(aStrList,'非常感谢,您的回复已经发布') then
        MemoRunInfo.Lines.Add('回贴成功!');这些参数有的是固定的,有的需要从网页源文件里面去即时分析出来。
      

  6.   

    没有验证码的简单如下
    var
    o : Olevariant;
    begin
    o := WebBrowser.OleObject.document.all.item('LoginUserID',0);   //找到登录用户名的输入框
    o.value := 'TEST';
    o := WebBrowser.oleobject.document.all.item('LoginPassword',0); //找到登录密码的输入框
    o.value := 'TEST'
    WebBrowser.oleobject.document.Forms.Item(0, 0).submit;          //第一个表单提交
    {
    o :=WebBrowser.oleobject.document.all.item('Login',0);          //或者用指定表单名称提交
    o.Click;  //点击操作,对其它对象也可同样操作
    }
    end;
    有验证码的要用到验证码识别...,而且每一种还不一样,所以基本写不出通用的