序言
本系列旨在记录笔者学习nonebot2以及搭建过程分享。
主要分为Nonebot2基础和插件部分。插件主要关于笔者已上线运营的服务于本校的教务系统机器人,其自12月2日上线以来,截至2021年12月29日本校用户突破1k人,总使用次数突破3w次。
一、Nonebot2介绍
摘录于Nonebot2官方文档 https://v2.nonebot.dev/
NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。
除了起到解析事件的作用,NoneBot 还为插件提供了大量实用的预设操作和权限控制机制。对于命令处理,它更是提供了完善且易用的会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。
得益于 Python 的 asyncio (opens new window)机制,NoneBot 处理事件的吞吐量有了很大的保障,再配合 WebSocket 通信方式(也是最建议的通信方式),NoneBot 的性能可以达到 HTTP 通信方式的两倍以上,相较于传统同步 I/O 的 HTTP 通信,更是有质的飞跃。
需要注意的是,NoneBot 仅支持 Python 3.7.3 以上版本
特色
NoneBot2 的驱动框架 Driver 以及通信协议 Adapter 均可自定义,并且可以作为插件进行替换/添加!
提供使用简易的脚手架
提供丰富的官方插件
提供可添加/替换的驱动以及协议选项
基于异步 I/O
同时支持 HTTP 和反向 WebSocket 通信方式
支持多个机器人账号负载均衡
提供直观的交互式会话接口
提供可自定义的权限控制机制
多种方式渲染要发送的消息内容,使对话足够自然
二、Nonebot2安装
官方文档
https://v2.nonebot.dev/guide/installation.html
官网提供了两种安装方式(脚手架安装、不使用脚手架安装)
这里采用脚手架安装方式
创建一个空文件夹,我的命名是(new_bot)添加到pycharm项目中
打开pycharm的终端键入
pip install nb-cli
安装成功后,在终端键入
nb create
如果安装成功会出现下图所示,反之则安装失败。
如果安装失败,检查:
1、pip安装环境下的 Python 版本应>= 3.7。
2、安装 NoneBot 2 之前卸载 NoneBot 1
nb create意思是创建实例(官方文档-创建实例),没有安装问题则继续下面的操作。
这里的Project Name 输入自定义名称后按回车。出现如下图所示,这个意思是选择存放插件的文件夹,我习惯于选择src文件夹。什么是插件在后面会给大家介绍。
点击回车,按照输入:y,继续点击回车。
这里出现了一个选择列表:cqhttp、ding、mirai、feishu。
这个意思是让你选择适配器。目前nonebot2支持的适配器有QQ、钉钉、Mirai-API-HTTP、飞书,由于这里是基于QQ的机器人,所以这里选择cqhttp。
注意:是用上下键选择,空格键确定,如果按空格会出现提示未选择适配器一行,需要重新进行创建。
如果实例成功创建,我们可以发现在new_bot文件夹下多出了一个(csdn)文件夹,“csdn”即是我们创建实例时输入的Project Name。
安装一些需要的库(直接复制粘贴即可)如果使用的时候缺少模块使用pip安装即可,有时候需要换源大部分使用清华源就可以成功安装:
清华源:https://pypi.tuna.tsinghua.edu.cn/simple/
使用方法:pip语句后加-i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install pydantic loguru pygtrie httpx python-dotenv uvicorn fastapi requests selenium aiocqhttp ffmpeg aiohttp -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install nonebot2 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install nonebot-plugin-apscheduler nonebot-adapter-cqhttp -i https://pypi.tuna.tsinghua.edu.cn/simple/
下面进行一些基本配置
官方文档-基本配置
1、bot.py文件的配置
位置如图所示
bot.py中需要写入的配置信息已经放在下面了,可以直接复制粘贴覆盖原有的信息。
后面写插件的时候会具体教大家配置。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import nonebot
from nonebot.adapters.cqhttp import Bot as CQHTTPBot
# Custom your logger
#
# from nonebot.log import logger, default_format
# logger.add("error.log",
# rotation="00:00",
# diagnose=False,
# level="ERROR",
# format=default_format)
# You can pass some keyword args config to init function
nonebot.init()
app = nonebot.get_asgi()
nonebot.load_plugins("src/plugins")
driver = nonebot.get_driver()
driver.register_adapter("cqhttp", CQHTTPBot)
nonebot.load_builtin_plugins()
# Please DO NOT modify this file unless you know what you are doing!
# As an alternative, you should use command `nb` or modify `pyproject.toml` to load plugins
nonebot.load_from_toml("pyproject.toml")
# Modify some config / config depends on loaded configs
#
# config = driver.config
# do something...
if __name__ == "__main__":
nonebot.logger.warning("Always use `nb run` to start the bot instead of manually running!")
nonebot.run(app="__mp_main__:app")
2、.env文件的配置
NoneBot 在启动时将会从系统环境变量或者 .env 文件中寻找变量 ENVIRONMENT (大小写不敏感),默认值为 prod。
这将引导 NoneBot 从系统环境变量或者 .env.{ENVIRONMENT} 文件中进一步加载具体配置。
.env 文件是基础环境配置文件,该文件中的配置项在不同环境下都会被加载,但会被 .env.{ENVIRONMENT} 文件中的配置所覆盖。
现在,我们在 .env 文件中写入当前环境信息:
# .env
ENVIRONMENT=dev
CUSTOM_CONFIG=common config # 这个配置项在任何环境中都会被加载
3、env.dev文件配置
因为在.env文件中已经添加了ENVIRONMENT=dev,这里需要配置一下env.dev文件信息
HOST=127.0.0.1
PORT=8890
DEBUG=true
注意这里的PORT端口需要是未被使用的,打开任务管理器可以查看端口是否被占用
4、env.pord配置
配置信息如下
HOST=127.0.0.1
PORT=8890
SECRET=
ACCESS_TOKEN=
由于在上一步设置了端口号,这里的端口号需要与env.dev端口号相同。
env.pord配置信息较多,初学者可以不选择全部配置,按照上面配置即可。
如果有兴趣可以参考官方给出的配置信息
HOST=0.0.0.0 # 配置 NoneBot 监听的 IP/主机名
PORT=8080 # 配置 NoneBot 监听的端口
DEBUG=true # 开启 debug 模式 **请勿在生产环境开启**
SUPERUSERS=["123456789", "987654321"] # 配置 NoneBot 超级用户
NICKNAME=["awesome", "bot"] # 配置机器人的昵称
COMMAND_START=["/", ""] # 配置命令起始字符
COMMAND_SEP=["."] # 配置命令分割字符
# Custom Configs
CUSTOM_CONFIG1="config in env file"
CUSTOM_CONFIG2= # 留空则从系统环境变量读取,如不存在则为空字符串
三、go-cqhttp介绍
go-cqhttp官方文档
https://docs.go-cqhttp.org/
四、go-cqhttp安装
go-cqhttp在Github的下载链接
这里有Linux和windows的不同方式的下载链接,根据自己需要选择,本篇只介绍windows环境下的安装方式。Linux环境部署会在本系列后面更新。
下载后得到一个名称为go-cqhttp_windows_amd64.exe的exe文件,我习惯于把它放在项目文件夹下。
下面进行go-cqhttp的配置
在go-cqhttp文件所在的文件夹的空白处,打开powershell(shift+鼠标右键在此次打开power shell)
输入
.\go-cqhttp_windows_amd64.exe
会出现如下所示,选择通信方式。
如果对这通讯方式不了解的小白可以选择反向Websocket通信跟着我一起做。
选择成功后按回车,此时提示:默认配置文件已生成,请修改 config.yml 后重新启动!
关闭power shell,我们会发现原来的go-cqhttp所在的目录下会出现一个config.yml文件。
下面进行config.yml文件信息配置。
对于反向socket我们只需要配置两个位置的信息。
这里的uin输入机器人的QQ号,密码可以不用加,注意QQ号前空格不要删掉。
account: # 账号相关
uin: 123456789 # QQ账号
password: '' # 密码为空时使用扫码登录
这里需要修改universal,把后面的改成 ws://127.0.0.1:8890/cqhttp/ws,这里的8890改成你自己的端口号,端口号和env.dev中的端口号要一致。
# 连接服务列表
servers:
# 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
#- http: # http 通信
#- ws: # 正向 Websocket
#- ws-reverse: # 反向 Websocket
#- pprof: #性能分析服务器
# 反向WS设置
- ws-reverse:
# 反向WS Universal 地址
# 注意 设置了此项地址后下面两项将会被忽略
universal: ws://127.0.0.1:8890/cqhttp/ws
# 反向WS API 地址
api: ws://your_websocket_api.server
# 反向WS Event 地址
event: ws://your_websocket_event.server
# 重连间隔 单位毫秒
reconnect-interval: 3000
middlewares:
<<: *default # 引用默认中间件
到这里go-cqhttp就已经配置好了。
四、开启实例
启动机器人需要两个步骤
1、开启nonebot。
右键点击运行bot.py
如果前面的配置没有问题,此时运行成功界面如图所示
2、开启go-cqhttp
回到原来go-cqhttp所在目录文件下,打开power shell 输入
.\go-cqhttp_windows_amd64.exe
如果go-cqhttp配置成功会出现一个二维码,使用在配置文件中填写的QQ扫码登录。
登陆成功后,如图所示
此时机器人就已经开启了,我们测试一下是否成功运行。我们给机器人发送/echo Hello world。如图:
这样我们的机器人就已经成功开启了,但这只是一个裸板机器人,想要实现更多有趣的功能还需要编写插件,下面一篇将带着大家编写一些简单的插件。