title: 论如何破解腾讯滑块验证码
date: 2020-04-10 21:19:57.0
updated: 2020-09-27 21:55:33.0
url: https://www.ufec.cn/archives/4.html
thumbnail: https://ghproxy.com/https://raw.githubusercontent.com/ufec/picGoImg/main/blog/2020/04/timg-97d283f09f9f4ddc896ea6ea715b2380.webp
categories:
- 代码
tags:
- Python
- 爬虫开发
实现缘由
学校要求每天要提交个什么健康信息收集表,交就交,每天数据没啥变化,这腾讯文档还不能保存选择(就算状况有变,个人基本信息不会变,非得要重新填,小程序里历史记录点一下页面就会重新置顶,又得拉下去填,真的烦),于是这个小项目就诞生了
实现思路
- Python 模拟登陆
- 获取 cookie
- 构造发送数据
- 接口发送数据
- 创建定时器,定时执行
遇到问题
1、腾讯滑块验证码的问题,腾讯滑块验证码应该是有过一次更新机制,看到网上帖子,是说获取原图与有验证图作比较,得出具体位置,现在的验证码没有原图,只有滑块和缺陷图,上述方法也就失效了
经过爬贴后,看到一个方法,对缺陷图中的轮廓进行提取,据说可在 95%以上,但这也有个问题,如上图所示,如果直接截图拼图区域(280*161),进行识别,就不会成功,猜测是像素不够,获取图片链接,下载原图(680*390)就可以识别;接下来算出比例、滑块图初始位置,比较计算即可算出滑块需要移动的距离。正当对滑块图初始位置无从下手之时,F12 得到了答案
经过不断刷新(穷举所有图片),发现所有初始值均为 22px,这就简单多了,另外轮廓距最左端距离比例大概是 0.43
那么距离就是 x(原图轮廓距左端距离)*0.43-22 即可,而且腾讯这个没有速度检测机制,不需要考虑模拟人工,0.1s 都是可以的,为了保险起见,建议放慢
2、运行期间部分报错
使用定时器时后,报了一个如下错误
出自博客园: https://www.cnblogs.com/ALXPS/p/10193296.html
RuntimeError: There is no current event loop in thread
查找资料得知,asyncio(协程)程序中的每个线程都有自己的事件循环,但它只会在主线程中为你自动创建一个事件循环。所以如果你 asyncio.get_event_loop 在主线程中调用一次,它将自动创建一个循环对象并将其设置为默认值,但是如果你在一个子线程中再次调用它,你会得到这个错误。相反,您需要在线程启动时显式创建/设置事件循环:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
使用 pyppeteer 时候,报了一个类似如下的错误:
出自 stackoverflow: https://url.cn/5ReagPN
handler = _signal.signal(_enum_to_int(signalnum),_enum_to_int(handler))
ValueError: signal only works in main thread.
需要在禁用信号处理的情况下调用启动,实例 browser 对象时,增加如下参数:
'handleSIGINT' : False,
'handleSIGTERM' : False,
'handleSIGHUP' : False
lib 库缺失类错误:
libXtst 库
error while loading shared libraries: libXtst.so.6: cannot open shared object file: No such file or directory
yum list available | grep libXtst #查找对应版本
yum install libXtst.i686 #一般不用选devel这种版本的即可
libXss
error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory
解决方案
yum install libXss #我装这一个好像还不行,
sudo dnf install libXScrnSaver #这两个都装就可以了
libasound
error while loading shared libraries: libasound.so.2: cannot open shared object file: No such file or directory
解决方案
sudo yum install alsa-lib
libatk-bridge
error while loading shared libraries: libatk-bridge-2.0.so.0: cannot open shared object file: No such file or directory
解决方案
yum install at-spi2-atk -y
libgtk-3
error while loading shared libraries: libgtk-3.so.0: cannot open shared object file: No such file or directory
解决方案
yum install gtk3
通用解决方案:https://pkgs.org/download/ + 缺失 lib 库名,如:
https://pkgs.org/download/libatk-bridge-2.0.so.0
选择对应操作系统即可
识别代码
def get_pos(imgpath):
image = cv.imread(imgpath)
blurred = cv.GaussianBlur(image, (5, 5), 0)
canny = cv.Canny(blurred, 200, 400)
contours, hierarchy = cv.findContours(canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for i, contour in enumerate(contours):
M = cv.moments(contour)
if M['m00'] == 0:
cx = cy = 0
else:
cx, cy = M['m10'] / M['m00'], M['m01'] / M['m00']
if 6000 < cv.contourArea(contour) < 8000 and 370 < cv.arcLength(contour, True) < 390:
if cx < 400:
continue
x, y, w, h = cv.boundingRect(contour) # 外接矩形
cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
return x
return 0
写在结尾
其他的基本也就没啥了,主要没找到具体的识别代码,有需要的可以参考,其他问题基本百度都有,CSDN、博客园、思否等等多看看。学习爬虫可以看看崔庆才的爬虫教学
查看《52 讲轻松搞定网络爬虫》目录