自動投票器的原理及設計思路
___________________________
羅坤凡 2008-01-12
網絡投票和平時浏覽網頁、登陸郵箱一樣,都是客戶端和網站服務器之間的通訊過程。客戶端發出信息請求,服務器端收到信息後根據後台程序作出相應的反饋,客戶端收到反饋信息後再顯示出來。
手工投票時,客戶端電腦打開IE,點擊投票按鈕,IE就會發送一定的信息到服務器,服務器收到信息後進行處理,再將結果反饋回客戶端的IE,用戶就會在IE中看到投票是否成功的信息。
自動投票器的原理就是循環模擬手動投票的過程,大致分為以下幾個步驟:
1、打開IE手動投票,使用專門工具獲取投票時IE往服務器提交的信息。
2、分析信息得到提交的網址、提交的數據等。
3、編程模擬手動投票往服務器發送投票信息,循環發送信息就可以達到快速投票。
獲取信息和分析信息在Outdovote通用網絡自動投票器的說明文件裡有,這裡就不再說了,下面講講Microsoft Visual Studio 2005 C#如何編程模擬手工投票發送信息。
假如投票時獲取的數據如下:
POST /generalvote/webvote/savevote.ASP HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-Flash, application/vnd.ms-Excel, application/vnd.ms-PowerPoint, application/msWord, */*
Referer: http://www.outDOSz.cn/generalvote/webvote/vote.ASP
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .Net CLR 2.0.50727)
Proxy-Connection: Keep-Alive
Content-Length: 42
Host: www.outDOSz.cn
Pragma: no-cache
CookIE: ASPSESSIONIDAACTDRCR=CHAMMJLDMCKFLLLOIADDFPGK; ASPSESSIONIDAACQASDR=PHILKNLDIPNPCOCDMAFANJFB; ASPSESSIONIDCACTCTBR=MJAAAGMDBFKLAFOGKDDCKEED
citygroup=%C7%E0%B5%BA&submit=%CC%E1%BD%BB
那麼如何用編程來發送這樣的數據呢,C#有個WebClIEnt類,這個類非常好用,我們就用它來實現發送投票信息。
WebClIEnt類可以自定義HTTP Headers屬性(設置HTTP頭信息),使用UploadData函數就可以POST數據到服務器,關於WebClIEnt類的更多信息,請參考MSDN。
C#代碼如下:
WebClient myWebClient = new WebClient();//申明並創建WebClient實例myWebClIEnt
byte[] byteArray;//申明存儲提交數據的變量
byte[] response
Array;//申明存儲接收數據的變量
//設置HTTP頭信息,並非所以的信息都需要設置,以下這些信息足夠了
myWebClIEnt.Headers.Add("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-Flash, application/vnd.ms-Excel, application/vnd.ms-PowerPoint, application/msWord, */*");
myWebClIEnt.Headers.Add("Referer", "http://www.outDOSz.cn/generalvote/webvote/vote.ASP");
myWebClIEnt.Headers.Add("Accept-Language", "zh-cn");
myWebClIEnt.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
myWebClIEnt.Headers.Add("Accept-Encoding", "gzip, deflate");
byteArray = Encoding.Default.GetBytes(voteDATA);//將提交的數據轉化為byte數組
try
{
responseArray = myWebClIEnt.UploadData("http://www.outDOSz.cn/generalvote/webvote/savevote.ASP", "POST", byteArray);//提交投票信息,並獲取返回的數據
}
catch (Exception exPOST)
{
errorMessage = "\nPOST方式投票時出現錯誤,錯誤信息為:" + exPOST.Message;
myWebClient.Dispose();//釋放myWebClIEnt所占用的資源
return false;//提示錯誤信息並返回。
}
myWebClient.Dispose();//釋放myWebClIEnt所占用的資源
outputMessage = "\n接收的正文信息:\n";
outputMessage = outputMessage + Encoding.Default.GetString(responseArray);
return true;
將以上代碼封裝在一個函數中,然後做個循環就可以實現連續投票了。