go-cqhttp 部署与简单编程
免责声明:本文仅供学习和交流,切勿用于违法行为。本文作者不对读者的不当使用负责。
在 之前的文章 中提到,我需要每天查询宿舍水电费余额。抓到小程序查余额的接口后,我打算把消息通知到宿舍 QQ 群中(微信群机器人操作太麻烦,或者说只有企业群才有机器人)。
本文简要介绍 go-cqhttp 部署与编程思路,并实现一个简单的单向数据传输的 Demo。
简述 QQ 机器人的曾经与未来
酷 Q 是一款制造 QQ 聊天机器人的软件,主要功能是获取 QQ 的聊天消息,然后通过各种插件达到各种不同的功能。
cqhttp 是 2017 年初出现的基于 CKYU(一个 QQ 机器人插件平台,应该就是酷 Q)的一款开源免费插件,它使用户能够通过 HTTP 或 WebSocket 对 CKYU 的事件进行上报以及接收请求来调用 CKYU 的 DLL 接口,从而可以使用其它语言(不方便编译到原生二进制的语言)编写 CKYU 插件。在 CQHTTP 活跃开发和维护期间,有非常多的开发者使用 Python、Java、Node.js 等 web 开发常用语言基于 CQHTTP 插件编写各式各样的聊天机器人。
2020 年晨风律师函事件发生,当年酷 Q 官网决定停运。
cqhttp 项目在 2020 年归档,作者自述原因为无力维护。
愿我们能在更开放的平行世界里相遇。——酷 Q 官网
在新的机器人平台 Mirai 开始发展、以及 CKYU 决定停运之后,为了让原来基于 CQHTTP 插件编写的机器人能够继续运行,一些开发者在其它机器人平台上编写了兼容 CQHTTP 接口的插件/模块。 go-cqhttp 是其中较为广泛使用的一个。
go-cqhttp 是使用 mirai 以及 Mirai 开发的 cqhttp golang 原生实现,并在 cqhttp 原版 的基础上做了部分修改和拓展。
但是以上均不是官方推出的机器人或接口。2020 年 4 月初,腾讯官方内测 Hoo!k 机器人,不久后下线。2023 年 7 月,腾讯 QQ Windows 全新 NT 架构 9.9.0 体验版已上架官网开放下载。
go-cqhttp 作者在 2023 年发布 声明,称由于 QQ 官方针对协议库的围追堵截,作者本人已无力维护项目。
协议库的时代已经过去,接下来是 Hook 官方客户端的时代。——go-cqhttp 项目维护者 Mrs4s
如今 2024 年 NTQQ 正式版诞生,官方正式推出「QQ 机器人」,称其可以直接打通「QQ 频道」「QQ 群」与个人。
思路
OneBot 是统一的聊天机器人应用接口标准,旨在统一不同聊天平台上的机器人应用开发接口,使开发者只需编写一次业务逻辑代码即可应用到多种机器人平台。go-cqhttp 支持该协议。2020 年诞生。
对于个人用户,官方的 QQ 机器人不能添加到群,故放弃此想法。go-cqhttp 虽停止维护,但是还能用,用这半个学期应该是可以的。我尝试了过使用基于 go-cqhttp 开发的 Python SDK(pycqBot),但不太好用。
使用 go-cqhttp 需要有一个小号,充当「机器人」。
项目离不开本地开发(我的电脑使用 Windows),定时任务离不开 Linux 服务器部署。
本地测试时信息流:
实际应用时的信息流:
本地测试开发
安装 go-cqhttp,它是一个可执行文件,直接下载下来就可以用。实测,不能使用账号密码登录,因此我们需要进行扫码登录。
刚刚下载好的 go-cqhttp 需要在命令行中执行一遍(不要鼠标双击)。通信方式选择 0。本地就会生成 config.yml
文件。
此时还不能扫码登录,会有出现以下报错:
错误:当前协议不支持二维码登录, 请配置账号密码登录。
这时,我们看到目录会生成 device.json
文件,点进去,把 "protocol":6
改成 "protocol":2
,就可以拿到二维码手机扫码登陆了。
接下来用机器人账号进行扫码即可。登录成功后,你可以先和大号建一个小群以供测试。
注意到本地会生成一个 session.token
的文件,请保留。
在浏览器或其它工具发送 GET 指令。(参考 onebot-11/api/public.md at master · botuniverse/onebot-11 (github.com))
1 | http://127.0.0.1:5700/send_group_msg?group_id=<QQ群群号>&message=hello_world |
群里收到机器人发送的 hello_world
即配置成功。
接下来写个 Python 脚本,用于查水电费,或者执行其它你想要的功能(比如使用 WebHook 推送)。这个脚本打算放在 Linux 服务器中运行。脚本实现:
- GET 请求获取水电费余额
- 计算余额是否不足
- 【可选】使用 hook 进行推送
- 发送消息至机器人
- 结束
1 | import json |
Linux 部署
安装 go-cqhttp,解压压缩包。同理,改一下协议并先运行一下。此时并不能扫码登录 QQ,因为 QQ 判定你的登录地和扫码地太远。这时候我们只需要把之前的 session.token
文件复制到当前目录即可。
运行 go-cqhttp。我们可以在本地浏览器等 HTTP 客户端进行测试:
1 | http://<服务器IP>:5700/send_group_msg?group_id=<QQ群群号>&message=hello_world |
云服务器安全组中记得把 5700 打开。
测试无误后把 python 文件复制过来,记得改一下正确的 QQ_PUSH_URL
,应改为 http://127.0.0.1:5700/send_group_msg
。
后台运行 go-cqhttp(参考 Linux 使用 nohup 后台运行程序):
1 | # 必须在go-cqhttp存在的目录运行指令 |
然后将运行 python 脚本的任务添加到 crontab 中实现定时启动(参考:Linux 使用 Cron 创建定时任务)
1 | 4 8 * * * /usr/bin/python /<your_dir>/your.py |
后续几个月的使用反馈:偶然出现消息没有成功发送出去的情况,所以不要过度依赖此机器人。
后记
如果想更方便更快捷实现更多丰富的功能(比如发图、群管理、群指令、游戏数据管理等),可以考虑使用各种语言的 SDK 进行进一步的开发:开始 | go-cqhttp 帮助中心
2024 年 7 月 27 日通过检查发现,从昨天(26 日)开始沈典巷的某公寓的水电费的接口升级了,似乎加入了认证机制,不能通过脚本查看具体水电费余额,手机上也不能查看其他宿舍的余额了。机器人倒是没挂。
第二天找到了通知原文:
关于「XX 通」水电小程序升级的通知
各公寓区住户您好:为尽量避免公寓住户在「XX 通」水电充值过程中的误充情况,现对「XX 通」水电充值程序优化升级。计划更新时间:2024 年 7 月 26 日 10 时。主要更新内容:
- 进入水电小程序后,系统将默认选择本人所登记房间;
- 非本人所登记房间余额将不显示,请注意区分;
- 如需向非本人房间充值,可以手动选择房间号后充值。
注意事项:如同学发现「XX 通」系统显示的房间号和本人入住房间有偏差,可至各公寓区一站式服务中心处理(如存在私下调宿情况,公寓区一站式服务中心不予处理)。
本文参考
- 我与酷Q的故事——纪念QQ机器人业黑暗的一天 - 哔哩哔哩 (bilibili.com)
- 酷Q停运后,其他机器人,该何去何从? - 知乎 (zhihu.com)
- 介绍 | OneBot
- 腾讯 QQ Windows 全新 NT 架构 9.9.0 体验版上架官网,升级后有哪些亮点? - 知乎 (zhihu.com)
- 【个人笔记】go-cqhttp+pycqBot配置-CSDN博客
- 初识Nonebot2-CSDN博客
- Linux 安装配置 go-cqhttp - 掘金 (juejin.cn)
- listen tcp :8080: bind: Only one usage of each socket address (protocol/network address/port) is nor-CSDN博客
- 解决Go-CQhttp无法登录(服务器如何登录)的问题_go-cqhttp登录失败-CSDN博客
- 使用python解析Json字符串-获取Json字符串关键字_python解析json获取key字段名-CSDN博客
- Python爬虫基础(3)——requests库get请求方法 - 知乎 (zhihu.com)