很多人一定用過OICQ,想必也用過了它的BP機短訊、手機短訊,編程的朋友一定想實現這種功能,如果你的程序能發到手機、發到BP機一定很酷。現在我就介紹一種可行的方法。
一、原理
它不同於OICQ的雙方都在網上才能進行交流的尋呼功能,它可以將文字信息發送到真正的尋呼機上。只要你能夠上網,就可以自己動手,隨時隨地將信息發送出去,即使你在國外,也可以利用它來向國內的友人發送信息了,而且不用交納國際長途費用,是不是方便又省事呢!
二、分析
現在網上各尋呼台都有網上服務,網頁尋呼(Web Paging)就是常用的一種。它是通過在互聯網上訪問尋呼台的主頁,然後由尋呼台的信息尋呼系統打傳呼。所以我們只要利用HTTP協議就可以實現網絡尋呼了。以下就簡單介紹一下HTTP協議: HTTP中完成一個會話通常要完成:
1)客戶端程序與服務器建立連接
2)發送請求
3)服務器響應客戶端
4)關閉連接
HTTP常用到的請求有:
1)GET(請求一萬維網頁)
2)HEAD(讀取一萬維網頁的頭部)
3)PUT(請求一存儲萬維網頁)
4)POST(附加一個命名的資源)
5)DELETE(刪除萬維網頁)
6)LINK(連接兩個已有的資源)
7)UNLINK(斷開兩個已有資源的連接)
HTTP中常用到的應答狀態代碼有:(*號代表0-9間的一個數)
1. 1** (信息)
2. 2**(成功)
3.4**(客戶端錯誤)
4.5**(服務器錯誤)
其實我們要實現的程序,只用POST、GET請求,收到正常應答就可以了。POST可以用於把用戶輸入的數據以數據流的方式傳給CGI程序,CGI通過Contect-Length環境變量來取相應長度的數據流信息。
POST請求格式如下:
POST http://www2.scuta.edu.cn/stu/chatroom/check.ASP HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-PowerPoint, application/vnd.ms-Excel, application/msWord, */*
Referer: http://www2.scuta.edu.cn/stu/
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
Host: www2.scuta.edu.cn
Content-Length: 87
Pragma: no-cache
CookIE: ASPSESSIONIDQGGGQHHE=ABGNNOJCIGOFCDLBIOLHKAFK
服務器正常應答的頭部結構為:
200 OK HTTP/1.0 說明提交數據成功
三、程序的實現
Delphi中NMHTTP已經可以很容易的實現上面的所說的數據提交,而且它還支持Proxy、這樣對於通過代理服務器上網一樣可以適用,並且它不是OICQ中發送訊信所用到SOCKET5代理。
新建一個窗體,加入組件一個ComboBox,命名為callto,用於存放尋呼對象,如國信尋呼就有95908、94908、94909、98062、98063、98019、98035、98052、98038、99055、98060、98061、98051、98003、99062、99016、99017、99018、99019、99046、99076;加入組件Edit,命名為tonumber,表示尋呼號碼;加入組件RadioGroup,命名為RadioGroup1,Caption設為呼機類型,items中加入兩項,分別為中文機、數字機;加入組件Edit,命名為firstName,用於表示發尋呼人的姓;加入組件RadioGroup,命名為RadioGroup2,Caption設為尋呼人性別,items中加入兩項,分別為先生、小姐;加入組件Memo,命名為callmsg,用於輸入發送的信息(注:對於數字機只能是數字信息);加入組件NMHTTP,命名為NMHTTP1;加入Checkbox,命名為ifuseproxy,用於確定是否使用代理服務器;加入兩個Edit組件,分別用於軟件代理服務器地址、代理服務器端口;最後加入命令按鈕,Caption設為“發送”。
現在以國信尋呼為例,它用GET請求就可以實現了,“發送”按鈕的程序代碼如下:
procedure TForm1.Button1Click(Sender: TObject);
var callstr:string;
begin callstr:='http://tips.gxspace.com/CGI-bin/tips/webpaging?stn_id='+callto.Text+'&page_no='+tonumber.Text;
case RadioGroup1.ItemIndex of
0:callstr:=callstr+'&pager_type=C';
1:callstr:=callstr+'&pager_type=N';
end;
callstr:=callstr+'&firstname='+firstname.text;
case RadioGroup2.ItemIndex of
0:callstr:=callstr+'&title=0';
1:callstr:=callstr+'&title=1';
end;
callstr:=callstr+'&msg='+callmsg.Text+'&answer=null&B1=發送尋呼';
NMHTTP1.InputFileMode := FALSE;
NMHTTP1.OutputFileMode := FALSE;
NMHTTP1.ReportLevel := Status_Basic;
If ifuseproxy.Checked then
Begin
NMHTTP1.Proxy := Edit1.Text;
NMHTTP1.ProxyPort := StrToInt(Edit2.Text);
End;
NMHTTP1.Get(callstr);
end;
有些尋呼(如潤迅尋呼就不能用上面的GET請求實現,它要用POST請求),使用與上面相差不大,如下面是NMHTTP的POST用法:
NMHTTP1.InputFileMode:=False;
NMHTTP1.OutputFileMode:=True;
NMHTTP1.ReportLevel:=Status_Basic;
If ifuseproxy.Checked then
Begin
NMHTTP1.Proxy := Edit1.Text;
NMHTTP1.ProxyPort := StrToInt(Edit2.Text);
End;
With NMHTTP1.HeaderInfo do
Begin
CookIE := Edit5.Text;
LocalMailAddress := Edit6.Text;
LocalProgram := Edit7.Text;
Referer := Edit8.Text;
UserID := Edit9.Text;
PassWord := Edit10.Text;
End;
// 把要提交的數據先放在test.txt文件中:格式為stnid=A&pageno=123456....
NMHTTP1.Post('http://www.wocall.com/script/zbwebcall.ASP','test.txt');
file://NMHTTP的具體用法在Delphi安裝目前BorlandDelphi5DemosFastNetHttp下有個NMHTTP使用的例子。
以上都是用NMHTTP實現的,其實用Delphi中的WebBrowser組件同樣可以完成數據的提交,使用是這樣的 Webbrowser1.OleObject.Document.FrontPage_Form1.submit();
說明:WebBrowser1是WebBrowser組件的名,FrontPage_Form1是用WebBrowser打開的網頁中的表單名
網頁中的表單是這機樣的:
<FORM action=http://message.com.cn/CGI-bin/ips/webpaging method=post name=FrontPage_Form1>
.......
</FORM>
這樣的實現方法就是用程序生成一個已經按用戶輸入信息生成一個網頁,然後通過WebBrowser1.Navigate(生成的網頁),最後提交到服務器Webbrowser1.OleObject.Document.FrontPage_Form1.submit();這樣就完成了一次尋呼