Featured image of post 使用NoneBot2和go-cqhttp打造自己的FF14 QQ机器人

使用NoneBot2和go-cqhttp打造自己的FF14 QQ机器人

因为近期沉迷《最终幻想14》,于是我又有了搭建QQ机器人的想法,好在go-cqhttp和NoneBot的出现为我们带来了极大的便利并大幅度降低硬件门槛,阅读这篇文章,狒狒也能领养一只属于自己的QQ机器人。

两年多之前,CoolQ还没死掉的时候,我就注册了小号开了个基于CoolQ的机器人。当时CoolQ本身要使用Windows,即便有基于Wine的各种Docker容器可供使用,但对于性能较差的小鸡来讲还是负担不小,凑巧当时我还有精力拿Windows Server做Seedbox刷PT,就让自己的Hetzner独立服务器兼职做了QQ机器人。但不巧的是几个月后CoolQ就被腾讯干掉了,我群里的QQ机器人就此停摆。

最近几个月我一直沉迷《最终幻想14》,也是这段时间才后知后觉发现其实很多群里都已经有自己的QQ机器人,且现在常用的机器人框架如NoneBot、QQ支持库如go-cqhttp对性能的要求已经比先前低了很多,看起来在小鸡上运行不会有什么问题。于是我就给我所在的部队,利用闲置的甲骨文免费机器(相信各位应该都知道甲骨文给的x86架构的免费机器的性能大概是什么样的),重新做一下QQ机器人。

大致思路

前面已经说了,我想恢复QQ机器人的主要目的就是把它作为一个集成了FF14相关工具和其他一些娱乐功能的Bot,前者有一个比较成熟的框架叫做獭獭Bot(OtterBot),有现成的”獭窝“可以直接使用go-cqhttp接入;后者则需要使用NoneBot配合对应的插件自行搭建、缝合。

而将上述的机器人”大脑“连接起来并登录QQ进行发信的工具则是go-cqhttp,类似于当初CoolQ本体,而其他功能则类比CoolQ的插件。

本文中我们将先使用go-cqhttp接入QQ和獭獭Bot,完成后再使用NoneBot给自己的QQ机器人加一些娱乐功能。

使用go-cqhttp登录QQ并接入獭獭Bot

当前最适合低配置VPS的QQ运行库非go-cqhttp莫属,且安装简单,在其Github Release页面中下载对应的发行版和架构的安装包安装即可。我的VPS运行的是Ubuntu 20.04 x64,故下载AMD64的deb包,使用 dpkg -i 命令安装即可。

接入獭獭Bot

由于一些人恶意对獭窝DDoS攻击,故最近无法领养和使用獭窝。

因为我做这个QQ机器人主要原因就是使用FF14相关工具,所以我会接入獭獭Bot,直接按照 教程 进行领养即可,由于该教程使用的是Windows,所以在”正式领养“的Step2后,客户端选择go-cqhttp下载对应的配置文件,并在自己的电脑上根据自己的实际情况修改该文件。由于我们除了獭獭Bot之外还要接入自己的NoneBot,所以我们还要在该文件的最后面添加:

1
2
3
4
5
6
7
8
  - ws-reverse:
      disabled: false
      universal: ws://127.0.0.1:8080/onebot/v11/ws/
      api: ws://127.0.0.1:8080/onebot/v11/api/
      event: wa://127.0.0.1:8080/onebot/v11/event
      reconnect-interval: 3000
      middlewares:
      		*default # 引用默认中间件

完成后,在该文件夹内使用命令 go-cqhttp 运行一下看是否能成功登录QQ(此时会出现 ws://127.0.0.1:8080 无法连接的报错,这是因为我们现在还没有部署自己的NoneBot机器人,所以可以忽视)。

检查是否有风控问题

腾讯有一些奇奇怪怪的风控机制,被风控的账号无法在群里发消息(私聊不会有问题),这时我们把机器人放到群里,使用任意命令看其是否能回应,如果不能,则有可能是被风控(此时终端内的log也会提示),如果有该问题,可以考虑编辑go-cqhttp运行目录下刚刚生成的 device.json ,并修改内容(使用一些Android手机信息生成器生成手机IEMI等信息,让它看起来更真实),同时删除 session.token 并重新启动go-cqhttp。如果还不行建议在go-cqhttp的 Github Issues 里面寻找答案。

如果没有问题的话,这时候我们可以暂时退出go-cqhttp,写一个简单的systemd守护进程,再开始部署NoneBot缝合想要的娱乐功能。

守护进程(Systemd)

编辑service文件 /lib/systemd/system/go-cqhttp.service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Unit]
Description=GO-CQHTTP
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory= GO-CQHTTP的运行目录
ExecStart= nohup go-cqhttp
KillMode=process

[Install]
WantedBy=multi-user.target

如果你不知道怎么使用systemd的话,可以参考下列命令:

1
2
3
4
5
systemctl status go-cqhttp #查看状态
systemctl enable go-cqhttp #启用开机自启
systemctl restart go-cqhttp #重启进程
systemctl stop go-cqhttp #停止进程
systemctl start go-cqhttp #开始进程

使用NoneBot搭建并部署机器人

我的VPS环境是Ubuntu 20.04,apt安装的Python为3.8,NoneBot要求至少使用Python 3.7.3 以上版本

NoneBot是基于Python的可兼容多个聊天工具平台的机器人框架,而且使用非常简单,在有Python3的环境下使用pip安装即可,详细安装过程直接参考 官方文档 即可。需要一提的是,在Bot的目录内使用脚手架(即nb-cli)安装插件时,程序可以自动编辑Bot配置文件把插件加载到其中,无需手动修改配置文件,故为了方便,第三方插件可以等到创建好Bot后再安装。

配置

由于我们在这里只将Bot作为QQ机器人使用,所以只需要安装OneBot这一个适配器即可,安装命令为 nb adapter install nonebot-adapter-onebot

安装好后找好准备存放Bot文件的目录(脚手架会帮你创建Bot文件夹),可以使用 nb create 开始创建Bot,具体流程可以查看 官方文档 ,在这里就不再赘述。因为我们是作为QQ机器人使用所以要在”适配器(Adapters)“的选择中选择OneBot。

创建完成后不要忘记编辑 .env.env.* (默认是 .env.dev)以配置机器人框架,查看 以进行配置。

安装插件

到这里一个NoneBot的机器人框架就搭建好了,接下来可以按照自己的喜好安装插件,可以直接访问 官方商店 查看插件目录,挑选好自己喜欢的插件,直接点击”复制安装命令“,复制到终端内安装即可,非常方便(务必不要忘记查看对应插件的说明,获取详细配置信息)。

我自己的NoneBot机器人使用了以下几个插件,可以直接在NoneBot商店找到,直接使用脚手架安装,且配置都非常简单(大部分都不需要配置,开箱即用)。

1
2
3
4
5
6
7
ELF_RSS2 - 订阅RSS并发送到群里(配合RSSHub效果拔群,用来推送FF14新闻)
nonebot_plugin_epicfree - Epic白嫖喜加一,可选定期推送
nonebot_plugin_analysis_bilibili - 自动解析Bilibili小程序并转换为普通链接
nonebot_plugin_setu_now - 随机色图(使用Lolicon API)
nonebot_plugin_word_bank2 - 无数据库的问答插件
nonebot_plugin_what2eat - 今天吃什么
splatoon2_tools - Splatoon2相关查询(涂地、打工、排位查询)

此外,由于我是因为FF14兴起才打算恢复QQ机器人的,所以必然少不了FF14相关的插件,我目前给自己的Bot加了2个FF14相关组件:FF14占卜插件(onebot_Astrologian_FFXIV)和獭獭Bot,后者为独立的机器人框架且可以直接接入”獭窝“直接使用。

FF14占卜插件是没有加入NoneBot插件商店的,所以需要把该插件的源码下载到自己Bot目录下的 /[Bot名称或src]/plugins/ 目录内,因为Bot默认会加载该目录下的插件所以无需再改配置文件,最后安装依赖 pip install pydantic 即可使用。

运行

插件配好后可以开始试运行了,在Bot目录下使用命令 nb run 即可,同时别忘了运行go-cqhttp(使用systemd或者新开一个终端窗口运行),运行没问题后记得试用自己插件的命令,查看是否有问题,如果有报错,则根据报错内容到对应插件的Github仓库寻找答案。

至此,NoneBot机器人就缝合好了,同样也写一个简单的Systemd守护进程方便后台运行。

编辑service文件 /lib/systemd/system/nonebot.service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[Unit]
Description=NONEBOT SERVICE
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=root
WorkingDirectory= NONEBOT的运行目录
ExecStart= nohup nb run
KillMode=process

[Install]
WantedBy=multi-user.target

如果你不知道怎么使用systemd的话,可以参考下列命令:

1
2
3
4
5
systemctl status nonebot #查看状态
systemctl enable nonebot #启用开机自启
systemctl restart nonebot #重启进程
systemctl stop nonebot #停止进程
systemctl start nonebot #开始进程

总结

至此,我们的基于獭獭Bot、NoneBot并使用go-cqhttp整合的QQ机器人就算是完工了,我把它放进了自己的亲友群和FF14的部队群里,尤其是色图推送和占卜插件,群友们用了都说好(乐。

顺便贴一张我和我女朋友在海都的合照(((

comments powered by Disqus