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 官方维护的协议适配:

商店 | NoneBot

二、项目配置

1、环境配置

首先,我们需要提前安装python3.7或以上版本。检查Python版本:

python -v

如果版本低于3.7,则更改安装版本,参考资料:

升级Centos7.5的默认Python版本至最新_韩以安

不要用宝塔面板的Python项目管理器,没用!

2、安装依赖

pip install nb-cli
pip install nonebot-adapter-cqhttp

3、安装go-cqhttp

参考资料:Go语言全平台QQ机器人搭建 – 松子分享

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 linls

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

4、升级Centos7.5的默认Python版本至最新_韩以安

5、NoneBot2文档