自动投票程序
来源:互联网 发布: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;
}
}
...{
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);
}
...{
ThreadStart ts = new ThreadStart(Post);
Thread thread = new Thread(ts);
thread.Start();
label3.Text = Convert.ToString(Convert.ToInt32(label3.Text) + 1);
}
因为服务器那边使用的限制方式是5分钟内同一个ip不能重复投票,所以这种方法投票效率不高,本来打算做一个adsl短线重新登录的程序加进来的,问问那边说这样就行了,也就懒的做了。
- 自动投票程序
- 自动投票程序
- 自动投票程序
- 如何编写一个自动投票程序
- 如何编写一个自动投票程序
- 如何编写一个自动投票程序
- 如何编写一个自动投票程序
- 如何编写一个自动投票程序
- 如何编写一个自动投票程序
- 如何编写一个自动投票程序
- 自动投票。。。
- 如何编写一个自动投票程序 (转)
- 刚用.net写了一个自动投票程序
- 利用批处理自动投票
- 自动投票系统
- 自动跳转投票专用
- 自动投票软件功能分析
- 动态ip 投票程序
- lighttpd,nginx,apache的比较
- .net CF应用中隐藏OK按钮
- 手机镜像网
- 中国电影金鸡奖
- scriptaculous1.7.0和Prototype1.5.1不兼容引起的问题
- 自动投票程序
- 手机实名制:我们究竟需不需要?
- 大众电影百花奖
- nginx vs. Lighttpd vs. Apache 高效的web server服务器软件比较
- editplus 配置 Java 环境
- 如何发展
- 悖论
- 改程式比写程式更有进步!
- 为论坛和Blog添加代码高亮显示的功能。