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

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

ztj100 2024-11-27 23:33 18 浏览 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技术知识。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步。

相关推荐

人生苦短,我要在VSCode里面用Python

轻沉发自浅度寺量子位出品|公众号QbitAI在程序员圈子里,VisualStudioCode(以下简称VSCode)可以说是目前最火的代码编辑器之一了。它是微软出品的一款可扩展的轻量...

亲测可用:Pycharm2019.3专业版永久激活教程

概述随着2020年的到来,又有一批Pycharm的激活码到期了,各位同仁估计也是在到处搜索激活方案,在这里,笔者为大家收录了一个永久激活的方案,亲测可用,欢迎下载尝试:免责声明本项目只做个人学习研究之...

Python新手入门很简单(python教程入门)

我之前学习python走过很多的歧途,自学永远都是瞎猫碰死耗子一样,毫无头绪。后来心里一直都有一个做头条知识分享的梦,希望自己能够帮助曾经类似自己的人,于是我来了,每天更新5篇Python文章,喜欢的...

Pycharm的设置和基本使用(pycharm运行设置)

这篇文章,主要是针对刚开始学习python语言,不怎么会使用pycharm的童鞋们;我来带领大家详细了解下pycharm页面及常用的一些功能,让大家能通过此篇文章能快速的开始编写python代码。一...

依旧是25年最拔尖的PyTorch实用教程!堪比付费级内容!

我真的想知道作者到底咋把PyTorch教程整得这么牛的啊?明明在内容上已经足以成为付费教材了,但作者偏要免费开源给大家学习!...

手把手教你 在Pytorch框架上部署和测试关键点人脸检测项目DBFace

这期教向大家介绍仅仅1.3M的轻量级高精度的关键点人脸检测模型DBFace,并手把手教你如何在自己的电脑端进行部署和测试运行,运行时bug解决。01.前言前段时间DBFace人脸检测库横空出世,...

进入Python的世界02外篇-Pycharm配置Pyqt6

为什么这样配置,要开发带UI的python也只能这样了,安装过程如下:一安装工具打开终端:pipinstallPyQt6PyQt6-tools二打开设置并汉化点击plugin,安装汉化插件,...

vs code如何配置使用Anaconda(vscode调用anaconda库)

上一篇文章中(Anaconda使用完全指南),我们能介绍了Anaconda的安装和使用,以及如何在pycharm中配置Anaconda。本篇,将继续介绍在vscode中配置conda...

pycharm中conda解释器无法配置(pycharm配置anaconda解释器)

之前用的好好的pycharm正常配置解释器突然不能用了?可以显示有这个环境然后确认后可以conda正在配置解释器,但是进度条结束后还是不成功!!试过了pycharm重启,pycharm重装,anaco...

Volta:跨平台开发者的福音,统一前端js工具链从未如此简单!

我们都知道现在已经进入了Rust时代,不仅很多终端常用的工具都被rust重写了,而且现在很多前端工具也开始被Rust接手了,这不,现在就出现了一款JS工具管理工具,有了它,你可以管理多版本的js工具,...

开发者的福音,ElectronEgg: 新一代桌面应用开发框架

今天给大家介绍一个开源项目electron-egg。如果你是一个JS的前端开发人员,以前面对这项任务桌面应用开发在时,可能会感到无从下手,甚至觉得这是一项困难的挑战。ElectronEgg的出现,它能...

超强经得起考验的低代码开发平台Frappe

#挑战30天在头条写日记#开始进行管理软件的开发来讲,如果从头做起不是不可以,但选择一款免费的且经得起时间考验的低代码开发平台是非常有必要的,将大幅提升代码的质量、加快开发的效率、以及提高程序的扩展性...

一文带你搞懂Vue3 底层源码(vue3核心源码解析)

作者:妹红大大转发链接:https://mp.weixin.qq.com/s/D_PRIMAD6i225Pn-a_lzPA前言vue3出来有一段时间了。今天正式开始记录一下梗vue3.0.0-be...

Windows 11 + WSL2 打造轻量级 Linux 本地开发环境实战教程

一、前言...

基于小程序 DSL(微信、支付宝)的,可扩展的多端研发框架

Mor(发音为/mr/,类似more),是饿了么开发的一款基于小程序DSL的,可扩展的多端研发框架,使用小程序原生DSL构建,使用者只需书写一套(微信或支付宝)小程序,就可以通过Mor...

取消回复欢迎 发表评论: