`
alex8946
  • 浏览: 369391 次
  • 性别: 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  
眼睛都看花了  这个颜色

相关推荐

    22T挖掘机回转减速器设计说明书.doc.doc

    22T挖掘机回转减速器设计说明书.doc.doc

    步进式推刚机设计说明书.doc

    步进式推刚机设计说明书.doc

    《单片机技术》课程设计说明书 8x8x8的光立方设计.docx

    《单片机技术》课程设计说明书 8x8x8的光立方设计.docx

    累加平均算法verilog

    累加平均算法verilog

    时间序列预测中SVM、BP神经网络与LSTM的应用及MATLAB实现

    内容概要:本文详细介绍了支持向量机(SVM)、BP神经网络和LSTM网络在时间序列预测中的应用及其MATLAB实现。首先,针对SVM部分,文章讲解了如何将时间序列数据转化为特征矩阵并通过滑动窗口进行预测,强调了交叉验证的重要性。对于BP神经网络,则着重于数据归一化以及网络结构的选择,并指出BP网络容易陷入局部最优的问题。最后,在LSTM部分,文章展示了如何利用MATLAB的深度学习工具箱实现LSTM网络,解决了输入数据格式转换的问题,并实现了滚动预测。文中提供了具体的代码示例,确保读者能够轻松替换数据源并运行程序。 适用人群:适用于有一定MATLAB基础的时间序列预测初学者和技术爱好者。 使用场景及目标:帮助读者掌握三种不同类型的机器学习模型在时间序列预测任务中的具体应用,理解各自的特点和优缺点,从而选择合适的模型应用于实际项目中。 其他说明:文章不仅提供了详细的理论解释,还给出了完整的代码实现,使得读者可以直接上手实践。同时,作者提醒了一些常见的错误和注意事项,如数据格式、归一化等问题,有助于提高预测准确性。

    基于S7-200 PLC与组态王的花式喷泉控制系统设计及其实现

    内容概要:本文详细介绍了利用S7-200 PLC和组态王构建智能花式喷泉控制系统的设计思路和技术细节。首先阐述了喷泉系统的基本构成,包括硬件部分如PLC、喷嘴及其连接方式,以及软件部分如喷嘴控制逻辑、喷泉变换逻辑和控制画面设计。接着展示了具体的梯形图接线图和代码实现,解释了关键变量的作用和程序流程。最后讨论了系统测试与调试的方法,强调了硬件配置、IO分配、通信配置等方面的注意事项,并分享了一些实用技巧。 适合人群:对工业自动化感兴趣的工程技术人员,特别是从事PLC编程和组态软件应用的从业者。 使用场景及目标:适用于需要设计和实施智能喷泉控制系统的项目,旨在提高喷泉展示的效果和管理效率。通过学习本文,读者可以掌握如何使用PLC和组态王创建复杂的喷泉控制系统,实现多样化的喷水模式。 其他说明:文中提供了丰富的实践经验,包括常见问题的解决方案和优化建议,有助于读者更好地理解和应用相关技术。同时,附带的实际案例使理论更加生动具体,便于理解和模仿。

    基于S7-200 PLC的饮料灌装机控制系统设计与实现

    内容概要:本文详细介绍了基于西门子S7-200 PLC的饮料灌装机控制系统的设计与实现。首先阐述了硬件设计,包括瓶体输送、定位检测、液体灌装、计数统计等环节的具体配置,如CPU224搭配EM221数字量扩展模块及其I/O分配。接着深入解析了梯形图程序的核心代码,涵盖系统启停控制、灌装流程控制以及产量统计等功能模块。此外,还展示了如何利用WinCC Flexible进行组态画面设计,实现了动态液位显示、实时计数器和电磁阀状态指示灯等功能。最后分享了一些调试过程中遇到的实际问题及解决方案,如接近开关接线错误、电磁阀动作引起的输出抖动等问题,并提出了效率优化技巧。 适合人群:从事PLC编程、自动化控制系统的工程师和技术人员,尤其是对西门子S7-200系列PLC感兴趣的读者。 使用场景及目标:适用于饮料行业或其他类似行业的灌装生产线控制系统开发项目。目标是帮助读者掌握S7-200 PLC在实际生产环境中的应用方法,提高系统的稳定性、可靠性和效率。 其他说明:文中不仅提供了详细的理论讲解,还包括了许多实用的经验分享和注意事项,有助于读者更好地理解和应用于实际工作中。同时,对于初学者而言,可以作为学习PLC编程和控制系统设计的良好参考资料。

    6156铝合金平板对接焊焊接工艺及夹具设计 设计说明书.doc

    6156铝合金平板对接焊焊接工艺及夹具设计 设计说明书.doc

    中兴U30高级web后台app

    中兴U30高级web后台app

    基于LABVIEW的西门子PLC数据采集处理程序设计与实现

    内容概要:本文详细介绍了一款基于LABVIEW开发的通用型PLC通讯与数据处理程序。该程序主要用于与西门子PLC进行通讯,完成数据采集、存储、回放、处理及报警显示等功能。文中具体介绍了各个功能模块的实现方法和技术要点,包括OPC协议通讯、内存和CSV文件存储、数据回放与处理、报警逻辑等。此外,作者还分享了一些开发过程中遇到的问题及其解决方案。 适合人群:从事工业自动化领域的工程师、技术人员,尤其是熟悉LABVIEW和PLC编程的专业人士。 使用场景及目标:适用于需要进行工业数据采集和处理的各种项目,旨在帮助开发者快速构建稳定可靠的数据采集系统,提高工作效率。 其他说明:文中提供了详细的代码示例和注意事项,有助于读者更好地理解和应用相关技术。同时,该程序具有良好的扩展性和灵活性,可以根据具体需求进行定制化开发。

    Realtek PCIe GBE Family Controller网卡驱动程序 v2.1 Win7 or above

    老网卡驱动程序,给老电脑老系统(XP,WIN7等)留存备用啦

    新能源汽车领域的电动汽车方案详解:涵盖BMS、电机控制与PCB设计

    内容概要:本文详细介绍了最新的电动汽车设计方案,涉及电池管理系统(BMS)、电机控制以及PCB设计等方面。文中首先展示了高压平台的BMS控制板及其采用的Rust语言实现的主动均衡算法,该算法通过移动平均替代传统阈值判断,提高了均衡效率。接着讨论了电机控制部分,特别是FOC算法的实现细节,强调了硬件设计中的关键组件选择和布局技巧,如MOSFET驱动电路和DC-Link电容的放置。此外,文章还探讨了CAN总线通信协议的应用,确保各模块间稳定的数据传输。最后提到了一些实用的设计建议,如热管理和防呆设计等。 适合人群:从事新能源汽车研究与开发的专业人士,尤其是对电动汽车硬件设计和软件实现感兴趣的工程师。 使用场景及目标:帮助读者深入了解电动汽车的关键技术和设计理念,为实际项目提供理论支持和技术指导。同时,也为初学者提供了入门级别的理解和实践方法。 其他说明:文章不仅包含了详细的代码示例和技术解析,还附带了一些实用的小贴士,如硬件防护措施和设计注意事项。

    (整理)平压印刷机运动方案和主要机构设计课程设计说明书.doc

    (整理)平压印刷机运动方案和主要机构设计课程设计说明书.doc

    蛋壳清洁机设计说明书.pdf

    蛋壳清洁机设计说明书.pdf

    二氧化硫填料吸收塔设计_毕业设计说明书.doc

    二氧化硫填料吸收塔设计_毕业设计说明书.doc

    三相与单相整流仿真:基于双闭环PI控制、SVPWM及PLL的应用与优化

    内容概要:本文详细探讨了三相和单相整流仿真中的关键技术,重点介绍了双闭环PI控制、空间矢量脉宽调制(SVPWM)以及锁相环(PLL)的应用。文章首先解释了三相整流中的电压外环和电流内环的作用机制,强调了电流内环PI参数调节的重要性,并提供了具体的MATLAB代码示例。接着讨论了PLL在电网电压跌落情况下的表现及其改进方法,如采用二阶广义积分器(SOGI)结构提高稳定性。对于SVPWM部分,则讲解了扇区判断逻辑和波形生成的具体步骤,指出调制比过高会导致波形畸变的问题并提出解决方案。此外,还涉及了单相整流中SPWM的实现方式,包括虚拟正交生成和电流环设计,以及如何应对二次谐波干扰。最后,文章总结了一些实用的经验和技术要点,如参数整定、仿真步长选择等。 适合人群:从事电力电子研究的技术人员、高校相关专业师生、对电力电子控制系统感兴趣的工程师。 使用场景及目标:适用于希望深入了解三相和单相整流仿真原理的研究者,旨在帮助他们掌握双闭环控制、SVPWM和PLL的实际应用技巧,从而更好地进行系统设计和故障排除。 其他说明:文中不仅包含了详细的理论分析,还附有大量的代码片段供读者参考实践,有助于加深理解和提高动手能力。同时提醒读者关注一些常见的陷阱和注意事项,确保仿真结果更加可靠。

    joblib-0.12.2-py2.py3-none-any.whl

    该资源为joblib-0.12.2-py2.py3-none-any.whl,欢迎下载使用哦!

    基于PLC的电阻炉温度控制系统设计与实现:从梯形图到组态画面的实战解析

    内容概要:本文详细介绍了基于PLC的电阻炉温度控制系统的完整设计方案,涵盖硬件配置、IO分配、梯形图编程以及组态画面设计。首先,文章展示了硬件架构的选择与配置,包括选用西门子S7-1200 CPU、热电偶、固态继电器等组件。接着,深入探讨了梯形图编程的关键部分,特别是PID控制算法的应用及其优化方法,如抗积分饱和设置、分段PID参数调整等。此外,文章还强调了组态画面设计的人机交互体验,确保操作简便且直观。最后,分享了一些调试经验和常见问题解决方案,如热电偶补偿导线的正确接线、环境温度补偿算法等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是有志于深入了解PLC温度控制系统设计的专业人士。 使用场景及目标:适用于冶金、化工等行业中涉及高温加热工艺的企业,旨在提高温度控制精度,降低能耗,保障生产安全。通过学习本文,读者能够掌握完整的PLC温度控制系统设计流程,应用于实际工程项目中。 其他说明:文中提供的技术细节仅供参考,在具体应用时需根据实际情况进行适当调整。建议在实施前进行充分的仿真测试,确保系统的稳定性和可靠性。

    LabVIEW调用VisionPro实现工业级机器视觉应用的关键技术和最佳实践

    内容概要:本文详细介绍了如何利用LabVIEW调用VisionPro框架进行工业级机器视觉应用开发。主要内容涵盖加载和运行VPP文件、相机采集与图像处理、图像保存、标定流程、实时图像采集显示以及内存管理和参数设置等方面。文中不仅提供了具体的代码示例,还分享了许多实用技巧和注意事项,如避免内存泄漏的方法、正确的标定步骤、图像格式转换等。 适合人群:从事机器视觉开发的技术人员,尤其是那些需要将LabVIEW与VisionPro结合使用的开发者。 使用场景及目标:适用于需要开发复杂机器视觉系统的场合,旨在提高图像处理效率、精度和稳定性。具体应用场景包括但不限于自动化生产线的质量检测、产品外观缺陷检测等。 其他说明:文章强调了在开发过程中应注意的问题,如内存管理、图像格式转换、标定精度等,并提供了一些优化建议和技术细节,有助于开发者更好地理解和掌握这两款工具的联合使用方法。

    2023年建筑工程项目管理简答题历年自考真题整理.docx

    2023年建筑工程项目管理简答题历年自考真题整理.docx

Global site tag (gtag.js) - Google Analytics