用Python过QQ登录滑块验证
用python+selenium+opencv可以简单过QQ登录滑块验证,本文只着重介绍计算滑块的偏移量,具体登录就不做介绍。
1、首先需要安装 opencv
pip install opencv-python
2、计算滑块需要滑动举例
原理就是腾讯的这个滑块背景图很容易就得到原始图,利用opencv两图相减,就会得到一个只有滑块的背景图,利用这个图片很容易就找到滑块位置。
效果图如下:

相减之后:

最终效果:

import os import traceback import urllib.error import urllib.request import cv2 temp_dir = os.path.realpath(__file__) + '/../temp/' def download_img(url, file): req = urllib.request.Request(url, headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36" }) try: res = urllib.request.urlopen(req) fp = open(temp_dir + file, "wb") fp.write(res.read()) except urllib.error.HTTPError: print('download img error!') # 完整图片很大概率会下载失败,要多次下载 download_img(url, file) # 计算滑块偏移量 def calculate(url, debug=False): try: download_img(url, 'bg.jpg') # 滑块背景图片 download_img(url.replace('_1_', '_0_'), 'full.jpg') # 滑块图 download_img(url.replace('_1_', '_2_'), 'fg.png') # 完整图片 bg = cv2.imread(temp_dir + 'bg.jpg', 0) full = cv2.imread(temp_dir + 'full.jpg', 0) template = cv2.imread(temp_dir + 'fg.png', 0) img = cv2.absdiff(full, bg) # 完整图-背景图 cv2.imshow('ret', img) cv2.waitKey(0) cv2.destroyAllWindows() res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF) # 查找滑块位置 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) if debug: h, w = template.shape[:2] left_top = max_loc # 左上角 right_bottom = (left_top[0] + w, left_top[1] + h) # 右下角 ret = cv2.rectangle(bg, left_top, right_bottom, 255, 2) # 画出矩形位置 cv2.imshow('ret', ret) cv2.waitKey(0) cv2.destroyAllWindows() return max_loc[0] / 680 * 330 - 26 # 这里注意计算,主要是看网页打开时,图片大小,这个时自适应的。 except: traceback.print_exc() return 100 calculate('https://hy.captcha.qq.com/hycdn_1_1585946834324702464_0', True)