自动投票程序
前天接到我哥的電話,說讓我?guī)兔憘€投票的程序要為他的一個朋友在網(wǎng)上投票,這種作弊行為我向來是不恥的,但是為了我哥的面子就硬著頭皮開始干了。本來以為分分鐘可以搞定的小程序,但是因為服務(wù)器是.net做的,挺麻煩,感冒好幾天了,前天達到了高潮,頭疼乏力,于是暫時擱置,洗洗睡了。昨天晚上開弄的,開始想用javascript來做,但是因為框架跨域不能訪問,再加上javascript實在難于調(diào)試,于是改用.net來做,但是軟件給人家的時候還要那邊裝.netFramwork,這事挺惡心的。
實現(xiàn)的原理是這個樣子的,首先用嗅探器(我用的是微軟的Fiddler2,網(wǎng)上有的下載也挺好用)查出當點擊投票時提交的數(shù)據(jù),然后使用WebClient模擬瀏覽器發(fā)給服務(wù)器就行了。源代碼如下:
?private?void?Post()????????...{
????????????try
????????????...{
????????????????//?要提交表單的URI字符串。
????????????????string?uriString?=?"http://*****.****.**/index.aspx";
???????????????
????????????????/**////
????????????????//?打開頁面
????????????????/**////
????????????????WebClient?webClient?=?new?WebClient();
????????????????byte[]?responseData?=?webClient.DownloadData(uriString);
????????????????string?srcString?=?Encoding.UTF8.GetString(responseData);
????????????????/**////
????????????????//?填寫頁面并提交
????????????????/**////
????????????????webClient?=?new?WebClient();
????????????????webClient.Headers.Add("Content-Type",?"application/x-www-form-urlencoded");
????????????????//?獲取頁面的?VeiwState????????????????
????????????????string?viewStateFlag?=?"id="__VIEWSTATE"?value="";
????????????????int?i?=?srcString.IndexOf(viewStateFlag)?+?viewStateFlag.Length;
????????????????int?j?=?srcString.IndexOf(""",?i);
????????????????string?viewState?=?srcString.Substring(i,?j?-?i);
????????????????//?獲取頁面的?EventValidation????????????????
????????????????string?eventValidationFlag?=?"id="__EVENTVALIDATION"?value="";
????????????????i?=?srcString.IndexOf(eventValidationFlag)?+?eventValidationFlag.Length;
????????????????j?=?srcString.IndexOf(""",?i);
????????????????string?eventValidation?=?srcString.Substring(i,?j?-?i);
????????????????//?提交按鈕的文本
??????????????
????????????????string?submitButton?=?"Button";
????????????????viewState?=?System.Web.HttpUtility.UrlEncode(viewState);
????????????????eventValidation?=?System.Web.HttpUtility.UrlEncode(eventValidation);
????????????????submitButton?=?System.Web.HttpUtility.UrlEncode(submitButton);
????????????????//?要提交的字符串數(shù)據(jù)。格式形如:user=uesr1&password=123
????????????????string?postString?=?"Button1=&DataList1$ctl17$CheckBox1=on&__VIEWSTATEENCRYPTED="?+?"&__VIEWSTATE="?+?viewState?+?"&__EVENTVALIDATION="?+?eventValidation;
???????????????
????????????????//?將字符串轉(zhuǎn)換成字節(jié)數(shù)組
????????????????byte[]?postData?=?Encoding.ASCII.GetBytes(postString);
????????????????//?上傳數(shù)據(jù),返回頁面的字節(jié)數(shù)組
????????????????responseData?=?webClient.UploadData(uriString,?"POST",?postData);
????????????????//?將返回的將字節(jié)數(shù)組轉(zhuǎn)換成字符串(HTML);
????????????????//?ASP.NET?返回的頁面一般是Unicode,如果是簡體中文應(yīng)使用?
????????????????//???Encoding.GetEncoding("GB2312").GetString(responseData)
????????????????srcString?=?Encoding.UTF8.GetString(responseData);
????????????????/**////
????????????????//?分析返回的頁面
????????????????/**////
????????????????//?......?......
????????????????
????????????}
????????????catch?(WebException?we)
????????????...{
????????????????string?msg?=?we.Message;
????????????}
????????}
然后在計時器控件的tick方法中使用多線程調(diào)用post就可以了
private?void?timer1_Tick(object?sender,?EventArgs?e)????????...{
????????????ThreadStart?ts?=?new?ThreadStart(Post);
????????????Thread?thread?=?new?Thread(ts);
????????????thread.Start();
????????????label3.Text?=?Convert.ToString(Convert.ToInt32(label3.Text)?+?1);
????????}
因為服務(wù)器那邊使用的限制方式是5分鐘內(nèi)同一個ip不能重復投票,所以這種方法投票效率不高,本來打算做一個adsl短線重新登錄的程序加進來的,問問那邊說這樣就行了,也就懶的做了。?
總結(jié)
- 上一篇: 飞腾FT-2000/4处理器+复旦微FP
- 下一篇: windows 2003 sp2补丁导致