近来,一个朋友请我帮他在某个网站投票。投票程序设立了验证码,并且限制每个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等多种比较方式。根据图片中干扰的情况,选择一种最合适的 方式,或者用多种方式逐步处理以后进行比较,验证码就可以轻松识别了。
至于识别验证码后进行自动灌水就很简单了。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 代码
- <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,可以不断更新当前的提示行,而不是一行一行的输出程序运行结果,这样看起来更简洁一些。
分享到:
相关推荐
数学建模学习资料 神经网络算法 参考资料-Matlab 共26页.pptx
happybirthday2 升级版生日祝福密码0000(7).zip
本项目是一个基于SSM框架的税务门户网站实现,结合了Vue技术,旨在提供一个全面的税务信息管理平台。该项目主要功能包括税务信息查询、税务申报、税务政策浏览及用户管理等多个模块。通过这些功能,用户可以方便地查询和管理税务相关的各类信息,同时也能及时了解最新的税务政策和规定。 项目采用SSM框架,即Spring、Spring MVC和MyBatis,这三者的结合为项目提供了强大的后端支持,确保了数据的安全性和系统的稳定性。前端则采用Vue.js框架,以其高效的数据绑定和组件化开发模式,提升了用户界面的响应速度和用户体验。 开发此项目的目的不仅是为了满足计算机相关专业学生在毕业设计中的实际需求,更是为了帮助Java学习者通过实战练习,深入理解并掌握SSM框架的应用,从而在实际工作中能够更好地运用这些技术。
php7.4.33镜像7z压缩包
本项目是一个基于Java的珠宝购物网站系统,采用SSM框架进行开发,旨在为计算机相关专业学生提供一个实践平台,同时也适合Java学习者进行实战练习。项目的核心功能涵盖商品展示、用户注册登录、购物车管理、订单处理和支付系统等。通过这一系统,用户可以浏览各类珠宝商品,包括详细的商品描述、高清图片和价格信息,同时能够方便地添加商品至购物车,并进行结算和支付操作。 在技术实现方面,项目运用了Spring、Spring MVC和MyBatis三大框架,确保系统的稳定性和扩展性。Spring负责业务逻辑层,提供依赖注入和面向切面编程的支持;Spring MVC则处理Web层的请求和响应,实现MVC设计模式;MyBatis作为持久层框架,简化了数据库操作。 此外,项目采用JSP技术进行前端页面展示,结合HTML、CSS和JavaScript等技术,为用户提供友好的交互界面。
基于java的高校大学生党建系统设计与实现.docx
本项目是一个基于Python-Django框架开发的疫情数据可视化分析系统,旨在为计算机相关专业的学生提供一个实践平台,同时也适用于需要进行项目实战练习的同学。项目集成了疫情数据的收集、处理、分析和可视化功能,为用户提供了一个直观、高效的数据分析环境。 在功能方面,系统能够自动抓取最新的疫情数据,包括确诊、疑似、治愈和死亡人数等关键指标。数据处理模块则负责清洗和整理这些数据,以确保分析的准确性。分析模块采用了多种统计方法和机器学习算法,以揭示疫情的发展趋势和潜在模式。可视化模块则通过图表和地图等形式,直观地展示了分析结果,便于用户理解和分享。 项目的开发框架选择了Django,这是一个高级Python Web框架,它鼓励快速开发和清晰、务实的设计。Django的强大功能和灵活性,使得项目能够快速响应需求变化,同时保证了系统的稳定性和安全性。
果树领养计划.docx
环境说明:开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器。 项目均可完美运行 基于Java的云平台信息安全攻防实训平台提供了以下核心功能: 1. **实训课程与项目**:平台提供了丰富多样的实训课程和项目,覆盖网络安全基础知识、漏洞挖掘与利用、渗透测试技术、安全防护策略等多个领域。 2. **在线学习模块**:学员可以通过在线学习模块观看教学视频、阅读文档资料,系统地学习信息安全知识。 3. **虚拟实验室环境**:平台提供虚拟实验室环境,学员可以在模拟的真实网络场景中进行攻防演练,包括漏洞扫描、攻击测试和防御措施的学习。 4. **教学管理功能**:教师可以创建和管理课程内容,制定教学计划,布置实训作业和考试任务。 5. **监控和统计功能**:教师可以实时了解学员的学习进度、实践操作情况和考试成绩,进行有针对性的指导和辅导。 6. **平台管理功能**:管理员负责用户管理、资源分配、系统安全维护等,确保平台稳定运行和实训环境的安全性。 7. **实时监控和评估**:系统具备实时监控和评估功能,能够及时反馈学生的操作情况和学习效果。 8. **用户认证和授权机制**:平台采用了严格的用户认证和授权机制,确保数据的安全性和保密性。 这些功能共同构建了一个功能丰富、操作便捷的实训环境,旨在提升学员的信息安全技能,为信息安全领域的发展输送专业人才。
基于GrampusFramework的轻量级单体RBAC权限管理系统
内容概要:本文档全面整理了软考(中级-软件设计师)的关键知识点,涵盖了计算复杂度、网络协议、数据结构、编程语言、数据库理论、软件测试、编译原理、设计模式、安全协议等多个方面的内容。具体涉及环路复杂度计算、SSH协议、数据字典与数据流图、对象的状态与数字签名、编程语言分类、海明码、著作权法、物理层与数据链路层设备、归纳法与演绎法、模块间耦合、能力成熟度模型集成、配置管理与风险管理、数据库关系范式、内存技术、计算机网络端口、路由协议、排序算法、中间代码、软件测试类型、编译器各阶段任务、设计模式、耦合与内聚、计算机病毒种类等。 适用人群:备考软考(中级-软件设计师)的技术人员,尤其是有一定工作经验但希望进一步提升自身技能和知识的IT从业人员。 使用场景及目标:帮助考生系统梳理考试重点,理解和掌握软件设计师应具备的专业知识和技术。适合考前复习和巩固基础知识。文档还可以作为参考资料,用于日常工作中遇到相关问题时查阅。 其他说明:本文档不仅提供了丰富的知识点,还附带了一些关键术语的定义和详细的解释,确保读者能够全面理解相关内容。建议在复习过程中结合实际案例进行练习,加深理解。
数学建模学习资料 神经网络算法 Hopfield网络 共58页.pptx
工作寻(JobHunter)是一款招聘信息整合的网站,目前固定的模板有拉勾网,中华英才网,前程无忧。工作寻可以在线通过关
本项目是基于Python实现的协同过滤音乐推荐系统,旨在为计算机相关专业学生提供一个完整的毕设实战案例。项目以协同过滤算法为核心,通过分析用户历史行为数据,为用户推荐符合其兴趣偏好的音乐。 主要功能包括用户兴趣建模、音乐推荐生成以及用户反馈机制。系统能够实时捕捉用户听歌行为,动态更新用户兴趣模型,从而更精准地推送个性化音乐推荐。同时,系统设计了友好的用户界面,使用户能够方便地获取推荐音乐,并通过反馈机制不断完善推荐算法。 在技术框架方面,项目采用了Python编程语言,借助scikit-learn等机器学习库实现协同过滤算法,并结合Flask框架搭建了Web服务,确保了系统的性能和稳定性。此项目的开发,不仅能够帮助学生深入理解协同过滤算法及音乐推荐系统的工作原理,还能提升其软件开发和项目管理能力。
微型餐饮补正备案材料通知书.docx
食品生产许可质量跟踪监督建议书.docx
基于django的音乐推荐系统.zip
如果让某人推荐Python技术书,请让他看这个列表很棒的 Python 书籍如果让某人推荐Python技术书,请让他看这个列表前言好的技术书籍可以帮助我们快速成长,大部分人新生儿或者少部分受益于经典的技术书籍。在「Python开发者」微信公号后台,我们经常能收到帮忙推荐书籍的消息。此类问题在@Python开发者微博和伯乐在线的Python小组讨论中也绝非耳熟能详。 7月3日,伯乐在线在「Python开发者」微信公号发起了一个讨论(注PC端无法看到大家的评论,需要关注微信公号后,从微信公号才可以看到),通过这个讨论话题,在评论中分享对自己有帮助的大量Python技术书籍。 (Python开发者)入门《Head First Python》+入门级+微信49票+豆瓣评分9.5推荐语**66**浅显易懂,编排的顺序特别,有大量插图、对话,感觉枯燥古心通熟易懂,大量の图片,不会觉得枯燥,是一本不错的入门书《集体智慧编程》+入门级+微信123票+豆瓣评分 9.0推荐语**Mèrçurý**以实例具体的方式来展示Python的编程技巧,受益良多《Py
基于java的博客系统设计与实现.docx
建设工程基本建设程序检查表.docx