首先要在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里的列表!
谢谢! 不过我想用idhttp实现 怎么处理呢?
我不知道我编写的是否已经登陆 如何知道呢? 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;
then///此处是form提交.如果从html发现只有一个form的话那第二个条件是非必需的!///而且也不一定要判断name属性,也可以根据其它属性来判断.Hform.submit;end; ////for end;end; //if end;end; 到此,,一个自动登陆的例子就作好了..如果要实现灌水的话,,可以将hinput:ihtmlinputelement换成htext:ihtmltextareaelement,也就相当于memo控件.将用户名的赋值换成是发言的赋值就好;当然这里还可以换成是其它的,如单选等…具体内容可以查看mshtml里的列表!
不过我想用idhttp实现 怎么处理呢?
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;
有人告诉我用idhttp可以。主要是HTTP头的问题。
登录:
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('回贴成功!');这些参数有的是固定的,有的需要从网页源文件里面去即时分析出来。
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;
有验证码的要用到验证码识别...,而且每一种还不一样,所以基本写不出通用的