NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架,它基于 Python 的类型注解和异步特性,能够为你的需求实现提供便捷灵活的支持。
NoneBot2 具有丰富的插件生态系统,可以实现多种功能,例如自动回复、天气查询、消息推送等等。此外,它还提供了完善的文档和示例代码,方便用户快速上手和开发自己的插件。
如果你是一名 Python 程序员,想要开发一个聊天机器人,那么 NoneBot2 绝对是你的不二之选。你可以在官方文档中了解更多关于 NoneBot2 的详细信息和使用方法。
首先,你需要明白的是NoneBot2的运行是需要python运行环境来支持,因此我们首先需要配置好python环境;再有,以QQ聊天机器人举例,NoneBot2本身并不包含与QQ服务器通信的底层协议实现,因此无法独立搭建聊天机器人。与 QQ 服务器通信的底层协议实现可以有多种选择,如 CoolQ HTTP API 协议、Mirai 协议、go-cqhttp 协议等。因此,在使用 nonebot 框架搭建 QQ 机器人时,您还需要选择一个底层协议实现来与 QQ 服务器通信,这里我们以go-cqhttp为例。
综上所述,如果我们要搭建一个属于自己的QQ机器人,需要进行如下几步:
下面将直接用云服务器进行部署,毕竟如果你要开个机器人肯定是24小时一直服务,因此,这里以腾讯云的Centos为例部署。
首先你得先按照Python,需要注意的是,NoneBot 仅支持 Python 3.7.3 以上版本,这里以安装Python3.9.9为例:
由于CentOS7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到。所以我们要额外安装Python3,而且系统一般允许多个版本的python同时存在。
我们先来查看python安装位置,一般是位于/usr/bin/python目录下。
$ which python
>> /usr/bin/python
下面介绍安装Python3的方法:
安装依赖包(切记安装)
yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
在安装 Python 之前需要安装必要的开发工具和库。
当您运行第一个命令 yum -y groupinstall development tools
时,它会安装一组常用的开发工具,用于在 Linux 系统上构建软件。这些工具包括编译器、链接器和其他用于构建软件的实用程序。
接下来的命令 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
安装 Python 所需的其他开发库。这些库提供了压缩和加密功能、数据库访问支持以及 GUI 工具包(如 Tkinter)等功能。
通过在安装 Python 之前安装这些工具和库,您可以确保您的系统具备构建和运行 Python 程序所需的所有必要组件。
同时,补充个小知识点:在 yum 命令中,-y
参数是指定在执行安装或卸载操作时不需要手动确认。如果没有使用 -y
参数,则在安装或卸载软件包时,yum 会提示您确认操作,需要手动输入 y
才能继续执行操作。
使用 -y
参数可以使 yum 命令在执行操作时自动确认,避免了人工交互的过程,方便自动化脚本和批量操作。但是,使用 -y
参数也需要注意,因为这样可能会导致不必要的安装或卸载,所以在使用时需要谨慎。
下载Python3安装包
大家可根据自己需求下载不同版本的Python3,我下载的是Python3.9.9
wget https://www.python.org/ftp/python/3.9.9/Python-3.9.9.tar.xz
新建python3存放目录
mkdir /usr/local/python3
安装Python3
解压压缩包,进入解压目录,指定安装目录,安装Python3。
tar -xvJf Python-3.9.9.tar.xz # 该命令将 Python 的源代码文件(压缩文件)解压缩到当前目录中。
cd Python-3.9.9 # 将当前工作目录更改为 Python 源代码所在的目录,以便在这个目录下执行后续的命令。
./configure --prefix=/usr/local/python3 # 运行配置脚本,为 Python 的构建过程设置参数。--prefix 选项指定 Python 的安装目录,这里设置为 /usr/local/python3。这意味着 Python 将被安装到 /usr/local/python3 目录中。
yum install libffi-devel -y # 这个命令会安装 libffi-devel 开发包,该开发包是 Python 某些模块的依赖项。在安装 Python 的某些版本(如 Python 3.7 及以上版本)时,需要先安装此包。
make && make install # 这个命令会构建和安装 Python。make 命令编译源代码,并生成可执行文件。make install 命令将编译好的文件安装到指定的目录中(在这里是 /usr/local/python3)。这样,Python 就已经成功安装到了系统中。
在 Python 3.4 及以后的版本中,pip 被包含在了 Python 的安装包中,因此在安装 Python 3.4 及以后的版本时,pip 也会被一同安装。
如果您使用的是 Python 3.4 及以后的版本,那么在安装完成后,您可以通过在终端中输入 pip
命令来验证 pip 是否已经安装成功。
对于早期版本的 Python(例如 Python 2.x 系列和 Python 3.3 及以前的版本),pip 并不会自动安装。您需要手动安装 pip。yum -y install python-pip
或 yum -y install python3-pip
创建软链接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
在 Linux 系统中,通常使用 python
和 pip
命令来分别执行 Python 解释器和 pip 包管理器。在您安装了多个版本的 Python 时,可能会出现需要切换 Python 版本的情况。此时,您可以使用软链接来指定默认版本。
创建软链接的命令是 ln -s 源文件 目标文件
,其中 -s
表示创建软链接。在这里,/usr/local/python3/bin/python3
是您要创建软链接的源文件,而 /usr/bin/python3
是软链接的目标文件。这样,当您执行 python3
命令时,实际上会调用 /usr/local/python3/bin/python3
解释器。
同样,/usr/local/python3/bin/pip3
是源文件,/usr/bin/pip3
是目标文件,执行 pip3
命令时,实际上会调用 /usr/local/python3/bin/pip3
包管理器。
通过创建软链接,您可以轻松地切换不同版本的 Python,并指定默认版本。但是,需要注意的是,软链接只是一个指向源文件的快捷方式,源文件被删除或移动时,软链接也将失效。
安装完成,输入python3测试
安装成功
go-cqhttp 是一个基于 go 语言开发的,轻量、原生跨平台、高效、可扩展的 QQ 机器人框架,支持多种协议和多个 QQ 用户同时连接,可轻松实现 QQ 消息收发、群消息管理、帐号管理、事件处理等功能。
以腾讯云轻量级服务器centos7为例,配置go-cqhttp的流程如下:
在github上下载最新的版本go-cqhttp,根据你的系统选择下载安装包,这里我们选择arm64 Linux
系统类型 | 可执行文件 | 压缩文件 |
---|---|---|
Intel 版 Macos | Not available | go-cqhttp_darwin_amd64.tar.gz |
M1 版 Macos | Not available | go-cqhttp_darwin_arm64.tar.gz |
32 位 Linux | Not available | go-cqhttp_linux_386.tar.gz |
64 位 Linux | Not available | go-cqhttp_linux_amd64.tar.gz |
arm64 Linux | Not available | go-cqhttp_linux_arm64.tar.gz |
armv7 Linux | Not available | go-cqhttp_linux_armv7.tar.gz |
32 位 Windows | go-cqhttp_windows_386.exe | go-cqhttp_windows_386.zip |
64 位 Windows | go-cqhttp_windows_amd64.exe | go-cqhttp_windows_amd64.zip |
arm64 Windows | go-cqhttp_windows_arm64.exe | go-cqhttp_windows_arm64.zip |
armv7 Windows | go-cqhttp_windows_armv7.exe | go-cqhttp_windows_armv7.zip |
wget https://github.com/Mrs4s/go-cqhttp/releases/download/v1.0.0-rc4/go-cqhttp_linux_amd64.tar.gz
(一定要注意你的安装目录)
解压安装设置并登录机器人QQ
tar -xzvf go-cqhttp_linux_amd64.tar.gz
解压后cd到解压的目录里执行ssh命令./go-cqhttp
,执行这个命令会在当前文件夹下生成几个文件。重点关注config.yml
文件,你需要在这个文件中设置QQ(和 QQ密码)
# go-cqhttp 默认配置文件
account: # 账号相关
uin: # QQ账号
password: '' # 密码为空时使用扫码登录
encrypt: false # 是否开启密码加密
status: 0 # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
relogin: # 重连设置
delay: 3 # 首次重连延迟, 单位秒
interval: 3 # 重连间隔
max-times: 0 # 最大重连次数, 0为无限制
......
设置好后可以重启go-cqhttp。
重启后,第一次登录因为异地需要验证,可以选择扫码登录。
如果你的服务器和手机不在同一个局域网内,会提示网络环境复杂
解决办法:在本地电脑调试成功后,会在go-cqhttp所在的文件夹中生成session.token文件,将session.token文件传到云服务器中go-cqhttp所在的文件夹内即可
提示登录失败: 密码错误或账号被冻结
解决办法:在运行一次go-cqhttp
后,可以发现其文件夹内会生成一个device.json文件,将device.josn中的protocol=5改为protocol=2即可
这里你可能会出现其他bug,可以访问其GitHub,查看issue,看看有无解决办法。如下:
https://github.com/Mrs4s/go-cqhttp/issues
由于我们想要其24小时运营,因此可以给它设置为后台运行,并进行进程守护
设置后台运行
nohup ./go-cqhttp
nohup ./go-cqhttp
是一个命令,它的作用是在后台运行 go-cqhttp。
nohup
是 Linux 系统中一个命令,用于让命令在后台运行,并且忽略掉 Hangup 信号。Hangup 信号通常是在用户退出登录时发送给当前进程的,如果没有使用 nohup
命令,当用户退出登录时,进程也会被关闭。
./go-cqhttp
则是一个运行 go-cqhttp 的命令,其中 ./
表示在当前目录下执行,go-cqhttp
是 go-cqhttp 的可执行文件名。因此,nohup ./go-cqhttp
的作用是在后台运行 go-cqhttp,并且忽略掉 Hangup 信号,这样即使当前用户退出登录,进程也会继续在后台运行。
需要注意的是,在使用 nohup
命令运行程序时,程序的输出信息将不再显示在终端上,而是保存在当前目录下的 nohup.out 文件中,您可以使用 tail -f nohup.out
命令来实时查看输出信息。
进程守护:
pm2 start ./go-cqhttp --name="go-cqhttp"
pm2 save
pm2 startup
**
pm2
**是一个用于管理 Node.js 进程的工具,它可以帮助我们轻松地启动、停止、重启和监控 Node.js 进程。在这里,我们使用 **pm2
**来启动 go-cqhttp 进程,并将其命名为go-cqhttp
,方便我们后续管理进程。使用 **pm2
启动进程后,可以通过pm2 list
命令查看当前运行的进程列表,也可以通过pm2 stop
、pm2 restart
、pm2 delete
**命令来停止、重启、删除进程。
测试
接下来我们进行http通信测试,首先需要在config.yml
配置http通信
如果你是本地服务器,配置IP地址以及端口号以127.0.0.1:5700为例,运行go-cqhttp。
浏览器访问下面网址,测试使用机器人QQ发送消息给好友
http://127.0.0.1:5700/send_private_msg?user_id=接收消息的好友QQ号码&message=这里输入发送的信息内容
执行成功会返回一段响应数据{"data":{"message_id":xxxx},"retcode":0,"status":"ok"}
说明发送成功了
给qq群发送消息测试,成功同样会返回上面一样的数据"status":"ok”
http://127.0.0.1:5700/send_group_msg?group_id=接收消息QQ群号&message=这里输入发送的信息内容
更多详情内容,请访问go-cqhttp相关文档:https://docs.go-cqhttp.org/
直接进入正题,根据以下步骤进行None Bot的配置:
下载安装机器人依赖
使用 pip 或 其他包管理工具 安装 nb-cli,nonebot2 会作为其依赖被一起安装
python3 -m pip install nb-cli
如果没有安装的话,可以执行下面这段命令安装nonebot2
python3 -m pip install nonebot2
安装cqhttp适配器
python3 -m pip install nonebot-adapter-cqhttp
nonebot 是一个基于 Python 的 QQ 机器人开发框架,它本身只提供了一些高级 API 和插件,方便开发者编写 QQ 机器人的功能。但是,与 QQ 服务器通信的底层协议实现是多种多样的,如 go-cqhttp、Mirai、CoolQ 等,这些协议实现之间的 API 不尽相同。因此,开发 QQ 机器人需要先选择一个合适的协议实现,然后再编写对应的适配器,以便将协议实现和 nonebot 框架连接起来,实现 QQ 机器人的功能。
适配器可以理解为是一个桥梁,它的作用是将底层协议实现和 nonebot 框架连接起来,使它们能够互相通信。在使用 nonebot 框架开发 QQ 机器人时,需要先根据所选的底层协议实现,选择相应的适配器,然后根据适配器提供的 API 编写 QQ 机器人的功能。
举个例子,如果您选择使用 go-cqhttp 作为底层协议实现,那么您需要安装 go-cqhttp,并选择 go-cqhttp 适配器。这个适配器将 go-cqhttp 和 nonebot 框架连接起来,使得您可以通过 nonebot 框架来编写 QQ 机器人的功能,并且 go-cqhttp 可以帮助您与 QQ 服务器通信。
因此,在使用 nonebot 框架开发 QQ 机器人时,需要根据所选的底层协议实现,选择相应的适配器,并将其与 nonebot 框架结合使用,以实现 QQ 机器人的功能。
修改go-cqhttp配置
修改配置 config.yml
文件,找到如下位置,修改地址及端口号,后面nonebot机器人安装要用到的
......
# 反向WS设置
- ws-reverse:
# 反向WS Universal 地址
# 注意 设置了此项地址后下面两项将会被忽略
universal: ws://127.0.0.1:53245/cqhttp/ws
# 反向WS API 地址
api: ws://127.0.0.1:53245/cqhttp/api
# 反向WS Event 地址
event: ws://127.0.0.1:53245/cqhttp/event
......
新建nonebot qq机器人项目
如果你已经按照推荐方式安装了 nb-cli
,使用它创建一个空项目:
nb create
根据引导进行项目配置,完成后会在当前目录下创建一个项目目录,项目目录内包含 bot.py
。
如果未安装 nb-cli
,使用你最熟悉的编辑器或 IDE,创建一个名为 bot.py
的文件,内容如下(这里以 onebot.v11适配器为例):
import nonebot
from nonebot.adapters.onebot.v11 import Adapter as ONEBOT_V11Adapter
nonebot.init()
app = nonebot.get_asgi()
driver = nonebot.get_driver()
driver.register_adapter(ONEBOT_V11Adapter)
nonebot.load_builtin_plugins("echo")
nonebot.load_from_toml("pyproject.toml")
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
文件端口,这里的53245
就是上面设置的cqhttp端口一致,第四行是超级管理员qq
DRIVER=~fastapi
HOST=127.0.0.1 # 配置 NoneBot 监听的 IP/主机名
PORT=53245 # 配置 NoneBot 监听的端口
DEBUG=true # 开启 debug 模式 **请勿在生产环境开启**
SUPERUSERS=["123456789", "987654321"] # 配置 NoneBot 超级用户
NICKNAME=["awesome", "bot"] # 配置机器人的昵称
COMMAND_START='["/"]' # 配置命令起始字符
在命令行使用如下命令即可运行这个 NoneBot 实例:
# nb-cli
nb run
# 其他
python3 bot.py
运行后会产生类似如下日志:
09-14 21:02:00 [INFO] nonebot | Succeeded to import "nonebot.plugins.base"
09-14 21:02:00 [INFO] nonebot | Running NoneBot...
09-14 21:02:00 [INFO] uvicorn | Started server process [1234]
09-14 21:02:00 [INFO] uvicorn | Waiting for application startup.
09-14 21:02:00 [INFO] uvicorn | Application startup complete.
09-14 21:02:00 [INFO] uvicorn | Uvicorn running on http://127.0.0.1:53245 (Press CTRL+C to quit)
至此,所有的配置都over了
我们来看一下最终效果:
声明:本博客为基础学习性质,想要更加深入了解请自行研究官方文档