Python代碼實現(xiàn)輕松編寫一個QQ AI機(jī)器人
最近刷熱榜全是 OpenClaw 接 QQ Bot 的教程,看起來很香:掃碼創(chuàng)建機(jī)器人、一鍵接入 AI、5 分鐘搞定。
但我下載完 OpenClaw 一看——800MB 的客戶端,Electron 套殼,內(nèi)存 1.2G 起步。我就想讓機(jī)器人在群里回答問題而已,有必要裝這么重的東西?
于是我試了另一條路:QQ 官方 Python SDK + 任意大模型 API,30 行代碼搞定一個能在 QQ 群里聊天的 AI 機(jī)器人。不用裝任何桌面客戶端,一個 Python 腳本跑在服務(wù)器上就行。
先說結(jié)論
| 方案 | 部署方式 | 資源占用 | 靈活性 | 上手難度 |
|---|---|---|---|---|
| OpenClaw + QQ | 桌面客戶端 | 內(nèi)存 1.2G+ | 開箱即用但定制難 | ? |
| botpy + AI API | Python 腳本 | 內(nèi)存 50MB | 想接什么模型接什么 | ?? |
| go-cqhttp(非官方) | Docker/二進(jìn)制 | 內(nèi)存 30MB | 功能最全但有封號風(fēng)險 | ??? |
我最終選了 botpy(QQ 官方 SDK),原因很簡單:官方支持 = 不怕封號。
準(zhǔn)備工作:3 分鐘注冊 QQ 機(jī)器人
騰訊上周剛開放了個人開發(fā)者注冊(終于!),流程很快:
- 打開 QQ 開放平臺,手機(jī) QQ 掃碼登錄
- 點「創(chuàng)建機(jī)器人」,填個名字和簡介
- 拿到
appid和token
一個 QQ 號最多創(chuàng)建 5 個機(jī)器人。注意:目前個人開發(fā)者只能在群聊里用,私聊功能還沒開放。
核心代碼:30 行搞定
先裝依賴:
pip install qq-botpy openai
然后就是完整代碼了:
# qq_ai_bot.py
import botpy
from botpy.message import GroupMessage
from openai import OpenAI
# AI 客戶端 - 兼容 OpenAI 協(xié)議的都能用
ai = OpenAI(
api_key="your-api-key",
base_url="https://api.ofox.ai/v1" # 我用的聚合接口,Claude/GPT/Gemini 隨便切
)
class MyBot(botpy.Client):
async def on_group_at_message_create(self, message: GroupMessage):
"""群里被 @ 時觸發(fā)"""
user_msg = message.content.strip()
if not user_msg:
return
# 調(diào)大模型
resp = ai.chat.completions.create(
model="claude-sonnet-4-20250514", # 換成任意模型
messages=[
{"role": "system", "content": "你是一個 QQ 群里的 AI 助手,回復(fù)簡潔有趣。"},
{"role": "user", "content": user_msg}
],
max_tokens=500
)
answer = resp.choices[0].message.content
# 回復(fù)消息
await message.reply(content=answer)
intents = botpy.Intents(public_messages=True)
client = MyBot(intents=intents)
client.run(appid="your-appid", secret="your-secret")
沒錯,就這么多。on_group_at_message_create 是群里 @機(jī)器人 時的回調(diào),拿到用戶消息 → 丟給大模型 → 回復(fù)。
進(jìn)階:加上多輪對話記憶
光能一問一答太無聊了,加個簡單的上下文記憶:
from collections import defaultdict, deque
# 每個群維護(hù)最近 10 輪對話
chat_history = defaultdict(lambda: deque(maxlen=20))
class MyBot(botpy.Client):
async def on_group_at_message_create(self, message: GroupMessage):
user_msg = message.content.strip()
if not user_msg:
return
group_id = message.group_openid
history = chat_history[group_id]
history.append({"role": "user", "content": user_msg})
messages = [
{"role": "system", "content": "你是 QQ 群里的 AI 助手,回復(fù)簡潔有趣,不超過 200 字。"}
] + list(history)
resp = ai.chat.completions.create(
model="claude-sonnet-4-20250514",
messages=messages,
max_tokens=500
)
answer = resp.choices[0].message.content
history.append({"role": "assistant", "content": answer})
await message.reply(content=answer)
用 deque(maxlen=20) 自動滾動,內(nèi)存占用幾乎為零。如果你想更持久,換成 Redis 或 SQLite 都行,但對于群聊機(jī)器人來說,記住最近幾輪就夠了。
踩坑記錄
坑 1:botpy 版本混亂
pip install botpy 裝的不是官方版本!QQ 官方的包名是 qq-botpy:
# ? 錯誤 pip install botpy # ? 正確 pip install qq-botpy
裝錯了會報一堆莫名其妙的 import 錯誤,我在這上面浪費(fèi)了半小時。
坑 2:群聊需要額外申請
個人開發(fā)者創(chuàng)建完機(jī)器人后,默認(rèn)只有頻道權(quán)限。想在QQ 群里用,需要在開放平臺后臺額外勾選「群聊」場景,然后等審核(大概 1-2 小時)。
很多教程沒提這一步,導(dǎo)致代碼寫好了機(jī)器人死活不響應(yīng)。
坑 3:消息里的 @前綴 要處理
用戶在群里 @機(jī)器人 發(fā)消息時,message.content 前面會帶一個 @機(jī)器人名字 的前綴(注意有個空格)。如果不處理,這段文字會一起發(fā)給大模型,導(dǎo)致回復(fù)很奇怪。
# 清理 @ 前綴
user_msg = message.content.strip()
if user_msg.startswith(f"@{bot_name}"):
user_msg = user_msg[len(f"@{bot_name}"):].strip()
坑 4:回復(fù)有頻率限制
QQ 機(jī)器人有頻率限制:被動回復(fù)每分鐘最多 5 條(個人開發(fā)者),超過會被靜默丟棄,不報錯。
解決方案:對于長回復(fù),先截斷到 500 字以內(nèi);對于高頻群,加個 cooldown:
import time
last_reply = {}
async def on_group_at_message_create(self, message: GroupMessage):
group_id = message.group_openid
now = time.time()
if now - last_reply.get(group_id, 0) < 12: # 12秒冷卻
return
last_reply[group_id] = now
# ... 正常處理
模型怎么選
QQ 群聊場景比較特殊:消息短、要求響應(yīng)快、上下文碎片化。我試了幾個模型的體驗:
| 模型 | 響應(yīng)速度 | 群聊效果 | 適合場景 |
|---|---|---|---|
| GPT-4.1-mini | 0.8s | 回復(fù)質(zhì)量高但偶爾太長 | 技術(shù)群 |
| Claude Sonnet | 1.2s | 語氣自然,長度適中 | 通用群 |
| Gemini Flash | 0.5s | 最快,但中文偶爾拉胯 | 對速度要求高 |
| Qwen-Plus | 0.6s | 中文最好,回復(fù)接地氣 | 中文閑聊群 |
我最后在代碼里用的是 Claude Sonnet,因為群聊場景下它的回復(fù)長度和語氣最合適。如果你更在意速度,Gemini Flash 是最快的。這些模型我都是通過一個聚合接口調(diào)的,改個 model 參數(shù)就切換了,不用管各家 API 的差異。
部署:丟到服務(wù)器上跑
本地測試沒問題后,直接 nohup 掛后臺就行:
想更穩(wěn)定可以用 systemd 或 supervisor,但說實話對于個人用的小機(jī)器人,nohup 夠了。
小結(jié)
全網(wǎng)都在裝 OpenClaw 搞 QQ 機(jī)器人,但如果你只是想讓機(jī)器人能聊天、能回答問題,完全沒必要裝一個 800MB 的桌面客戶端。QQ 官方 SDK + 一個 AI API,30 行 Python 就夠了。
當(dāng)然 OpenClaw 的優(yōu)勢在于它的多 Agent 能力和可視化配置,如果你需要復(fù)雜的工作流編排,那確實比自己寫代碼方便。但對于「群里 @機(jī)器人問個問題」這種簡單場景,輕量方案完全夠用。
到此這篇關(guān)于Python代碼實現(xiàn)輕松編寫一個QQ AI機(jī)器人的文章就介紹到這了,更多相關(guān)Python QQ機(jī)器人內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Pandas dataframe數(shù)據(jù)處理方法的速度比較
這篇文章主要介紹了淺談Pandas dataframe數(shù)據(jù)處理方法的速度比較,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
Python使用正則表達(dá)式過濾或替換HTML標(biāo)簽的方法詳解
這篇文章主要介紹了Python使用正則表達(dá)式過濾或替換HTML標(biāo)簽的方法,簡單介紹了Python正則相關(guān)語法并結(jié)合具體實例形式分析了Python基于正則表達(dá)式的HTML標(biāo)簽過濾與替換相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
Python實現(xiàn)Mysql全量數(shù)據(jù)同步的腳本分享
這篇文章主要為大家詳細(xì)介紹了基于Python如何實現(xiàn)Mysql全量數(shù)據(jù)同步的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06

