python+opencv+selenium自动化登录邮箱并解决滑动验证的问题
作者:滑稽研究所 发布时间:2021-10-01 07:32:18
前言
大家做自动化登录时可能都遇到过滑块验证码需要手动验证的问题,这次我们就来解决他
如下:
在我们做自动化登录时,总会遇到各种奇奇怪怪的验证码,滑块验证码就是其中最常见的一种。若我们的程序自动输入账号密码之后,还需要我们人工去滑动验证码那还能称得上是自动化吗?
那么先给大家说一下我的‘解题步骤'。
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()
下面是运行结果,两种不同的验证码背景图都可以正确识别出来。红框为代码识别缺口之后标记的红框
可以看到在跳出验证码之后,我们的程序正确的识别到了缺口的位置,并且正确的返回了缩放后的距离。模拟的鼠标事件完美的把滑块拖动到了缺口的位置。提示我们验证成功,不过我们并没有给代码正确的账号和密码因此会提醒我们账号或密码错误。大家只需填入正确的账号密码即可成功登入。非常的好用~
需要注意一个问题,就是要保持网络的稳定,不要有太 * 动。长时间加载不出来页面元素,就会出现获取不到页面元素的报错。
所有可能遇到的问题,我都在代码注释中写了出来,非常详细。隔壁老大爷看了之后都说好。
那么本期文章到这里就结束了,后续有什么问题可以私信我或者在评论区滴滴我嗷~
给大家比个心嗷!
来源:https://blog.csdn.net/weixin_45067072/article/details/118465642


猜你喜欢
- 有两个简单的方法MySQL中的数据加载到MySQL数据库从先前备份的文件。LOAD DATA导入数据:MySQL提供了LOAD DATA语句
- 引子闭包是有权访问另一个函数作用域中的变量的函数。闭包是javascript中很难理解的部分,很多高级的应用都依靠闭包来实现的,我们先来看下
- 使用Python的第三方库pyautogui,PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘
- 通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的:这些图怎么做出来呢?今天就来分享下如何一步步绘
- 一、安装包MYSQL服务下载地址:MySQL官网下载,这里会显示当前最新的版本,MYSQL刚从5.7版本升到8.0正式版,据说速度提升了2倍
- 一、色彩空间的转换代码如下:#色彩空间转换import cv2 as cvdef color_space_demo(img):
- Python序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人。你会怎么做?这取决于你想要怎么保存,怎么
- 谈到比特币,我们都知道挖矿,有些人并不太明白挖矿的含义。这里的挖矿其实就是哈希的碰撞,举个简单例子:import hashlibx = 11
- pytest fixtures装饰器pytest中可以使用@pytest.fixture 装饰器来装饰一个方法,被装饰方法的方法名可以作为一
- 一、测试常用规则一个测试单元必须关注一个很小的功能函数,证明它是正确的;每个测试单元必须是完全独立的,必须能单独运行。这样意味着每一个测试方
- 春节来到,红包们大概率在微信各大群中肆虐,大家是否都一样不抢到红包们心里就感觉错过了一个亿,可总会被这事那事耽误而遗憾错过,下面用 Pyth
- 1.循环删除 #这个是我选中其中的一个分支进行右键清空操作时进行的处理for i in range(self.tree.currentIte
- <html>位于网页的顶端它没有父辈,称之为根节点1.元素节点(element node)可以说,整个DOM模型都是由元素节点(
- 本文实例讲述了Python生成8位随机字符串的方法。分享给大家供大家参考,具体如下:#!/usr/bin/env python# -*- c
- 今天想直观的展示一下数据就用到了matplotlib模块,之前都是一张图只有一条曲线,现在想同一个图片上绘制多条曲线来对比,实现很简单,具体
- Celery 简介除了redis,还可以使用另外一个神器---Celery。Celery是一个异步任务的调度工具。Celery 是 Dist
- php多进程实现PHP有一组进程控制函数(编译时需要–enable-pcntl与posix扩展),使得php能在nginx系统中实现跟c一样
- 针对弹幕的爬取我们如果只需要获取看到的网页里面的而数据,使用selenium就能实现,对于直播平台来说,往往有第三方平台api让你获取数据(
- 本文细致的为大家分享了Bootstrap轮播插件简单实例,供大家参考,具体内容如下使用Bootstrap的轮播插件可以向站点添加滑块,内容可
- 前言本文主要介绍了Vue 实现返回顶部按钮的方法,下面话不多说,来直接看代码吧实例代码:<template> <div c