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处理滑块验证码?教你用cv2解决 -> 正文阅读

[开发测试]不想用selenium处理滑块验证码?教你用cv2解决

cv2解决滑块验证码验证

opencv-python安装

虽然cv2是直接通过导入cv2包使用,但是它不是通过import cv2安装,需要通过pip install opencv-python安装,直接pip安装可能会比较慢,可以使用pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple安装

案例场景

在这里插入图片描述
在这里插入图片描述
当点击滑块时,会显示缺口背景图和方块,将方块移动到背景图缺口处就能实现验证,我们可以看看验证通过整个过程的请求包来判断它的验证逻辑
在这里插入图片描述
当我们点击滑块时,会去请求方块和背景图,当我们滑动并停止滑动滑块后,会发起一个验证请求,推测这个请求会把我们的动作传给后端验证,而我们的动作直接产生的就是坐标的变化,一般验证码验证会根据两种方式验证,坐标参数验证滑动轨迹验证码坐标参数验证是传递一个滑块停止后的坐标,而滑动轨迹验证码是传递一个坐标数组,记录滑块整个滑动周期变化的坐标。

我们查看异步请求验证这个包,看看它传递的参数便可以知道属于哪种验证逻辑
在这里插入图片描述
观察参数可以确定它传递的是滑块移动停止时的坐标,那怎么拿到这个坐标呢,dragleft我们假定是方块左侧坐标的距离,dragright我们假定是方块右侧坐标的距离,然后模拟一下查看style样式中left的变化。
在这里插入图片描述
多次观察可以确定,这个left便是dragleft的值,而dragrightdragleft要大32,这样我们只要知道dragleft的值便能确定dragright了。

cv2实战

使用cv2计算图片差异位置的坐标,我们需要拿到背景图片和方块图片,通过对比背景图片和方块图片之间的联系与差异从而定义差异的坐标。

cv2识别代码

# -*- coding: utf-8 -*-
from PIL import Image
from io import BytesIO
import numpy as np
import cv2


def identify_gap(bg, tp):
    """
    :param bg: 背景图片
    :param tp: 缺口图片
    :return int
    """
    # 读取背景图片和缺口图片
    bg_img = get_cv2_img(bg)  # 背景图片
    tp_img = get_cv2_img(tp)  # 缺口图片
    if type(bg_img) == str or type(tp_img) == str:
        print('图片格式存在问题,无法用cv2读取!')
        return

    # 识别图片边缘
    bg_edge = cv2.Canny(bg_img, 100, 200)
    tp_edge = cv2.Canny(tp_img, 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)

    print(min_val, max_val, min_loc, max_loc)

    # 返回缺口的X坐标
    return max_loc[0]


def get_cv2_img(img_object):
    if type(img_object) == str:
        cv_img = cv2.imread(img_object)
    elif type(img_object) == bytes:
        image_data = BytesIO(img_object)
        img = Image.open(image_data)
        cv_img = np.asarray(img)
    else:
        cv_img = None
    return cv_img


if __name__ == '__main__':
    print(identify_gap('背景图本地路径', '方块本地路径'))
    print(identify_gap('背景图二进制流', '方块二进制流'))

测试识别结果

# -*- coding: utf-8 -*-
import requests

from sxSpider.check_open_cv.cv2_gap import identify_gap

header = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Accept-Encoding': 'gzip, deflate, br',
    'Cookie': 'lnReGnsFlag=0; tbbysb=N; tbzbsy=N; LESB_SESSION=ZF9tq3-Avn6LnFE80mstxwI3QTwoHZdyPrz_FWuwwpPu_As9a2fy!46501968',
    'Host': 'etax.ningxia.chinatax.gov.cn',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
}

before_img_url = 'https://etax.ningxia.chinatax.gov.cn/download.sword?ctrl=CheckcodeCtrl_initBgPic&0.1601673354750519&bgPicPath=/wsbs/images/bg4_style2.jpg&id=dragCheckCode'
after_img_url = 'https://etax.ningxia.chinatax.gov.cn/download.sword?ctrl=CheckcodeCtrl_initcutPic&0.14661519005791934&bgPicPath=/wsbs/images/bg4_style2.jpg&id=dragCheckCode'

before_img_resp = requests.get(before_img_url, headers=header)
before_img = before_img_resp.content
with open('image/before.png', 'wb') as fb:
    fb.write(before_img_resp.content)
after_img_resp = requests.get(after_img_url, headers=header)
after_img = after_img_resp.content
with open('image/after.png', 'wb') as fb:
    fb.write(after_img_resp.content)

drag_left = identify_gap(before_img, after_img)
drag_right = drag_left + 32
print(drag_left, drag_right)

如果想看看识别的到底对不对,可以圈出识别位置

# 绘制方框
th,tw = tp_pic.shape[:2]
tl = max_loc  # 左上角点的坐标
br = (tl[0] + tw, tl[1] + th)  # 右下角点的坐标
cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2)  # 绘制矩形
cv2.imwrite('存储路径', bg_img)  # 保存在本地

在这里插入图片描述
ok,分享就到这里了!

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

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