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滑动验证内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python selenium UI自动化解决验证码的4种方法

    本文介绍了python selenium UI自动化解决验证码的4种方法,分享给大家,具体如下: 测试环境 windows7+ firefox50+ geckodriver # firefox浏览器驱动 python3 selenium3 selenium UI自动化解决验证码的4种方法:去掉验证码.设置万能码.验证码识别技术-tesseract.添加cookie登录,本次主要讲解验证码识别技术-tesseract和添加cookie登录. 1. 去掉验证码 去掉验证码,直接通过用户名和密码登陆网

  • python验证码识别教程之滑动验证码

    前言 上篇文章记录了2种分割验证码的方法,此外还有一种叫做"滴水算法"(Drop Fall Algorithm)的方法,但本人智商原因看这个算法看的云里雾里的,所以今天记录滑动验证码的处理吧.网上据说有大神已经破解了滑动验证码的算法,可以不使用selenium来破解,但本人能力不足还是使用笨方法吧. 基础原理很简单,首先点击验证码按钮后的图片是滑动后的完整结果,点击一下滑块后会出现拼图,对这2个分别截图后比较像素值来找出滑动距离,并结合selenium来实现拖拽效果. 至于seleni

  • Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能

    测试结果: 整个买票流程可以再快一点,不过为了稳定起见,有些地方等待了一些时间 完整程序,拿去可用 整个程序分了三个模块:购票模块(主体).验证码识别模块.余票查询模块 购票模块: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.commo

  • Python使用selenium实现网页用户名 密码 验证码自动登录功能

    好久没有学python了,反正各种理由吧(懒惰总会有千千万万的理由),最近网上学习了一下selenium,实现了一个简单的自动登录网页,具体如下. 1.安装selenium: 如果你已经安装好anaconda3,直接在windows的dos窗口输入命令安装selenium: python -m pip install --upgrade pip 查看版本pip show selenium 2.接着去http://chromedriver.storage.googleapis.com/index.

  • python爬虫之验证码篇3-滑动验证码识别技术

    滑动验证码介绍 本篇涉及到的验证码为滑动验证码,不同于极验证,本验证码难度略低,需要的将滑块拖动到矩形区域右侧即可完成. 这类验证码不常见了,官方介绍地址为:https://promotion.aliyun.com/ntms/act/captchaIntroAndDemo.html 使用起来肯定是非常安全的了,不是很好通过机器检测 如何判断验证码类型 这个验证码的标识一般比较明显,在页面源码中一般存在一个 nc.js 基本可以判定是阿里云的验证码了 <script type="text/j

  • Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)

    从最简单的Web浏览器的登录界面开始,登录界面如下: 进行Web页面自动化测试,对页面上的元素进行定位和操作是核心.而操作又是以定位为前提的,因此,对页面元素的定位是进行自动化测试的基础. 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素属性(class属性,name属性)等等.webdriver就是利用元素的这些属性来进行定位的. 可以用于定位的常用的元素属性: id name class name tag name link text partial link text xp

  • Python 200行代码实现一个滑动验证码过程详解

    前言 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大致说明下这些验证码的原理以及带大家实现一个滑动验证码. 实际上这类验证码的校验是分为两个步骤的: 1.第一步就是前端的校验.一般来说,登录注册页面在点击提交的时候都会伴随着一个表单提交,在表单提交的时候会有 JavaScript 事件的触发.如果加入了验证码,那么在表单提交的时候会多加一个额外的验证,判断这个验证码是否已经成功完成了操作.如果没有的话,

  • python 实现selenium断言和验证的方法

    最近在学习自动化测试,网上资料是挺多的,但是都是很基础的,想深入一点了解就没有资料了.于是开始自己研究. 这两天在看selenium验证和断言方面的资料. 断言就是判断是否跟预期结果一致,不一致的话,测试用例直接失败,程序便不再执行下去. 验证也是判断是否跟预期结果一致,不一致的话,测试用例还会执行下去. 如何简单的理解断言和验证呢?举个简单的例子.比如点击某个按钮会跳转到某个页面上,我们会设置断言为是否能成功跳转到这个页面上,验证的话,一般为这个页面的信息.如果都不跳转成功,那么页面信息就什么

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

    前言 大家做自动化登录时可能都遇到过滑块验证码需要手动验证的问题,这次我们就来解决他 如下:    在我们做自动化登录时,总会遇到各种奇奇怪怪的验证码,滑块验证码就是其中最常见的一种.若我们的程序自动输入账号密码之后,还需要我们人工去滑动验证码那还能称得上是自动化吗? 那么先给大家说一下我的'解题步骤'. 1.使用selenium打开邮箱首页. 2.定位到账号密码框,键入账号密码. 3.获取验证图片,使用opencv处理返回滑块应拖动的距离. 4.创建鼠标事件,模拟拖动滑块完成验证.   需要解

  • 一篇文章带你了解Python之Selenium自动化爬虫

    目录 Python之Selenium自动化爬虫 0.介绍 1.安装 2.下载浏览器驱动 3.实例 4.开启无头模式 5.保存页面截图 6.模拟输入和点击 a.根据文本值查找节点 b.获取当前节点的文本 c.打印当前网页的一些信息 d.关闭浏览器 e.模拟鼠标滚动 7.ChromeOptions 8.验证滑块移动 9.打开多窗口和页面切换 10.Cookie操作 11.模拟登录 12.使用代理 14.更换UA 15.鼠标悬停 16.优缺点 总结 Python之Selenium自动化爬虫 0.介绍

  • 全网最全python库selenium自动化使用详细教程

    一.安装selenium pip install Selenium 二.初始化浏览器 Chrome 是初始化谷歌浏览器 Firefox 是初始化火狐浏览器 Edge 是初始化IE浏览器 PhantomJS 是一个无界面浏览器. from selenium import webdriver driver = webdriver.Chrome() 三.设置浏览器大小 maximize_window 最大化窗口 set_window_size 自定义窗口大小 from selenium import

  • Python之Selenium自动化浏览器测试详解

    目录 Python之Selenium(自动化浏览器测试) 1.安装selenium 2.下载对应版本的浏览器驱动 3.测试code,打开一个网页,并获取网页的标题 4.一个小样例 总结 Python之Selenium(自动化浏览器测试) 1.安装selenium pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple 2.下载对应版本的浏览器驱动 http://npm.taobao.org/mirrors/chromedr

  • Python实现Selenium自动化Page模式

    Selenium是当前主流的web自动化工具,提供了多种浏览器的支持(Chrome,Firefox, IE等等),当然大家也可以用自己喜欢的语言(Java,C#,Python等)来写用例,很容易上手.当大家写完第一个自动化用例的时候肯定感觉"哇...好牛x",但是大家用余光扫了一下代码后,内心也许是崩溃的,因为太乱了!像这样: __author__ = 'xua' from selenium import webdriver from selenium.webdriver.common

  • 利用Java+Selenium+OpenCV模拟实现网页滑动验证

    目录 一.需求分析 二.模拟步骤 1.使用selenium打开某音网页 2.找到小滑块以及小滑块所在的背景图 3.计算小滑块需要滑动的距离 4.按住小滑块并滑动 三.学习过程中比较棘手的问题 1.截图问题 2.返回结果与实际滑动距离相差太多,甚至无规律可循 3.openCV的下载安装 四.总结 目前很多网页都有滑动验证,目的就是防止不良爬虫扒他们网站的数据,我这次本着学习的目的使用Java和selenium学习解决滑动验证的问题,前前后后花了一周时间(抄代码),终于成功了某音的滑动验证! 效果展

  • python使用selenium登录QQ邮箱(附带滑动解锁)

    前言 最近因为工作需要 用selenium做了一个QQ邮箱的爬虫(登录时部分帐号要滑动解锁),先简单记录一下. 这个问题先可以分为两个部分:1.登录帐号和2.滑动解锁.python版本3.5.4 问题分析:登录+滑动解锁 其实登录账号的部分本来很简单,用selenium打开QQ邮箱官网:https://mail.qq.com 然后切换frame输入帐号 和密码点击登录即可,但是部分账号,或者可以说是异地登录的QQ账号需要滑动解锁验证码才能继续登录(下图) 看到这张图我们应该不难想到: 1.我们需

  • 解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题

    目前由于phantomjs已经不维护了,而新版的Chrome(59+)推出了Headless模式,对爬虫来说尤其是定时任务的爬虫截屏之类的是一大好事. 不过按照网络上的一些方法来写的话,会报下面的错误: 后来经过分析,他们运行python是在mac或者linux下进行的,win下由于高版本的chromedriver只能通过路径进行指定,所以会出现这类找不到驱动程序的错误. 经过比对常识网络上的各种代码,后来得出了win下可顺畅执行的driver的写法如下: from selenium impor

  • selenium+python实现自动化登录的方法

    Selenium Python 提供了一个简单的API 便于我们使用 Selenium WebDriver编写 功能/验收测试. 通过Selenium Python的API,你可以直观地使用所有的 Selenium WebDriver 功能 .Selenium Python提供了一个很方便的接口来驱动 Selenium WebDriver , 例如Firefox.Chrome.Ie,以及Remote,目前支持的python版本有2.7或3.2以上. selenium 可以自动化测试.抢票.爬虫等

  • 学习Python selenium自动化网页抓取器

    直接入正题---Python selenium自动控制浏览器对网页的数据进行抓取,其中包含按钮点击.跳转页面.搜索框的输入.页面的价值数据存储.mongodb自动id标识等等等. 1.首先介绍一下 Python selenium ---自动化测试工具,用来控制浏览器来对网页的操作,在爬虫中与BeautifulSoup结合那就是天衣无缝,除去国外的一些变态的验证网页,对于图片验证码我有自己写的破解图片验证码的源代码,成功率在85%. 详情请咨询QQ群--607021567(这不算广告,群里有好多P

随机推荐