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 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 可视化爬虫selenium-破解滑动验证码 -> 正文阅读

[开发测试]可视化爬虫selenium-破解滑动验证码

作者:token keyword

1.问题界面分析

在这里插入图片描述
验证码网址:https://007.qq.com/online.html
解决方法:
我们用的时selenium自动测试框架,selenium能够模拟人工操作网页界面,只用selenium很显然不太足够,我们还需要用到opencv,opencv是一个图像处理库,安装他的方法网上都有,我们在这里主要是用它来识别缺口图像的位置的,在实际应用中可能还需要用到PIL,因为我发现图片是经过缩放的,所以在实际操作中,我们应该将图片缩放后再去判断缺口位置,其次还需要用到urllib去网页上获取图片保存到本地再去判断。有的滑块一打开并不是在最左边我们也需要判断这个位置,可以直接定位按钮获取style属性在加上此段距离。
代码流程:
基于上面的网址界面,我们第一步是找到弹出验证码的按钮的xapth路径,当然在实际开发中,可能需要先去定位用户输入框与密码输入框,然后定位登录按钮才会触发验证码界面,这里的话我们直接弹出验证码界面即可,然后定位到补全图片以及被补全图片的img src 地址,然后通过urllib请求下载到本地,通过PIL按实际缩放比例缩放,然后通过opencv识别缺口位置,最后判断滑块在缺口位置的左坐标,然后通过selenium模拟鼠标拖动滑块进行验证。

2.应用代码

#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author:白杨
@file: 破解验证码登录.py
@time: 2021/10/19
"""
import time
from tenacity import retry, stop_after_attempt
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from PIL import Image
from icecream import ic
import urllib.request
import cv2
import numpy as np


# 避免意外,使用python重试机制, 发生意外重试十次
@retry(stop=stop_after_attempt(10))
def Crack():
    """
    破解滑动验证码
    """
    option = webdriver.ChromeOptions()
    option.add_experimental_option("detach", True)  # 程序结束chrome不被关闭
    chrome = webdriver.Chrome(options=option)
    # chrome = webdriver.Chrome()
    chrome.maximize_window()  # 浏览器最大化
    chrome.get(url='https://007.qq.com/online.html')  # 跳转页面
    chrome.find_element(By.XPATH, '//*[@id="code"]').click()  # 点击弹出验证码按钮
    time.sleep(3)
    iframe = chrome.find_element(By.XPATH, '//*[@id="tcaptcha_iframe"]')  # 找到“嵌套验证码界面”的iframe
    chrome.switch_to.frame(iframe)  # 切换到iframe
    button = chrome.find_element(By.XPATH, '//*[@id="tcaptcha_drag_thumb"]')  # 找到滑动按钮
    img1 = chrome.find_element(By.XPATH, '//*[@id="slideBg"]').get_attribute('src')  # 找到待补全图并获取src属性
    img2 = chrome.find_element(By.XPATH, '//*[@id="slideBlock"]').get_attribute('src')  # 找到缺口图并获取src属性
    resp1 = urllib.request.urlopen(img1)  # 下载待补全图
    image1 = np.asarray(bytearray(resp1.read()), dtype="uint8")
    new_img1 = cv2.imdecode(image1, cv2.IMREAD_COLOR)  # cv2.imdecode()函数将数据解码成Opencv图像格式
    resp2 = urllib.request.urlopen(img2)  # 下载待缺口图
    image2 = np.asarray(bytearray(resp2.read()), dtype="uint8")
    new_img2 = cv2.imdecode(image2, cv2.IMREAD_COLOR)  # cv2.imdecode()函数将数据解码成Opencv图像格式
    cv2.imwrite('login1.jpg', new_img1)  # 保存在本地
    cv2.imwrite('login2.jpg', new_img2)  # 保存在本地
    im = Image.open('login1.jpg')  # 重新打开图像
    im = im.resize((341, 195))  # 缩放
    im.save('login1.jpg')
    im = Image.open('login2.jpg')
    im = im.resize((68, 68))  # 缩放
    im.save('login2.jpg')
    im1 = cv2.imread("login1.jpg")  # 再次打开
    im2 = cv2.imread('login2.jpg')
    bg_edge = cv2.Canny(im1, 100, 200)  # 识别图片边缘
    tp_edge = cv2.Canny(im2, 100, 200)
    bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)  # 转换图片格式
    tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
    res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)  # 缺口匹配
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 寻找最优匹配
    x = max_loc[0]  # 滑块在验证图片的x坐标(左边)
    # 创建一个新的ActionChains,将webdriver实例对driver作为参数值传入,然后通过WenDriver实例执行用户动作
    ActionChains(chrome).click_and_hold(on_element=button).perform()
    # 第一步:在滑块处按住鼠标左键
    ActionChains(chrome).move_by_offset(xoffset=x - 27, yoffset=0).perform()  # 鼠标移动到距离当前位置(x,y)
    time.sleep(2)
    # 第二步:相对鼠标当前位置进行移动
    ActionChains(chrome).release(on_element=button).perform()
    # 第三步:释放鼠标
    time.sleep(5)
    ic("登陆成功")
    time.sleep(5)


if __name__ == '__main__':
    Crack()


  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:47:09  更:2021-10-20 12:48:08 
 
开发: 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年11日历 -2024/11/18 2:57:29-

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