刷掘金热榜全是 OpenClaw 接 QQ Bot 的教程,看起来很香:扫码创建机器人、一键接入 AI、5 分钟搞定。
但我下载完 OpenClaw 一看——800MB 的客户端,Electron 套壳,内存 1.2G 起步。我就想让机器人在群里回答问题而已,有必要装这么重的东西?
于是我试了另一条路:QQ 官方 Python SDK + 任意大模型 API,30 行代码搞定一个能在 QQ 群里聊天的 AI 机器人。不用装任何桌面客户端,一个 Python 脚本跑在服务器上就行。
先说结论
| 方案 | 部署方式 | 资源占用 | 灵活性 | 上手难度 |
|---|---|---|---|---|
| OpenClaw + QQ | 桌面客户端 | 内存 1.2G+ | 开箱即用但定制难 | ⭐ |
| botpy + AI API | Python 脚本 | 内存 50MB | 想接什么模型接什么 | ⭐⭐ |
| go-cqhttp(非官方) | Docker/二进制 | 内存 30MB | 功能最全但有封号风险 | ⭐⭐⭐ |
我最终选了 botpy(QQ 官方 SDK),原因很简单:官方支持 = 不怕封号。
准备工作:3 分钟注册 QQ 机器人
腾讯上周刚开放了个人开发者注册(终于!),流程很快:
- 打开 QQ 开放平台,手机 QQ 扫码登录
- 点「创建机器人」,填个名字和简介
- 拿到
appid和token
一个 QQ 号最多创建 5 个机器人。注意:目前个人开发者只能在群聊里用,私聊功能还没开放。
核心代码:30 行搞定
先装依赖:
pip install qq-botpy openai
然后就是完整代码了:
# qq_ai_bot.py
import botpy
from botpy.message import GroupMessage
from openai import OpenAI
# AI 客户端 - 兼容 OpenAI 协议的都能用
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):
"""群里被 @ 时触发"""
user_msg = message.content.strip()
if not user_msg:
return
# 调大模型
resp = ai.chat.completions.create(
model="claude-sonnet-4-20250514", # 换成任意模型
messages=[
{"role": "system", "content": "你是一个 QQ 群里的 AI 助手,回复简洁有趣。"},
{"role": "user", "content": user_msg}
],
max_tokens=500
)
answer = resp.choices[0].message.content
# 回复消息
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 是群里 @机器人 时的回调,拿到用户消息 → 丢给大模型 → 回复。
进阶:加上多轮对话记忆
光能一问一答太无聊了,加个简单的上下文记忆:
from collections import defaultdict, deque
# 每个群维护最近 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 助手,回复简洁有趣,不超过 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) 自动滚动,内存占用几乎为零。如果你想更持久,换成 Redis 或 SQLite 都行,但对于群聊机器人来说,记住最近几轮就够了。
踩坑记录
坑 1:botpy 版本混乱
pip install botpy 装的不是官方版本!QQ 官方的包名是 qq-botpy:
# ❌ 错误
pip install botpy
# ✅ 正确
pip install qq-botpy
装错了会报一堆莫名其妙的 import 错误,我在这上面浪费了半小时。
坑 2:群聊需要额外申请
个人开发者创建完机器人后,默认只有频道权限。想在QQ 群里用,需要在开放平台后台额外勾选「群聊」场景,然后等审核(大概 1-2 小时)。
很多教程没提这一步,导致代码写好了机器人死活不响应。
坑 3:消息里的 @前缀 要处理
用户在群里 @机器人 发消息时,message.content 前面会带一个 @机器人名字 的前缀(注意有个空格)。如果不处理,这段文字会一起发给大模型,导致回复很奇怪。
# 清理 @ 前缀
user_msg = message.content.strip()
if user_msg.startswith(f"@{bot_name}"):
user_msg = user_msg[len(f"@{bot_name}"):].strip()
坑 4:回复有频率限制
QQ 机器人有频率限制:被动回复每分钟最多 5 条(个人开发者),超过会被静默丢弃,不报错。
解决方案:对于长回复,先截断到 500 字以内;对于高频群,加个 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 群聊场景比较特殊:消息短、要求响应快、上下文碎片化。我试了几个模型的体验:
| 模型 | 响应速度 | 群聊效果 | 适合场景 |
|---|---|---|---|
| GPT-4.1-mini | 0.8s | 回复质量高但偶尔太长 | 技术群 |
| Claude Sonnet | 1.2s | 语气自然,长度适中 | 通用群 |
| Gemini Flash | 0.5s | 最快,但中文偶尔拉胯 | 对速度要求高 |
| Qwen-Plus | 0.6s | 中文最好,回复接地气 | 中文闲聊群 |
我最后在代码里用的是 Claude Sonnet,因为群聊场景下它的回复长度和语气最合适。如果你更在意速度,Gemini Flash 是最快的。这些模型我都是通过一个聚合接口调的,改个 model 参数就切换了,不用管各家 API 的差异。
部署:丢到服务器上跑
本地测试没问题后,直接 nohup 挂后台就行:
nohup python3 qq_ai_bot.py > /tmp/qqbot.log 2>&1 &
想更稳定可以用 systemd 或 supervisor,但说实话对于个人用的小机器人,nohup 够了。
小结
全网都在装 OpenClaw 搞 QQ 机器人,但如果你只是想让机器人能聊天、能回答问题,完全没必要装一个 800MB 的桌面客户端。QQ 官方 SDK + 一个 AI API,30 行 Python 就够了。
当然 OpenClaw 的优势在于它的多 Agent 能力和可视化配置,如果你需要复杂的工作流编排,那确实比自己写代码方便。但对于「群里 @机器人问个问题」这种简单场景,轻量方案完全够用。
代码我放 GitHub 了,有问题评论区聊。