go-cqhttp搭建的机器人只能做些简单的事情,所以让 NoneBot2 给机器人注入灵魂吧!NoneBot2搭配go-cqhttp构建QQ机器人。
一、项目详情
1、简介
NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。
除了起到解析事件的作用,NoneBot 还为插件提供了大量实用的预设操作和权限控制机制。对于命令处理,它更是提供了完善且易用的会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。
得益于 Python 的 asyncio 机制,NoneBot 处理事件的吞吐量有了很大的保障,再配合 WebSocket 通信方式(也是最建议的通信方式),NoneBot 的性能可以达到 HTTP 通信方式的两倍以上,相较于传统同步 I/O 的 HTTP 通信,更是有质的飞跃。
2、特色
NoneBot2 的驱动框架 Driver
以及通信协议 Adapter
均可自定义,并且可以作为插件进行替换/添加!
目前 NoneBot2 内置的驱动框架:
目前 NoneBot2 官方维护的协议适配:
- OneBot(CQHTTP) 协议 (QQ 等)
- Mirai-API-HTTP 协议
- 钉钉
二、项目配置
1、环境配置
首先,我们需要提前安装python3.7或以上版本。检查Python版本:
python -v
如果版本低于3.7,则更改安装版本,参考资料:
不要用宝塔面板的Python项目管理器,没用!
2、安装依赖
pip install nb-cli pip install nonebot-adapter-cqhttp
3、安装go-cqhttp
4、修改配置
编辑go-cqhttp项目文件夹内的config.yml文件
# 反向WS设置 - ws-reverse: # 反向WS Universal 地址 # 注意 设置了此项地址后下面两项将会被忽略 universal: ws://127.0.0.1:自定义端口号/cqhttp/ws
记住这里的自定义端口号,后面要用。
5、新建机器人
在网站根目录执行:
# nb # Create a New Project # Project Name: lin # In a "src" folder # Load NoneBot Builtin Plugin? (y/N) n
[?] Which adapter(s) would you like to use? (<up>, <down> to move, <space> to select, <a> to toggle, <i> to invert) ❯cqhttp ding mirai gocq
生成的目录结构如下(命令cd lin
,ls
)
lin ├── Dockerfile ├── README.md ├── bot.py ├── docker-compose.yml ├── pyproject.toml └── src └── plugins
6、修改配置
修改bot.py文件(命令vi bot.py
)(添加第5、18行)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import nonebot from nonebot.adapters.cqhttp.bot import Bot # from nonebot.adapters.cqhttp.bot import Bot # 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() nonebot.get_driver().register_adapter("cqhttp", Bot) app = nonebot.get_asgi() driver = nonebot.get_driver() 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")
保存后,编辑 .env.prod 文件(命令 vi .env.prod
)
HOST=127.0.0.1 PORT=之前设置的端口 DEBUG=False SUPERUSERS=["123456","234567"] COMMAND_START=["/","!!"]
注释:SUPERUSERS内是超级管理员QQ号;COMMAND_START 命令的起始符号,即以此列表中的所有符号作为起始的消息会被识别为“命令”
修改 .env 文件(命令 vi .env
)
ENVIRONMENT=prod
7、编写插件
进入 lin/src/plugins 文件夹,新建文件 welcome.py 并编辑保存
cd lin/src/plugins vi welcome.py
from nonebot import on_notice from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, Message, GroupDecreaseNoticeEvent, GroupIncreaseNoticeEvent welcome = on_notice() #朋友加群 @welcome.handle() async def _(bot: Bot, event:GroupIncreaseNoticeEvent, state: T_State): user = event.get_user_id() at_ = "[CQ:at,qq={}]".format(user) msg = at_ + '欢迎新朋友的加入!' msg = Message(msg) await welcome.finish(message=msg) #群友退群 @welcome.handle() async def _(bot: Bot, event:GroupDecreaseNoticeEvent, state: T_State): user = event.get_user_id() at_ = "[CQ:at,qq={}]".format(user) msg = at_ + '\n' + '一位朋友离我们而去!' msg = Message(msg) await welcome.finish(message=msg)
8、运行项目
进入go-cqhttp项目文件夹执行
./go-cqhttp
进入机器人文件夹(命令 cd lin
)执行
python3 bot.py
9、项目测试
拉几个小号测试一下
10、进程守护
建议使用PM2管理器守护进程:
pm2 start bot.py --name="nonebot" pm2 save pm2 startup
三、参考资料
1、GitHub – nonebot/nonebot2: 跨平台Python异步机器人框架
2、【QQBot】基于 go-cqhttp + nonebot2 搭建的QQ机器人_aBBBBBear的博客
3、使用NoneBot2搭建QQ机器人第一章*Hello World——安装并配置你的机器人 – 知乎