51社区滑块验证码

news2024/11/21 0:31:59

url

aHR0cHM6Ly9wYXNzcG9ydC41MS5jb20vP2dvdXJsPWh0dHBzOi8vd2FuLjUxLmNvbS92dWUvaW5kZXg=

接口分析

在这里插入图片描述
圈起来的两个接口,一个拿滑块,一个验证。

参数分析

在这里插入图片描述
没用特别难的加密

验证识别

需要注意的是,我们先拿到的图片是混乱的,需要按行来抠图。
如下:
在这里插入图片描述
识别可以采用cv2或者ddddocr

完整代码

# -*- coding: utf-8 -*-
# @Time    : 29/8/2023 上午 11:22
# @Author  : 明月清风我
# @File    : main.py
# @Software: PyCharm

import hashlib
import json
import cv2
import requests
import re
from PIL import Image
import io
import time
import loguru
import ddddocr

def copy_headers_dict(headers_raw):
    if headers_raw is None:
        return None

    headers = headers_raw.splitlines()
    headers_tuples = [header.split(":", 1) for header in headers]

    result_dict = {}
    for header_item in headers_tuples:
        if not len(header_item) == 2:
            continue
        item_key = header_item[0].strip()
        item_value = header_item[1].strip()
        result_dict[item_key] = item_value

    return result_dict
def identify_gap(bg, tp):
    # 读取背景图片和缺口图片
    bg_img = cv2.imread(bg)  # 背景图片
    tp_img = cv2.imread(tp)  # 缺口图片

    # 识别图片边缘
    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)  # 寻找最优匹配

    # 绘制方框
    th, tw = tp_pic.shape[:2]
    tl = max_loc  # 左上角点的坐标
    # 返回缺口的X坐标
    return tl[0]
def identify_gap1(bg, tp):
    det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)

    with open(tp, 'rb') as f:
        target_bytes = f.read()

    with open(bg, 'rb') as f:
        background_bytes = f.read()

    _x = str(det.slide_match(target_bytes, background_bytes, simple_target=True)['target'][0])
    return _x
requests = requests.session()
headers = copy_headers_dict("""
            Host: authcode.51.com
            Pragma: no-cache
            Referer: https://passport.51.com/?gourl=https://wan.51.com/vue/index
            sec-ch-ua: "Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"
            sec-ch-ua-mobile: ?0
            sec-ch-ua-platform: "Windows"
            Sec-Fetch-Dest: script
            Sec-Fetch-Mode: no-cors
            Sec-Fetch-Site: same-site
            User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36
        """)
def main():
    cnt = 0
    for _ in range(100):
        time.sleep(0.3)
        slidecode_url = "https://authcode.51.com/authcode/slidecode"
        params={
            'callback': 'jQuery1111011556910494181394_1693292335405',
            'from': 'passport',
            '_': str(int(time.time())*1000)
        }
        response = requests.get(slidecode_url, headers=headers, params=params)
        challenge=re.compile('<input.*?challenge.*?value=(.*?)>').findall(response.text)[0].replace('\\"','')
        times=re.compile('<input.*?times.*?value=(.*?)>').findall(response.text)[0].replace('\\"','')

        big_img_url = "https:" + re.compile('url\((.*?)\)').findall(response.text)[0].replace("\/","/")[2:-2]
        small_img_url = "https:" + re.compile('url\((.*?)\)').findall(response.text)[1].replace("\/","/")
        positions= re.compile("class='gt_cut_fullbg_slice' style='background-position:(.*?)px (.*?)px;'>").findall(response.text)
        pos_lists=[]
        for ps in positions:
            x=int(ps[0])
            y=int(ps[1])
            pos_lists.append({"x":x,"y":y})
        bg_img = requests.get(big_img_url).content
        small_img= requests.get(small_img_url).content
        bg_img=io.BytesIO(bg_img)
        im = Image.open(bg_img)
        with open('target.png','wb')as f:
            f.write(small_img)

        #取整用int  去绝对值也就是去除负号abs
        new_pos=[]
        for pos in pos_lists:
            if pos['y'] == -75:
                new_pos.append(im.crop((abs(pos['x']), 75, abs(pos['x']) + 13, 100)))
            if pos['y'] == -50:
                new_pos.append(im.crop((abs(pos['x']), 50, abs(pos['x']) + 13, 75)))
            if pos['y'] == -25:
                new_pos.append(im.crop((abs(pos['x']), 25, abs(pos['x']) + 13, 50)))
            if pos['y'] == 0:
                new_pos.append(im.crop((abs(pos['x']), 0, abs(pos['x']) + 13, 25)))

        new_im = Image.new('RGB', (260, 100))

        x_offset = 0
        y_offset=0

        for im in new_pos:
            if (x_offset==260):
                x_offset=0
                y_offset+=25

            new_im.paste(im, (x_offset, y_offset))
            x_offset += 13
        new_im.save('./{}.png'.format('background'))
        # _x = str(identify_gap1('target.png', 'background.png'))
        _x = str(identify_gap('target.png', 'background.png'))
        my_time=int(time.time()*1000)
        submit_url='https://authcode.51.com/authcode/yz2'

        loguru.logger.info(_x)
        params={
            'callback': 'jQuery1111011556910494181394_'+str(my_time),
            'point': _x,
            'times': times,
            'challenge': challenge,
            'token': hashlib.md5((challenge+times+_x).encode('utf8')).hexdigest(),
            'from': 'passport',
            'divpre':'',
            '_': str(my_time +6)
        }
        resp=requests.get(submit_url,params=params,headers=headers)
        loguru.logger.info(json.loads(resp.text[len("jQuery1111011556910494181394_1693292857236("):-2]))
        loguru.logger.info(json.loads(resp.text[len("jQuery1111011556910494181394_1693292857236("):-2])['errno'])
        if json.loads(resp.text[len("jQuery1111011556910494181394_1693292857236("):-2])['errno'] == 0:
            cnt += 1
    loguru.logger.info(str(cnt/100*100) + "%" )
if __name__ == '__main__':
    main()
# 2023-08-29 15:12:54.831 | INFO     | __main__:<module>:147 - {'errno': 401, 'error': '抱歉错误', 'data': []}
# 2023-08-29 15:12:54.832 | INFO     | __main__:<module>:148 - 401
# 2023-08-29 15:12:54.832 | INFO     | __main__:<module>:151 - 17
# 2023-08-29 15:12:54.832 | INFO     | __main__:<module>:152 - 17.0%

在这里插入图片描述
成功率偏低,校验比较严格,_x相差1可能都过不了了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/945479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人员闯入检测告警算法

人员闯入检测告警算法通过yolov5网络模型识别检测算法&#xff0c;人员闯入检测告警算法对未经许可或非法进入的人员进行及时识别告警&#xff0c;确保对危险区域的安全管理和保护。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用anchor box将分类与目标定位…

图解Spring三级缓存的工作流程

一级缓存&#xff1a;保存了完整的Bean实例&#xff0c;可以直接使用 二级缓存&#xff1a;保存了实例化以后还没有设置属性值的Bean实例&#xff0c;也就是一个空的对象&#xff0c;没有做依赖注入 三级缓存 &#xff1a;存放Bean工厂&#xff0c;它用来生成原始Bean对象并且…

「Redis」1. 数据类型的底层实现

前言&#xff1a;在这篇博文中&#xff0c;我们将简单总结在面试中怎么回答Redis数据类型的底层实现。 因为面试时间就那么点&#xff0c;言简意赅的描述自己会的知识显得尤为重要‼️ 文章目录 0.1. String 的底层实现原理0.2. 列表的底层实现原理0.3. 字典的底层实现原理0.4.…

【Interaction交互模块】AngularJointDrive角度关节驱动

文章目录 一、预设体位置二、案例&#xff1a;做一个“能开合的门” 1、在已建好的门框下&#xff0c;建门 2、设置参数 3、解决产生的问题 一、预设体位置 交互模块——可控制物体——物理关节——角度关节驱动 二、案例&#xff1a;做一个“能开合的门” 1…

深入了解fcntl函数:Linux系统编程中的文件控制

文章目录 概述介绍函数原型与参数 拓展&#xff1a;fcntl改文件属性总结 概述 摘要: fcntl函数是Linux系统编程中一个重要的函数&#xff0c;用于对文件描述符进行各种控制操作。本文将详细介绍fcntl函数的原型、各个参数的用法&#xff0c;以及阻塞和非阻塞模式切换的方法&am…

Code Lab - 34

GAT里面有一些地方看的不是太懂&#xff08;GAT里Multi Attention的具体做法&#xff09;&#xff0c;暂时找了参考代码&#xff0c;留一个疑问 1. 一个通用的GNN Stack import torch_geometric import torch import torch_scatter import torch.nn as nn import torch.nn.fun…

package.json 详解

文章目录 package.json1. name2. version3. description4. homepage5. bugs6. license7. author, contributors8. funding9. files10. main11. module12. browser13. bin14. man15. directories15.1 directories.bin15.2 directories.man 16. repository17. scripts18. config1…

Unity引擎修改模型顶点色的工具

大家好&#xff0c;我是阿赵。   之前分享过怎样通过MaxScript在3DsMax里面修改模型的顶点色。不过由于很多时候顶点色的编辑需要根据在游戏引擎里面的实际情况和shader的情况来动态调整&#xff0c;所以如果能在引擎里面直接修改模型的顶点色&#xff0c;将会方便很多。于是…

指向任意节点的带环链表

&#x1f308;图示指向任意节点的带环链表 如图&#xff1a; &#x1f308;快慢指针法判断链表是否带环 &#x1f31f;思路&#xff1a;快指针fast一次走2步&#xff0c;慢指针slow一次走1步&#xff0c;fast先进环在换中运动&#xff0c;随后slow进入环。两指针每同时移动…

复原20世纪复古修仙游戏

前言 在本教程中&#xff0c;我突发奇想&#xff0c;想做一个复古的修仙游戏&#xff0c;考虑到以前的情怀决定做个古老的躺平修仙游戏 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列&#xff1a; ☄️爬虫JS逆向系列专栏 - 爬虫逆向教学 ☄️python…

英特尔Raptor Lake Refresh第14代CPU:传闻发布日期、价格、规格等

英特尔预计将在今年秋天推出第14代Raptor Lake-S Refresh CPU。虽然即将推出的系列芯片沿用了当前的第13代英特尔核心系列&#xff0c;但它们实际上是相同CPU的更新版本。 Raptor Lake-s Refresh芯片没有任何官方消息&#xff0c;但几次所谓的泄露让我们了解了我们可能会期待什…

发光太阳聚光器的蒙特卡洛光线追踪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C++字符串详解

C 大大增强了对字符串的支持&#xff0c;除了可以使用C风格的字符串&#xff0c;还可以使用内置的 string 类。string 类处理起字符串来会方便很多&#xff0c;完全可以代替C语言中的字符数组或字符串指针。 string 是 C 中常用的一个类&#xff0c;它非常重要&#xff0c;我们…

uniapp 项目实践总结(一)uniapp 框架知识总结

导语&#xff1a;最近开发了一个基于 uniapp 框架的项目&#xff0c;有一些感触和体会&#xff0c;所以想记录以下一些技术和经验&#xff0c;在这里做一个系列总结&#xff0c;算是对自己做一个交代吧。 目录 简介全局文件全局组件常用 API条件编译插件开发 简介 uniapp 是…

Matlab(变量与文本读取)

目录 1.变量&#xff08;数据&#xff09;类型转换 1.1 字符 1.2 字符串 1.3 逻辑操作与赋值 2.Struct结构体数组 2.1函数的详细介绍&#xff1a; 2.1.1 cell2struct 2.1.1.1 垂直维度转换 2.1.1.2 水平维度转换 2.1.1.3 部分进行转换 2.1.2 rmfield 2.1.3 fieldnames(查…

Git分布式版本控制系统与github

第四阶段提升 时 间&#xff1a;2023年8月29日 参加人&#xff1a;全班人员 内 容&#xff1a; Git分布式版本控制系统与github 目录 一、案例概述 二、版本控制系统 &#xff08;一&#xff09; 本地版本控制 &#xff08;二&#xff09;集中化的版本控制系统 &…

C++day7(auto关键字、lambda表达式、C++中的数据类型转换、C++标准模板库(STL)、list、文件操作)

一、Xmind整理&#xff1a; 关键词总结&#xff1a; 二、上课笔记整理&#xff1a; 1.auto关键字 #include <iostream>using namespace std;int fun(int a, int b, float *c, char d, double *e,int f) {return 12; }int main() {//定义一个函数指针&#xff0c;指向fu…

【USRP】集成化仪器系列1 :信号源,基于labview实现

USRP 信号源 1、设备IP地址&#xff1a;默认为192.168.10.2&#xff0c;请勿 修改&#xff0c;运行阶段无法修改。 2、天线输出端口是TX1&#xff0c;请勿修改。 3、通道&#xff1a;0 对应RF A、1 对应 RF B&#xff0c;运行 阶段无法修改。 4、中心频率&#xff1a;当需要…

自然语言处理-NLP

目录 自然语言处理-NLP 致命密码&#xff1a;一场关于语言的较量 自然语言处理的发展历程 兴起时期 符号主义时期 连接主义时期 深度学习时期 自然语言处理技术面临的挑战 语言学角度 同义词问题 情感倾向问题 歧义性问题 对话/篇章等长文本处理问题 探索自然语言…

腾讯云学生免费服务器如何申请?

腾讯云学生免费服务器如何申请?学生机申请流程&#xff0c;腾讯云学生服务器优惠活动&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置84…