尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

NoneBot2 适配器(Adapter)完全指南:注册、获取 Bot 与事件通用信息

发布时间:2026/9/27 8:45:04

资讯中心
01
ARTICLE

NoneBot2 适配器(Adapter)完全指南:注册、获取 Bot 与事件通用信息

NoneBot2 适配器(Adapter)完全指南:注册、获取 Bot 与事件通用信息
后端即时通讯【免费下载链接】nonebot2跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python项目地址https://gitcode.com/gh_mirrors/no/nonebot2点击查看免费下载适配器Adapter是 NoneBot2 机器人与平台交互的核心桥梁负责在驱动器和机器人插件之间转换与传递消息。本文以 NoneBot2 官方文档使用适配器为主线系统讲解适配器的功能组成、注册方式、获取已注册适配器与 Bot 对象的方法以及事件通用信息的获取接口并结合本仓库源码nonebot/__init__.py、nonebot/internal/adapter/、nonebot/internal/driver/abstract.py等剖析底层实现帮助你真正理解并熟练使用适配器 API。适配器功能与组成适配器在 NoneBot2 中承担两种核心功能接收事件将驱动器收到的来自平台的事件消息转换为 NoneBot 定义的事件模型然后交由机器人插件处理调用平台接口将机器人插件调用平台接口的数据转换为平台指定的格式交由驱动器发送并接收接口返回数据。为了实现这两种功能一个完整的适配器通常由四个部分组成Adapter负责转换事件和调用接口正确创建 Bot 对象并注册到 NoneBot 中Bot负责存储平台机器人相关信息并提供回复事件的方法Event负责定义事件内容以及事件主体对象Message负责正确序列化消息以便机器人插件处理。从源码结构看NoneBot2 在 nonebot/internal/adapter/init.py 中导出了Adapter、Bot、Event、Message、MessageSegment、MessageTemplate六个基类并在 nonebot/adapters/init.py 中作为nonebot.adapters模块的公共接口对外提供。所有具体平台的适配器如 OneBot、Console、Telegram 等都是继承这些基类实现的它们均定义在nonebot/adapters/{adapter-name}命名空间包中并注册到nonebot.adapters模块之下。注册适配器在使用适配器之前需要先将适配器注册到驱动器中这样适配器才能通过驱动器接收事件和调用接口。以 Console 适配器为例注册过程如下bot.pyimport nonebot from nonebot.adapters.console import Adapter driver nonebot.get_driver() driver.register_adapter(Adapter)首先从适配器模块中导入所需的适配器类然后通过驱动器的register_adapter方法将适配器注册到驱动器中。如果需要多平台支持可以多次调用register_adapter方法注册多个适配器例如import nonebot from nonebot.adapters.console import Adapter from nonebot.adapters.onebot.v11 import Adapter as OneBotV11Adapter driver nonebot.get_driver() driver.register_adapter(Adapter) driver.register_adapter(OneBotV11Adapter)底层实现register_adapter 做了什么从 nonebot/internal/driver/abstract.py 的源码可以看到Driver.register_adapter的核心逻辑为通过adapter.get_name()获取适配器名称由适配器类的get_name类方法返回若同名适配器已注册则打印 debug 日志并直接返回幂等否则实例化适配器self._adapters[name] adapter(self, **kwargs)存入驱动器的类变量_adapters字典中。其中get_name是 nonebot/internal/adapter/adapter.py 中定义的抽象类方法每个适配器必须实现并返回自己的唯一名称通常形如Console、OneBot V11。另外register_adapter还接受**kwargs额外参数这些参数会原样传递给适配器的构造函数__init__(self, driver, **kwargs)。注意driver对象需要通过nonebot.get_driver()获取该函数定义于 nonebot/init.py它返回全局唯一的Driver实例如果nonebot.init()尚未被调用它会抛出ValueError: NoneBot has not been initialized.。因此register_adapter调用必须发生在nonebot.init()之后。获取已注册的适配器NoneBot2 提供了get_adapter方法来获取已注册的适配器可以通过适配器的名称或类型来获取指定的适配器实例import nonebot from nonebot.adapters.console import Adapter adapters nonebot.get_adapters() console_adapter nonebot.get_adapter(Adapter) console_adapter nonebot.get_adapter(Adapter.get_name())nonebot.get_adapters()返回所有已注册适配器实例的字典键为适配器名称nonebot.get_adapter(Adapter)按适配器类型获取实例nonebot.get_adapter(Adapter.get_name())按适配器名称字符串获取实例。底层实现与异常行为从 nonebot/init.py 的源码看get_adapter定义了两个重载接受str名称或type[A]类型。内部实现为adapters get_adapters() target name if isinstance(name, str) else name.get_name() if target not in adapters: raise ValueError(fAdapter {target} not registered.) return adapters[target]即若传入类型则先调用其get_name()转成名称再查找若目标适配器未注册会抛出ValueError: Adapter {target} not registered.。而get_adapters()返回的是get_driver()._adapters.copy()即驱动器内部注册表的一份拷贝避免外部直接修改内部状态。这一行为在仓库的测试 tests/test_init.py 中也有验证test_get_adapter断言了get_adapters()返回的字典内容、按名称与按类型两种方式都能取到同一个实例以及查询不存在的适配器会抛出异常。获取 Bot 对象当前所有适配器已连接的 Bot 对象可以通过get_bots方法获取这是一个以机器人 ID 为键的字典import nonebot bots nonebot.get_bots()也可以通过get_bot方法获取指定 ID 的 Bot 对象。如果省略 ID 参数将返回所有 Bot 中的第一个import nonebot bot nonebot.get_bot(bot_id)如果需要获取指定适配器连接的 Bot 对象可以通过适配器的bots属性获取这也是一个以机器人 ID 为键的字典import nonebot from nonebot.adapters.console import Adapter console_adapter nonebot.get_adapter(Adapter) bots console_adapter.botsBot 对象都具有一个self_id属性它是机器人的唯一 ID由适配器填写通常为机器人的账号 ID 或者 APP ID。底层实现Bot 的注册与生命周期nonebot.get_bots()定义于 nonebot/init.py返回get_driver().bots即驱动器中的_bots字典见 nonebot/internal/driver/abstract.py 的bots属性nonebot.get_bot(self_id)定义于 nonebot/init.py传入self_id时等价于get_bots()[self_id]未找到会抛出KeyError不传时返回字典中第一个 Bot若没有任何可用 Bot 则抛出ValueError: There are no bots to get.适配器的bots属性定义于 nonebot/internal/adapter/adapter.py在Adapter.__init__中被初始化为空字典。Bot 连接建立与断开时适配器会调用bot_connect/bot_disconnect见 nonebot/internal/adapter/adapter.py前者将 Bot 写入适配器自身的bots字典并调用driver._bot_connect(bot)注册到驱动器后者则从两个字典中移除。驱动器侧 nonebot/internal/driver/abstract.py 的_bot_connect/_bot_disconnect还会触发由Driver.on_bot_connect/Driver.on_bot_disconnect装饰器注册的连接钩子函数因此你可以在 Bot 上下线时执行自定义逻辑。Bot 基类nonebot/internal/adapter/bot.py的__init__接收adapter与self_id两个参数其中self_id即机器人唯一 ID同时提供type属性返回所属适配器名称、config属性全局配置、call_api方法与send抽象方法用于调用平台接口与回复消息。测试 tests/test_init.py 的test_get_bot覆盖了get_bot()无参、get_bot(test)指定 ID 以及get_bots()三种调用场景。获取事件通用信息适配器的所有事件模型均继承自Event基类nonebot/internal/adapter/event.py。在事件类型与重载一节中也提到了如何使用基类抽象方法来获取事件通用信息。基类能提供如下信息事件类型事件类型通常为meta_event、message、notice、request可通过get_type()获取type: str event.get_type()事件名称事件名称由适配器定义通常用于日志记录name: str event.get_event_name()事件描述事件描述由适配器定义通常用于日志记录description: str event.get_event_description()事件日志字符串事件日志字符串由事件名称和事件描述组成用于日志记录。其默认实现见 nonebot/internal/adapter/event.py为[{event_name}]: {event_description}通常无需修改若希望 NoneBot 隐藏该事件日志可以抛出NoLogException异常log: str event.get_log_string()事件主体 ID事件主体 ID 通常为机器人用户 IDuser_id: str event.get_user_id()事件会话 ID事件会话 ID 通常为机器人用户 ID 与群聊/频道 ID 组合而成用于判断当前事件属于哪一个会话session_id: str event.get_session_id()事件消息如果事件包含消息则可以通过get_message()获取否则会产生异常。返回值为该适配器定义的Message类型message: Message event.get_message()事件纯文本消息通常为事件消息的纯文本内容如果事件不包含消息则会产生异常。基类默认实现为get_message().extract_plain_text()即过滤出所有纯文本消息段并拼接见 nonebot/internal/adapter/message.pytext: str event.get_plaintext()事件是否与机器人有关由适配器实现的判断通常将事件目标主体为机器人、消息中包含机器人或以机器人的昵称开始视为与机器人有关is_tome: bool event.is_tome()底层实现要点上述方法中get_type、get_event_name、get_event_description、get_user_id、get_session_id、get_message、is_tome均为Event基类中的抽象方法abc.abstractmethod必须由各平台适配器的事件模型实现而get_log_string与get_plaintext在基类中提供了默认实现适配器通常无需覆写。此外Event基类还基于 pydantic 定义了model_config ConfigDict(extraallow)允许事件模型携带平台上报的额外字段便于插件直接通过事件属性访问扩展信息。更进一步了解事件在适配器中的流转结合适配器开发文档可以更完整地理解上述 API 在整个框架中的位置适配器通过setup_http_server、setup_websocket_server需驱动器支持 ASGI注册平台回调路由或通过request、websocket需驱动器支持客户端主动连接平台将收到的原始数据解析为Event对象后交给 NoneBot 的事件分发机制插件处理事件后通过bot.call_api(api, **data)或直接以属性形式调用如await bot.send_msg(messagehello world)由Bot.__getattr__实现见 nonebot/internal/adapter/bot.py最终由适配器实现的抽象方法_call_apinonebot/internal/adapter/adapter.py转换为平台指定的数据格式经驱动器发送如需在调用 API 前后插入自定义逻辑可使用Bot.on_calling_api与Bot.on_called_api钩子。更多官方支持的适配器和社区贡献的适配器均可在商店商店数据源见 assets/adapters.json5中查看。如果你想要开发自己的适配器可以参考开发文档也可使用nb adapter create脚手架快速创建适配器项目欢迎通过商店发布你的适配器。赞分享后端即时通讯【免费下载链接】nonebot2跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python项目地址https://gitcode.com/gh_mirrors/no/nonebot2点击查看免费下载相关推荐朝方向一指就能分屏免费开源的 macOS 窗口管理器 Loop朝方向一指就能分屏免费开源的 macOS 窗口管理器 Loop Loop 是一款免费开源GPLv3 协议的 macOS 窗口管理器macOS 13 及以后端即时通讯如何在Windows上简单快速搭建小爱音箱音乐播放系统完整指南如何在Windows上简单快速搭建小爱音箱音乐播放系统完整指南 你是否想在Windows电脑上搭建一个属于自己的小爱音箱音乐播放系统xiaomusic项目让后端智能硬件音视频小爱音箱终极音乐管家XiaoMusic让你的智能音箱变身私人音乐库 小爱音箱终极音乐管家XiaoMusic让你的智能音箱变身私人音乐库 想要让小爱音箱摆脱音乐平台的限制打造专属的私人音乐库吗XiaoMusic正是你寻后端智能硬件音视频上一篇深度解析ResNet-50 v1.5架构为什么它比原始版本更准确下一篇在 Windows 上为 graphify 技能引导正确的 Python 解释器PowerShell 安装片段剖析与 skillgen 渲染机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。