基于Nonebot2搭建QQ机器人(一)机器人环境配置

序言


本系列旨在记录笔者学习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

如果安装成功会出现下图所示,反之则安装失败。
基于Nonebot2搭建QQ机器人(一)机器人环境配置
如果安装失败,检查:
1、pip安装环境下的 Python 版本应>= 3.7。
2、安装 NoneBot 2 之前卸载 NoneBot 1

nb create意思是创建实例(官方文档-创建实例),没有安装问题则继续下面的操作。

这里的Project Name 输入自定义名称后按回车。出现如下图所示,这个意思是选择存放插件的文件夹,我习惯于选择src文件夹。什么是插件在后面会给大家介绍。
基于Nonebot2搭建QQ机器人(一)机器人环境配置
点击回车,按照输入:y,继续点击回车。
这里出现了一个选择列表:cqhttp、ding、mirai、feishu。
这个意思是让你选择适配器。目前nonebot2支持的适配器有QQ、钉钉、Mirai-API-HTTP、飞书,由于这里是基于QQ的机器人,所以这里选择cqhttp。
基于Nonebot2搭建QQ机器人(一)机器人环境配置
注意:是用上下键选择,空格键确定,如果按空格会出现提示未选择适配器一行,需要重新进行创建。

如果实例成功创建,我们可以发现在new_bot文件夹下多出了一个(csdn)文件夹,“csdn”即是我们创建实例时输入的Project Name。
基于Nonebot2搭建QQ机器人(一)机器人环境配置

安装一些需要的库(直接复制粘贴即可)如果使用的时候缺少模块使用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文件的配置
位置如图所示
基于Nonebot2搭建QQ机器人(一)机器人环境配置
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端口需要是未被使用的,打开任务管理器可以查看端口是否被占用
基于Nonebot2搭建QQ机器人(一)机器人环境配置
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环境部署会在本系列后面更新。
基于Nonebot2搭建QQ机器人(一)机器人环境配置
下载后得到一个名称为go-cqhttp_windows_amd64.exe的exe文件,我习惯于把它放在项目文件夹下。
基于Nonebot2搭建QQ机器人(一)机器人环境配置
下面进行go-cqhttp的配置
在go-cqhttp文件所在的文件夹的空白处,打开powershell(shift+鼠标右键在此次打开power shell)
输入

.\go-cqhttp_windows_amd64.exe

会出现如下所示,选择通信方式。
如果对这通讯方式不了解的小白可以选择反向Websocket通信跟着我一起做。
基于Nonebot2搭建QQ机器人(一)机器人环境配置
选择成功后按回车,此时提示:默认配置文件已生成,请修改 config.yml 后重新启动!
关闭power shell,我们会发现原来的go-cqhttp所在的目录下会出现一个config.yml文件。
基于Nonebot2搭建QQ机器人(一)机器人环境配置
下面进行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
基于Nonebot2搭建QQ机器人(一)机器人环境配置
如果前面的配置没有问题,此时运行成功界面如图所示
基于Nonebot2搭建QQ机器人(一)机器人环境配置
2、开启go-cqhttp
回到原来go-cqhttp所在目录文件下,打开power shell 输入

.\go-cqhttp_windows_amd64.exe

如果go-cqhttp配置成功会出现一个二维码,使用在配置文件中填写的QQ扫码登录。

登陆成功后,如图所示
基于Nonebot2搭建QQ机器人(一)机器人环境配置
此时机器人就已经开启了,我们测试一下是否成功运行。我们给机器人发送/echo Hello world。如图:
基于Nonebot2搭建QQ机器人(一)机器人环境配置
这样我们的机器人就已经成功开启了,但这只是一个裸板机器人,想要实现更多有趣的功能还需要编写插件,下面一篇将带着大家编写一些简单的插件。

上一篇:打印准考证没电脑怎么办


下一篇:Java实现邮件发送(QQ邮箱例)