如何用程序实现网站的用户登录(200分)

  • 主题发起人 主题发起人 whj2000
  • 开始时间 开始时间
W

whj2000

Unregistered / Unconfirmed
GUEST, unregistred user!
事先输入用户名和密码,以及需要登录的网页地址,
用程序去登录。请问如何实现。
允许再设置一些针对性的其它的参数,只是要求操作比较方便。
 
用delphi下的web编程用webmodule
 
查看那些登陆网址的URL你会发现他们通常是这样的字符串:www.website.com?wdef?112123
其中?代表其后面是参数,因此比如你的用户名是ddeerr,而密码是77678,登录的网站是
www.wtom.com,则可以在程序中直接用
shellexecute(handle,'open','http://www.wtom.com?ddeerr?77678',nil,nil,SW_SHOW);
就可以了!
 
yvtong能说得在详细一点吗?

only you好像考虑得太简单了,登录页面上的表单通常不止一个,登录的参数除了
用户名和密码可能还有别的,我记得字符串的格式
好像是www.website.com?username=wdef&password=112123形式的,可能更复杂,
我要求程序有较好的通用性,但可以事先用一个不太复杂的操作配置以下,如将
登录用的url及其参数记录下来。

请各位高手多多指点,有急用,万分感谢。
 
用Socket连接网站,放松Get/POST ... HTTP/1.1 +两个回车
再接受数据。
 
先写一个跟你要登陆的页面相同的页面,放在本地,设置好你自己的参数后,
用TWebBrowser.Navigator('file://yourfile.htm');
然后查找你要按下的按钮,Click就可以了。怎么查找这个Button,以前很多
关于TWebBrowser的讨论中都有了。
 
post好象不太管事。特别是那种要提交form的。
javascript那么方便,不用考虑太多http什么的,何苦不用呢?
我的做法是这样的:首先知道要登陆的cgi,知道需要提交的input的name。
写一个javascript只需要

function login()
{
loginformname.submit();
}

在body标签里加上:onload=“login()”

保存为 temp.html 或 放在memo里savetofile(temp.html)过后删除。

再用:shellexecute(handle,'open',‘temp.html’,nil,nil,SW_SHOW);

发分吧。

 
抱歉,我对delphi还不是很熟,所以对各位的提示不太理解,能否说得再详细一点,
另外需要说明的是,我需要的是一个通用的程序,也就是说,通过图形界面修改参数后
能够登录不同的网站,而不能针对一个特定的网站来写程序,同时要求参数设置的方法
尽量简单,因为使用的人对技术不了解。
 
登录后大多数都是使用cookie来表明后面访问的页面,你要处理cookie,特别是asp
 
从来都是:

<h1>好用不通用,通用不好用!</h1>

又要好用又要通用,世上哪有这么好的事情???
要具体问题具体分析。
 
那有没有“通用不好用”的方法。
请大虾指点一下,我快急死了。
 
这个问题我也想过
不过也还不是很熟悉

大致因该是这样的:
根据网站页面的源代码,找出登陆程序的cgi(php,etc),参数的name,比如
username,password,然后可以用nmhttp使用post方法
发送的data 为 'username=fsafasdfa&password=*********** '
但是要处理cookie
 
这么好做的东西很麻烦么?
截获http头(为了截获cookie和其他数据)
将date用nmurl打包(就是encode)
根据date长度更改content length
用clientsocket连接服务器并且发出修改过的http包
接受成功信息

我原来作了一个搜狐自动登陆器就是这么作的
可以大批量进行网站登陆
只用了一天时间就做好了。
你可以参看rfc的http协议

 
to: timerri
能把你登陆器源码发一个给我吗?
我好好研究一下

多谢了
 
主要代码,我这是跟数据库联接的东西(做得太早,编码很乱,但是应该能让人看懂)
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DBCtrls, Db, Grids, DBGrids, ADODB, ExtCtrls, StdCtrls, NMURL, ScktComp;

type
TForm1 = class(TForm)
ADOQuery1: TADOQuery;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Button1: TButton;
url: TNMURL;
Memo1: TMemo;
ClientSocket1: TClientSocket;
Edit3: TEdit;
Label3: TLabel;
Button2: TButton;
Edit4: TEdit;
Label4: TLabel;
ComboBox1: TComboBox;
Label5: TLabel;
ComboBox2: TComboBox;
Edit5: TEdit;
Label6: TLabel;
Edit6: TEdit;
Label7: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
adoquery1.close;
adoquery1.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=True;Data Source='+edit4.text;
adoquery1.SQL.Text :='select * from 文章 where 日期>=#'+edit1.text+'# and 日期<=#'+edit2.text+'#';

adoquery1.Open;
end;

procedure TForm1.FormCreate(Sender: TObject);
var ttt:textfile;a,b:string;
begin
edit1.text:=datetostr(date());
edit2.text:=edit1.text;
assignfile(ttt,'栏目分类.txt');
reset(ttt);
while not eof(ttt) do
begin
readln(ttt,a);
readln(ttt,b);
combobox1.Items.Add (b);
combobox2.items.add(a);

end;
combobox1.ItemIndex :=8;
combobox2.ItemIndex :=8;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
combobox2.itemindex:=combobox1.ItemIndex ;

end;

procedure TForm1.ComboBox2Change(Sender: TObject);
begin
combobox1.itemindex:=combobox2.ItemIndex ;
end;

procedure TForm1.Button2Click(Sender: TObject);
var sends,sendp:string;
begin
adoquery1.First;
clientsocket1.active:=true;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var s:string;
begin
s:=socket.ReceiveText;
if pos('成功',s)<>0 then
begin
clientsocket1.Active :=false;
memo1.Lines.Add('成功');
adoquery1.moveby(1);

clientsocket1.active:=true;
end;
end;


//这里是核心
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
var s,sendp,sends:string;
begin
if not adoquery1.Eof then
begin
sends:='POST /regurl/regform.asp HTTP/1.1'+#13#10;
sends:=sends+'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*'+#13#10;
sends:=sends+'Accept-Language: zh-cn'+#13#10;
sends:=sends+'Content-Type: application/x-www-form-urlencoded'+#13#10;
sends:=sends+'Accept-Encoding: gzip, deflate'+#13#10;
sends:=sends+'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'+#13#10;
sends:=sends+'Host: db.sohu.com'+#13#10;
url.InputString := combobox2.Text;
sendp:='Step=Create&ClassKey='+url.Encode ;
url.inputstring := adoquery1.fieldvalues['文章名']+' 发布者:'+ adoquery1.fieldvalues['作者'] ;
sendp:=sendp+'&SiteName='+url.Encode;
url.inputstring:=edit5.text+'?id='+inttostr(adoquery1.fieldvalues['id']) ;
sendp:=sendp+'&URL='+url.Encode;
url.inputstring:= edit6.text;
sendp:=sendp+'&Description='+url.Encode;
sendp:=sendp+'&Keywords=';
url.inputstring:= edit3.text;
sendp:=sendp+'&EffDate=&ExpDate=&Contact=&EMail='+url.Encode+'&B1=%B5%DD%BD%BB';
sends:=sends+'Content-Length: '+inttostr(length(sendp))+#13#10;
sends:=sends+'Connection: Keep-Alive'+#13+#10+#13#10 +sendp;
memo1.Lines.Add(sends);
clientsocket1.Socket.SendText(sends);
end;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin

memo1.Lines.Add('连接出错');
errorcode:=0;
end;

end.
 
SEARCH nmhttp.post
 
当网页不含多个frame时,我作到了,但含多个frame时,我就不会了。
 
1.用JAVASCRIPT是可以的,不过安全性不高,没有什么实际的意义。
2.处理COOKIES也是有安全隐患的,别的东东也可以对你的COOKIES进行操作的哦。
3。所以我建议用ASP,PHP,或者JSP,ISAPI建议不用(毕竟不是主流的INTERNET技术)
ASP相对安全性没有PHP或者JSP高。
4。最好在数据传输前对其进行加密,即使是最简单的加密算法也比没有要好哦呵呵。
 
后退
顶部