IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python+opencv+selenium自动化登录邮箱并解决滑动验证 -> 正文阅读

[Python知识库]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知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-05 20:19:50  更:2021-07-05 20:20:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 3:49:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码