nonebot2 插件编写指南(四)(从旧版迁移至 2.0.0-beta.2)

这篇博客介绍了如何将NoneBot的cqhttp协议插件迁移到新版本的onebot协议。主要步骤包括更换协议适配器,修改import部分,调整事件响应器。新版本提供了CommandArg()方法简化消息处理,并对事件进行了细分。同时提醒用户检查依赖的第三方插件是否已适配新版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nonebot2 插件编写指南(四)(从旧版迁移至 2.0.0-beta.2)

在 nb2 更新之后,许多未进行更新的插件均无法继续使用,包括之前几篇编写的简单插件。
在本篇中,将会对之前自己编写的插件进行新版本的适配。

更换协议适配器

在新版本的 nonebot 中,cqhttp 协议被弃用,如果你仍然使用的是 go-cqhttp 作为 qq 端,那么需要将协议改为 onebot。
使用脚手架安装时使用空格选择 onebot。
在 bot.py 中有以下片段即安装成功:

from nonebot.adapters.onebot.v11 import Adapter as ONEBOT_V11Adapter

和:

driver = nonebot.get_driver()
driver.register_adapter(ONEBOT_V11Adapter)

插件修改

新版本对于插件的影响不大,主要修改点为 import 导入点包和每个事件处理函数的部分。

修改 import 部分

以之前发的日报部分来举例,这是插件的 import 部分:

from nonebot import on_command
from nonebot.rule import to_me
from nonebot.typing import T_State
from nonebot.adapters import Bot, Event
from nonebot.adapters.cqhttp.message import Message

其中,cqhttp 有关的部分需要换成 onebot,Massage 部分需要更换来源,替换过后的样子:

from nonebot import on_command
from nonebot.rule import to_me
from nonebot.params import CommandArg
from nonebot.adapters.onebot.v11 import GroupMessageEvent,Bot,Message

其中nonebot.adaptersnonebot.typing的部分被弃用,取而代之的是nonebot.params和 onebot 协议适配器对应的nonebot.adapters.onebot.v11
而在老版本中常用的 Bot、Massage 和 Event 则归到了 onebot 之下。
而 event 也细分为群 event(GroupMessageEvent)和私聊 event(PrivateMessageEvent)。

修改事件响应器部分

若您的插件不需要使用 event 或者 bot 等来进行消息内容获取或 bot 设置,则可以直接跳过此部分

其实修改的部分只有 event 等数据的获取。
这是老的:

@today.handle()
async def handle_first_receive(bot: Bot, event: Event, state: T_State):

这是新的:

@today.handle()
async def handle_first_receive(event: GroupMessageEvent,message: Message = CommandArg()):

因为在新版中提供了一个新的方法:CommandArg(),这个方法将 Message 部分整合到了一起,提供了更方便的使用方法。
而 event 则可以根据消息来源来设置分开响应。
其他相关部分可以查看 nonebot 官网的 api 部分。

修改事件处理部分

在本插件中,事件处理部分暂无需要修改部分。若您的插件需要修改,请参考官方 api 文档。

若使用官方商店插件

在使用官方商店的第三方插件时,请注意查看此插件是否已适配新版本。
具体方法为:查看此插件 github 仓库,或者使用 pip 或 nb-cli 下载,进入 python 的 site-packages 文件夹下查看此插件源码。

此指南举例插件完整源码

命运 2 日报:

from nonebot import on_command
from nonebot.rule import to_me
from nonebot.params import CommandArg
from nonebot.adapters.onebot.v11 import GroupMessageEvent,Bot,Message

import urllib3
import json

today = on_command("today", aliases={'日报', }, priority=5)

@today.handle()
async def handle_first_receive(event: GroupMessageEvent,message: Message = CommandArg()):
    try:
        try:
            url = 'http://www.tianque.top/d2api/today/'

            r = urllib3.PoolManager().request('GET', url)
            hjson = json.loads(r.data.decode())

            img_url = hjson["img_url"]

            cq = "[CQ:image,file=" + img_url + ",id=40000]"

            await today.send(Message(cq))
        except:
            url = 'http://www.tianque.top/d2api/today/'

            r = urllib3.PoolManager().request('GET', url)
            hjson = json.loads(r.data.decode())

            error_url = hjson["error"]
            await today.send("获取日报失败\n"+
                            "error:\n"+
                            error_url)
    except :
        await today.send("获取日报失败:\n服务器错误")
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值