博客
关于我
python爬虫实战—python破解识别由canvas绘制成的滑块验证码
阅读量:738 次
发布时间:2019-03-21

本文共 1652 字,大约阅读时间需要 5 分钟。

一、网站全面分析

2020中国游戏十强投票网站的自动化操作实验

1.1 网站访问流程

首先,进入投票网站进行注册,发现需要填写姓名、手机号和邮箱信息。虽然现实中存在用户信息真实性的问题,但对于技术实现来说,我们可以通过随机生成百家姓名后的名字、随机号码、随机邮箱来完成自动化操作。

1.2 验证流程

点击"开始投票"后,会跳转到滑块验证码认证界面。这个过程并没有涉及复杂的技术,甚至可以说非常简单。然而,这里有个小陷阱——由于采用了Canvas绘制滑块验证码,传统的图像识别方法已经不再适用。


二、Canvas滑块验证码技术分析

2.1 簡要理解

通过分析发现,该滑块验证码采用了完全不同的实现方式:滑块是通过Canvas绘制出来的,而非传统的图片拼接方式。

2.1.1 背景Canvas
  • Canvas元素在DOM中可以用document.getElementById('puzzle-canvas')找到
  • Canvas绘制的是完全透明的PNG图片
  • PNG图片与背景Canvas的大小完全一致
2.1.2 滑块识别逻辑
  • 通过将Canvas转换为base64编码的图片数据下载下来
  • 只需识别滑块在透明 PNG 图中的像素位置
  • 轻松通过简单的算法找出左端距离顶端像素数值

2.2 实现代码示例

2.2.1 下载Canvas内容
def download_canvas():
# 执行JavaScript获取Canvas内容
canvas_data_url = execute_script('return document.getElementById("puzzle-canvas").toDataURL();'
base64_img = base64.b64decode(canvas_data_url.split(',')[1:])
# 将二进制转换为PNG文件
with open('puzzle.png', 'wb') as f:
f.write(base64_img)
2.2.2 识别滑块位置
import PIL
def identify_puzzle_position(puzzle_image):
# 转换为黑白图像
image = PIL.Image.open(puzzle_image).convert('L')
# 遍历找最小x轴位置
for x in range(image.size[0]):
if any(image.getpixel((x, y)) for y in range(image.size[1])):
return x - 10 # 减少10个像素的偏移量
return 0

三、完整实现流程

3.1 下载滑块图片

通过分析发现,传统图片滑块验证需要解析背景图片中的缺口,这对算法要求较高。Canvas实现的滑块只需要找到滑块左端的位置,因为这直接决定了移动距离,这大大简化了验证流程。

3.2 自动化操作的实现细节

  • 前期可以通过简单的CSS选择器定位Canvas元素
  • 使用JavaScript直接调用Canvas的toDataURL方法获取图片
  • 将Base64字符串解码成图片文件
  • 通过简单的像素处理算法识别滑块位置

四、测试案例

通过对多个投票页面进行测试,发现Canvas滑块的实现方式有很大特点:由于滑块是通过移动一个透明的PNG图层进行验证,实际上只需要计算x坐标即可算出移动距离。


五、总结与展望

通过以上实现,充分证明了Canvas滑块验证码其实并没有想象中的那么难。相比于传统的图像识别问题,这种方式反而简化了验证流程,甚至可以说降低了技术门槛。

对于想实现类似自动化操作的人来说,关键在于:

  • 理解Canvas渲染方式
  • 学习如何处理Base64编码
  • 熟悉简单图像处理算法
  • 希望以上内容能够为大家提供一些启发!

    转载地址:http://rengz.baihongyu.com/

    你可能感兴趣的文章
    Nginx配置TCP代理指南
    查看>>
    Nginx配置——不记录指定文件类型日志
    查看>>
    nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    nginx配置全解
    查看>>
    Nginx配置参数中文说明
    查看>>
    nginx配置域名和ip同时访问、开放多端口
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    Nginx配置文件nginx.conf中文详解(总结)
    查看>>
    Nginx配置负载均衡到后台网关集群
    查看>>
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>