`
alex8946
  • 浏览: 369828 次
  • 性别: Icon_minigender_1
  • 来自: 广东广州
社区版块
存档分类
最新评论

验证码识别与自动灌水(http://blog.csdn.net/deadcat/archive/2007/02/15)

阅读更多
近来,一个朋友请我帮他在某个网站投票。投票程序设立了验证码,并且限制每个IP每天只能投一票。我是在debian sarge 3.1下面通过ADSL拨号上网的,IP限制可以通过重新拨号轻松搞定。网上有人说使用代理也可以,但是我找了很久,发现网上列出的大部分代理服务器都已 经无法访问。好了,下面的问题主要就是识别验证码和自动投票了。

网上有很多关于验证码识别的方法和思路,不过大部分都是在windows下面运行的。在linux下面有一个很有名的图片处理软件叫imagemagick。这个软件支持非常多的图片格式已经更多的图片处理方法,请看这里的图片效果:

我 的思路是,首先找到含有验证码的图片,把背景、杂色、条纹等干扰因素去掉,并把图片转化为黑白象素,以便于处理。然后分析图片上每个文字的位置,精确的把 整个图片分割成包含每个文字的小图片。我关注的这个投票网站上的验证码是有0到9这十个数字构成了,我就用GIMP——是的,GIMP是linux下面不 可多得的图像处理软件——打开验证码图片,把十个数字一一截取下来,并且分别命名为0.jpg到9.jpg。截取的时候一定要注意,每个文字最好留一点边 框,并且在截取后的小图片上要居中,这样更利于排除干扰,提高识别率。为了提高准确率,我把用GIMP把验证码放大到1600倍以后对每个象素进行处理。 等要识别图片上验证码的时候,使用相同的位置截取图片上的文字,然后和刚才保存的十个小图片一一对比,与之差异最小的那个图片的序号就是该位置上的文字 了。ImageMagick在命令行下面运行,支持MAE,MSE,PSE,PSNR,RMSE等多种比较方式。根据图片中干扰的情况,选择一种最合适的 方式,或者用多种方式逐步处理以后进行比较,验证码就可以轻松识别了。放大1600倍获取准确位置

至于识别验证码后进行自动灌水就很简单了。linux下面有一个更强大的工具curl,它可以通过HTTP,FTP,HTTPS等多种方式访问远程服务器,自动上传或下载数据。首先用curl查看其HTTP头信息

1 * About to connect() to xxxx.com port 80
2 * Trying xxx.xxx.xxx.xxx... * connected
3 * Connected to xxxx.com (xxx.xxx.xxx.xxx) port 80
4 > GET / HTTP/1.1
5 User-Agent: curl/7.13.1 (debian-linux-gnu) libcurl/7.13.1 OpenSSL/0.9.7e zlib/1.2.2.2 libidn/0.5.13
6 Host: xxxx.com
7 Pragma: no-cache
8 Accept: */*
9
10 < HTTP/1.1 302 Moved Temporarily
11 < Via: 1.1 PROXY
12 < Connection: Keep-Alive
13 < Proxy-Connection: Keep-Alive
14 < Transfer-Encoding: chunked
15 < Date: Tue, 04 Jul 2006 05:55:16 GMT
16 < Location: http://xxxx.com/queryVote.do?type=netvotes&Group=1
17 < Content-Type: text/html;charset=gb2312
18 < Server: WebLogic Server 8.1 SP2 Fri Dec 5 15:01:51 PST 2003 316284
19 < Set-Cookie: JSESSIONID=EqCEDyCC2JGex2sLoT231l6NP38OStZaFf9zLSHUxb2MxrqLBE1i!1559900188; path=/
java 代码
  1. <html></html>22  <head></head>23  "Content-Type" content="text/html; charset=gb2312">24  25  26  "#FFFFFF">27  ...28  29  3031    


32 * Connection #0 to host xxxx.com left intact
33 * Closing connection #0
34
从第19行中可以看出,改站点使用了JSESSION这个cookie。查看投票页面的源代码,我发现投票时使用了POST方法,有五个表单项目需要提交。我把这些都记录下来,构成一个POST字符串就可以了。

上面所说的很罗嗦,还是看我写的代码吧(源网址被改成了xxxx.com)

1 #!/bin/bash
2
3 #exec 1> curl.log
4
5 function parse
6 {
7 ret=
8 file=$1
9 convert $file.jpeg -crop 9x13+1+2 $file-a.jpeg
10 convert $file.jpeg -crop 9x13+10+2 $file-b.jpeg
11 convert $file.jpeg -crop 9x13+19+2 $file-c.jpeg
12 convert $file.jpeg -crop 9x13+28+2 $file-d.jpeg
13 for pic in {a,b,c,d}
14 do
15 dB=1000000000 # a very high value
16 value=10
17 for num in {0,1,2,3,4,5,6,7,8}
18 do
19 curr=`compare -metric PSE $file-$pic.jpeg xj-$num.jpeg null: | awk '{print $1}'`
20 small=`echo "$curr < $dB" | bc`
21 if [ $small -eq 1 ]; then
22 value=$num
23 dB=$curr
24 fi
25 done
26 ret=$ret$value
27 done
28 rm -fr $file-[abcd].jpeg
29 echo $ret
30 }
31
32
33 hit=0
34 for((i=1;i<10000;i++))
35 do
36 pon dsl-provider > /dev/null 2> curl.log
37 sleep 3
38 curl -s \
39 -c cookie \
40 -j \
41 -A "Mozilla/4.0" \
42 http://xxxx.com/MakeEXPWD > code.jpeg
43 code=$(parse code)
44 curl -s \
45 -b cookie \
46 -d "tid=35" \
47 -d "name=jerry$(date +%s)" \
48 -d "certify=310902790504054" \
49 -d "tele=23493451" \
50 -d "authcode=$code" \
51 -d "send=%20" \
52 -e http://xxxx.com/VoteForm.jsp?tID=35 \
53 -A "Mozilla/4.0" \
54 http://xxxx.com/vote.do | grep -q '投票成功'
55 if [ $? -eq 0 ]; then
56 hit=$(($hit + 1))
57 echo -n -e "Total: $i, Hit $hit, Last: $code\r"
58 else true
59 fi
60 rm -fr code.jpeg
61 poff dsl-provider > /dev/null 2> curl.log
62 done
63 exit 0
64


代码中第三行表示把整个程序的输出重定向到文件,可以用于无人值守的批量运行时。如果程序中有很多输入,这样做就可以不必逐一对每个输出的重定向了。
下 面是parse函数,用于对获取到的图片进行识别。分析时,首先截取图片的预定区域,并与准备好的小图片逐一比较,取参数中的最值,其对应的小图片就是该 位置的文字了。比较时使用到了浮点运算,这是bash的弱势所在,所以要用bc进行高精度计算。比较两个图片所用的compare命令支持很复杂的参数和 诸如MAE,MSE,PSE,PSNR,RMSE等多种方式,这里只是用了其中一种。
函数之后就是程序的主循环部分。每次循环时都把adsl断线并重新拨号。从拨号成功到数据能够正常传输之间可能有一段延误时间,所以要sleep一会儿。
下面的第一个curl有两个作用:首先,它从目标网站获取含有验证码的图片;另外,它还取得了当前连接的cookie,并且初始化服务器端的session。其中的-j参数表示每次拨号都抛弃以前的cookie。
第 二个curl使用了刚才取得的cookie,使用post方法向目标站点提交投票数据。其中的name是投票人的姓名,投票程序规定相同的名字只能投一 票,所以我干脆把用时间来表示了。在投票以后的返回页面中检查“投票成功”四个字,如果有则表示本次投票已成功,计数器加一。第55行的$?就表示上一个 命令的返回值:找到关键词时返回0。
每次操作结束以后都要把临时文件删除,同时更新状态行。echo命令加上-n参数表示输出信息后不换行;再加上一个控制字符\r,可以不断更新当前的提示行,而不是一行一行的输出程序运行结果,这样看起来更简洁一些。
分享到:
评论
2 楼 luzl 2009-03-26  
很是牛叉!
1 楼 lenj 2008-09-19  
眼睛都看花了  这个颜色

相关推荐

    COMSOL多物理模拟下二氧化碳驱替甲烷:热流固耦合中煤层变形及物性变化对产气量及封存能力的影响

    内容概要:本文详细介绍了使用COMSOL多物理场仿真软件,在热流固耦合框架下,研究二氧化碳驱替甲烷过程中的煤层变形、孔渗变化及其对甲烷产量和二氧化碳封存量的影响。首先,文章解释了二氧化碳驱替甲烷作为一种关键技术的意义,然后逐步展示了模型的构建方法,包括设定煤层作为多孔介质、考虑其复杂物理特性(如渗透率、孔隙度)以及模拟二氧化碳注入和甲烷释放过程。接着,通过对模拟结果的分析,揭示了煤层在二氧化碳注入后的明显变形、孔渗特性的显著变化,最终得出甲烷产量与煤层孔渗特性紧密相关,而二氧化碳封存量受煤层变形和孔渗变化影响的结论。最后,强调了该模型对未来理解和优化驱替过程的重要性。 适合人群:从事能源领域研究的专业人士,尤其是关注二氧化碳驱替甲烷技术的研究人员和技术人员。 使用场景及目标:适用于需要深入了解二氧化碳驱替甲烷过程中煤层变形和孔渗变化机理的研究项目,旨在提高甲烷产量和二氧化碳封存量的理解和优化。 其他说明:文中提供了详细的建模步骤和代码分析,有助于读者掌握COMSOL多物理场仿真的具体操作方法。

    少儿编程scratch项目源代码文件案例素材-我的世界 守卫者.zip

    少儿编程scratch项目源代码文件案例素材-我的世界 守卫者.zip

    【制造业AGV调度系统】基于Python的两交叉轨道AGV调度优化:任务分配、路径规划与充电管理设计了一个针对制造业环境中(含详细可运行代码及解释)

    内容概要:本文详细探讨了制造业工厂中两条交叉轨道(红色和紫色)上的自动导引车(AGV)调度问题。系统包含2辆红色轨道AGV和1辆紫色轨道AGV,它们需完成100个运输任务。文章首先介绍了AGV系统的背景和目标,即最小化所有任务的完成时间,同时考虑轨道方向性、冲突避免、安全间隔等约束条件。随后,文章展示了Python代码实现,涵盖了轨道网络建模、AGV初始化、任务调度核心逻辑、电池管理和模拟运行等多个方面。为了优化调度效果,文中还提出了冲突避免机制增强、精确轨道建模、充电策略优化以及综合调度算法等改进措施。最后,文章通过可视化与结果分析,进一步验证了调度系统的有效性和可行性。 适合人群:具备一定编程基础和对自动化物流系统感兴趣的工程师、研究人员及学生。 使用场景及目标:①适用于制造业工厂中多AGV调度系统的开发与优化;②帮助理解和实现复杂的AGV调度算法,提高任务完成效率和系统可靠性;③通过代码实例学习如何构建和优化AGV调度模型,掌握冲突避免、路径规划和电池管理等关键技术。 其他说明:此资源不仅提供了详细的代码实现和理论分析,还包括了可视化工具和性能评估方法,使读者能够在实践中更好地理解和应用AGV调度技术。此外,文章还强调了任务特征分析的重要性,并提出了基于任务特征的动态调度策略,以应对高峰时段和卸载站拥堵等情况。

    MATLAB中基于FDTD方法模拟电磁波自由空间传播的仿真系统(含ABC边界与正弦脉冲激励源)

    内容概要:本文介绍了一个使用MATLAB编写的基于FDTD(时域有限差分)方法的电磁波在自由空间中传播的仿真系统。该系统采用了ABC(吸收边界条件)和正弦脉冲激励源,并附有详细的代码注释。文中首先介绍了关键参数的选择依据及其重要性,如空间步长(dx)和时间步长(dt),并解释了它们对算法稳定性和精度的影响。接着阐述了电场和磁场的初始化以及Yee网格的布局方式,强调了电场和磁场分量在网格中的交错排列。然后详细讲解了吸收边界的实现方法,指出其简单而有效的特性,并提醒了调整衰减系数时需要注意的问题。最后,描述了正弦脉冲激励源的设计思路,包括脉冲中心时间和宽度的选择,以及如何将高斯包络与正弦振荡相结合以确保频带集中。此外,还展示了时间步进循环的具体步骤,说明了磁场和电场分量的更新顺序及其背后的物理意义。 适合人群:对电磁波传播模拟感兴趣的科研人员、高校学生及工程技术人员,尤其是那些希望深入了解FDTD方法及其具体实现的人群。 使用场景及目标:适用于教学演示、学术研究和技术开发等领域,旨在帮助使用者掌握FDTD方法的基本原理和实际应用,为后续深入研究打下坚实基础。 阅读建议:由于本文涉及较多的专业术语和技术细节,建议读者提前熟悉相关背景知识,如电磁理论、MATLAB编程等。同时,可以通过动手实践代码来加深理解和记忆。

    少儿编程scratch项目源代码文件案例素材-小鸡会飞.zip

    少儿编程scratch项目源代码文件案例素材-小鸡会飞.zip

    房地产 -云南农博园项目一组团(河尾村)产业规划构思.pptx

    房地产 -云南农博园项目一组团(河尾村)产业规划构思.pptx

    haproxy-2.2.17

    haproxy-2.2.17

    少儿编程scratch项目源代码文件案例素材-音乐飞翔.zip

    少儿编程scratch项目源代码文件案例素材-音乐飞翔.zip

    少儿编程scratch项目源代码文件案例素材-信仰.zip

    少儿编程scratch项目源代码文件案例素材-信仰.zip

    scratch少儿编程逻辑思维游戏源码-锯切片.zip

    scratch少儿编程逻辑思维游戏源码-锯切片.zip

    scratch少儿编程逻辑思维游戏源码-货车.zip

    scratch少儿编程逻辑思维游戏源码-货车.zip

    scratch少儿编程逻辑思维游戏源码-火箭动力超级鱿鱼.zip

    scratch少儿编程逻辑思维游戏源码-火箭动力超级鱿鱼.zip

    scratch少儿编程逻辑思维游戏源码-滚动的天空.zip

    scratch少儿编程逻辑思维游戏源码-滚动的天空.zip

    scratch少儿编程逻辑思维游戏源码-极速求生.zip

    scratch少儿编程逻辑思维游戏源码-极速求生.zip

    scratch少儿编程逻辑思维游戏源码-火柴人战争.zip

    scratch少儿编程逻辑思维游戏源码-火柴人战争.zip

    MATLAB一维PCHE微通道换热器模型:基于系统参数的换热性能研究及应用

    内容概要:本文详细介绍了MATLAB一维PCHE微通道换热器模型在能源工质系统中的应用。首先,文章阐述了PCHE的设计与模型建立,强调了进出口节点温度参数对确定PCHE长度和换热量的重要性。接着,文中采用了湍流型长直半圆通道Gnielinki方程来计算流动换热的努塞尔数,从而评估PCHE的换热性能。最后,通过MATLAB调用Refprop物性库求解普朗特数,进一步优化PCHE的设计,提升其换热效率。研究表明,这种模型有助于提高能源工质系统的换热性能,推动微通道换热器在能源领域的广泛应用。 适合人群:从事能源工程、热力学、换热器设计等相关领域的研究人员和技术人员。 使用场景及目标:适用于需要精确计算和优化微通道换热器性能的研究项目,旨在提高能源利用效率并减少环境污染。 其他说明:随着计算机技术的发展,一维PCHE微通道换热器模型将进一步完善,为能源领域的发展提供更强有力的支持。

    少儿编程scratch项目源代码文件案例素材-星际飞船.zip

    少儿编程scratch项目源代码文件案例素材-星际飞船.zip

    少儿编程scratch项目源代码文件案例素材-外星异形战跑.zip

    少儿编程scratch项目源代码文件案例素材-外星异形战跑.zip

    图25. 火焰成像装置捕获图像示意图

    图25. 火焰成像装置捕获图像示意图

    scratch少儿编程逻辑思维游戏源码-僵尸射击.zip

    scratch少儿编程逻辑思维游戏源码-僵尸射击.zip

Global site tag (gtag.js) - Google Analytics