前言

大家做自动化登录时可能都遇到过滑块验证码需要手动验证的问题,这次我们就来解决他

如下:

  在我们做自动化登录时,总会遇到各种奇奇怪怪的验证码,滑块验证码就是其中最常见的一种。若我们的程序自动输入账号密码之后,还需要我们人工去滑动验证码那还能称得上是自动化吗?
那么先给大家说一下我的‘解题步骤’。

1.使用selenium打开邮箱首页。
2.定位到账号密码框,键入账号密码。
3.获取验证图片,使用opencv处理返回滑块应拖动的距离。
4.创建鼠标事件,模拟拖动滑块完成验证。

  需要解决的问题:

1.页面元素的定位。
2.文本框和验证码的frame嵌套。
3.opencv处理验证图片缺口图像匹配并返回距离。
4.webdriver在网页中使用xpath时如何定位自身元素。
5.原始图片尺寸与在网页中的实际尺寸同比例缩放(距离的缩放)。

  OK,思路清晰上代码!!!

  源代码:

#滑稽研究所出品
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from selenium import webdriverimport requests
import time
import cv2#下载图片
def download_img(url,filename):r = requests.get(url)with open( filename + '.png', 'wb') as f:# 对于图片类型的通过r.content方式访问响应内容,将响应内容写入yanzheng.png中f.write(r.content)print(filename + '下载完成')def get_image():#为什么这里要定义全局变量?因为driver在函数内,函数运行完毕就会关闭,#相应的网页也会被关闭,这就是网上很多问为什么网页会自动关闭的原因。global driverdriver= webdriver.Chrome() #获取浏览器对象driver.get("https://mail.qq.com/") #加载百度首页#窗口最大化操作,如果窗口过小,会导致后续拖动滑块时出现视野丢失的问题driver.maximize_window()time.sleep(2) #睡眠两秒driver.find_element_by_xpath('/html/body/div/div[2]/div/div[1]/div/div[1]/div[2]').click()time.sleep(1)driver.switch_to.frame('login_frame')# driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()#输入账号密码input=driver.find_element_by_xpath('//*[@id="u"]')#定位QQ账号框time.sleep(1)input.send_keys("zhanghao") #搜索框输入内容input=driver.find_element_by_xpath('//*[@id="p"]')#定位QQ密码框input.send_keys("你的密码") #搜索框输入内容print('账号密码输入完成。')#这里停顿一下,不然不会显示滑动验证,应该是检测自动化工具的手段。(反爬)time.sleep(1)driver.find_element_by_xpath('//*[@id="login_button"]').click()#注意我们这里又需要跳到验证码的子框(又一个嵌套)time.sleep(1)driver.switch_to.frame('tcaptcha_iframe')#webdriver的定位方法和浏览器xpath不一样,不能直接定位到标签的属性.#需要首先定位到webelement,之后get到属性!!!!!!!bk = driver.find_element_by_xpath('//*[@id="slideBg"]').get_attribute('src')print(bk)#获取背景和滑块地址,下载到本地。key = driver.find_element_by_xpath('//*[@id="slideBlock"]').get_attribute('src')print(bk)download_img(bk,filename= 'bk')download_img(key,filename= 'key')#锁定滑块slider = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_thumb"]')#获取应滑动距离dis = get_distance()print(dis)#滑块部分,没有问题,已完成。newact =  ActionChains(driver)newact.click_and_hold(slider).perform()newact.move_by_offset(xoffset=dis-20,yoffset=0).perform()time.sleep(0.5)newact.release().perform()#处理得到滑块应移动的距离。
def get_distance():path = 'bk.png'img = cv2.imread(path)path = 'key.png'img2 = cv2.imread(path)imgContour = img.copy()print('img.shape:', img.shape)imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)imgBlur = cv2.GaussianBlur(imgGray, (3, 3), 1)imgCanny = cv2.Canny(imgBlur, 400, 500)imgGray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)imgBlur2 = cv2.GaussianBlur(imgGray2, (3, 3), 1)imgCanny2 = cv2.Canny(imgBlur2, 400, 500)cv2.imshow("O", imgCanny)# 匹配拼图result = cv2.matchTemplate(imgCanny, imgCanny2, cv2.TM_CCOEFF_NORMED)# 归一化cv2.normalize(result, result, 0, 1, cv2.NORM_MINMAX, -1)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)print('min_loc:', min_loc)print('max_loc:', max_loc)# 匹配后结果画圈cv2.rectangle(imgContour, max_loc, (max_loc[0] + 135, max_loc[1] + 135), (0, 0, 255), 2)# 原图为680*390 在浏览器resize为280*161,这里我们只用到宽。所以需要进行同比例缩放。res = min_loc[0] / (680 / 280)cv2.imshow("Canny Image", imgContour)#这里不可以用0,因为图片窗口会一直显示,程序卡住无法return出距离给滑块功能使用。cv2.waitKey(100)print('应滑动距离获取成功。')return resif __name__ == '__main__':get_image()

  下面是运行结果,两种不同的验证码背景图都可以正确识别出来。红框为代码识别缺口之后标记的红框


  可以看到在跳出验证码之后,我们的程序正确的识别到了缺口的位置,并且正确的返回了缩放后的距离。模拟的鼠标事件完美的把滑块拖动到了缺口的位置。提示我们验证成功,不过我们并没有给代码正确的账号和密码因此会提醒我们账号或密码错误。大家只需填入正确的账号密码即可成功登入。非常的好用~
  需要注意一个问题,就是要保持网络的稳定,不要有太大波动。长时间加载不出来页面元素,就会出现获取不到页面元素的报错。
  所有可能遇到的问题,我都在代码注释中写了出来,非常详细。隔壁老大爷看了之后都说好。
  那么本期文章到这里就结束了,后续有什么问题可以私信我或者在评论区滴滴我嗷~
  给大家比个心嗷!

  转载自:滑稽研究所
  相关文章,请关注我们吧!

python+opencv+selenium自动化登录邮箱并解决滑动验证相关推荐

  1. python3爬虫系列21之selenium自动化登录163邮箱并读取未读邮件内容

    python3爬虫系列21之selenium自动化登录163邮箱并读取未读邮件内容 1.前言 前面在 python3爬虫系列20之反爬需要登录的网站三种处理方式中介绍的第三种方法,使用自动化测试工具s ...

  2. Python之Selenium自动化爬虫

    文章目录 Python之Selenium自动化爬虫 0.介绍 1.安装 2.下载浏览器驱动 3.实例 4.开启无头模式 5.保存页面截图 6.模拟输入和点击 a.根据文本值查找节点 b.获取当前节点的 ...

  3. Appium+python实现App自动化登录

    Appium+python实现App自动化登录 以下是个人用Appium + python写的第一个App自动化案例,仅做单页面,比较简单,后续将涉及到主功能模块化,需使用到功能时调用即可. 获取设备 ...

  4. python语言+selenium自动化,编写脚本调用Chrome、Firefox浏览器打开百度网站

    python语言+selenium自动化,编写脚本调用Chrome.Firefox浏览器打开百度网站 目标:初始化一个webdriver实例对象driver,通过webdriver.Chrome()和 ...

  5. Python项目实例——selenium自动化项目升级版——定时操作

    低端版:Python的selenium自动化项目实例 升级版加入指定时间段操作功能,例如程序在在上午8:30 到 11:30 下午14:00 到 17:00 晚上19:00 到 晚上 22:00运行 ...

  6. dnf自动刷图python脚本_python+selenium自动化登录dnf11周年活动界面领取奖励登录部分采坑总结[1]...

    背景: Dnf的周年庆活动之一,游戏在6月22日 06:00~6月23日 06:00之间登陆过游戏后可以于6月25日 16:00~7月04日 06:00领取奖励 目标:连续四天自动运行脚本,自动领取所 ...

  7. python selenium自动化断言_python+selenium自动化登录测试,设计不同场景进行登录,两种方式断言,截图保存...

    # coding : utf-8 # date :2019/1/7 # 根据不同场景做自动化登录测试 # 正确账号密码.正确账户错误密码.等其他场景 from selenium import webd ...

  8. 017:Opencv+Selenium模拟QQ邮箱滑块操作

    之前发了一个国航的滑块模拟操作,没有计算滑块到缺口的位置. 本篇则是用opencv+selenium来对QQ邮箱的滑块进行模拟测试. QQ邮箱链接: https://mail.qq.com/ QQ邮箱 ...

  9. python脚本——selenium自动化执行一些网页上的操作

    文章目录 一.说明 二.代码 三.用法总结 一.说明 通过python的selenium模块,自动化执行一些网页上的重复的无聊的工作. 二.代码 #! /usr/bin/python3.6 from ...

最新文章

  1. mysql评论表结构设计_文章评论嵌套显示mysql表结构如何设计(形式如网易新闻评论)...
  2. 的标题形状工具在哪里_一分钟教你做一款让人眼前一亮的标题!你想学吗?「Word技巧」...
  3. matlab的单项悟空整流,一种新型单相脉冲整流器的MATLAB仿真研究
  4. Qt 中实现在控件中点击鼠标,就在鼠标点击处加载图片的方法
  5. Python爬虫爬取微博热搜保存为 Markdown 文件
  6. L1-014 简单题 (5 分)—团体程序设计天梯赛
  7. 八、K8s 密码管理
  8. access做仓库管理
  9. 高阶系统设计优化-----Bloom Filter
  10. 【阿里开发规范】Java开发手册(嵩山版)
  11. Django菜鸟入门
  12. 学校计算机房网络的拓扑结构一般采用,XX学校机房建设规划方案
  13. 第8章——DMA控制器
  14. 2021年清北等重点高校都有哪些冬令营?最全汇总看这里!
  15. 随机森林模型sklearn_sklearn中的随机森林
  16. 跨境电商战略发展中,流星汇聚分析未来跨境电商发展趋势
  17. 错误ORA-01438: 值大于为此列指定的允许精度
  18. ArcGIS快速分别导出大量范围线的坐标到报盘Excel格式
  19. 最小二乘法求模型最优解
  20. 汽车芯片的可靠性为其他行业打开了大门

热门文章

  1. C# delegate、event、Action、Func使用案例解析
  2. 基于TCP协议的mfc多人聊天室
  3. 闰日闰年问题 大年份计算
  4. 打印图形——空心的倒三角形
  5. python学习——IO编程——文件读写
  6. explorer exe 服务器运行失败,win10系统提示explorer.exe服务器运行失败
  7. Esxi重置root密码
  8. 集福宝- 支付宝 集福神器 2020 【三年集福老品牌】
  9. python如何把ts视频拼接起来_Python实现FLV视频拼接功能
  10. Yii2 事件--自定义事件和系统事件