基于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/plugins
或src/plugins
: 用于存放编写的 bot 插件.env
、.env.dev
、.env.prod
: 各环境配置文件bot.py
: bot 入口文件pyproject.toml
: 项目插件配置文件Dockerfile
、docker-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 中的 plugins
和 plugin_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时,会提示你生成配置文件,要按照以下操作进行
选择通信方式
这里必须是反向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
中导入