滑动验证码的解决方案
一 :可以获取到带有缺口的背景图片和缺口图片
1图片的获取保存
以查询shunfeng快递为例子,使用selenium来进行滑块的验证
# 显示等待
wait = WebDriverWait(driver, 30)
# 等待验证码模块加载完成
wait.until(EC.presence_of_element_located((By.ID, 'tcaptcha_iframe')))
# 切换iframe
driver.switch_to.frame('tcaptcha_iframe')
# 等待图片加载完成
wait.until(EC.presence_of_element_located((By.ID, 'slideBg')))
# 然后就可以定位提取url进行图片的保存
2获取滑动的距离
使用opencv可以很好的解决
pip install opencv-python
def get_long():# 背景图片处理# 灰度图片bg_img = cv2.imread('cpt1.png', 0)# 高斯滤波,模糊化bg_img = cv2.GaussianBlur(bg_img, (3, 3), 0)# 边缘检测, 后两个参数为阈值,一般50,150即可bg_img = cv2.Canny(bg_img, 50, 150)slide_img = cv2.imread('cpt2.png', 0)slide_img = cv2.GaussianBlur(slide_img, (3, 3), 0)slide_img = cv2.Canny(slide_img, 50, 150)# 寻找最佳匹配res = cv2.matchTemplate(bg_img, slide_img, cv2.TM_CCORR_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)top_left = max_loc[0]return top_left
3模拟人类运动轨迹
def get_track(distance):# 记录滑动轨迹tracks = []# 从0开始current = 0# 何时开始减速mid = distance*4/5# 时间t = 0.2# 速度v = 0while current < distance:# 加速度if current < mid:a = 3else:a = -3v0 = vv = v0 + a*tmove = v0*t + 1/2 * a * t * ttracks.append(round(move))current += movetracks.append(distance-sum(tracks))return tracks
distance即为要滑动的距离,传参数时还需要减去滑块本身所处位置的距离
4滑动
# 按钮定位
button = driver.find_element_by_id('tcaptcha_drag_button')
# 事件处理
webdriver.ActionChains(driver).click_and_hold(button).perform()
# 按照轨迹滑动,perform() 依次执行任务
for t in tmp_track:webdriver.ActionChains(driver).move_by_offset(xoffset=t, yoffset=0).perform()
# 释放按钮
webdriver.ActionChains(driver).release(button).perform()
二:不能获取到两张图片
以qidian登陆为例,这里可以看到是无法单独获取到滑块图片,和之前不同的是图片的获取和获取滑动距离,其他都一致
1图片的获取
还是和之前一样,等待滑动验证码的加载完成,这里就不多做注释
wait = WebDriverWait(browser, 30)
wait.until(EC.presence_of_element_located((By.ID, 'loginIfr')))
browser.switch_to.frame('loginIfr')browser.find_element_by_xpath('//*[@id="username"]').send_keys('qeqwewd')
browser.find_element_by_xpath('//*[@id="password"]').send_keys('qweqwe')
browser.find_element_by_xpath('//*[@id="j-inputMode"]/div[2]/a').click()wait.until(EC.presence_of_element_located((By.ID, 'tcaptcha_iframe_dy')))
browser.switch_to.frame('tcaptcha_iframe_dy')
# 定位截屏得到图片
browser.find_element_by_id('slideBg').screenshot('captch.png')
2获取滑动距离
def get_long():bg_img = cv2.imread('captch.png', 0)bg_img = cv2.GaussianBlur(bg_img, (3, 3), 0)canny = cv2.Canny(bg_img, 220, 500)# 图象的边缘显示# cv2.imshow('Canny', canny)# cv2.waitKey(10000)# 轮廓检测contours, hierarchy = cv2.findContours(canny, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)for i, contour in enumerate(contours): # 所有轮廓# 面积和周长,可以找一个区间尝试if 500 < cv2.contourArea(contour) <= 2000 and 100 < cv2.arcLength(contour, True) < 300:# 外接矩形,x,y是矩形左上角的坐标,w,h为宽高x, y, w, h = cv2.boundingRect(contour) # print(x, y, w, h)# 绘制矩形# cv2.rectangle(bg_img, (x, y), (x + w, y + h), (0, 0, 255), 2)# cv2.imshow('image', bg_img)# cv2.waitKey(10000)# 找目标缺口,第一个可能是滑块if x <= 200:continuereturn int(x-30)
后面就是计算模仿人类移动轨迹,然后进行按钮定位进行滑动即可
三:可以获取到完整的背景图和带有缺口的背景图
这里获取到图片后可以使用pillow来获取滑动的距离
from PIL import Image, ImageChopsimg_a = Image.open(path)
img_b = Image.open(path)
x = ImageChops.difference(img_a, img_b).getbbox()
x为缺口坐标(left, top, right, bottom)
x[0]即为滑动的距离,记得要减去滑块之前的距离
滑动验证码的解决方案相关推荐
- 自动化测试中的滑动验证码解决方案
很多同学反馈,在web自动化的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证. 今天专门给大家来聊聊验证码的问题,一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或 ...
- 利用深度学习识别滑动验证码缺口位置
做爬虫的同学肯定或多或少会为验证码苦恼过,在最初的时候,大部分验证码都是图形验证码.但是前几年「极验」验证码横空出世,行为验证码变得越来越流行,其中之一的形式便是滑块验证码. 滑块验证码是怎样的呢?如 ...
- 从零开发一款轻量级滑动验证码插件(深度复盘)
关注并将「趣谈前端」设为星标 每天定时分享技术干货/优秀开源/技术思维 github地址: https://github.com/MrXujiang/react-slider-vertify 之前一直 ...
- 与滑动验证码的斗智斗勇,看如何用Python破解
前言 很多小伙伴们反馈,在web自动化的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证.今天专门给大家来聊聊验证码的问题,一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验 ...
- RPA中关于“滑动”验证码与按照“语序”点击两类验证码
学Python,用RPA 艺赛旗RPA2020.1版本 正在免费下载使用中,欢迎下载使用 www.i-search.com.cn/index.html?from=line1 最近发现很多伙伴在项目中都 ...
- selenium爬虫|破解滑动验证码以极验为例
爬虫访问一些网站遇到滑动验证码解决方案 这里是用selenium做模拟,如果是requests可以封装这个登录方法来获取登录后的cookies也是可以用的. 1 思路 先讲思路,分析流程 我们输入账号 ...
- web自动化之验证码识别解决方案
验证码识别解决方案 对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码,验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的,再复杂一点就是滑动 ...
- (RPA)学习——谈谈关于“滑动”验证码与按照“语序”点击两类验证码
为了大家近距离了解RPA,推出信用卡账单管理机器人,独立场景,独立使用,欢迎免费下载使用: http://fs.i-search.com.cn/setup/card1.0.0.13_csdn.exe ...
- 200行代码实现一个滑动验证码
作者 | 崔庆才 转载自进击的Coder(ID: FightingCoder) 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还 ...
最新文章
- jsp中include指令和动作的区别
- All in one TFS 项目建立
- 解决The current branch is not configured for pull No value for key branch.master.merge found in config
- Spring源码由浅入深系列一 简介
- tcga癌症亚型获取_亚型多态性应用于元组的危险
- html4符合web的标准吗,在生成HTML,表格等时,CakePhp是否“符合标准”?
- 关于SQL SERVER 2000在Windows Server 2003下不能使用的问题
- 12佳精美的国外 Flash 网站模板下载(附源文件)
- 大数据技术_ 基础理论 之 数据挖掘与分析
- 堡垒机(运维审计系统)的基本原理与部署方式
- 2023年天津仁爱学院专升本报名确认缴费考试流程
- 【Windows】使用【老毛桃】PE系统进行Windows系统的镜像备份
- 01Linux之计算机硬件软件介绍
- [转帖]Tensor是神马?为什么还会Flow?
- 计算机课吐槽,让上课更有趣!这位老师的课学生可发弹幕提问吐槽
- 论文投稿-图片处理技巧
- 详解为什么v-if和v-for不能同时使用
- Python 空元组、空列表、空字典、空集合
- 单播、组播、广播三者之间的区别
- 英美国家时政与辩论辩题汇总
热门文章
- 使用FileZilla上传和下载远程Linux服务器文件
- debounce实现 js_js 实现一个debounce防抖函数
- 在笛卡尔坐标系上描绘函数(x*x+1)/(x*x-1)曲线
- 让java招聘人最心动的简历
- DeepLab v3+为啥可以封神?(论文讲解含超详细注解+中英文对照+配图)
- GDB调试多线程程序
- MEPG2 -TS小结
- table表格单元格的合并详解
- Silverlight/Windows8/WPF/WP7/HTML5周学习导读(7月16日-7月22日)
- Jenkins+钉钉,实现Jenkins的构建结果直接发送到钉钉群