軟體登入軟體 DIY
Http 協議是 Web 服務的主要協議之一,網頁的瀏覽和網站動態資料的提交就是由這個協議實現的。實現的過程是通過 Http 會話,向 Web 服務器進行資料請求(讀取、儲存等)。
我們編程中常用的有 POST 和 GET 資料請求。POST 可以用於把使用者輸入的資料以資料流的方式傳給 CGI(ASP、JSP) 程式,CGI 再通過 Contect-Length 環境變數來取相應長度的資料流資訊。如果資料提交成功,伺服器將產生正常應答,其頭部資訊為:
HTTP/1.1 200 OK
網站登入是通過使用者填寫登入資訊,由 CGI 程式向 Web 服務器提交來實現的。以 Sohu 網站的免費網站提交為例:首先由 Sohu 首頁面進入網站登入介面,選擇網站的登入類別,然後填寫網站的資訊:這個過程由 2 步組成,第一步填寫網站的名稱和網站地址(http://…),第二步填寫一些詳細資料,然後就可以提交了。真正實現資料儲存的是第二步,其核心網頁代碼(簡化)為:
<form name="form1" method="POST"
action="/regurl/regform.asp?Step=Create&Class=C016015005002
&sitename=網站名稱&url=http://網站地址"
onsubmit="return checkform()">
<input type="hidden" name="Step" value="Create">
網站描述:
<textarea name="Description" rows="2" cols="60"></textarea>
……
</form>
(註:C016015005002 因選擇的網站類別而不同)
我們的程式就是通過利用經過 Delphi 完美封裝的 TNMHttp 組件,類比網頁中的按鈕 Submit 提交,來實現用程式碼進行網站的快速、準確註冊。
本例中,筆者的程式可以圓滿的完成網站“十萬個為什麼”(http://helps100000.yeah.net)的登入,登入在“首頁>公司企業>電腦與互連網>電腦軟體>資料庫”類目下。程式的介面組件為:1 個 WebBrowser 組件,3 個 Memo 組件,分別用來顯示登入後的反饋頁面和一些提示資訊。1 個 NMHTTP1 組件,是本程式的核心組件。還有一個 Button 按鈕。
其實程式的核心代碼也就一句:
NMHTTP1.Post('http://db.sohu.com/regurl/regform.asp?
Step=Create&Class=C016015005002&sitename=十萬個為什麼
&url=http://helps1000000.yeah.net','PostData.txt');
其中,Post 方法有 2 個參數,第 1 個參數代表 form 表單的 action 部分,第 2 個參數是 <input> 標籤中各參數的取值組成的字串。由於 NMHTTP1 的 OutputFileMode 屬性被設定為 true,所以第 2 個參數的字串被放在一個外部文字檔 PostData.txt 中,PostData.txt 的內容為(不分行):
Description=探討電腦技術收集應用技巧&Keywords=電腦技巧
&district=山系&city=西安&Contact=張慶&EMail=zhangking@263.net&memo=no
該字串是通過分析網頁代碼得到的。
程式運行後,點擊“網站註冊”按鈕,如果機器已經串連到 Internet 上,就會像在網頁中進行網站註冊一樣,很快在 WebBrowser1 中返回“註冊成功”或“錯誤:該網站已經註冊”頁面。
本程式在 Windows98、IE5.0、Delphi5.0 環境下調式成功。我們完全可以在此基礎上,運用多線程等技術,做成一個類似“登入騎兵”一類的實用軟體。
//程式的完整原始碼如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleCtrls, SHDocVw, Psock, NMHttp, ExtCtrls;
type
TForm1 = class(TForm)
NMHTTP1: TNMHTTP;
Panel1: TPanel;
Button1: TButton;
Memo3: TMemo;
Memo2: TMemo;
Memo1: TMemo;
Panel2: TPanel;
WebBrowser1: TWebBrowser;
procedure Button1Click(Sender: TObject);
procedure NMHTTP1Success(Cmd: CmdType);
procedure NMHTTP1Failure(Cmd: CmdType);
procedure FormCreate(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('about:blank');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
With NMHTTP1 do
Begin
InputFileMode :=False;
OutputFileMode :=True;
ReportLevel :=Status_Basic;
end;
With NMHTTP1.HeaderInfo do
begin
Cookie :='';
LocalMailAddress :='';
LocalProgram :='';
Referer :='';
UserID :='';
Password :='';
try
NMHTTP1.Post('http://db.sohu.com/regurl/regform.asp?
Step=Create&Class=C016015005002&sitename=十萬個為什麼
&url=http://helps1000000.yeah.net','PostData.txt');
except
showMessage(' Error! ');
end;
End;
end;
procedure TForm1.NMHTTP1Success(Cmd: CmdType);
begin
Case Cmd of
CmdPOST:
begin
Memo1.Text := NMHTTP1.Header;
Memo2.Text := NMHTTP1.Body;
WebBrowser1.OleObject.document.body.innerHTML :=NMHTTP1.Body;
Memo3.Lines.Add('HTTP POST Successful');
end;
end;
end;
procedure TForm1.NMHTTP1Failure(Cmd: CmdType);
begin
Memo1.Text := NMHTTP1.Header;
Memo2.Text := NMHTTP1.Body;
case Cmd of
CmdPOST:
Memo3.Lines.Add('HTTP Post Failed');
end;
end;
end.
------------------------------------------------
張慶(西安 Net-e 軟體系統工程公司)
Email: zhangking@263.net
http://soft.why100000.com