投票机的实现及相关技术(一)

本文仅限于投票机技术的讨论与学习,请大家以后不要再留言索求XXXXX的投票机了,我是不会写的。谢谢!

这几天没日没夜,就为了一个网络投票。在网上找了一下,还有很多收费的投票机,而且还不便宜,效率似乎也不是很高,自己动手写了一个。(原创文章,转载请联系我)

其实投票机就是一个往目标服务器Post数据,看以下代码,

None.gif cl  =   new  WebClient();
None.gif
None.gif                     cl.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, */* " );
None.gif
None.gif                     cl.Headers.Add(
" Referer " , idxPage);
None.gif
None.gif                     cl.Headers.Add(
" Accept-Language " " en-us " );
None.gif
None.gif                     cl.Headers.Add(
" Content-Type " " application/x-www-form-urlencoded " );
None.gif
None.gif                     cl.Headers.Add(
" UA-CPU " " x86 " );
None.gif
None.gif                     cl.Headers.Add(
" Accept-Encoding " " gzip, deflate " );
None.gif
None.gif                     
string  result  =  cl.UploadString(votePage,  " POST " " R1=xx&B1=%CD%B6%C6%B1 " );
None.gif
None.gif

 

以上的代码很简单,就是往服务器Post一个“R1=xx&B1=%CD%B6%C6%B1”数据,前面的cl.Headers.Add(…..)是伪造一个请求的头。

 

以上是一个简单的实现,很多服务器都进行IP判断,这样以上代码投完服务器指定的每IP投多少票后,就不能再投了。下面就是使用代理服务器。

WebProxy proxy = new WebProxy(hostip, hostport);

cl.Proxy = proxy;

使用了代理服务器后,如果服务器不进行代理服务器的检测,那么每换一次代理,就相当于换了新的IP。代理当然可以实现程序自动更换,比如说你先取一个列表,然后随机从列表中去,具体代码我就不贴出来了。

投票程序如果加了验证码,那么就要取得验证码,单纯的数字验证,相当简单,我就不说了,这里说一下使用图形验证码,看下面图形(相对比较简单的图形验证)

 img.jPG

上面的图片中,只有数字,虽然数字颜色不同,但没躁点,无干扰线,还有就是背景色是不变的,现在思路就是,读取图片,把图片中的单个数字截取出来,再转换成黑白色,也就是说如果当前象素如果是背景色,就转换成白色,反之转换成黑色。这里只是提供一条思路,具体如何实现可以参考(http://blog.csdn.net/qqwwee_com/archive/2005/08/14/454335.aspx)。以下是代码:

 

None.gif static   void  LoadConfirmCodes()
None.gif
ExpandedBlockStart.gifContractedBlock.gif       
dot.gif {
InBlock.gif
InBlock.gif              confirmCodes.Add(
20357705950);
InBlock.gif
InBlock.gif              confirmCodes.Add(
-13239202421);
InBlock.gif
InBlock.gif              confirmCodes.Add(
10584162692);
InBlock.gif
InBlock.gif              confirmCodes.Add(
10981343403);
InBlock.gif
InBlock.gif              confirmCodes.Add(
-16310303134);
InBlock.gif
InBlock.gif              confirmCodes.Add(
5583032615);
InBlock.gif
InBlock.gif              confirmCodes.Add(
-18820801456);
InBlock.gif
InBlock.gif              confirmCodes.Add(
-3934491937);
InBlock.gif
InBlock.gif              confirmCodes.Add(
-12977451958);
InBlock.gif
InBlock.gif              confirmCodes.Add(
18624901559);
InBlock.gif
ExpandedBlockEnd.gif       }

None.gif
None.gif       
None.gif
None.gif       
static   string  GetConfirmCode(Bitmap bmp)
None.gif
ExpandedBlockStart.gifContractedBlock.gif       
dot.gif {
InBlock.gif
InBlock.gif              Rectangle r1 
= new Rectangle(00610);
InBlock.gif
InBlock.gif              Rectangle r2 
= new Rectangle(100610);
InBlock.gif
InBlock.gif              Rectangle r3 
= new Rectangle(200610);
InBlock.gif
InBlock.gif              Rectangle r4 
= new Rectangle(300610);
InBlock.gif
InBlock.gif              
InBlock.gif
InBlock.gif              Bitmap b1 
= bmp.Clone(r1, bmp.PixelFormat);
InBlock.gif
InBlock.gif              Bitmap b2 
= bmp.Clone(r2, bmp.PixelFormat);
InBlock.gif
InBlock.gif              Bitmap b3 
= bmp.Clone(r3, bmp.PixelFormat);
InBlock.gif
InBlock.gif              Bitmap b4 
= bmp.Clone(r4, bmp.PixelFormat);
InBlock.gif
InBlock.gif              
InBlock.gif
InBlock.gif              
return string.Format("{0}{1}{2}{3}", ImageToNumeric(b1),
InBlock.gif
InBlock.gif                     ImageToNumeric(b2), ImageToNumeric(b3), ImageToNumeric(b4));
InBlock.gif
ExpandedBlockEnd.gif       }

None.gif
None.gif       
None.gif
None.gif       
static   int  ImageToNumeric(Bitmap bmp)
None.gif
ExpandedBlockStart.gifContractedBlock.gif       
dot.gif {
InBlock.gif
InBlock.gif              StringBuilder sb 
= new StringBuilder();
InBlock.gif
InBlock.gif              
int height = bmp.Height - 1;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif              
for (int i = 0; i < height; i++)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif              
dot.gif{
InBlock.gif
InBlock.gif                     
int width = bmp.Width - 1;
InBlock.gif
InBlock.gif                     
for (int j = 0; j <= width; j++)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                     
dot.gif{
InBlock.gif
InBlock.gif                            Color color 
= bmp.GetPixel(j, i);
InBlock.gif
InBlock.gif                            sb.Append(color.Name 
== "ffeeeeee" ? "0" : "1");
InBlock.gif
ExpandedSubBlockEnd.gif                     }

InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif              
return confirmCodes[sb.ToString().GetHashCode()];
InBlock.gif
ExpandedBlockEnd.gif       }

None.gif
None.gif

 

    以上代码将像素点按背景和非背景转换成了字符串,然后取得Hash,然后将取回来的图片进行转换后与以存在的对比。当然,以有的库你必须先学习,也就是说你先必须从网站先学到(0-9)这10个图片,分析出字符串,得到每个数的Hash。
    这里只是简单的说明了一个基本的投票机的原理,如果有足够的资源,而且不能使用代理的时候,就可以使用自动切IP(要求你有足够多的合法IP资源)和ADSL自动断线重拨(要求你有足够多的ADSL)。下一篇文章将说明如何切IP和ADSL自动断线重拨。

转载于:https://www.cnblogs.com/XiaoHui/archive/2006/04/03/365735.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值