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——安装并配置你的机器人 – 知乎