论如何破解腾讯滑块验证码

论如何破解腾讯滑块验证码

Scroll Down

实现缘由

学校要求每天要提交个什么健康信息收集表,交就交,每天数据没啥变化,这腾讯文档还不能保存选择(就算状况有变,个人基本信息不会变,非得要重新填,小程序里历史记录点一下页面就会重新置顶,又得拉下去填,真的烦),于是这个小项目就诞生了

实现思路

  1. Python模拟登陆
  2. 获取cookie
  3. 构造发送数据
  4. 接口发送数据
  5. 创建定时器,定时执行

遇到问题

1、腾讯滑块验证码的问题,腾讯滑块验证码应该是有过一次更新机制,看到网上帖子,是说获取原图与有验证图作比较,得出具体位置,现在的验证码没有原图,只有滑块和缺陷图,上述方法也就失效了
1.png
经过爬贴后,看到一个方法,对缺陷图中的轮廓进行提取,据说可在95%以上,但这也有个问题,如上图所示,如果直接截图拼图区域(280*161),进行识别,就不会成功,猜测是像素不够,获取图片链接,下载原图(680*390)就可以识别;接下来算出比例、滑块图初始位置,比较计算即可算出滑块需要移动的距离。正当对滑块图初始位置无从下手之时,F12得到了答案
2.png
经过不断刷新(穷举所有图片),发现所有初始值均为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、博客园、思否等等多看看。学习爬虫可以看看崔庆才的爬虫教学
QQ图片20200410212544.png
查看《52讲轻松搞定网络爬虫》目录