
后端即时通讯【免费下载链接】nonebot2跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python项目地址https://gitcode.com/gh_mirrors/no/nonebot2点击查看免费下载导读NoneBot2 是一个插件化的跨平台 Python 异步聊天机器人框架其插件系统既负责加载扩展功能也为开发者提供了标准化的插件信息收集通道。本文以 website/versioned_docs/version-2.5.0/advanced/plugin-info.md 为骨架系统讲解如何在插件顶层模块中声明PluginMetadata元数据名称、描述、用法、类别、配置类、适配器支持范围等以及如何通过get_loaded_plugins、get_plugin、get_plugin_by_module_name等公开 API 在运行时获取插件对象并读取其属性。读完本文你将能为自己开发的插件补齐可被商店与帮助系统识别的元数据并能编写出向机器人用户自动收集、展示插件帮助信息的完整方案。插件元数据为插件补充人类可读的信息NoneBot 的插件系统在加载插件时会在内存中构建一个插件对象Plugin其中存储了插件系统运行所需的一系列内部信息包括插件的索引名称、插件模块、插件中定义的事件响应器Matcher、插件父子关系等。从源码看Plugin是一个dataclass其字段定义于 nonebot/plugin/model.pyname插件索引名称NoneBot 使用文件/文件夹名称作为插件名称module插件模块对象module_name点分割的模块路径manager导入该插件的插件管理器matcher插件加载时定义的Matcher集合parent_plugin父插件sub_plugins子插件集合metadata插件元数据。这些信息主要用于插件系统内部索引与调度通常只有插件开发者才需要关心。而插件使用者或机器人用户想看到的是这个插件是做什么的、怎么用这样的帮助信息。为此NoneBot 提供了插件元数据PluginMetadata允许插件开发者在插件顶层模块中附加一组额外的、面向使用者的描述信息。这些元数据编写在插件模块的顶层即__init__.py中可以直接通过源码查看也可以由 NoneBot 插件系统在运行时收集再通过发送消息、网页渲染等方式传递给机器人用户。在插件中添加元数据假设我们有一个插件example其模块结构如下 awesome-bot ├── awesome_bot │ └── plugins │ └── example │ ├── __init__.py │ └── config.py ├── pyproject.toml └── README.md我们需要在插件顶层模块example/__init__.py中声明元数据代码如下from nonebot.plugin import PluginMetadata from .config import Config __plugin_meta__ PluginMetadata( name示例插件, description这是一个示例插件, usage没什么用, typeapplication, configConfig, extra{}, )PluginMetadata是一个dataclass定义于 nonebot/plugin/model.py其中name、description、usage三个属性为必填项其余属性均可选name插件名称人类可读description插件功能介绍usage插件使用方法type插件类别发布插件必填homepage插件主页发布插件必填config插件配置类发布插件时如有配置类则必须填写supported_adapters支持的适配器集合extra任意扩展信息的字典。字段逐项详解type插件类别type用于标识插件的服务对象当前有效类别有两种library为其他插件编写提供功能的库插件application直接向机器人用户提供功能的应用插件。该字段在发布插件到商店时必填用于商店分类展示详细填写要求见 发布插件 章节。homepage插件项目主页发布插件时必填指向插件项目的公开主页便于使用者找到源码、文档与反馈渠道。config插件配置类指向插件的 配置类。NoneBot 加载插件后插件内可以通过nonebot.plugin.get_plugin_config从全局配置中按配置类提取所需配置项实现见 nonebot/plugin/init.pyfrom nonebot.plugin import get_plugin_config config get_plugin_config(Config)该方法内部读取全局驱动配置结合配置类的字段定义、环境变量与.env文件等来源完成类型校验与取值保证插件配置与全局配置体系无缝衔接。supported_adapters支持的适配器声明插件所支持的适配器取值为适配器模块路径的集合。格式为module[:Adapter]其中~是nonebot.adapters.的缩写。若插件只使用了 NoneBot 基本抽象不依赖任何具体适配器应显式填写None表示支持所有适配器。从源码看nonebot/plugin/model.pyPluginMetadata提供了get_supported_adapters()方法将集合中的字符串解析为当前已安装的适配器类列表解析过程使用resolve_dot_notation并静默忽略未安装或导入失败的适配器。例如仓库内置测试插件 tests/plugins/metadata.py 中同时使用了简写与完整写法supported_adapters{~onebot.v11, plugins.metadata:FakeAdapter}而 tests/plugins/metadata_3.py 则展示了使用内置适配器全名的写法supported_adapters{ nonebot.adapters.onebot.v11, nonebot.adapters.onebot.v12, ~qq, }extra任意扩展信息一个dict用于存储任意自定义信息。不同插件可以通过约定extra字典的键名来达成收集某些特殊信息的目的例如约定extra{author: ...}记录作者信息。这是 NoneBot 插件生态中一种轻量、去中心化的扩展机制第三方插件管理器如商店爬虫、帮助聚合器可以按约定键名读取这些数据。名称辨析插件索引名称 ≠ 插件元数据名称请注意一个容易混淆的关键点PluginMetadata.name中的插件名称是供使用者或机器人用户查看的人类可读名称与插件索引名称无关。插件索引名称即插件模块名称如example仅用于 NoneBot 插件系统内部索引对应Plugin.name字段。也就是说一个内部索引为echo的插件其元数据名称可以写成回声插件这样的中文展示名。仓库内的真实元数据示例NoneBot 内置插件即遵循此规范例如 nonebot/plugins/echo.py__plugin_meta__ PluginMetadata( nameecho, description重复你说的话, usage/echo [text], typeapplication, homepagehttps://github.com/nonebot/nonebot2/blob/master/nonebot/plugins/echo.py, configNone, supported_adaptersNone, )以及 nonebot/plugins/single_session.py 中声明的唯一会话插件元数据。这些内置插件是声明元数据的最佳参照模板configNone表示无配置类supported_adaptersNone表示不依赖特定适配器。获取插件信息四个公开 API 的使用NoneBot 在 nonebot/plugin/init.py 中提供了多个获取插件对象的公开函数均从nonebot或nonebot.plugin导入。获取当前所有已导入的插件import nonebot plugins: set[Plugin] nonebot.get_loaded_plugins()返回当前已加载完成的所有插件对象集合。其实现直接返回内部_plugins字典的值集合nonebot/plugin/init.py。注意该函数只包含已导入的插件尚未加载的插件不会出现在结果中。通过插件索引名称获取插件对象import nonebot plugin: Plugin | None nonebot.get_plugin(example)参数为插件标识符Plugin.id_。对于通过load_plugins文件夹导入的插件标识符就是文件夹名对于嵌套子插件标识符格式为父插件标识符:子插件文件(夹)名见 nonebot/plugin/init.py 的 docstring。插件不存在时返回None。通过模块路径获取插件对象import nonebot plugin: Plugin | None nonebot.get_plugin_by_module_name(awesome_bot.plugins.example)参数为点分割的完整模块路径Plugin.module_name。该函数实现了一个巧妙的向上回退逻辑nonebot/plugin/init.py如果传入的模块名是某插件的子模块例如awesome_bot.plugins.example.config会逐级向上截取模块名直到命中已加载插件因此总能返回所属的插件对象。获取所有已声明的插件名称import nonebot plugin_names: set[str] nonebot.get_available_plugin_names()与get_loaded_plugins不同该函数返回当前所有可用的插件标识符其中可能包含尚未加载的插件。其实现遍历所有已注册的PluginManager汇总各管理器的available_pluginsnonebot/plugin/init.py。可用于在加载前预览插件列表例如机器人启动时打印全部可用插件。Plugin 对象属性全景插件对象Plugin包含以下核心属性定义于 nonebot/plugin/model.py属性类型说明namestr插件索引名称文件/文件夹名moduleModuleType插件模块对象module_namestr点分割的模块路径managerPluginManager导入该插件的插件管理器matcherset[type[Matcher]]插件中定义的事件响应器parent_pluginPlugin \| None父插件sub_pluginsset[Plugin]子插件集合metadataPluginMetadata \| None插件元数据此外还有一个只读属性id_nonebot/plugin/model.py插件索引标识顶层插件即其name子插件为父插件id:子插件name的形式与get_plugin的参数一一对应。其中matcher属性尤为实用——通过它可以枚举某插件注册的全部事件响应器进而收集每个响应器的规则、优先级与处理函数信息构成完整的插件能力清单。结合metadata中的描述与用法即可组装出面向用户的帮助文本。底层实现原理元数据如何被收集理解 NoneBot 收集元数据的机制有助于把握使用边界。NoneBot 通过自定义的PluginFinder/PluginLoader实现于 nonebot/plugin/manager.py在导入插件时完成一系列工作执行模块代码之前先创建Plugin对象并挂载为模块的__plugin__属性将当前插件写入上下文变量_current_plugin供模块内创建的Matcher关联到该插件执行模块代码exec_module期间模块顶层声明的__plugin_meta__被赋值执行完毕后通过getattr(module, __plugin_meta__, None)读取元数据并写入plugin.metadatanonebot/plugin/manager.py。从源码可以推断__plugin_meta__必须在插件顶层模块的导入阶段被赋值才能被加载器捕获如果放在函数内部或延迟赋值收集到的元数据将为None。同时若模块执行抛异常已创建的插件对象会被回滚_revert_plugin保证失败加载不会污染全局插件表。测试方面仓库在 tests/plugins/metadata.py、tests/plugins/metadata_2.py、tests/plugins/metadata_3.py 中覆盖了元数据声明、supported_adapters简写/全名解析等场景tests/test_plugin/test_manager.py 则验证了同一插件既可按标识符manager加载、也可按模块名dynamic.manager加载且返回同一对象印证了get_plugin与get_plugin_by_module_name的检索语义。实战构建插件帮助信息收集器综合以上 API 与属性可以写出一个完整的帮助信息收集函数import nonebot from nonebot.plugin import Plugin def collect_plugin_help() - list[str]: 收集所有已加载插件的帮助信息。 lines: list[str] [] for plugin in nonebot.get_loaded_plugins(): meta plugin.metadata if meta is None: continue # 跳过未声明元数据的插件 lines.append(f【{meta.name}】{meta.description}) lines.append(f 用法{meta.usage}) if meta.extra: lines.append(f 附加信息{meta.extra}) # 列出该插件注册的响应器数量 lines.append(f 响应器数量{len(plugin.matcher)}) return lines进一步地若需要按适配器过滤插件可读取meta.get_supported_adapters()判断插件是否支持当前运行环境若需要定位某个具体插件则用nonebot.get_plugin(echo)或nonebot.get_plugin_by_module_name(awesome_bot.plugins.example)精确获取后再读取其metadata与matcher。这一套声明元数据 → 运行时收集 → 按需展示的流程正是 NoneBot 插件商店分类、自动帮助生成、插件管理面板等上层功能的数据基础。遵循__plugin_meta__声明规范你的插件就能无缝融入整个 NoneBot 插件信息生态。赞分享后端即时通讯【免费下载链接】nonebot2跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python项目地址https://gitcode.com/gh_mirrors/no/nonebot2点击查看免费下载相关推荐NoneBot2 插件信息体系详解PluginMetadata 元数据定义与插件信息获取实战NoneBot2 插件信息体系详解PluginMetadata 元数据定义与插件信息获取实战 导读 NoneBot2 是一个插件化的跨平台异步聊天机器人框架后端即时通讯NoneBot2 插件信息模型详解PluginMetadata 与 Plugin 的完整指南NoneBot2 插件信息模型详解PluginMetadata 与 Plugin 的完整指南 本篇技术指南以 NoneBot2 的 nonebot.plugi后端即时通讯NoneBot2 插件信息详解插件元数据定义与插件对象获取全指南NoneBot2 插件信息详解插件元数据定义与插件对象获取全指南 本篇指南聚焦 NoneBot2 插件系统的信息层如何为插件声明元数据 PluginM后端即时通讯上一篇 Software Engineering New Grad Roles (182)下一篇从0到1掌握JetBrains Amper30分钟构建跨平台应用新范式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考