我们将使用目前最主流、最易用的 go-cqhttp 作为 QQ 协议接口,因为它稳定、功能强大,且拥有丰富的 Python SDK 支持。

(图片来源网络,侵删)
核心概念
- QQ 机器人: 我们不能直接用 Python 连接 QQ 服务器(官方不开放且会封号),所以需要一个“中间人”程序,它通过反向协议(如 HTTP)与我们的 Python 脚本通信,这个“中间人”
go-cqhttp。 - go-cqhttp: 一个基于 CQHTTP 协议的 QQ 机器人框架,它模拟登录你的 QQ 号,然后提供一个 HTTP 或 WebSocket 接口,供你的 Python 脚本发送和接收消息。
- 图灵机器人: 一个第三方智能对话平台,你只需要将用户发送的消息内容,通过 API 请求发送给图灵的服务器,它会返回一个预设的智能回复,你的 Python 机器人再把这个回复转发回 QQ 群或私聊。
工作流程图:
[QQ用户] --(发送消息)--> [QQ客户端] --(通过协议)--> [go-cqhttp] --(HTTP POST)--> [你的Python脚本]
|
| (1. 获取消息内容)
V
[调用图灵API]
|
| (2. 发送消息内容,获取回复)
V
[图灵服务器]
|
| (3. 返回智能回复)
V
[你的Python脚本] --(4. 构造回复消息)--> [go-cqhttp] --(通过协议)--> [QQ客户端] --(显示回复)--> [QQ用户]
第一步:环境准备
-
安装 Python: 确保你的电脑上安装了 Python (建议 3.7+)。
-
安装 go-cqhttp:
- 访问 go-cqhttp 的 Releases 页面。
- 下载对应你操作系统的版本(Windows 用户下载
go-cqhttp-windows-amd64.zip)。 - 解压到一个固定目录,
D:\go-cqhttp。 - 首次运行: 双击
go-cqhttp.exe,它会自动生成一个config.yml配置文件,并尝试扫码登录,请使用你的手机 QQ 扫描屏幕上的二维码进行登录。 - 登录成功后: 再次运行
go-cqhttp.exe,它会最小化到系统托盘,并开始监听消息,现在你的 QQ 号已经变成了一个机器人,等待接收指令。
-
安装 Python 库: 打开你的终端或命令提示符,运行以下命令安装必要的库。
(图片来源网络,侵删)httpx: 一个现代、快速的 HTTP 客户端,用于与 go-cqhttp 和图灵 API 通信。pydantic: 用于数据验证,能让我们用更优雅的方式处理 go-cqhttp 发来的 JSON 数据。
pip install httpx pydantic
第二步:获取图灵机器人 API Key
- 访问 图灵机器人官网。
- 注册并登录账号。
- 在控制台创建一个机器人,你会得到一个唯一的
API Key。请妥善保管这个 Key。
第三步:编写 Python 机器人脚本
现在我们来编写核心的 Python 代码,建议将代码和 go-cqhttp 放在同一个目录下,方便管理。
创建一个名为 bot.py 的文件,然后复制以下代码:
import asyncio
import httpx
from pydantic import BaseModel, Field
# --- 配置区域 ---
# 从 go-cqhttp 的文档可知,默认监听 5700 端口
GO_CQHTTP_API_URL = "http://127.0.0.1:5700"
# 替换成你自己的图灵机器人 API Key
TURING_API_KEY = "你的图灵机器人API_KEY"
# 设置一个触发词,避免机器人回复所有消息
TRIGGER_WORD = "bot"
# --- 数据模型 (使用 Pydantic 定义) ---
# 定义 go-cqhttp 发来的消息格式,方便我们解析
class CQMessage(BaseModel):
post_type: str
message_type: str # 'private' 或 'group'
message_id: int
user_id: int
group_id: int = Field(None, alias="group_id")
message: str
raw_message: str
# --- 核心功能函数 ---
async def send_to_tuling(question: str) -> str:
"""调用图灵 API 获取回复"""
try:
async with httpx.AsyncClient() as client:
url = "http://openapi.turingapi.com/api/v2"
payload = {
"perception": {
"inputText": {
"text": question
}
},
"userInfo": {
"apiKey": TURING_API_KEY,
"userId": "12345" # 可以写死,也可以用QQ号
}
}
# 发送 POST 请求
r = await client.post(url, json=payload, timeout=10)
r.raise_for_status() # 如果请求失败 (状态码非 200),则抛出异常
result = r.json()
# 解析图灵 API 返回的结果
if result.get("intent") and result["intent"].get("code") == 10004:
return "抱歉,我没有理解您的问题,可以换个方式问我吗?"
reply_text = result.get("results")[0].get("values").get("text")
return reply_text if reply_text else "图灵机器人暂时无法回复。"
except httpx.RequestError as e:
print(f"请求图灵API失败: {e}")
return "图灵服务器连接失败,请稍后再试。"
except (KeyError, IndexError, TypeError) as e:
print(f"解析图灵API返回数据失败: {e}")
return "图灵机器人返回数据异常。"
async def handle_message(message_data: dict):
"""处理来自 go-cqhttp 的消息"""
try:
# 使用 Pydantic 模型解析消息
msg = CQMessage(**message_data)
# 只处理群消息,并检查触发词
if msg.message_type == "group" and msg.raw_message.startswith(TRIGGER_WORD):
# 提取真正的问题 (去掉触发词)
question = msg.raw_message[len(TRIGGER_WORD):].strip()
print(f"收到来自群 {msg.group_id} 用户 {msg.user_id} 的问题: {question}")
if not question:
await send_group_msg(msg.group_id, "请输入你想问的问题哦~")
return
# 调用图灵 API 获取回复
reply = await send_to_tuling(question)
print(f"图灵机器人回复: {reply}")
# 将回复发送回群聊
await send_group_msg(msg.group_id, reply)
except Exception as e:
print(f"处理消息时发生错误: {e}")
async def send_group_msg(group_id: int, message: str):
"""封装发送群消息的函数"""
async with httpx.AsyncClient() as client:
params = {
"group_id": group_id,
"message": message
}
r = await client.post(f"{GO_CQHTTP_API_URL}/send_group_msg", params=params)
print(f"发送消息结果: {r.text}")
async def main():
"""主循环,持续监听 go-cqhttp 的消息"""
print("QQ机器人启动成功,正在监听消息...")
async with httpx.AsyncClient() as client:
while True:
try:
# 从 go-cqhttp 的消息接口获取消息
r = await client.post(f"{GO_CQHTTP_API_URL}/get_msg", data={"message_id": last_message_id})
r.raise_for_status()
messages = r.json().get("data", [])
for msg_data in messages:
# 更新最后一条消息的ID,以便下次获取新消息
# 注意:go-cqhttp 的消息获取机制更推荐使用 `get_forward_msg` 处理消息链
# 这里为了简化,我们使用一个简单的 ID 追踪,实际项目中推荐使用 WebSocket。
# 但对于 `go-cqhttp` v1.0.0+ 版本,推荐使用 `/get_event` 接口或 WebSocket。
# 此处的 `message_id` 用于标记已读,防止重复处理。
# 更好的做法是使用 WebSocket,实时推送消息。
# 由于 HTTP 轮询效率低,我们这里简化处理,仅作演示。
# 实际开发请查阅 go-cqhttp 文档,使用 WebSocket (`ws://127.0.0.1:8080`) 会更高效。
# 我们这里用一个更简单的方式:直接
(图片来源网络,侵删)
标签: Python QQ机器人接入图灵API教程 图灵API对接Python QQ机器人实现智能对话 Python QQ机器人调用图灵AI接口做智能问答
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。