自动投票程序

来源:互联网 发布:name是顶级域名么 编辑:程序博客网 时间:2024/05/02 20:12

前天接到我哥的电话,说让我帮忙写个投票的程序要为他的一个朋友在网上投票,这种作弊行为我向来是不耻的,但是为了我哥的面子就硬着头皮开始干了。本来以为分分钟可以搞定的小程序,但是因为服务器是.net做的,挺麻烦,感冒好几天了,前天达到了高潮,头疼乏力,于是暂时搁置,洗洗睡了。昨天晚上开弄的,开始想用javascript来做,但是因为框架跨域不能访问,再加上javascript实在难于调试,于是改用.net来做,但是软件给人家的时候还要那边装.netFramwork,这事挺恶心的。

实现的原理是这个样子的,首先用嗅探器(我用的是微软的Fiddler2,网上有的下载也挺好用)查出当点击投票时提交的数据,然后使用WebClient模拟浏览器发给服务器就行了。源代码如下:

 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);

                
// 要提交的字符串数据。格式形如:user=uesr1&password=123
                string postString = "Button1=&DataList1$ctl17$CheckBox1=on&__VIEWSTATEENCRYPTED=" + "&__VIEWSTATE=" + viewState + "&__EVENTVALIDATION=" + eventValidation;
               


                
// 将字符串转换成字节数组
                byte[] postData = Encoding.ASCII.GetBytes(postString);
                
// 上传数据,返回页面的字节数组
                responseData = webClient.UploadData(uriString, "POST", postData);
                
// 将返回的将字节数组转换成字符串(HTML);
                
// ASP.NET 返回的页面一般是Unicode,如果是简体中文应使用 
                
//   Encoding.GetEncoding("GB2312").GetString(responseData)
                srcString = Encoding.UTF8.GetString(responseData);

                
///////////////////////////////////////
                // 分析返回的页面
                ///////////////////////////////////////
                // ...... ......
                
            }

            
catch (WebException we)
            
{
                
string msg = we.Message;
            }

        }

然后在计时器控件的tick方法中使用多线程调用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);
        }

因为服务器那边使用的限制方式是5分钟内同一个ip不能重复投票,所以这种方法投票效率不高,本来打算做一个adsl短线重新登录的程序加进来的,问问那边说这样就行了,也就懒的做了。