我利用WebBrowser做一个浏览器。要求能够自动登陆,要求能够自动连接页面。要求能够自动的将页面中的表格中的数据自动保存下来。
自动登陆部分我在http://www.163.com中测试可以通过,但在包含有框架页中就无法实现自动登陆的功能。
下面是困扰我几天的问题,大家看看我的代码问题出在哪个地方。同时希望高手们为我调试一下。
我需要自动登陆的页面 http://stbet.com procedure TForm1.LoginFrameset(document: IHTMLDocument2);
var
index: Integer;
ole_index: OleVariant;
frame_dispatch: IDispatch;
framed: IHTMLWindow2;
obj_user : Olevariant;
obj_pass : Olevariant;
obj_submit : Olevariant;
begin
if document = nil then
exit;
try
for index := 1 to document.Frames.Length do
try
ole_index := index-1;
frame_dispatch := document.Frames.Item(ole_index); obj_user := document.all.item('username',0);
obj_user.value := 'username'; //今后用户名从配置文件中取
obj_pass := document.all.item('passwd',0);
obj_pass.value := '0000'; //今后密码在配置文件中取
obj_submit := document.all.item('Submit2',0);
obj_submit.Click; if frame_dispatch <> nil then
begin
framed := frame_dispatch as IHTMLWindow2;
NavigateFrameset(framed.document);
end;
except
on E: Exception do
begin
end
end;
except
on E: Exception do
begin
Application.MessageBox(PChar(E.Message),
PChar('Exception'));
end;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
LoginFrameset(WebBrowser1.Document as IHTMLDocument2);
end;
自动登陆部分我在http://www.163.com中测试可以通过,但在包含有框架页中就无法实现自动登陆的功能。
下面是困扰我几天的问题,大家看看我的代码问题出在哪个地方。同时希望高手们为我调试一下。
我需要自动登陆的页面 http://stbet.com procedure TForm1.LoginFrameset(document: IHTMLDocument2);
var
index: Integer;
ole_index: OleVariant;
frame_dispatch: IDispatch;
framed: IHTMLWindow2;
obj_user : Olevariant;
obj_pass : Olevariant;
obj_submit : Olevariant;
begin
if document = nil then
exit;
try
for index := 1 to document.Frames.Length do
try
ole_index := index-1;
frame_dispatch := document.Frames.Item(ole_index); obj_user := document.all.item('username',0);
obj_user.value := 'username'; //今后用户名从配置文件中取
obj_pass := document.all.item('passwd',0);
obj_pass.value := '0000'; //今后密码在配置文件中取
obj_submit := document.all.item('Submit2',0);
obj_submit.Click; if frame_dispatch <> nil then
begin
framed := frame_dispatch as IHTMLWindow2;
NavigateFrameset(framed.document);
end;
except
on E: Exception do
begin
end
end;
except
on E: Exception do
begin
Application.MessageBox(PChar(E.Message),
PChar('Exception'));
end;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
LoginFrameset(WebBrowser1.Document as IHTMLDocument2);
end;
URL := WideString('http://www.163.com');
WebBrowser1.Navigate(URL);
谢谢你的参与,你说的这一步我已经在程序中实现了。只是在我提问时没有表述出来。所以还希望你继续指点。
我现在的问题的关键是在框架页中实现自动登录。如果登录页面是一个单独的也面要实现自动登陆是比较方便的。你可以仔细帮我看看LoginFrameset这个函数有什么问题。
URL := WideString('http://www.163.com');
WebBrowser1.Navigate(URL);
我今天又做了很多的测试,http://www.csdn.net,http://www.sina.com.cn等都能够自动登录,唯独(http://stbet.com)这个网站不能自动登录,请各位大侠帮助我解决一下。//窗体激活时自动链接到http://stbet.com
procedure TForm1.FormActivate(Sender: TObject);
begin
WebBrowser1.Navigate('http://stbet.com');
end;//实现自动登录的功能。http://stbet.com的登录页面在框架页中,因此实现代码如下。
procedure TForm1.LoginFrameset(document: IHTMLDocument2);
var
index: Integer;
ole_index: OleVariant;
frame_dispatch: IDispatch;
framed: IHTMLWindow2;
obj_user : Olevariant;
obj_pass : Olevariant;
obj_submit : Olevariant;
webBrowserTemp : IWebBrowser;
documentTemp : IHTMLDocument2;
begin
if document = nil then
exit;
try
for index := 1 to document.Frames.Length do
try
ole_index := index-1;
frame_dispatch := document.Frames.Item(ole_index); obj_user := document.all.item('username',1);
obj_user.value := 'crr1951'; //今后用户名从配置文件中取
obj_pass := document.all.item('passwd',0);
obj_pass.value := '0000'; //今后密码在配置文件中取
obj_submit := document.all.item('Submit2',0);
obj_submit.Click; if frame_dispatch <> nil then
begin
framed := frame_dispatch as IHTMLWindow2;
LoginFrameset(framed.document);
end;
except
on E: Exception do
begin
end
end;
except
on E: Exception do
begin
Application.MessageBox(PChar(E.Message),
PChar('Exception'));
end;
end;
end;//通过一个按钮来触发自动登录。因为功能需求处于预研阶段,所以通过点击按钮来进行
procedure TForm1.Button1Click(Sender: TObject);
begin
LoginFrameset(WebBrowser1.Document as IHTMLDocument2);
end;
obj_user.value := 'crr1951'; //今后用户名从配置文件中取
obj_pass := document.all.item('passwd',0);
obj_pass.value := '0000'; //今后密码在配置文件中取
obj_submit := document.all.item('Submit2',0);
obj_submit.Click;showmessage((string)obj_user) 看看有值没,没值就是网页的格式根本没取到
那就没什么好方法呀,其实你可以跳过主页,只要他传
httP://www.1643.com&?12
http://stbet.com/checkuser.php?username=1212121&password=121212
你取值不就行了,干嘛那么复杂呢?
obj_user.value := 'crr1951'; //今后用户名从配置文件中取obj_user的值没有取到,因为执行到obj_user.value := 'crr1951'就出异常了。
你说的http://stbet.com/checkuser.php?username=1212121&password=121212这种方式我试了,但怎么不行,http://stbet.com/checkuser.php?username=1212121&passwd=121212链接无法打开的。
我写了一段测试代码,将框架页中的所有页面的源码截取出来,是正确的。大家也可以看看这段测试代码。
procedure TForm1.NavigateFrameset(document: IHTMLDocument2);
var
index: Integer;
ole_index: OleVariant;
frame_dispatch: IDispatch;
framed: IHTMLWindow2;
begin
if document = nil then
exit;
try
Memo1.Lines.Add(String(document.body.innerHTML));
Memo1.Lines.Add(String(document.URL)); for index := 1 to document.Frames.Length do
try
Memo1.Lines.Add('This is Frames: ' + inttostr(index));
ole_index := index-1;
frame_dispatch := document.Frames.Item(ole_index); if frame_dispatch <> nil then
begin
framed := frame_dispatch as IHTMLWindow2;
NavigateFrameset(framed.document);
end;
except
on E: Exception do
begin
end
end;
except
on E: Exception do
begin
Application.MessageBox(PChar(E.Message),
PChar('Exception'));
end;
end;
end;
username='这里输入EDIT1.TEXT的值'&passwd='这里输入EDIT2.TEXT'的值实际上就是
edit1.text = 'admin'
edit2.text = 'abcd'
url := 'http://stbet.com/checkuser.php?username' + edit1.text + '&' passwd = edit2.text
http://stbet.com/checkuser.php?username=admin&passwd=abcdcheckusr.php //PHP我不熟悉,写伪代码
a = params('username')
B = Params('passwd')后面就可以用PHP处理了
谢谢你的关注,但我对php也不熟悉,一直没有做这方面的开发,现在要弄起来真困难。你能否帮我些一个这样的脚本,我现在还不理解的是php文件的运行环境是什么。是不是需要在应用服务器上。
var
SList: TStringList;
PostStr: String;
i: Integer;
PostData,Headers: OleVariant;
begin
SList := TStringList.Create;
try
SList.Add('http://stbet.com/app/member/login.php');
PostStr := 'username=' + 'crr1951';
PostStr := PostStr + '&passwd=' + '0000';
PostStr := PostStr + '&uid=' + '85814c0';
PostStr := PostStr + '&langx=' + 'zh-tw'; Headers := 'Content-Type: application/x-www-form-urlencoded'+ #10#13;
PostData := VarArrayCreate([0, Length(PostStr)-1], varByte);
for i := 0 to Length(PostStr)-1 do begin
PostData[i] := Ord(PostStr[i+1]);
end;
WebBrowser1.Navigate(SList.Strings[0],EmptyParam,EmptyParam,PostData,Headers);
finally
SList.Free;
end;
end;
谢谢你的解答,不过这个网站里面的页面都是框架页,用你的方法确实可以登录进去,但进去后报错。页面脚本发生错误。错误原因是“top.ST_mem_index为空或者不是对象”。你觉得我能否利用WebBrowser控件获取框架页面中的子页面中的对象,通过对编辑框赋值,在通过触发提交按钮的点击事件进入。这样可能我的问题就可以得到解决了。因为后面的工作我还要继续对框架也中的页面进行自动的访问。