转载自:http://xiaohui.cnblogs.com/archive/2006/04/03/365735.html
投票机的实现及相关技术(一)
本文仅限于投票机技术的讨论与学习,请大家以后不要再留言索求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 WebProxy(hostip, hostport);
cl.Proxy = proxy;
使用了代理服务器后,如果服务器不进行代理服务器的检测,那么每换一次代理,就相当于换了新的IP。代理当然可以实现程序自动更换,比如说你先取一个列表,然后随机从列表中去,具体代码我就不贴出来了。
投票程序如果加了验证码,那么就要取得验证码,单纯的数字验证,相当简单,我就不说了,这里说一下使用图形验证码,看下面图形(相对比较简单的图形验证)
上面的图片中,只有数字,虽然数字颜色不同,但没躁点,无干扰线,还有就是背景色是不变的,现在思路就是,读取图片,把图片中的单个数字截取出来,再转换成黑白色,也就是说如果当前象素如果是背景色,就转换成白色,反之转换成黑色。这里只是提供一条思路,具体如何实现可以参考(http://blog.csdn.net/qqwwee_com/archive/2005/08/14/454335.aspx)。以下是代码:
static void LoadConfirmCodes()
{
confirmCodes.Add(2035770595, 0);
confirmCodes.Add(-1323920242, 1);
confirmCodes.Add(1058416269, 2);
confirmCodes.Add(1098134340, 3);
confirmCodes.Add(-1631030313, 4);
confirmCodes.Add(558303261, 5);
confirmCodes.Add(-1882080145, 6);
confirmCodes.Add(-393449193, 7);
confirmCodes.Add(-1297745195, 8);
confirmCodes.Add(1862490155, 9);
}
static string GetConfirmCode(Bitmap bmp)
{
Rectangle r1 = new Rectangle(0, 0, 6, 10);
Rectangle r2 = new Rectangle(10, 0, 6, 10);
Rectangle r3 = new Rectangle(20, 0, 6, 10);
Rectangle r4 = new Rectangle(30, 0, 6, 10);
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自动断线重拨。