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

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

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

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

cl = new WebClient();

                     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, */*");

                     cl.Headers.Add(
"Referer", idxPage);

                     cl.Headers.Add(
"Accept-Language""en-us");

                     cl.Headers.Add(
"Content-Type""application/x-www-form-urlencoded");

                     cl.Headers.Add(
"UA-CPU""x86");

                     cl.Headers.Add(
"Accept-Encoding""gzip, deflate");

                     
string result = cl.UploadString(votePage, "POST""R1=xx&B1=%CD%B6%C6%B1");

 

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

 

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

WebProxy proxy = new WebProxyhostip, hostport;

cl.Proxy = proxy;

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

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

 

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

 

static void LoadConfirmCodes()

       
{

              confirmCodes.Add(
20357705950);

              confirmCodes.Add(
-13239202421);

              confirmCodes.Add(
10584162692);

              confirmCodes.Add(
10981343403);

              confirmCodes.Add(
-16310303134);

              confirmCodes.Add(
5583032615);

              confirmCodes.Add(
-18820801456);

              confirmCodes.Add(
-3934491937);

              confirmCodes.Add(
-12977451958);

              confirmCodes.Add(
18624901559);

       }


       

       
static string GetConfirmCode(Bitmap bmp)

       
{

              Rectangle r1 
= new Rectangle(00610);

              Rectangle r2 
= new Rectangle(100610);

              Rectangle r3 
= new Rectangle(200610);

              Rectangle r4 
= new Rectangle(300610);

              

              Bitmap b1 
= bmp.Clone(r1, bmp.PixelFormat);

              Bitmap b2 
= bmp.Clone(r2, bmp.PixelFormat);

              Bitmap b3 
= bmp.Clone(r3, bmp.PixelFormat);

              Bitmap b4 
= bmp.Clone(r4, bmp.PixelFormat);

              

              
return string.Format("{0}{1}{2}{3}", ImageToNumeric(b1),

                     ImageToNumeric(b2), ImageToNumeric(b3), ImageToNumeric(b4));

       }


       

       
static int ImageToNumeric(Bitmap bmp)

       
{

              StringBuilder sb 
= new StringBuilder();

              
int height = bmp.Height - 1;

 

              
for (int i = 0; i < height; i++)

              
{

                     
int width = bmp.Width - 1;

                     
for (int j = 0; j <= width; j++)

                     
{

                            Color color 
= bmp.GetPixel(j, i);

                            sb.Append(color.Name 
== "ffeeeeee" ? "0" : "1");

                     }


              }


 

              
return confirmCodes[sb.ToString().GetHashCode()];

       }


 

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

posted @ 2006-04-03 16:35  XiaoHui  阅读(15066)  评论(44编辑  收藏  举报