NoneBot2,基于Python的聊天机器人
- 第一步,配置python
- 第二步,配置[go-cqhttp](https://github.com/Mrs4s/go-cqhttp)
- 第三步,配置[NoneBot](https://61d3d9dbcadf413fd3238e89--nonebot2.netlify.app/)
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机器人,需要进行如下几步:
- 要搭建一个安装 Python 是作为 nonebot 运行的基础环境;
- 配置 go-cqhttp 是为了实现与 QQ 服务器的通信,并提供 QQ 机器人的服务;
- 配置 nonebot 是将 go-cqhttp 和 Python 代码连接起来,实现具体的 QQ 机器人功能。
下面将直接用云服务器进行部署,毕竟如果你要开个机器人肯定是24小时一直服务,因此,这里以腾讯云的Centos为例部署。
第一步,配置python
首先你得先按照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.9wget 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-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/
第三步,配置NoneBot
直接进入正题,根据以下步骤进行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端口一致,第四行是超级管理员qqDRIVER=~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了
我们来看一下最终效果:
声明:本博客为基础学习性质,想要更加深入了解请自行研究官方文档