WebBrowser中比较棘手的问题(自动登录),请各位指点,一定高分

solly 2004-10-10 09:20:08
我利用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;

...全文
295 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cronuz 2004-10-12
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
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;
solly 2004-10-12
  • 打赏
  • 举报
回复
cronuz(cronus)
谢谢你的解答,不过这个网站里面的页面都是框架页,用你的方法确实可以登录进去,但进去后报错。页面脚本发生错误。错误原因是“top.ST_mem_index为空或者不是对象”。你觉得我能否利用WebBrowser控件获取框架页面中的子页面中的对象,通过对编辑框赋值,在通过触发提交按钮的点击事件进入。这样可能我的问题就可以得到解决了。因为后面的工作我还要继续对框架也中的页面进行自动的访问。
solly 2004-10-11
  • 打赏
  • 举报
回复
masterjames(james)
谢谢你的关注,但我对php也不熟悉,一直没有做这方面的开发,现在要弄起来真困难。你能否帮我些一个这样的脚本,我现在还不理解的是php文件的运行环境是什么。是不是需要在应用服务器上。
masterjames 2004-10-11
  • 打赏
  • 举报
回复
自己写个 checkuser.php
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=abcd

checkusr.php //PHP我不熟悉,写伪代码
a = params('username')
B = Params('passwd')

后面就可以用PHP处理了




zwb666 2004-10-10
  • 打赏
  • 举报
回复
在Form.onshow 里添加
URL := WideString('http://www.163.com');
WebBrowser1.Navigate(URL);
solly 2004-10-10
  • 打赏
  • 举报
回复
我原来也试过通过取值的方式来链接,但一直不行,所以我采用了现在的这种方式,但现在的这种方式还是无法取到obj_user等对象。
我写了一段测试代码,将框架页中的所有页面的源码截取出来,是正确的。大家也可以看看这段测试代码。
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;
solly 2004-10-10
  • 打赏
  • 举报
回复
obj_user := document.all.item('username',1);
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链接无法打开的。
masterjames 2004-10-10
  • 打赏
  • 举报
回复
只要他传
http://stbet.com/checkuser.php?username=1212121&password=121212
你取值不就行了,干嘛那么复杂呢?
masterjames 2004-10-10
  • 打赏
  • 举报
回复
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;

showmessage((string)obj_user) 看看有值没,没值就是网页的格式根本没取到
那就没什么好方法呀,其实你可以跳过主页,只要他传
httP://www.1643.com&?12
solly 2004-10-10
  • 打赏
  • 举报
回复
zhangheaaa(竹)
谢谢你的参与,你说的这一步我已经在程序中实现了。只是在我提问时没有表述出来。所以还希望你继续指点。
我现在的问题的关键是在框架页中实现自动登录。如果登录页面是一个单独的也面要实现自动登陆是比较方便的。你可以仔细帮我看看LoginFrameset这个函数有什么问题。
zhangheaaa 2004-10-10
  • 打赏
  • 举报
回复
如何在TWebBrowser中设置默认的主页阿,如果打开则自动登录到这个主页上去?

在Form.onshow 里添加
URL := WideString('http://www.163.com');
WebBrowser1.Navigate(URL);
solly 2004-10-10
  • 打赏
  • 举报
回复
我重新说明一下我的问题,希望大家仔细帮我看看怎么实现这个网站的自动登录。
我今天又做了很多的测试,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;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧