免责声明:本文仅供学习和交流,切勿用于违法行为。本文作者不对读者的不当使用负责。

之前的文章 中提到,我需要每天查询宿舍水电费余额。抓到小程序查余额的接口后,我打算把消息通知到宿舍 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 服务器部署。

本地测试时信息流:

image.png

实际应用时的信息流:

image.png

本地测试开发

安装 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
2
http://127.0.0.1:5700/send_group_msg?group_id=<QQ群群号>&message=hello_world
# 5700 是 go-cqhttp 开放的端口

群里收到机器人发送的 hello_world 即配置成功。

接下来写个 Python 脚本,用于查水电费,或者执行其它你想要的功能(比如使用 WebHook 推送)。这个脚本打算放在 Linux 服务器中运行。脚本实现:

  1. GET 请求获取水电费余额
  2. 计算余额是否不足
  3. 【可选】使用 hook 进行推送
  4. 发送消息至机器人
  5. 结束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import json  
import requests

QQ_GROUP_NUMBER = 123456 # QQ群号
QQ_PUSH_URL = 'http://xxxx:5700/send_group_msg'

def send_message_qq(msg):
pyload = {
"group_id": QQ_GROUP_NUMBER,
"message": msg
}
headers = {
"Content-Type": "application/json; charset=UTF-8"
}
requests.post(QQ_PUSH_URL, data=json.dumps(pyload), headers=headers)

def main():
# 编写自己的逻辑 比如获取水电费
send_message_qq(msg) # Q群提示

if __name__ == '__main__':
main()

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
2
# 必须在go-cqhttp存在的目录运行指令
nohup /<your_dir>/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 时。主要更新内容:

  1. 进入水电小程序后,系统将默认选择本人所登记房间;
  2. 非本人所登记房间余额将不显示,请注意区分;
  3. 如需向非本人房间充值,可以手动选择房间号后充值。

注意事项:如同学发现「XX 通」系统显示的房间号和本人入住房间有偏差,可至各公寓区一站式服务中心处理(如存在私下调宿情况,公寓区一站式服务中心不予处理)。

本文参考