DeepSeek接入QQ机器人:API申请到多轮对话保姆级教程

发布时间:2026/9/9 13:57:45
DeepSeek接入QQ机器人:API申请到多轮对话保姆级教程 DeepSeek 接入 QQ 机器人这件事最近问的人很多。网上教程要么只讲了 API 调用要么只讲了机器人框架中间怎么串起来基本靠猜。这次我们就直接把完整链路拆开讲DeepSeek API 怎么申请、机器人怎么搭建、消息怎么转发、多轮对话怎么做、批量回复怎么扩展从头到尾走一遍保姆级流程。先给结论这套方案不需要本地显卡只要你有一台能跑 Python 的电脑或服务器再加上一个 DeepSeek API Key 就能跑。核心特点整理一下不需要 GPU普通云服务器或家用电脑都能带。启动方式为命令行启动配合 Supervisor 或 systemd 可以常驻后台。主要功能是 QQ 群聊 / 私聊自动回复支持角色设定、多轮记忆、关键词触发。支持通过 DeepSeek 官方 API 调用接口兼容 OpenAI 格式。支持对接多群、多用户可以在消息处理层做批量任务队列。门槛集中在机器人侧的环境配置DeepSeek 部分只是请求一个 HTTP 接口。本文会带你完成申请 API Key、搭建 QQ 机器人连接端、写一个 DeepSeek 调用函数、把 QQ 消息接到 DeepSeek、测试单轮对话、加入上下文记忆、再考虑批量任务和性能观察。1. 核心能力速览能力项说明项目类型API 接入教程DeepSeek 大模型 QQ 机器人框架主要功能QQ 私聊/群聊自动回复、角色设定、多轮记忆、批量消息处理硬件要求不需要 GPU普通电脑或轻量云服务器即可依赖环境Python 3.10、pip、一个 QQ 账号、DeepSeek API Key启动方式命令行启动可配置 systemd/Supervisor 常驻是否支持 API是DeepSeek 官方 API兼容 OpenAI 接口协议是否支持批量任务支持可在消息处理层做队列和并发控制适合场景个人助理、群管理辅助、自动化消息回复、AI 客服测试合规边界遵循 QQ 平台开放规则建议使用官方接口或小号测试禁止骚扰/违规内容这里要特别提醒DeepSeek API 是按调用量计费的官方可能会提供一定的免费额度具体价格和免费策略以官网显示为准。实际费用取决于你的 prompt 长度、回复长度和调用次数。成本整体可控但不建议直接放到大流量群里跑而不做限流。2. 适用场景与使用边界先想清楚你要拿它做什么。典型的使用场景包括个人 QQ 群助理有人提问机器人自动回答常见问题减轻群主重复回答的负担。学习调试通过一个真实可交互的对话窗口测试 DeepSeek 在不同 system prompt 下的表现。消息自动化把 QQ 消息接入自己的工作流比如收到特定关键词后自动生成 JSON、自动查天气、自动记录待办。产品原型验证做 AI 客服、AI 角色对话的早期 Demo不需要开发完整 App。不适合的场景也要明确不适合拿一个常用 QQ 号直接跑非官方协议有风控封号风险。不适合在群里高频刷屏容易触发平台限流也会影响群内正常聊天。不适合处理敏感隐私数据消息会经过 DeepSeek API不要往里面传身份证号、密码、内部文档。不适合做违法违规内容生成比如自动化诈骗、虚假信息、绕过安全限制的 prompt。这类内容本身就不允许API 侧也有内容过滤。关于安全合规这一点多说一句QQ 机器人的连接方式分官方和非官方两类。官方开放平台提供机器人接口稳定但入驻有门槛非官方协议框架常见的有基于 OneBot 协议的实现部署简单但可能存在账号风控风险。本文的教程以通用消息转发思路展开你在实际使用时优先选择平台允许的接入方式测试阶段建议使用小号不要直接拿常用号实验。声音克隆、换脸、数字人这类能力如果未来扩展也必须确认你拥有相关声音/肖像的合法授权。3. 环境准备与前置条件以下是通用检查清单按顺序确认缺哪项补哪项。3.1 硬件与系统操作系统Windows 10/11、Ubuntu 20.04、CentOS 7 都行。内存2GB 以上即可机器人框架本身占用不高。硬盘系统盘剩余 5GB 以上后续日志和依赖会有一些占用。网络服务器或电脑能访问外网。如果用的是国内云服务器确认可以正常访问 DeepSeek API 域名以及 QQ 消息服务对应端口。3.2 Python 环境进入命令行先确认 Python 版本python --version如果显示的是 Python 3.8 或更早建议先装 Python 3.10 或更高版本。推荐使用虚拟环境隔离项目依赖避免污染系统 Python。# Windows python -m venv venv venv\Scripts\activate # Linux / macOS python3 -m venv venv source venv/bin/activate3.3 必要账号需要一个 DeepSeek 开放平台账号用于创建 API Key。一个用于机器人登录的 QQ 号。建议用小号因为任何第三方接入方式都有一定风控风险小号损失更可控。3.4 端口规划QQ 机器人框架通常会监听一个本地端口用于接收消息事件。常见端口有 8080、8081、5700 等具体使用哪个取决于你选的框架和配置。建议提前用下述命令检查端口是否被占用# Linux lsof -i:8080 # Windows PowerShell netstat -ano | findstr 8080如果被占用就换一个端口。4. 安装部署与启动方式DeepSeek 接入 QQ 机器人的整体架构如下QQ 消息 ↓ QQ 机器人连接端负责接收 QQ 事件 ↓ 消息处理层你的 Python 代码 ↓ DeepSeek API生成回复 ↓ 消息处理层拿到文本后调用机器人发送 ↓ QQ 群聊 / 私聊下面按这个链路分别部署。4.1 第一步获取 DeepSeek API Key打开 DeepSeek 开放平台官网注册账号。登录后进入控制台找到 API Keys 管理页面创建一个新的 API Key。创建完成后会显示一次完整的 Key 值立即复制保存关闭页面后就不再显示完整内容。把 Key 存到环境变量中而不是直接硬编码在代码里# Linux / macOS export DEEPSEEK_API_KEYsk-你的key # Windows PowerShell $env:DEEPSEEK_API_KEYsk-你的key也可以写到项目目录下的.env文件里使用python-dotenv加载。不管用哪种方式都不要把 Key 提交到公开的 Git 仓库。4.2 第二步安装依赖pip install requests python-dotenv openai这里安装openai库是因为 DeepSeek API 兼容 OpenAI 接口格式可以直接用 OpenAI SDK 来调用。如果你不想引入这个依赖用requests也能完成后面会给两种写法。4.3 第三步安装并配置 QQ 机器人连接端这一步是整个教程里最容易出问题的地方。目前社区里常见的做法是使用支持 OneBot 协议的机器人框架它们负责与 QQ 服务器建立连接、监听消息、发送消息。你不需要自己处理 QQ 底层协议只要按 OneBot 标准接收事件、返回响应即可。假设你选择了一个支持 OneBot 协议的框架通常会得到一个 WebSocket 或 HTTP 端口。无论是正向 WebSocket框架主动连你的服务还是反向 WebSocket你的服务主动连框架记下这个地址和端口后面配置机器人代码时要用。如果对这块不熟悉更稳妥的做法是先确认你选用的框架官方文档里最新推荐的接入方式跟着它的“连接配置”章节把消息通道跑通然后再接入 DeepSeek。因为不同框架配置差异很大本文不写死某一种连接方式核心思路是一样的消息事件进来你拿到文本调用 DeepSeek把回复发回去。4.4 第四步验证消息通道不要一上来就接 DeepSeek。先把“QQ 收到消息 - 你本地能收到消息事件 - 你发回固定文本”这个链路跑通。在机器人代码目录下新建bot_debug.py# bot_debug.py # 这是一个伪代码示例具体事件监听方式以你选用的框架为准 from your_framework import on_message, bot on_message() async def echo(event): text event.message if text ping: await bot.send(event, pong)在 QQ 里给机器人发一条ping如果它回复pong说明消息通道已经通了。这一步通过后再接 DeepSeek问题排查会简单很多。4.5 第五步编写 DeepSeek 调用函数新建deepseek_api.pyimport os import requests from dotenv import load_dotenv load_dotenv() API_KEY os.getenv(DEEPSEEK_API_KEY) BASE_URL https://api.deepseek.com MODEL deepseek-chat # 具体模型名以官方控制台可用模型为准 def chat_with_deepseek(messages, temperature0.7): 调用 DeepSeek API 生成回复。 messages 格式与 OpenAI 一致例如 [ {role: system, content: 你是一个友好的QQ群助手}, {role: user, content: 你好} ] headers { Authorization: fBearer {API_KEY}, Content-Type: application/json } payload { model: MODEL, messages: messages, temperature: temperature, stream: False } try: resp requests.post( f{BASE_URL}/chat/completions, jsonpayload, headersheaders, timeout60 ) resp.raise_for_status() data resp.json() return data[choices][0][message][content] except requests.exceptions.Timeout: return 抱歉我这边响应超时了请稍后再试。 except Exception as e: print(fDeepSeek API 调用失败: {e}) return 抱歉我这边出了点问题。如果不想手动拼 HTTP 请求也可以用 OpenAI SDK 写法from openai import OpenAI client OpenAI( api_keyAPI_KEY, base_urlhttps://api.deepseek.com ) response client.chat.completions.create( modelMODEL, messagesmessages, temperature0.7 )用requests版本的好处是依赖少排查更直接。注意模型名这个参数很容易写错。DeepSeek 官方提供的模型名会随版本更新不要照抄网上旧教程里的模型名登录官网控制台以你能看到的模型列表为准。5. 功能测试与效果验证消息通道通了API 调用函数也写好了接下来把两者串起来。5.1 启动机器人服务python bot.py看到日志输出“机器人启动成功”“WebSocket 已连接”之类的信息后说明机器人已上线。5.2 单轮对话测试在 QQ 里给机器人发消息你好。预期行为机器人调用 DeepSeek API然后回复一句自然的问候语。判断成功的标准QQ 里能收到机器人回复。终端日志显示DeepSeek API 调用成功没有报错。回复内容与 DeepSeek 模型风格一致不是固定的pong。失败排查顺序检查 API Key 是否正确加载有没有打印出来不要打印完整 Key只打印前几位便于确认。检查模型名是否存在于控制台。检查网络是否通直接跑一次curl测试curl https://api.deepseek.com/chat/completions \ -H Authorization: Bearer $DEEPSEEK_API_KEY \ -H Content-Type: application/json \ -d {model:deepseek-chat,messages:[{role:user,content:hi}]}如果 curl 有正常返回 JSON说明 API 侧没问题问题在机器人代码。5.3 群聊测试把机器人拉进一个测试群在群里 机器人 再发消息。这里需要注意一个常见问题群聊里每条消息都会触发事件如果你的机器人对“所有群消息”都回复会造成刷屏。正确做法是只响应包含 机器人 的消息或者包含特定触发词的消息。伪代码思路if event.is_group_message: if not event.is_mention_me: return text event.get_plaintext() # 取出 之后的内容发给 DeepSeek在代码层面群聊消息会包含 符号和 QQ 号预处理时把CQ码或at信息去掉只保留纯文本。5.4 多轮对话测试DeepSeek API 本身是无状态的也就是说它不记得上一次对话。要实现“记忆”需要把历史消息作为参数一起传过去。最简单的方案用一个字典存每个用户的对话历史。from collections import defaultdict conversation_history defaultdict(list) MAX_HISTORY 10 # 最多保留多少条历史消息 def build_messages(user_id, new_text): history conversation_history[user_id] # 如果历史为空加上 system prompt if not history: history.append({ role: system, content: 你是一个友好、简洁、乐于助人的 QQ 机器人助手。 }) history.append({role: user, content: new_text}) # 只保留最近 MAX_HISTORY 条避免消息过长 trimmed history[-(MAX_HISTORY * 2 1):] return trimmed def update_history(user_id, reply): conversation_history[user_id].append({role: assistant, content: reply})测试流程用户问“我叫小明”。机器人回复。用户再问“我叫什么名字”。如果机器人能回答“你叫小明”说明多轮对话生效。注意纯内存会话在机器人重启后会丢失。如果想要长期记忆可以把历史存到 SQLite 或 Redis后面在批量任务一节再展开。5.5 角色设定测试在 system prompt 中自定义角色意思是给模型一个身份设定。例如system_prompt 你是一个猫咪风格的群聊助手。每句话都要带喵字回答简短不超过50字。把这段作为 messages 的第一条之后所有对话都会带猫咪风格。如果效果不符合预期调整方向有两个一是明确约束回复格式和长度二是在 system prompt 里给出具体示例。比如要求回复必须三行以内不如直接附一个“好的提问示例”和“期望回复示例”更有效。5.6 异常输入测试发送空消息、只发一个表情、发超长文本、连续快速发多条消息观察机器人是否卡死或崩溃。预期行为超时后返回“请稍后再试”的兜底文案进程不崩溃日志能记录错误。如果连续快速消息导致程序阻塞说明你的消息处理逻辑是同步阻塞的需要改成异步处理或者加锁/队列。6. 接口 API 调用示例与批量任务6.1 直接通过 curl 调用 DeepSeek API最快验证 DeepSeek API 可用的方式就是 curlcurl https://api.deepseek.com/chat/completions \ -H Authorization: Bearer $DEEPSEEK_API_KEY \ -H Content-Type: application/json \ -d { model: deepseek-chat, messages: [ {role: system, content: 你是一个QQ机器人}, {role: user, content: 介绍一下你自己} ], stream: false }正常返回的 JSON 结构类似{ id: chatcmpl-xxx, object: chat.completion, model: deepseek-chat, choices: [ { index: 0, message: { role: assistant, content: 你好我是基于 DeepSeek 的 QQ 机器人…… }, finish_reason: stop } ], usage: { prompt_tokens: 20, completion_tokens: 30, total_tokens: 50 } }usage字段里的 token 数就是你计费的依据建议在日志里记录这个字段方便做成本核算。6.2 Python 调用示例如果你在开发其他服务不一定要走机器人框架直接调用 DeepSeek API 即可。import requests def ask_deepseek(prompt, api_key): url https://api.deepseek.com/chat/completions headers { Authorization: fBearer {api_key}, Content-Type: application/json } payload { model: deepseek-chat, messages: [ {role: system, content: 你是一个技术助手}, {role: user, content: prompt} ], temperature: 0.5 } resp requests.post(url, jsonpayload, headersheaders, timeout60) resp.raise_for_status() return resp.json() print(ask_deepseek(用一句话解释什么是API, 你的API_KEY))这个函数可以复用到 QQ 机器人、命令行工具、Web 后端等任何 Python 服务里。6.3 批量任务设计思路QQ 机器人场景下“批量任务”通常指以下两类一类是多个群同时发来消息机器人需要并发处理而不是一个群的消息阻塞另一个群。解决方案是使用消息队列。最简单的 Python 实现是用asyncio.Queueimport asyncio request_queue asyncio.Queue() async def worker(): while True: user_id, text, reply_to await request_queue.get() try: reply await asyncio.to_thread(chat_with_deepseek, text) await reply_to(reply) except Exception as e: print(f处理用户 {user_id} 消息失败: {e}) finally: request_queue.task_done() # 启动 3 个 worker for _ in range(3): asyncio.create_task(worker())另一类是离线批量生成任务比如你有一批文本文件需要让 DeepSeek 处理不依赖 QQ 消息实时触发。这种情况可以写一个独立脚本读入目录逐条调用 API结果写到输出目录python batch_process.py --input ./inputs --output ./outputs对应batch_process.py的核心逻辑import os import json import time def batch_process(input_dir, output_dir): os.makedirs(output_dir, exist_okTrue) for filename in os.listdir(input_dir): if not filename.endswith(.txt): continue input_path os.path.join(input_dir, filename) output_path os.path.join(output_dir, filename.replace(.txt, .json)) with open(input_path, r, encodingutf-8) as f: text f.read().strip() reply chat_with_deepseek(text) with open(output_path, w, encodingutf-8) as f: json.dump({input: text, output: reply}, f, ensure_asciiFalse, indent2) print(f已完成 {filename}) time.sleep(0.5) # 简单的速率控制避免触发限流批量处理要注意 DeepSeek API 的速率限制。官网控制台可能会显示每分钟请求数上限超过之后会返回 429 状态码。你的代码里要处理429做退避重试等待 1 秒、2 秒、4 秒最多重试 3 次。6.4 并发控制即使你不对接 QQ只是自己写脚本调用 DeepSeek API也不建议一次性开 100 个线程同时请求。稳妥的做法是设置一个并发上限比如同时最多 5 个请求在处理剩下的排队。用ThreadPoolExecutor可以简单实现from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers5) as executor: results list(executor.map(chat_with_deepseek, all_texts))7. 资源占用与性能观察DeepSeek API 接入方案最大的优势是本地不需要 GPU不涉及模型推理显存占用为零。真正的资源开销集中在三个方面。7.1 机器人进程开销机器人框架本身占用内存不大但 Python 进程的内存占用不能只看空闲状态。如果你的代码里有大量用户对话历史存在内存里消息量增长后内存会线性上升。观察方法# Linux top -p $(pgrep -f bot.py) # Windows 任务管理器或使用如下命令 wmic process where namepython.exe get processid,working_set如果内存涨得很明显优先检查conversation_history字典的大小。解决思路有几种限制每个用户保留的历史条数。定期清理超过 24 小时没有活跃的会话。把历史存储从内存迁移到 SQLite 或 Redis重启不丢失。7.2 网络与延迟调用 DeepSeek API 的延迟主要取决于网络和模型负载。一次完整回复的耗时通常在几秒到十几秒之间复杂的推理模型可能更久。这是正常的不需要过于担心。真正需要注意的是超时设置。timeout60是最基础的兜底。但如果网络状态不稳定建议把超时时间设置成 90 秒或 120 秒避免模型刚生成到一半就中断。日志里可以记录每次调用的耗时import time start time.time() reply chat_with_deepseek(messages) cost_ms (time.time() - start) * 1000 print(fDeepSeek 调用耗时: {cost_ms:.1f}ms)如果耗时普遍偏高检查你的服务器和 DeepSeek API 之间的网络链路。7.3 日志与成本监控每次调用后记录 token 消费print(f本次请求 tokens: {data[usage]})设置一个简单脚本每天统计总 token 消耗可以避免月底账单超出预期。8. 常见问题与排查方法问题现象可能原因排查方式解决方案机器人一直离线/登录失败QQ 连接端的登录方式被风控或失效查看连接端日志检查登录状态确认连接方式符合平台规范测试用小号重新登录消息发出去机器人没反应消息事件没有到达你的服务终端是否有日志输出先跑通ping/pong调试链路再接入 DeepSeek机器人对群里所有消息都回复没有过滤 或触发词检查事件处理器逻辑增加is_mention_me判断或关键词过滤DeepSeek 返回 401API Key 错误或未正确加载在代码里打印 Key 前几位检查.env配置和变量名DeepSeek 返回 400请求体格式错误或模型名不对把 payload 打出来检查用官方 curl 示例逐项对比DeepSeek 返回 429请求频率超限或账户额度不足查看响应体中的错误描述增加重试退避降低并发数检查账户余额回复内容被截断max_tokens设置过小或者触发了内容过滤查看返回的finish_reason调大max_tokens或调整 prompt 表达方式机器人回复延迟很高网络链路原因或模型负载高查看日志中的耗时记录尝试更换网络环境或使用streamtrue流式输出让用户先看到部分内容内存持续增长会话历史没有清理观察进程内存变化加上限和历史清理逻辑端口被占用其他服务占用了配置的端口lsof -i:端口号修改框架端口配置重启后机器人不记得之前对话历史只保存在内存检查代码逻辑引入 SQLite/Redis 持久化常见且容易踩坑的一个细节是DeepSeek API 响应内容里的finish_reason如果为length说明生成被max_tokens截断了。这时候增加max_tokens或者把max_tokens设置为None让它自动估算能减少回复截断。9. 最佳实践与使用建议9.1 先从最小可运行配置开始第一次不要追求功能完整。最小可运行配置是机器人能收到“/chat 你好”这样的私有消息调用 DeepSeek 返回回复其他消息都忽略。跑通这个后再加多轮记忆、角色设定、群聊过滤。9.2 使用环境变量管理密钥把 API Key、QQ 号、端口配置全部放到.env文件里代码里用os.getenv()读取并添加到.gitignore。不要提交到公开仓库。DEEPSEEK_API_KEYsk-xxx BOT_NAMEmy-bot PORT80809.3 限流与防刷机器人一旦接入大群可能出现一个人连续发消息触发大量 API 调用的情况。加一个最基础的频率限制import time last_reply_time {} def is_rate_limited(user_id, interval_seconds3): now time.time() if user_id in last_reply_time: if now - last_reply_time[user_id] interval_seconds: return True last_reply_time[user_id] now return False超过频率的消息直接忽略或回复“别急慢一点发”。9.4 做好日志分级至少要做到正常回复不打印消息正文只打印用户 ID 和 token 消耗。异常情况打印完整报错堆栈。每条日志带时间戳。9.5 合规使用不管机器人接入目的是什么都要注意不生成违法违规内容。不用于骚扰、诈骗、传播虚假信息。不处理和存储他人的敏感个人信息。涉及人脸图片、语音音频、版权素材的扩展功能必须确认已获得合法授权。在群内使用时明确标注这是 AI 机器人避免误导其他成员。9.6 部署到服务器如果只想本地测试跑python bot.py就够了。想长期运行推荐用systemd或Supervisor托管。以 systemd 为例新建服务文件[Unit] DescriptionQQ Bot Afternetwork.target [Service] WorkingDirectory/path/to/your/bot ExecStart/path/to/your/venv/bin/python /path/to/your/bot/bot.py Restartalways [Install] WantedBymulti-user.target然后执行sudo systemctl daemon-reload sudo systemctl enable qqbot sudo systemctl start qqbot这样即使进程崩溃或者服务器重启机器人也能自动拉起来。10. 总结与下一步DeepSeek 接入 QQ 机器人核心成本不在模型推理而在消息通道的连通和消息预处理逻辑。DeepSeek 部分只是调用一个 HTTP API真正决定机器人体验的是三件事system prompt 怎么设计、多轮历史怎么管理、群消息怎么过滤。如果你第一次尝试建议按这个顺序执行申请 DeepSeek API Key用 curl 跑通一次 API 调用。把 QQ 机器人连接端跑起来先测试固定文本回复。替换成 DeepSeek 调用函数跑通单轮对话。加多轮记忆和角色设定。再加群聊触发和限流功能。最容易踩的坑集中在模型名写错、API Key 没加载、QQ 连接端登录不稳定这三块。遇到问题不要急着改代码先确认消息通道单独跑通再确认 API 单独跑通两个模块都验证后再拼接。后续可以扩展的方向不少接入本地向量库做知识库问答、定时发送每日总结、对接企业微信、接入语音识别实现语音问答、通过 Web 面板批量管理多个群的机器人。这套架构搭好之后只是换模型和换消息源的事情主体不会大改。建议收藏备用。如果你在搭建过程中卡在哪一步按文章里的排查表逐项检查大部分问题都能定位到具体环节。