python+opencv+selenium自动化登录邮箱并解决滑动验证的问题
前言
大家做自动化登录时可能都遇到过滑块验证码需要手动验证的问题,这次我们就来解决他
如下:
在我们做自动化登录时,总会遇到各种奇奇怪怪的验证码,滑块验证码就是其中最常见的一种。若我们的程序自动输入账号密码之后,还需要我们人工去滑动验证码那还能称得上是自动化吗?
那么先给大家说一下我的‘解题步骤'。
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 webdriver import 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 driver driver= 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 res if __name__ == '__main__': get_image()
下面是运行结果,两种不同的验证码背景图都可以正确识别出来。红框为代码识别缺口之后标记的红框
可以看到在跳出验证码之后,我们的程序正确的识别到了缺口的位置,并且正确的返回了缩放后的距离。模拟的鼠标事件完美的把滑块拖动到了缺口的位置。提示我们验证成功,不过我们并没有给代码正确的账号和密码因此会提醒我们账号或密码错误。大家只需填入正确的账号密码即可成功登入。非常的好用~
需要注意一个问题,就是要保持网络的稳定,不要有太大波动。长时间加载不出来页面元素,就会出现获取不到页面元素的报错。
所有可能遇到的问题,我都在代码注释中写了出来,非常详细。隔壁老大爷看了之后都说好。
那么本期文章到这里就结束了,后续有什么问题可以私信我或者在评论区滴滴我嗷~
给大家比个心嗷!
到此这篇关于python+opencv+selenium自动化登录邮箱并解决滑动验证的问题的文章就介绍到这了,更多相关python selenium滑动验证内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
Python getsizeof()和getsize()区分详解
这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20- 这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
- 这篇文章主要介绍了解决python 两个时间戳相减出现结果错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-12
- 这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
- 这篇文章主要介绍了Python绘制的爱心树与表白代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-06