很多人一定用過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、9905、98069 、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');
//NMHTTP的具體用法在Delphi安裝目前BorlandDelphi5DemosFastNetHttp下有個NMHTTP使用的例子。
以上都是用NMHTTP實現的,其實用Delphi中的WebBrowser元件同樣可以完成資料的提交,使用是這樣的Webbrowser1.OleObject.Document.FrontPage_Form1.submit();
說明:WebBrowser1是WebBrowser元件的名,Frontpage_Form1是用WebBrowser開啟的網頁中的表單名
網頁中的表單是這機樣的:
<FORM name=FrontPage_Form1 action=http://message.com.cn/cgi-bin/ips/webpaging method=post>
.....
</Form>
這樣的實作方法就是用程式產生一個已經按使用者輸入資訊產生一個網頁,然後透過WebBrowser1.Navigate(產生的網頁),最後提交到伺服器Webbrowser1.OleObject.Document.FrontPage_Form1.submit();這樣就完成了一次呼叫