基于Nonebot2的QQ机器人开发

刚使用nonebot不久,开发了自己的机器人。但是回头看看nonebot的文档,感觉对刚学python的新手还是比较晦涩且内容较多,于是我打算站在新手的角度自己写一个简约的能快速入门的教程,帮助新手们能很快上手,如果有不对的地方请大佬多多指正!

学会查阅文档

会查阅文档是学习知识的必备技能,这通常能帮助你更加深入了解这个知识或技能

Nonebot2的官方文档:https://v2.nonebot.dev/docs/

go-cqhttp的官方文档:https://docs.go-cqhttp.org/

ONEBOT协议适配文档:https://onebot.adapters.nonebot.dev/

Well404大佬的Nonebot2干货分享:https://www.zhihu.com/column/c_1375057475469656064

快速上手

安装脚手架

直接运行下面的命令

pip install nb-cli

脚手架安装完成之后,同时被安装的还有:

  • Nonebot2
  • 服务端驱动器(可以使用nb driver list命令查看,默认全部安装)
  • 协议适配器(可以使用nb adapter list命令查看,默认全部安装)

创建项目

使用nb-cli脚手架创建项目

nb create

创建出来的项目目录:

? AweSome-Bot
├── ? awesome_bot         # 或是 src
│   └── ? plugins
├── ? .env                # 可选的
├── ? .env.dev            # 可选的
├── ? .env.prod           # 可选的
├── ? .gitignore
├── ? bot.py
├── ? docker-compose.yml
├── ? Dockerfile
├── ? pyproject.toml
└── ? README.md
  • awesome_bot/pluginssrc/plugins: 用于存放编写的 bot 插件
  • .env.env.dev.env.prod: 各环境配置文件
  • bot.py: bot 入口文件
  • pyproject.toml: 项目插件配置文件
  • Dockerfiledocker-compose.yml: Docker 镜像配置文件

配置文件

.env.env.dev.env.prod为环境配置文件

.env 文件

文件默认内容为ENVIRONMENT=dev

ENVIRONMENT所对应的值即为该项目所使用的环境

ENVIRONMENT所对应的值为dev时,将项目将使用.env.dev文件作为配置文件

ENVIRONMENT所对应的值为prod时,将项目将使用.env.prod文件作为配置文件

.env.* 文件

示例及说明:

HOST=0.0.0.0  # 配置 NoneBot2 监听的 IP/主机名
PORT=8080  # 配置 NoneBot2 监听的端口
SUPERUSERS=["123456789", "987654321"]  # 配置 NoneBot 超级用户
NICKNAME=["awesome", "bot"]  # 配置机器人的昵称
COMMAND_START=["/", ""]  # 配置命令起始字符
COMMAND_SEP=["."]  # 配置命令分割字符

# Custom Configs
CUSTOM_CONFIG1="config in env file"
CUSTOM_CONFIG2=  # 留空则从系统环境变量读取,如不存在则为空字符串

详细的配置项可以参考配置项

有一些插件在加载的时候将需要修改或添加配置项

下载第三方插件

你可以在网络上搜索nonebot2的插件,有些插件可以在github上或nonebot2商店中找到

nonebot2插件商店:https://v2.nonebot.dev/store

通过脚手架下载

nb plugin install plugin-name

通过pip下载

pip install plugin-name

nonebot的插件在下载时,插件名的单词之间要用横杠-连接,但在导入时,插件名的单词之间要用下划线_连接

例如:下载时nb plugin install nonebot-plugin-status

​ 导入时nonebot.load_plugin("nonebot_plugin_status")

导入插件

加载插件的方式有多种,但在底层的加载逻辑是一致的。以下是为加载插件提供的几种方式:

load_plugin

通过点分割模块名称来加载插件,通常用于加载单个插件或者是第三方插件。例如:

nonebot.load_plugin("path.to.your.plugin")

load_plugins

加载传入插件目录中的所有插件,通常用于加载一系列本地编写的插件。例如:

nonebot.load_plugins("src/plugins", "path/to/your/plugins")

load_from_toml

通过 TOML 文件加载插件,是 load_all_plugins的 TOML 变种。通过读取 TOML 文件中的 [tool.nonebot] Table 中的 pluginsplugin_dirs Array 进行加载。例如:

plugin_config.toml

[tool.nonebot]
plugins = ["path.to.your.plugin"]
plugin_dirs = ["path/to/your/plugins"]

bot.py

nonebot.load_from_toml("plugin_config.toml", encoding="utf-8")

默认的,自己写的插件是不需要在bot.py中导入

原因在于bot.py中默认语句nonebot.load_from_toml("pyproject.toml")即从pyproject.toml文件中读取了要导入的插件

而在pyproject.toml文件中的语句plugin_dirs = ["src/plugins"]中导入了在plugins文件中的所有插件

如果你不想使用该默认导入,你可以将nonebot.load_from_toml("pyproject.toml")语句注释起来

QQ接口 go-cqhttp

go-cqhttp的github项目地址:https://github.com/Mrs4s/go-cqhttp

go-cqhttp的文档:https://docs.go-cqhttp.org/

关于go-cqhttp的一切都可以在文档中找到,写的很简洁很容易上手,这里就不多说了。

go-cqhttp有以下几点需要注意的

配置文件

当你第一次运行go-cqhttp时,会提示你生成配置文件,要按照以下操作进行

选择通信方式

image-20220902180045548

这里必须是反向Websocket通信

设置反向WS Universal 地址

config.yml文件中,你参照注释填写信息时,servers字段中的ws-reverse字段中的universal需要设置为

universal: ws://127.0.0.1:[你在.env.*设置的端口号]/onebot/v11/ws/

值得一提的是,你在登录go-cqhttp之后,请不要将生成的文件上传至网络或者开源社区,这将有可能造成数据泄露

启动项目

请在项目根目录处输入命令!

方法1:通过脚手架

nb run [--file=bot.py] [--app=app]

其中 --file 参数可以指定 bot 入口文件,默认为 bot.py--app 参数可以指定 asgi server,默认为 app

方法2:直接通过Python启动

python bot.py

启动go-cqhttp

按照go-cqhttp的文档的方法启动即可

此时,你已经成功地配置好了机器人的框架并能用上一些开源插件了!

(2022.9.2更新)


进阶-插件编写

插件结构

在NoneBot中,插件将以python的一个模块进行加载

编写插件有两种方式:单文件插件、包插件

单文件插件

plugins目录下创建一个.py文件即可,将所有的代码写入同一个.py文件中

包插件

plugins目录下创建一个your-plugin-name文件夹,在your-plugin-name文件夹中必须创建一个__init__.py文件作为插件的入口

可以在expample文件下创建多个.py文件并在__init__.py中导入