? ? 考慮到第三方的機器人現在越來越難維持了,來搗鼓一下官方的機器人。雖然官方藏著掖著不肯開放很多功能,但起碼能用。官方機器人的優點是穩定,只要申請成功,且你自己不亂搞,基本不存在被封的可能,缺點是藤子對其嚴格到令人發指的管控,包括已經完全關閉主動發送消息功能只能被動回復消息,無法獲得用戶的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服務就能收到騰訊的消息推送了。然后就能進一步開發或配置業務邏輯了。