百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

基于python计算缺口滑块验证码所需滑动距离

ztj100 2024-11-27 23:33 11 浏览 0 评论

导读:笔者之前是依靠打码平台计算缺口滑块验证码距离,由于平台不太稳定因此最近打算自己实现一个距离计算服务。在网上一阵探索后发现了一个采用 python 的解决方案识别成功率很高,这里做下分享希望对各位有所帮助。

代码实现

基于 python 同时借助强大的 OpenCV(计算机视觉库)、numpy 等库实现。笔者再借助 Flask(一个使用 Python 编写的轻量级 Web 应用框架)将其封装为一个简单的 Web 服务使其功能能够跨语言使用。

from flask import Flask, request, jsonify
import json
import cv2 
import numpy as np
import pandas as pd
import math

app = Flask(__name__)
app.debug = True

# x方向一阶导中值
def get_dx_median(dx, x, y, w, h):
    return np.median(dx[y:(y + h), x])

# 预处理
def pre_process(img_path):
    img = cv2.imread(img_path, 1)  # 从指定的文件中加载图像并返回,1 为彩色图像

    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转成灰度图像

    _, binary = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)  # 将灰度图像转成二值图像

    contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)  # 查找轮廓

    rect_area = []
    rect_arc_length = []
    cnt_infos = {}

    for i, cnt in enumerate(contours):
        if cv2.contourArea(cnt) < 5000 or cv2.contourArea(cnt) > 25000:
            continue

        x, y, w, h = cv2.boundingRect(cnt)
        cnt_infos[i] = {'rect_area': w * h,  # 矩形面积
                        'rect_arclength': 2 * (w + h),  # 矩形周长
                        'cnt_area': cv2.contourArea(cnt),  # 轮廓面积
                        'cnt_arclength': cv2.arcLength(cnt, True),  # 轮廓周长
                        'cnt': cnt,  # 轮廓
                        'w': w,
                        'h': h,
                        'x': x,
                        'y': y,
                        'mean': np.mean(np.min(img[y:(y + h), x:(x + w)], axis=2)),  # 矩形内像素平均
                        }
        rect_area.append(w * h)
        rect_arc_length.append(2 * (w + h))
    dx = cv2.Sobel(img, -1, 1, 0, ksize=5)

    return img, dx, cnt_infos


# 计算移动的距离
def calculate_distance(img_path):
    img, dx, cnt_infos = pre_process(img_path)
    df = pd.DataFrame(cnt_infos).T
    df.head()
    df['dx_mean'] = df.apply(lambda x: get_dx_median(dx, x['x'], x['y'], x['w'], x['h']), axis=1)
    df['rect_ratio'] = df.apply(lambda v: v['rect_arclength'] / 4 / math.sqrt(v['rect_area'] + 1), axis=1)
    df['area_ratio'] = df.apply(lambda v: v['rect_area'] / v['cnt_area'], axis=1)
    df['score'] = df.apply(lambda x: abs(x['rect_ratio'] - 1), axis=1)

    result = df.query('x>0').query('area_ratio<2').query('rect_area>5000').query('rect_area<20000').sort_values(
        ['mean', 'score', 'dx_mean']).head(2)
    return result.x.values[0]

@app.route('/verification/', methods=['post'])
def add_stu():
    # 计算并将结果响应回去
    request_json = json.loads(request.data.decode('utf-8'))
    result = calculate_distance(request_json["image"])
    response = {
        'code': '0',
        'data': {
            "result" : result
        },
        'message': 'success'
    }
    return jsonify(response)

if __name__ == '__main__':
    app.run(host='localhost', port=9091)
    # 这里指定了地址和端口号。

注意:当执行 img = cv2.imread(img_path, 1) 这行代码时 img_path 图片路径中含有中文字符会导致获取不到图像。可通过修改图片存放路径为英文(最佳)或替换为以下代码解决:

img = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), cv2.IMREAD_COLOR) # 解决文件路径名带有中文的情况

Java 调用服务

@Test
    public void sliderTest() {
        Map<String, String> data = new HashMap<>();
        data.put("image", "G:\\verificaPic\\validate-big_2.png");
        try {
            String resultString = Jsoup.connect("http://localhost:9091/verification/")
                    .requestBody(JSON.toJSONString(data))
                    .header("Content-Type", "application/json")
                    .ignoreContentType(true).timeout(120000).post().text();
            JSONObject object = JSONObject.parseObject(resultString);
            System.out.println(object.getJSONObject("data").getString("result"));
        } catch (Exception e) {
            throw new RuntimeException("调用验证码图片识别服务发生异常!", e);
        }
    }

取得距离结果之后借助 selenium 实现模拟拖动滑块就可破解(这里需要注意不要一次性到位,而是要分多段滑动以防被检测到),由于网上有很多方案此处就不展开具体讨论了。

最后

参考:

https://github.com/godtoy/python-tecent-slider-crack

https://www.runoob.com/numpy/numpy-tutorial.html

感谢您的阅读,如果喜欢本文欢迎关注和转发,转载需注明出处,本头条号将持续分享IT技术知识。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步。

相关推荐

Whoosh,纯python编写轻量级搜索工具

引言在许多应用程序中,搜索功能是至关重要的。Whoosh是一个纯Python编写的轻量级搜索引擎库,可以帮助我们快速构建搜索功能。无论是在网站、博客还是本地应用程序中,Whoosh都能提供高效的全文搜...

如何用Python实现二分搜索算法(python二分法查找代码)

如何用Python实现二分搜索算法二分搜索(BinarySearch)是一种高效的查找算法,适用于在有序数组中快速定位目标值。其核心思想是通过不断缩小搜索范围,每次将问题规模减半,时间复杂度为(O...

路径扫描 -- dirsearch(路径查找器怎么使用)

外表干净是尊重别人,内心干净是尊重自己,干净,在今天这个时代,应该是一种极高的赞美和珍贵。。。----网易云热评一、软件介绍Dirsearch是一种命令行工具,可以强制获取web服务器中的目录和文件...

78行Python代码帮你复现微信撤回消息!

来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。...

从零开始学习 Python!2《进阶知识》 Python进阶之路

欢迎来到Python学习的进阶篇章!如果你说已经掌握了基础语法,那么这篇就是你开启高手之路的大门。我们将一起探讨面向对象编程...

白帽黑客如何通过dirsearch脚本工具扫描和收集网站敏感文件

一、背景介绍...

Python之txt数据预定替换word预定义定位标记生成word报告(四)

续接Python之txt数据预定替换word预定义定位标记生成word报告(一)https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=748...

假期苦短,我用Python!这有个自动回复拜年信息的小程序

...

Python——字符串和正则表达式中的反斜杠(&#39;\&#39;)问题详解

在本篇文章里小编给大家整理的是关于Python字符串和正则表达式中的反斜杠('\')问题以及相关知识点,有需要的朋友们可以学习下。在Python普通字符串中在Python中,我们用'\'来转义某些普通...

Python re模块:正则表达式综合指南

Python...

Python中re模块详解(rem python)

在《...

python之re模块(python re模块sub)

re模块一.re模块的介绍1.什么是正则表达式"定义:正则表达式是一种对字符和特殊字符操作的一种逻辑公式,从特定的字符中,用正则表达字符来过滤的逻辑。(也是一种文本模式;)2、正则表达式可以帮助我们...

MySQL、PostgreSQL、SQL Server 数据库导入导出实操全解

在数字化时代,数据是关键资产,数据库的导入导出操作则是连接数据与应用场景的桥梁。以下是常见数据库导入导出的实用方法及代码,包含更多细节和特殊情况处理,助你应对各种实际场景。一、MySQL数据库...

Zabbix监控系统系列之六:监控 mysql

zabbix监控mysql1、监控规划在创建监控项之前要尽量考虑清楚要监控什么,怎么监控,监控数据如何存储,监控数据如何展现,如何处理报警等。要进行监控的系统规划需要对Zabbix很了解,这里只是...

mysql系列之一文详解Navicat工具的使用(二)

本章内容是系列内容的第二部分,主要介绍Navicat工具的使用。若查看第一部分请见:...

取消回复欢迎 发表评论: