如何利用C#编写网页投票器程序 如何使用代理来投票 代理IP来投票

一、前言
看个图,了解下投票的过程。
提交投票信息
投票页 ――――――――>投票信息处理页
反馈投票结果
(请求页)<―――――――(响应页)
一般情况下,填写投票信息,然后点提交按钮发送到响应页,这样来完成一个投票。这过程繁琐,还不能多次投票。有时,手工投票达不到所期待的效果。
曾帮朋友弄过几次投票,坛里有朋友也PM说要看看源代码。投票器应该说没有一个固定的框架,一些处理方法上需要视响应页做针对性的改动。
自己写的源代码太杂乱,放出来怕丢人。10.1放假窝在家里写了点心得,与大家分享一下。看过之后,你也可以写。不当之处请指正。

 制作投票器,最关键的二样东西是获得投票信息和找到响应页。也就是说通过请求页访问(提交)响应页时,提交了什么信息,并且这个响应页是什么。找到了这两样,投票器完成了一大半。
二、编写投票器所需要的一些HTTP知识
1、 最好是写过一些网页。看某网页的源文件,可以很快找到哪些是form表单、BUTTON提交按钮、INPUT文件框等内容。
恶补网站:
http://www.lib.tsinghua.edu.cn/chinese/INTERNET/HTML/Normal/html_design.html
http://www.w3.org/TR/REC-html40/index/elements.html
http://www.w3.org/TR/REC-html32.html

2、了解一个HTTP的消息头由哪些内容组成。如下是一个表单提交后,向网站发送的消息头内容:

POST /redsky/temp/whu_tp/vote.asp HTTP/1.1 //定义HTTP是一个POST动作
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
//响应页可以使用的媒体类型
Referer: http://pmc.whu.edu.cn/redsky/temp/whu_tp/whu_tp.asp //请求页的网址
Accept-Language: zh-cn //指定的字符集类型
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; mxie; .NET CLR 1.1.4322)
Host: pmc.whu.edu.cn
Content-Length: 46 //提交数据的长度
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: ASPSESSIONIDQSCDRSCC=NHNDPPNDPJJFBBJMLBAOMHOD //提交时所传送的Cookie值。

voted=25&voted=30&voted=35&Submit=%CD%B6%C6%B1 //提交时,所传送的数据

恶补网站:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14

小结: WIN form 、WEB FORM两样都得精通,这是师傅2002年说的。


三、辅助软件
查看HTTP消息头的软件,专门的软件有HTTP Watch(
http://www.hanzify.org/index.php?Go=Show::List&ID=4384)或IEWatch,
也可以用 CommView (这些天www.ttdown.com上的软件没法下载:-()之类抓包的软件。


四、手工分析投票过程
先说说手工操作时一个正常的投票过程(以武汉大学的这个投票为例)
http://pmc.whu.edu.cn/redsky/temp/whu_tp/whu_tp.asp
选择被投票人石云霞(在姓名前面打勾),然后点“投票”,响应页接收被投票人的姓名并记录投票数记录投票人的IP,然后返回投票成功或重复投票的信息。
这一过程很简单,但我们不知道点投票后,浏览器向网页发送了什么信息。在这里,先别急着用软件来看,尝试手工分析,这有助于一些复杂情况的解决。
回到投票的网页,查看源文件(前面所提到的http基本知识派上用场了),
a)首先找响应页是什么,也就是接收处理投票信息的网页。在记事本中按Ctrl+f,查找’<form’字符串。通过搜索,找到这么一行:
<form name="form1" method="post" action="vote.asp">
Form表单的名称name=form1,方法method=post,动作action=vote.asp 。vote.asp是我们所关心的,这个就是响应页的地址。
整理地址得到:http://pmc.whu.edu.cn/redsky/temp/whu_tp/vote.asp
b)查找被投票人的信息。被投票人的选择是通过一个多选框来完成,那么在源文件里查找’<input’字样。通过搜索,找到了以下内容。
<input type="checkbox" name="voted" value="25">
<a href="whu_tp_more.asp?id=25" class="index" target="_blank">
石云霞</a> <b><font color="#FFFF00" size="2">  </font></b>

<input type="checkbox" name="voted" value="26">
<a href="whu_tp_more.asp?id=26" class="index" target="_blank">
李义天</a> <b><font color="#FFFF00" size="2">  </font></b>
………………………….
从这一大串内容中可以看出,石云霞的编号为25,李义天的编号为26 ,input元素的名称为voted。 整理一下voted=25这是被投票人的信息。
查找input的时候需要注意,看是否有hidden类型的input元素。隐藏一定数量的input元素,可以起到一定的防范作用。
在源文件里一直看下去,只到</form>为止。在</form>前还有两个按钮,
<input type="submit" name="Submit" value="投票">
<input type="reset" name="Submit2" value="重置">
组合一下 submit=投票 submit2=重置(这个内容可以忽略)。
c) 最后整理一下,得到一个完整的网址
http://pmc.whu.edu.cn/redsky/temp/whu_tp/vote.asp?voted=25& submit=投票
在浏览器中访问一下这个地址,看有什么提示??,提示“投票成功“。再次访问提示“你的IP已经投过一次了^_^”。这说明这个网址就是真正的投票网址。只要不断地访问这个网址,就可以达到投票的目的。

小结:没写过网页也没关系,通过辅助软件也可以分析出这一网址。


五、软件分析投票过程
安装HTTPWATCH后,重启机器,可以在IE标准按钮栏中找到它的图标(没有的话,从菜单‘查看’->‘浏览器栏’中选择),单点图标后如图,IE窗口下半部分显示出HTTPWATCH的工作窗口。
http://bbs.et8.net/bbs/attachment.php?attachmentid=339392&stc=1
图中显示的内容是选择点击‘投票’按钮后,IE与网站之间的数据流。上半部分记录了IE访问了哪几个网页,下半部分是访问某个网页时,具体的数据流。
(HTTPWATCH的使用方法在这里不细讲了。)
我们在正常浏览网页时,IE一般的动作都是GET。而投票过程中,IE需要将你的选择(被投票人的姓名)提交给投票的网址,访问这个网址时,IE将产生一个POST动作。查看HTTPWATCH的记录,URL=http: //pmc.whu.edu.cn/redsky/temp/whu_tp/vote.asp时,IE的动作是POST。那么http: //pmc.whu.edu.cn/redsky/temp/whu_tp/vote.asp就是投票的响应页。这和前面手工分析时找到的响应页是一致的。
找到了响应页,接下来找投票的信息,也就是IE提交了什么数据。这里看HTTPWATCH窗口的下半部分。
下半部分是一个TAB PANEL,看重要的几个标签。
HEADERS:提交到响应页的HTTP HEADER的内容。
Cookies:提交时,Cookies的内容。
POST DATA:提交时,IE向响应页发送的数据。
STREAM:提交时,本地机器与网站之间的传输的数据流。
http://bbs.et8.net/bbs/attachment.php?attachmentid=339393&stc=1
显而易见,POST DATA是我们要找的内容。看到这个标签,左边是两个参数名voted 和submit ,右边是两个参数的值,‘25’和‘投票’。整理一下得到:
Voted=25 submit=投票
将这两个参数值与前面找到的网址整理一下,得到
http://pmc.whu.edu.cn/redsky/temp/whu_tp/vote.asp?voted=25& submit=投票

六、编写投票器
找到了真正的投票URL,用C#做投票器就简单了,无非是做到:如何循环地访问这个网页。
看下面的这个过程。

………
using System.Net;
………

public int GotoURL( out string message,string url,int timeout,string proxyurl,string keyword,out int rate,bool proxyed)
/*
Message:返回的信息
Url:需要访问的地址
Timeout:超时时间
Proxyurl:代理的地址
Keyword:判断投票成功的标志
Rate:访问url所花费的时间
Proxyed:是否使用代理
*/
{
byte[] gbyte=new byte[1024];
string strInput;
int iret=3;
int i,len=0;
DateTime dtBegin=DateTime.Now;
message="正在访问中。。。";
try
{

url=@"http://pmc.whu.edu.cn/redsky/temp/whu_tp/vote.asp?voted=25& submit=投票";
WebRequest myWebRequest=WebRequest.Create(url);
myWebRequest.Timeout=timeout;//设置超时时间=15000毫秒

if (proxyed)//是否使用代理功能
{

WebProxy myProxy=new WebProxy();//实例化一个WebProxy类,这个类设置WebRequest的Proxy属性,这样可以通过代理来访问url。
myProxy=(WebProxy)myWebRequest.Proxy;
string proxyAddress= proxyurl;
Uri newUri=new Uri(proxyAddress);
myProxy.Address=newUri;
myWebRequest.Proxy=myProxy;
}
WebResponse myWebResponse=myWebRequest.GetResponse();//实例化一个WebResponse类,用于接收WebRequest的响应内容,依据内容来判断投票是否成功。
Stream streamResponse=myWebResponse.GetResponseStream();// 实例化一个Stream类,从WebResponse接收数据流。

i=streamResponse.Read(gbyte,len,1024);
len+=i;
while(i!=0)
{
i=streamResponse.Read(gbyte,len,1024);
len+=i;
}

strInput=System.Text.Encoding.GetEncoding("gb2312").GetString(gbyte);
i=strInput.IndexOf("成功");
Console.WriteLine(i);
if (i==-1)
message="访问成功";
else
message="访问失败";// 将数据流转换成字符串,并从中判断投票是否成功。
iret=0;
streamResponse.Close();
}

catch (System.Net.WebException we)
{
message="NetError"+we.Message;
}
catch (System.IO.IOException ie)
{
message="IOError"+ie.Message;
}
catch (System.Exception ex)
{

message=ex.Message;


}

TimeSpan ts=DateTime.Now-dtBegin;
rate=(int)ts.TotalMilliseconds; //获取访问的时间。
return iret;
}

过程很简单,就是使用System.Net中的两个类来访问网页。
创建实例:WebRequest myWebRequest=WebRequest.Create(url);
访问网页:WebResponse myWebResponse=myWebRequest.GetResponse();
流StreamResponse视响应页的处理方法,可能没有任何返回内容。
Stream streamResponse=myWebResponse.GetResponseStream();

考虑到一个IP只能投票一次的限制,过程加了使用代理的功能
WebProxy myProxy=new WebProxy();
这样即可以当投票器来使用,也可以用于检测代理的有效性。

接下来的事,就容易多了。找代理,循环调用这个过程。循环速度感觉慢的话,可以用多个线程一起来跑。


小结:直接访问响应页就能投票,这是最常见的投票方式。网页设计人员没有在响应页做防范处理,从而为投票器创造了的条件。
防范措施通常有以下几种:
1、 对HTTP HREADERS里的REFERER做判断,为空表示没有访问过投票页(提交页)。这样绕开请求页,直接访问响应页是无效的。
2、 访问投票页时,在headers里的cookies里设置某种标志,提交时,响应页对这个标志做判断。没有这个标志,直接访问响应页是无效的。
3、 访问投票页时,随机生成N位数字验证码,响应页对验证码做判断。
4、 生成图形验证码。响应页对验证码做判断。
第1、2种方法容易处理,研究出规律,设置WebRequest的headers属性。
第3种方法需要多加个过程,首先访问投票页得到验证码,然后与其他data组合一同post给响应页。
第4种无解,和和。不过,还没发现哪种投票会用上图形验证码这措施。手工投票不仅麻烦,同时也关闭了自己、他人的方便之门。


结言:
不管投票方式如何,投票所需填写的内容有多复杂,最终它还是要提交给响应页做处理。多看看http watch。
不会编程也没关系,找代理软件,利用代理检测的功能,投票。

来源:http://blog.csdn.net/gavin_luo/article/details/5162388

转载于:https://www.cnblogs.com/gjhjoy/p/3492020.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式之美】<Reading Notes>贫血模型与充血模型

小知识 需要了解的一些名词 1、领域驱动设计&#xff08;Domain Driven Design&#xff0c;简称 DDD&#xff09; 2、MVC 三层架构 &#xff1a; M 表示 Model&#xff0c;V 表示 View&#xff0c;C 表示 Controller。 它将整个项目分为三层&#xff1a;展示层、逻辑层、数据层…

TAFE的完整形式是什么?

TAFE&#xff1a;拖拉机和农用设备 (TAFE: Tractors and Farm Equipment) TAFE is an abbreviation of Tractors and Farm Equipment Limited. It is an Indian tractor manufacturer which is founded at Chennai in 1960. It is the second-largest tractor manufacturer in …

Oracle 10g 数据库的备份和还原

一、备份数据库1.在图形工具中&#xff0c;如sqldeveloper,pl/sqldeveloper用以下这句查找空表select alter table ||table_name|| allocate extent; from user_tables where num_rows0;2.把第一步执行得到的结果当用sql语来再次执行3.到oracle服务器上执行备份语句. 运行-cmd …

用户行为分析指导电商精细化运营

规模和利润&#xff0c;这两个在商业运营中最基本的指标&#xff0c;却在电子商务市场中遭遇了不同的待遇。前两年&#xff0c;几乎所有的电商企业都只追求规模&#xff0c;不追求利润&#xff0c;导 致自身的运营极其粗放&#xff0c;绝大多数电商公司只有两招&#xff1a;猛打…

【C++基础】 类模板

类模板 模板是将类中某些类型变为泛型&#xff0c;从而定义一个模板。 如下&#xff1a; 类模板的语法 直接进行对比&#xff1a; 泛型化之前 泛型化之后类模板的实例化 注意&#xff1a;只要是对类模版进行实例化&#xff0c;编译器就会生成一个类&#xff01;&#xff0…

ruby 怎么抛异常_Ruby中的异常处理

ruby 怎么抛异常Ruby异常处理 (Ruby Exception Handling) Exceptions are abnormal conditions arising in the code segment at runtime in the form of objects. There are certain predefined Exception classes whereas we can create our exception known as Custom excep…

cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面

之前两个博客讲述了象棋的规格和工程文件之后&#xff0c;我们继续深入的从代码开始学习cocos2dx首先从程序入口main函数开始main函数int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow) {UNREFERENCED_PARAMETER(h…

[原创]Android中的android:layout_width和android:width的区别

在android系统中&#xff0c;我们可以通过在xml资源文件中定义布局&#xff0c;一般的写法是&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"ma…

【C++基础】模板参数与模板继承

模板参数 默认类型参数 函数参数可以设定一个默认值&#xff0c;我们现在可以对类模板的类型参数设定一个默认类型。 指定泛型Stack的默认类型参数为 int template<typename T int> class Stack{... };当我们这样定义一个对象时&#xff1a; Stack<> stack;使…

UNIX标准化及实现之POSIX标准可选头文件

POSIX标准定义的可选头文件 头文件说明<aio.h>异步I/O<mqueue.h>消息队列<pthread.h>线程<sched.h>执行调度<semaphore.h>信号量<spawn.h>实时spawn接口<stropts.h>XSI STREAMS接口<trace.h>事件跟踪转载于:https://www.cnblo…

Julia中的denominator()函数

Julia| 分母()函数 (Julia | denominator() function) denominator() function is a library function in Julia programming language, it is used to get the denominator of the rational representation of the given value. denominator()函数是Julia编程语言中的库函数&a…

【C++基础】STL迭代器

已知&#xff1a; STL组成部分&#xff1a; 容器、迭代器、算法、函数对象、空间分配器 容器&#xff1a;用于保存一组数据&#xff0c;数据个体被称为元素 迭代器&#xff1a;用于遍历容器中的元素&#xff0c;容器都有自己专属的迭代器&#xff0c;只有容器才知道如何遍历自己…

用ie9浏览器若出现看视频有声音没图像的问题处理

当我们在用ie9浏览器上网想看视频时&#xff0c;有时会遇到各种问题&#xff0c;尤其是有关声音和图像的。有时候有声音没图像&#xff0c;但有时候有图像却没声音。各种问题。当遇到某些问题时&#xff0c;只要是关于网页视频的&#xff0c;一般都会选择更新网页视频播放插件&…

java架构师之路:JAVA程序员必看的15本书的电子版下载地址

java架构师之路&#xff1a;JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说&#xff0c;最痛苦的事情莫过于可以选择的范围太广&#xff0c;可以读的书太多&#xff0c;往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些&#xff0c;按照学习的先后顺序…

office数据集dslr_DSLR的完整形式是什么?

office数据集dslrDSLR&#xff1a;数码单镜反光 (DSLR: Digital Single-Lens Reflex) DSLR is an abbreviation of digital single-lens reflex. It alludes to a digital camera which with the sensor of digital imaging merges optics and mechanism of single-lens reflex…

envs\TensorFlow2.0\lib\site-packages\tensorflow\python\framework\dtypes.py:516: FutureWarning 解决方案

import tensorflow后的完整报错&#xff1a; D:\Anaconda3\envs\TensorFlow2.0\lib\site-packages\tensorflow\python\framework\dtypes.py:516: FutureWarning: Passing (type, 1) or ‘1type’ as a synonym of type is deprecated; in a future version of numpy, it will b…

转义序列

转义序列描述\n换行符\r回车\t水平制表符\\反斜杠\$美元符\"双引号\[0-7]{1.3}八进制记法\x[0-9A-Fa-f]{1,2}十六进制记法转载于:https://www.cnblogs.com/cindylu520/archive/2012/07/05/2577246.html

Java动态代理模拟spring的AOP

广州疯狂软件学院拥有三大课程体系包括&#xff1a;java课程&#xff0c;android课程&#xff0c;ios课程&#xff0c;疯狂软件年终钜惠&#xff0c;报名java就业班&#xff0c;免费赠送基础班&#xff0c;名额有限&#xff0c;本月火热报名中&#xff0c;欢迎有志之士电话或者…

xlrd.biffh.XLRDError: Excel xlsx file; not supported解决方法

将原本的xlrd卸载&#xff0c;安装旧版本&#xff1a; pip uninstall xlrd pip install xlrd1.2.0转自&#xff1a;https://www.cnblogs.com/xiaoqiangink/p/14144517.html

生产消费是什么设计模式_快速消费品的完整形式是什么?

生产消费是什么设计模式快消品&#xff1a;快速消费品 (FMCG: Fast-Moving Consumer Goods) FMCG is an abbreviation of Fast-Moving Consumer Goods which are also known as Consumer Packed Goods (CPG). These consumer packed goods allude to the products that are sol…