首页 > 编程语言 >python+opencv+selenium自动化登录邮箱并解决滑动验证的问题

python+opencv+selenium自动化登录邮箱并解决滑动验证的问题

时间:2024-08-11 21:58:51浏览次数:9  
标签:xpath loc 滑块 python selenium driver 验证码 opencv cv2

本文主要讲解基于Python、OpenCV和Selenium的自动化登录邮箱并解决滑动验证问题。在这个过程中,我们需要特别注意页面元素的准确定位以及文本框和验证码的frame嵌套问题。感兴趣的朋友们一起来学习吧,让我们一起探索解决这个挑战的方法。

前言

大家在进行自动化登录时可能都曾面临过需要手动验证滑块验证码的问题,这次我们将着重解决这个挑战。

如下:

图片


  

在我们进行自动化登录时,经常会遇到各种各样的验证码,其中最常见的就是滑块验证码。如果我们的程序在自动输入账号密码后,还需要我们手动去滑动验证码,这样的过程还能称得上是自动化吗?

接下来,让我先给大家介绍一下我的解题步骤。

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()

 以下是运行结果,我们成功地识别出了两种不同验证码背景图。在图中,您可以看到标记了红框的区域,这是我们代码成功识别并标记出来的验证码缺口位置。

图片

图片

 

本文使用了OpenCV库,并且主要流程包括以下几个步骤:

  1. 对图像进行二值化处理。

  2. 对二值化后的图像进行高斯模糊处理。

  3. 使用Canny边缘检测算法进行边缘检测。

  4. 运用HoughLinesP霍夫变换来寻找直线。

  5. 对符合条件的直线进行处理,以寻找交点,从而计算出我们需要找到的滑块的位置。

通过以上步骤,我们可以成功地解决滑块验证码的识别问题。

到此,关于使用Python、OpenCV和Selenium自动化登录邮箱并解决滑块验证问题的文章就介绍完毕了。

标签:xpath,loc,滑块,python,selenium,driver,验证码,opencv,cv2
From: https://blog.csdn.net/m0_58552717/article/details/141111248

相关文章

  • Python打包命令汇总
    1、pyinstaller打包环境安装:pipinstallpyinstaller 网络不好可以通过-i指定安装源:pipinstallpyinstaller-ihttps://pypi.tuna.tsinghua.edu.cn/simple/安装完成后通过:pyinstaller--version查看是否安装成功打包单个脚本:pyinstaller-F-w-ipython.icomain.py......
  • Python虚拟环境
    虚拟环境安装1:安装好Python环境https://python.p2hp.com/downloads/     双击打开后弹窗显示下图,注意此处是两张图,都看完再进行下一步,第一步点击选中第二张图的Add这个选框,第二步选择第一张图自定义路径存储Customize。  选择自定义路径后会弹出此界面,不用......
  • 大一新生初入Python第五天
    大一新生初入Python第五天前言:有天没更新就是因为学这个流程控制语句我感觉这玩意应该在前期算比较难一点的了我尽量根据自己的理解写好一点吧一.程序的三大执行流程程序的三大执行流程分别为:1.顺序执行2.选择执行3.循环执行1.顺序执行顺序执行也就是你......
  • 基于Python的大模型学习手册(入门级)
    前言大模型(全称为大语言模型,英文名称:LargeLanguageModel),这个2023年刷爆了互联网圈的“现象级明星”,几乎以前所未有的姿态,席卷了各行各业,世人一时为之惊叹。同时,也开辟了各大厂商投入AI研发的新赛道。乘着这波“西风”,国内大模型开启了雨后春笋般的神奇发育,简直是“一浪......
  • python 如何获取当前时间
    python如何获取当前系统的时间1、导入包import datetime2、获取当前的时间curr_time = datetime.datetime.now()# 2019-07-06 14:55:56.873893 <class 'datetime.datetime'>curr_time.year# 2019 <class 'int'>curr_time.month# 7 <class......
  • python 如何获取毫秒级系统时间
    python如何获取毫秒级系统时间?下面给大家举个例子:import timeimport datetimet = time.time()print (t)                #原始时间数据print (int(t))              #秒级时间戳print (int(round(t * 1000)))     #毫秒......
  • Python - sum()
     >>>bugs=["bug1","bug2"]>>>sum(bugs,[])Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:canonlyconcatenatelist(not"str")tolist>&g......
  • pyqt5+win32+python联合在CAD绘图无法绘制
    1初始报错想法是:写好pyqt5的简单界面代码后,用一个信号槽连接到CAD绘制图形。出现了报错:显示“已成功连接到CAD”,说明连接没有问题,但是“在CAD中绘制线条时出错:(-2147352567,'发生意外。',(0,None,None,None,0,-2147024809),None)”。搜索后给出可能原因是:1-参......
  • Python使用PyCharm+PySide6+Pandas创建QTableView显示Excel工作簿数据
    importsysimportwarningsfrompathlibimportPathimportpandasaspdfromPySide6importQtWidgetsfromPySide6.QtCoreimportQtfromPySide6.QtGuiimportQStandardItemModel#读取Excel工作簿数据defread_excel_with_pandas(path_excel,_cols):"&qu......
  • python爬虫
    爬虫一、爬虫的分类1、通用爬虫 实例百度,360,google、搜狗等搜索引擎功能 访问网页-》抓取数据-》数据存储-》数据处理-》提供检测服务robots协议一个约定俗成的协议,添加robots.txt文件,来说明本网站哪些内容不可以被抓取,之际写的爬虫无需遵守网站排名......