考虑到第三方的机器人现在越来越难维持了,来捣鼓一下官方的机器人。虽然官方藏着掖着不肯开放很多功能,但起码能用。官方机器人的优点是稳定,只要申请成功,且你自己不乱搞,基本不存在被封的可能,缺点是藤子对其严格到令人发指的管控,包括已经完全关闭主动发送消息功能只能被动回复消息,无法获得用户的QQ号、群的QQ号等等。
这里记录一下自己对接QQ官方机器人的过程。仅粗略记录准备工作和如何实现回调验证,不记录具体实现的业务逻辑。
1. 准备工作
1.1 QQ开放平台
登录QQ开放平台QQ 开放平台,这边登录时有一个管理员QQ的概念,也就是你登录平台时的QQ,就是你想要创建的机器人的管理员,建议大家用大号去登录,这个不会有什么影响。
登录上去以后申请机器人,选个人的就行,现在个人申请机器人也可以加QQ群(以前只有企业实名的机器人才能加进QQ群)。过程不复杂,这里简略。不需要验证太多东西,只是需要你的手机QQ扫二维码验证。
创建好机器人后,点击机器人,进入具体的设置,找到左边菜单的开发-沙箱配置,设置一个测试用的群,自己登录用的管理员QQ必须是这个群的群主或者管理员,人数必须小于20人。建议是自己创一个,符合条件的群可以在下拉菜单里面看到,选中这个群,然后根据说明文字,去QQ上,群里把机器人添加到群里。
1.2 准备服务器、域名等
需要的东西有:服务器、域名、证书、ICP备案。我个人习惯用阿里云,这些东西都可以在阿里云上搞定。
阿里云上对于个人用户最便宜的方案:
服务器:阿里云的2核2G3M轻量服务器(99套餐),99一年,比其他动不动就几百上千一个月的实惠
域名:阿里云上购买一个非.cn/.com/.net后缀的域名,自己看着买哪个便宜买哪个,最低几块钱一年
证书:阿里云控制台找“数字证书管理服务”,里面找“个人测试证书”,一个账户一年能免费购买一次,20张,每张是3个月有效期,到期再创建,个人用户足够用,相当于是免费
ICP备案:阿里云搜ICP备案 网站备案_ICP备案_备案迁移_App备案_小程序备案_备案-阿里云
按提示备案,需要一些个人的信息,网站用途什么的写测试就行,这个可以直接做,不需要先启动网站。通过很容易,只是需要几天时间。这个是必须的,否则外部在连接你的API时会出现connection reset(但阿里云服务器之间互相访问不会出现这个问题)
1.3 准备HTTP服务
准备一个用来和腾讯交互的HTTP服务。这个自行搞定。看我这个标题点进来的应该用的都是python,可以用flask,也可以用fastapi等。我自己是用了nginx代理,后端fastapi。代理时对外部必须要使用域名、https,端口只能是80、443、8080、8443的其中一个,阿里云申请的话证书文件可以从阿里云那边直接下载下来。
2. 配置对接
准备工作做好后就可以开始对接了,回到QQ机器人的管理后台,找到菜单“开发”-“回调配置”,先在下面勾选你要监听的事件(建议是全部选上),再在请求地址这里填你的HTTP服务监听地址。
输入完毕以后,鼠标点击文本框外面任意地方,会立即触发验证,你的HTTP服务会收到一条HTTP请求,大致HTTP结构是这样的:
POST /recmsg/qbot HTTP/1.0 # 这里是你监听地址的uri
Host: xxx.xxx.xxx # 这里是你填写的域名
X-Real-IP: 183.47.105.49 # 这是腾讯那边发起请求的真实IP地址,由于我用nginx代理,后端收到请求时出现这个字段,实际IP地址有很多
X-Forwarded-For: 183.47.105.49 # 这是腾讯那边发起请求的真实IP地址,由于我用nginx代理,后端收到请求时出现这个字段,实际IP地址有很多
X-Forwarded-Proto: https
Connection: close
Content-Length: 76
content-type: application/json
user-agent: QQBot-Callback
x-bot-appid: xxxxxxxxx # 这是你创建的QQ机器人的ID,没什么用
x-signature-ed25519: xxxxxxxxxxxxxxxxxxxxxxxxxxx # 一串超长的东西,这个是腾讯向你请求时,给你校验用的,这里可以先不管
x-signature-method: Ed25519 # 验证用的方法,不用管
x-signature-timestamp: 1750407202 # 请求时间戳,不用管{"d":{"plain_token":"xxxxxxxxxxxxxxxxxxxxxx","event_ts":"1750407202"},"op":13}
# 有用的主要是这一串东西,plain_token、event_ts取下来用于计算返回给腾讯的鉴权字符串
# op=13表示这个请求是用来验证回调的
此时由于后端还没有调好,页面上会弹出验证失败的红色提示框。
腾讯要求返回一个大致是这样的响应体才可以通过验证:
HTTP/1.1 200 OK
date: Fri, 20 Jun 2025 08:13:21 GMT
server: uvicorn # 我用的fastapi,所以server显示这个
content-length: 181
content-type: application/json
Connection: close{"plain_token":"xxxxxxxxxxxx","signature":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
# plain_token值和前面请求给你的值保持一致
# signature为计算出来以后得鉴权签名串
计算signature的代码段:
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
# 需要安装一下cryptography这个库secret = 'xxxxxxxxxxxxxxxxxx' # QQ机器人后台“开发”-“开发管理”里面的AppSecret
event_ts = '1750407202' # 验证请求body里面送给你的时间戳
plain_token = 'xxxxxxxxxxxxxxxxxxxxxx' # 验证请求body里面送给你的plain_tokenwhile len(secret) < 32: # 重复secret,直到长度为32,官方的示例里面有这段secret += secret # 实际没啥用,现在获取的secret都是32位
secret = secret[:32] # 也许是一开始设计的时候secret有可能不为32位,总之先放到这里b_secret = secret.encode('utf-8')
private_key = Ed25519PrivateKey.from_private_bytes(b_secret)signature = private_key.sign((event_ts + plain_token).encode('utf-8')).hex()
# 这里用到了event_ts和plain_token来计算signature的值
加密采用的是Ed25519方式,大致过程是根据给出的密钥生成一个private_key,然后用这个private_key结合请求内的信息生成一个signature,有兴趣自行研究。
把plain_token和计算出来的signature值填入响应里返回给腾讯。HTTP服务修改好之后重启,激活一下回调地址修改的文本框,再点击外面空白处,如果这时候没有跳出报错,那就是验证成功了,可以点击“确定配置”按钮保存。
现在在你的测试群@机器人并发送一些消息,你的HTTP服务就能收到腾讯的消息推送了。然后就能进一步开发或配置业务逻辑了。