Python QQ机器人如何接入图灵API实现智能对话?

99ANYc3cd6 机器人 13

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

Python QQ机器人如何接入图灵API实现智能对话?-第1张图片-广州国自机器人
(图片来源网络,侵删)

核心概念

  1. QQ 机器人: 我们不能直接用 Python 连接 QQ 服务器(官方不开放且会封号),所以需要一个“中间人”程序,它通过反向协议(如 HTTP)与我们的 Python 脚本通信,这个“中间人”go-cqhttp
  2. go-cqhttp: 一个基于 CQHTTP 协议的 QQ 机器人框架,它模拟登录你的 QQ 号,然后提供一个 HTTP 或 WebSocket 接口,供你的 Python 脚本发送和接收消息。
  3. 图灵机器人: 一个第三方智能对话平台,你只需要将用户发送的消息内容,通过 API 请求发送给图灵的服务器,它会返回一个预设的智能回复,你的 Python 机器人再把这个回复转发回 QQ 群或私聊。

工作流程图:

[QQ用户] --(发送消息)--> [QQ客户端] --(通过协议)--> [go-cqhttp] --(HTTP POST)--> [你的Python脚本]
                                                                      |
                                                                      | (1. 获取消息内容)
                                                                      V
                                                                [调用图灵API]
                                                                      |
                                                                      | (2. 发送消息内容,获取回复)
                                                                      V
                                                                [图灵服务器]
                                                                      |
                                                                      | (3. 返回智能回复)
                                                                      V
                                                                [你的Python脚本] --(4. 构造回复消息)--> [go-cqhttp] --(通过协议)--> [QQ客户端] --(显示回复)--> [QQ用户]

第一步:环境准备

  1. 安装 Python: 确保你的电脑上安装了 Python (建议 3.7+)。

  2. 安装 go-cqhttp:

    • 访问 go-cqhttp 的 Releases 页面
    • 下载对应你操作系统的版本(Windows 用户下载 go-cqhttp-windows-amd64.zip)。
    • 解压到一个固定目录,D:\go-cqhttp
    • 首次运行: 双击 go-cqhttp.exe,它会自动生成一个 config.yml 配置文件,并尝试扫码登录,请使用你的手机 QQ 扫描屏幕上的二维码进行登录。
    • 登录成功后: 再次运行 go-cqhttp.exe,它会最小化到系统托盘,并开始监听消息,现在你的 QQ 号已经变成了一个机器人,等待接收指令。
  3. 安装 Python 库: 打开你的终端或命令提示符,运行以下命令安装必要的库。

    Python QQ机器人如何接入图灵API实现智能对话?-第2张图片-广州国自机器人
    (图片来源网络,侵删)
    • httpx: 一个现代、快速的 HTTP 客户端,用于与 go-cqhttp 和图灵 API 通信。
    • pydantic: 用于数据验证,能让我们用更优雅的方式处理 go-cqhttp 发来的 JSON 数据。
    pip install httpx pydantic

第二步:获取图灵机器人 API Key

  1. 访问 图灵机器人官网
  2. 注册并登录账号。
  3. 在控制台创建一个机器人,你会得到一个唯一的 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实现智能对话?-第3张图片-广州国自机器人
(图片来源网络,侵删)

标签: Python QQ机器人接入图灵API教程 图灵API对接Python QQ机器人实现智能对话 Python QQ机器人调用图灵AI接口做智能问答

抱歉,评论功能暂时关闭!