python+opencv+selenium自动化登录邮箱并实现滑动验证功能

发布时间:2022-03-29 16:20:30 作者:iii
来源:亿速云 阅读:179

这篇文章主要介绍“python+opencv+selenium自动化登录邮箱并实现滑动验证功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python+opencv+selenium自动化登录邮箱并实现滑动验证功能”文章能帮助大家解决问题。

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

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

  需要解决的问题:

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

  源代码:

#滑稽研究所出品
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+opencv+selenium自动化登录邮箱并实现滑动验证功能

关于“python+opencv+selenium自动化登录邮箱并实现滑动验证功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

推荐阅读:
  1. flask实现验证码并验证功能
  2. 使用vue怎么实现登录滑动验证

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python opencv selenium

上一篇:python中对信号的处理方法

下一篇:Python怎么实时获取任务请求对应的Nginx日志

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》