前言
自己拼了一台黑群晖,性能过剩,于是打算在上面跑点其他服务。记录并分享部署的过程以及遇到的问题
本项目是依托于群晖中的docker环境来安装部署各项服务,也可直接在linux环境中使用。关于如何自建群晖服务器以及安装docker服务,网上已有很多教程,本文不再详细介绍。
本项目的前端为NoneBot2,后端为go-cqhttp,同时还介绍了go-cqhttp需要用到的签名服务器qsign的搭建。
NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。
go-cqhttp是使用 mirai 以及 MiraiGo 开发的 cqhttp golang 原生实现, 并在 cqhttp 原版open in new window 的基础上做了部分修改和拓展。作为CQHTTP(CoolQ HTTP API)项目的继任者和进化版,go-cqhttp继承了CQHTTP的核心理念,即通过HTTP接口提供与QQ服务器交互的能力,同时引入了诸多优化和增强功能,为开发者提供了一个更轻量、更高效、更稳定的QQ机器人开发平台。
一、前期准备
首先当然是需要一个QQ账号,建议申请一个小号,而不是用自己的大号,因为在当前环境下QQ机器人账号非常容易被风控以至封号,因此不要用自己的大号冒险
根据官方文档,部署在Docker的go-cqhttp不适宜用交互式界面生成配置文件,因此需要事先准备好你的配置文件,否则容器将无法运行。
需要准备的文件为config.yml和device.json。其中 config.yml 为运行配置;device.json 为虚拟设备信息。这里建议先在Windows系统中安装cqhttp并运行一次以生成这两个配置文件。
Windows版本下载以及安装教程请参考官方文档
安装并运行一次后,将会在你的项目根目录下生成config.yml和device.json,可以将这两个文件备份出来。
提前下载软件:PuTTY或Xshell,建议下载notepad++以便编辑配置文件
二、安装NoneBot
1.1、使用群晖docker套件拉取镜像
打开群晖docker套件,选择注册表,搜索nonebot并拉到最下面,选择nonebot/nb-cli,右键-下载此映像。
由于国内网络限制,可能出现无法下载的情况,此时可以尝试使用代理或者用下面的方法下载。
1.2、使用SSH远程登录方式拉取镜像
在同个局域网环境下的计算机安装PuTTY或Xshell,远程登录群晖系统,此时可以使用Linux一般命令进行拉取
依次执行以下命令
#获取root权限 需要输入管理员密码
sudo su
#查询可以拉取的docker镜像
docker search nonebot
#拉取镜像
docker pull nonebot/nb-cli
下载成功后,可以在群晖docker套件的映像中看到刚刚下载的nonebot/nb-cli容器
2、运行容器
选择nonebot容器,点击启动
网络选择默认的bridge,如果不想在默认网络下后续也可以迁移
常规设置可以默认,也可以根据自己的情况设置资源限制
端口设置-新增,默认的端口为8080,后续可以在配置文件中修改,这里就将本地端口和容器端口都设置为默认的8080
存储空间设置-添加文件夹,选择群晖上的某个文件夹,建议先为docker单独新建一个文件夹方便管理。这里选择/docker/nonebot//workspaces,装载路径为/workspaces
最后检查以上配置是否有问题,如果没有问题,勾选“向导完成后运行此容器”并点击完成。
3、新建nonebot项目
双击刚刚新建的容器,选择终端机,此时可以看到出现选项,使用方向键上下选择“Create a NoneBot project.”,回车确认
然后选择“simple(for plugin developer)”,使用空格键确认,回车下一步
输入项目名称,接着选择默认的“FastAPI(Fast驱动器)”,直接回车下一步
最后选择“OneBot V11(OneBot V11协议)”,同样使用空格键确认,回车下一步,任意选择一个文件夹,弹出的提示全部输入Y,回车
然后就可以等待项目自动安装了
安装完成后提示是否预装插件,这里可以选择echo,同样空格键选中,回车确认
此时容器将自动停止。手动重启容器,并在终端机选择新增,创建新的命令界面,依次运行以下命令
#进入刚刚创建的项目路径
cd BOT_QQ
#运行机器人
nb run --reload
看到如下图所示则说明容器启动成功了
4、配置文件
接下来需要设置下项目自动生成的配置文件
NoneBot 在启动时将会从系统环境变量或者 .env 文件中寻找变量 ENVIRONMENT (大小写不敏感),默认值为 prod。
这将引导 NoneBot 从系统环境变量或者 .env.{ENVIRONMENT} 文件中进一步加载具体配置。
.env 文件是基础环境配置文件,该文件中的配置项在不同环境下都会被加载,但会被 .env.{ENVIRONMENT} 文件中的配置所覆盖。
将容器映射目录下的.env、.env.dev文件下载到本地
首先右键.env选择用notepad++打开,添加下面几项
ENVIRONMENT=dev
COMMON_CONFIG=common config # 这个配置项在任何环境中都会被加载
NICKNAME=["BOT_NAME","bot"] # 这个配置项设定了机器人的称呼,有些插件中会调用该参数
接着设置env.dev文件配置
LOG_LEVEL=DEBUG # NoneBot 日志输出等级。
HOST=172.18.0.2 # 当 NoneBot 作为服务端时,监听的 IP / 主机名。注意这里需要填写真实容器IP而不是127.0.0.1。
PORT=8080 # 当 NoneBot 作为服务端时,监听的端口,默认为8080。
env.pord配置信息较多,这里可以暂时先不配置,有兴趣可以参考官网文档 配置|nonebot
配置好后上传这两个文件,nonebot就可以使用了
三、安装go-cqhttp
1、拉取镜像
由于在群晖docker默认的镜像站中没有找到官方版本,或者说不确定哪个才是官方纯净版本,因此这里只使用官网提供的命令进行拉取
通过SSH远程登录群晖系统,执行命令
docker pull ghcr.io/mrs4s/go-cqhttp:master
下载完成后就可以看到映像选项中多出名为mrs4s/go-cqhttp:master的镜像了
2、修改配置文件
在运行容器之前还需要修改下前期准备中生成的config.yml和device.json配置文件
在Windows系统中右键config.yml,选择notepad++打开(也可以使用VS Code等其他编译软件)
修改账号相关配置,此处密码留空则以扫码方式登录
然后修改连接服务列表,这里选择以反向WS的方式连接nonebot,则只需要在universal:项中设置第二章安装的容器地址即可,格式为 ws://docker_ip:port/onebot/v11/ws,如下图所示
如何确定容器的IP是多少呢?可以在SSH中运行以下命令
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker名称
另外还有签名服务器地址需要修改,在第四章安装签名服务器再详细介绍
接下来配置device.json,同样以notepad++打开,找到"protocol",将值改为2,意思为使用Android Watch协议进行登录
配置完以上两项,在群晖共享文件夹中新建一个项目文件夹,这里选择/docker/目录下创建 cqhttp/data/,将config.yml和device.json放进去,就可以准备启动容器了。
3、启动容器
官方文档中有使用纯命令行启动的教程,详见go-cqhttp帮助中心-使用docker,这里只介绍通过可视化界面启动
首先选择下载好的容器,点击启动,来到网络配置界面,这里选择与nonebot容器放在同一个网络下。
常规设置全部默认,本项目没有需要反向访问容器的端口,因此端口设置可以跳过,也可以将容器8080端口映射到本地任意未使用端口
在存储空间设置中,添加上一步中创建的/docker/cqhttp/data/,装载路径为/data
最后检查确认无误,勾选“向导完成后运行此容器”并点击完成即可运行。
打开cqhttp容器的终端机界面,此时会弹出二维码,可以用手机QQ进行扫码登录(注意,手机和群晖需要在同一网络下,通常只要连上家里的WIFI操作即可)
这里二维码显示不全,可以在启动前将容器界面放大到全屏,或者使用SSH远程登录的方式,运行命令输出容器内的日志(cqhttp为启动容器时设置的名字,根据实际情况替换)
docker container logs cqhttp
通过手机扫码登录后,终端输出结果如下则说明机器人已经成功运行起来,并且成功连接到nonebot服务器了
此时对机器人发送命令“echo hello world”,机器人会自动打印回复“hello world”。到这里QQ机器人的基础服务就搭建完成了。
不过此时终端机可能会输出警告:签名服务器不可用
如果不配置签名服务器,则有可能导致机器人账号被封。因此接下来我们继续来搭建签名服务器
四、安装签名服务器
参考这篇文章docker安装、调试qsign签名服务器,这里直接用命令拉取
docker run -d --restart=always --name qsign -p 8080:8080 -e ANDROID_ID=xxxxxxx xzhouqd/qsign:8.9.63
可以使用文章的方式一键运行,也可以使用可视化界面启动,这里只介绍可视化界面方式启动
网络设置依旧选择和前面两个容器一样的网络
在常规设置点击高级设置-环境,可以看到预置的ANDROID_ID为空,这里需要从保存虚拟设备信息的配置文件device.json中获取
来到端口设置,如果你将三个容器都放在了同个网络下,那么这一步可以跳过,同网络下的容器间可以直接互相访问。
假设你希望容器处于不同网络下,或者你的cqhttp运行在其他环境里,需要外部访问,则需要将容器的8080端口映射出来,注意不要和前面nonebot映射的端口冲突了
接下来就全部默认,完成自动启动即可。
启动后,可以在SSH远程命令行中执行
curl http://sgin_docker_ip:8080
看到返回结果为IAA则签名服务器在正常运行
确认你的qsign容器IP地址,打开config.yml,在sign-servers:url处填写http://IP+端口
然后就可以重新上传config.yml,重新启动cqhttp,这时候你的机器人就可以正常使用了。
五、其他
1、安装插件
现在你的机器人还只有最基础的echo输出能力,如何给机器人添加丰富多彩的功能呢?可以访问插件商店|nonebot 添加你想要的功能
这里以 网易云无损音乐下载 插件举例
在nonebot容器的终端机新建一个bash,按CTRL+A 进入前缀模式以进行复制和粘贴,复制nb 开头的这条命令到命令行中运行,等待下载完成。
注意,这里可能会出现报错,提示容器的httpx组件版本过高,需要使用低于0.24.0,又高于等于0.23.3的版本
这里我们就直接降级,执行下面命令
pip install 'httpx>=0.23.3,<0.24.1'
执行完成后,再重新执行nb安装命令,就可以顺利安装成功了
然后根据官方文档,还需要设置配置文件
打开.env文件,将配置项全部复制上去并填好参数,重启nonebot容器,此时插件就可以使用了
2、关于风控
当你将机器人拉进一个群,有时候会突然出现机器人不再响应命令的情况,此时查看cqhttp容器的日志,会出现一个警告:发送消息失败:账号可能被风控。
目前尝试过网上许多方法,如删除session.token、修改登录协议、去除device.json中mirai字样等,都没有什么效果,最终只能等待风控自动解除。
目前由于官方不再更新协议库,只能使用protocol=2,即Android watch 登录,使用其他协议登录都会提示当前版本太低无法登录,所以需要做好准备随时迁移机器人。
总结
以上就是如何在群晖docker中搭建QQ机器人的详细教程。虽然现在机器人使用起来并不稳定,群聊容易被风控,但私聊不受影响,还是值得搭建一个来玩玩的,也算是有效利用多余的设备性能。希望这篇教程对你有所帮助