python获取滑块验证码需要滑动的距离

news/2024/9/21 22:11:31 标签: python, 爬虫, 逆向, 滑块验证码

我们以这个网站为例: http://120.86.191.138/hbgs/zwgk/dirData.do?dirId=402881204e959150014e959f42f30014&subjectId=93e889f2501d3fe8015024305bdf0efc
往后点到第四页后会出现验证码

一.获取到背景图片和缺口图片

在这里插入图片描述
我们发现图片是base64格式通过API直接发送

二.识别缺口位置输出x距离

img_data = base64.b64decode(img_data)  # png
img_btn_data = base64.b64decode(img_btn_data)  # png
# 读取图片
img = Image.open(io.BytesIO(img_data))
img_btn = Image.open(io.BytesIO(img_btn_data))
# 识别缺口
left = identify_gap(img, img_btn, bg_params, gp_params)[0]
print(left)

identify_gap.py

import cv2
import numpy as np


def identify_gap(background, gap, bg_edge_list: list[int], gp_edge_list: list[int]):
    """
    获取缺口的X坐标

    使用OpenCV的边缘检测实现

    :param background: 背景图片对象
    :param gap: 缺口图片对象
        图片对象可以是cv2.imread('opencv_logo.jpg',0)
        也可以是PIL.Image.open('opencv_logo.jpg')
    :param bg_edge_list: 背景图片对比度调整参数[50, 100] 50为最小对比度,100为最大对比度
    :param gp_edge_list:缺口图片对比度调整参数[50, 100] 50为最小对比度,100为最大对比度
    :return:
    """

    background_image = background  # 背景图片
    background_image = np.array(background_image)
    gap_image = gap  # 缺口图片
    gap_image = np.array(gap_image)
    # 识别图片边缘
    background_edge = cv2.Canny(background_image, bg_edge_list[0], bg_edge_list[1])
    gap_edge = cv2.Canny(gap_image, gp_edge_list[0], gp_edge_list[1])

    # 转换图片格式
    background_picture = cv2.cvtColor(background_edge, cv2.COLOR_GRAY2RGB)

    gap_picture = cv2.cvtColor(gap_edge, cv2.COLOR_GRAY2RGB)

    res = cv2.matchTemplate(background_picture, gap_picture, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # type: ignore

    return max_loc

3.完整代码

import base64
import io
import re
import requests
from PIL import Image
from packages.scrapy_spiders.utils.captcha.compare_image import identify_gap
def getlist_cookie(yzm_res):
    """
    获取验证码返回的set-cookie并返回
    :param response:
    :return dic:
    """
    extracted_cookies = {}
    cookies = yzm_res.headers["Set-Cookie"].split(",")
    # 解析Set-Cookie头部中的cookies
    for cookie in cookies:
        parts = cookie.split(";")[0].split("=")
        if len(parts) == 2:
            key, value = parts
            extracted_cookies[key.strip()] = value.strip()
    return extracted_cookies
def generate_random_string():
    htmlurl='http://120.86.191.138/hbgs/verify/index.do'
    response = requests.get(htmlurl).text
    # 编写正则表达式来匹配verify后的值,注意这里我们使用了转义字符来匹配冒号和单引号
    pattern = r"verify\s*:\s*'([^']*)'"

    # 使用re.search查找匹配项
    match = re.search(pattern, response)

    # 如果找到匹配项,则提取括号内的内容(即需要的值)
    if match:
        value = match.group(1)
        print("提取的verify值为:", value)
    else:
        print("未找到匹配的verify值")
        return None

    return value

ssst=generate_random_string()

yzm_url=f'http://120.86.191.138/hbgs/verify/get_img_verify.do?verify={ssst}'
res=requests.get(yzm_url)
cookies = getlist_cookie(res)
res=res.json()
bg_params = [100, 200]
gp_params = [100, 200]
img_data=res["oriCopyImage"]
img_btn_data=res["newImage"]
img_data = base64.b64decode(img_data)  # jpg
img_btn_data = base64.b64decode(img_btn_data)  # png
# 读取图片
img = Image.open(io.BytesIO(img_data))
img_btn = Image.open(io.BytesIO(img_btn_data))
# 识别缺口
left = identify_gap(img, img_btn, bg_params, gp_params)[0]
print(left)

dataurl='http://120.86.191.138/hbgs/verify/check.do'
header={
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
formdata=f'verify={ssst}&IY={res["Y"]}&X={left}&Y={res["Y"]}'

res2=requests.post(dataurl, formdata,cookies=cookies,headers=header).json()
print(res2)
itemurl='http://120.86.191.138/hbgs/zwgk/item.do'
formdata=f'page=6&rows=20&HBTB_XH=&HBTB_XH_END=&HBTB_XMMC=&HBTB_SPWH=&HBTB_TXDZ=&HBTB_GSSJ=&HBTB_GSSJ_END=&dirId=402881204e959150014e95bb85b5010f&subjectId=93e889f2501d3fe8015024305bdf0efc&backPage=&vcode={res2["data"]}'

res=requests.post(itemurl, formdata)
print(res.text)

http://www.niftyadmin.cn/n/5669539.html

相关文章

2024.9.20 Python模式识别新国大EE5907,PCA主成分分析,LDA线性判别分析,GMM聚类分类,SVM支持向量机

1.PCA 主成分分析用于特征提取、可视化和分类 根据要求,我在第一个代码框中完成了从指定路径提取图像数据,将其转换为灰度图像并将其展平。在这里,我将数字 88 设置为我的照片的标签,然后将所有 10 张照片传入代码。然后我定义了…

[模板]树的最长路径

[模板]树的最长路径 题目描述 给定一棵树,树中包含 n 个结点(编号1~n)和 n-1 条无向边,每条边都有一个权值。 现在请你找到树中的一条最长路径。 换句话说,要找到一条路径,使得使得路径两端的点的距离最远…

百易云资产管理运营系统 ticket.edit.php SQL注入漏洞复现

0x01 产品简介 百易云资产管理运营系统,是专门针对企业不动产资产管理和运营需求而设计的一套综合解决方案。该系统能够覆盖资产的全生命周期管理,包括资产的登记、盘点、评估、处置等多个环节,同时提供强大的运营分析功能,帮助企业优化资产配置,提升运营效率。 0x02 漏…

c++初阶--c++类和对象(中)

大家好&#xff0c;我们今天来继续学习c的类和对象&#xff0c;今天我们来着重学习一下c中的运算符重载这一部分的知识。那话不多说&#xff0c;这就开始我们今天的学习吧。 目录 1. 运算符重载 1.1 一个简单的运算符重载示例 1.2 前置和后置重载 1.3 位移运算符<<和…

[数据集][图像分类]茶叶病害分类数据集6749张7类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;6749 分类类别数&#xff1a;7 类别名称:["Unlabeled","alg…

国标GB28181视频融合监控汇聚平台的方案实现及场景应用

Liveweb国标视频融合云平台基于端-边-云一体化架构&#xff0c;部署轻量简单、功能灵活多样&#xff0c;平台可支持多协议&#xff08;GB28181/RTSP/Onvif/海康SDK/Ehome/大华SDK/RTMP推流等&#xff09;、多类型设备接入(IPC/NVR/监控平台)&#xff0c;在视频能力上&#xff0…

Python 中的 Kombu 类库

Kombu 是一个用于 Python 的消息队列库&#xff0c;提供了高效、灵活的消息传递机制。它是 Celery 的核心组件之一&#xff0c;但也可以单独使用。Kombu 支持多种消息代理&#xff08;如 RabbitMQ、Redis、Amazon SQS 等&#xff09;&#xff0c;并提供了消息生产者和消费者的功…

C++中数组可以开多大

C中数组可以开多大 - 糖豆爸爸 - 博客园 (cnblogs.com) 一般OI题的时空限制 时/空限制&#xff1a;1s/64MB或 时/空限制&#xff1a;2s/128MB 以128MB为例&#xff0c;128M131072KB134217728字节 下面才是正确的大小&#xff1a; int4字节 char1字节 long long8字节 开intin…