您的位置:程序门 -> delphi -> 网络通信/分布式开发



关于用程序控制论坛回复(类似与论坛灌水机)如何用idhttp提交表单? 跪谢!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于用程序控制论坛回复(类似与论坛灌水机)如何用idhttp提交表单? 跪谢![无满意答案结贴,结贴人:flychenrj072]
发表于:2007-02-26 17:42:43 楼主
我用idhttp.post(posturl,fpost,res);
为什么不行?
posturl是论坛的回复提交页面
fpost的参数如何取得?又如何设置?谢谢
发表于:2007-02-27 12:48:221楼 得分:0
首先要在uses中引用mshtml单元.  

 

代码及分析如下:

 

var

hform:ihtmlformelement;

hdoc:ihtmldocument2;

hall:ihtmlelementcollection;

hinput:ihtmlinputelement;

iw:iwebbrowser2;

hlen,tmploop:integer;

vk:olevariant;

dispatch:idispatch;

begin

if   assigned(webbrowse1)   then   ///保证网页里有内容;即已经打开一个网页!

begin

hdoc:=webbrowse1.document   as   ihtmldocument2;

hall:=hdoc.get_all;

hlen:=hall.get_length;

////以上几步的操作为:将浏览器控件里的内容赋给hdoc.取其所有标识,并算出总数;

////下面的操作为:按总数循环找到用户名和密码的edit;并赋值;

for   tmploop:=0   to   hlen-1   do

begin

vk:=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里的列表!

 
发表于:2007-02-27 13:22:302楼 得分:0
谢谢!
不过我想用idhttp实现   怎么处理呢?
发表于:2007-02-27 13:23:083楼 得分:0
我不知道我编写的是否已经登陆   如何知道呢?
        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;
发表于:2007-07-10 11:42:354楼 得分:0
我也有类似的想法.
  有人告诉我用idhttp可以。主要是http头的问题。
发表于:2007-07-12 15:41:465楼 得分:0
这个我做过,主要是要先读网页的源代码,分析出需要的参数,然后模拟提交就可以了。如:
登录:
    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( '回贴成功! ');

这些参数有的是固定的,有的需要从网页源文件里面去即时分析出来。


发表于:2007-07-14 16:48:516楼 得分:0
怎么讲的多。没有做出来研究下的啊。
发表于:2007-07-17 14:53:227楼 得分:0
没有验证码的简单

如下
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;


有验证码的要用到验证码识别...,而且每一种还不一样,所以基本写不出通用的


快速检索

最新资讯
热门点击