资讯动态

保姆级教程:用NoneBot2+OneBot把DeepSeek接入QQ机器人

发布时间:2026/9/9 3:25:53 来源:尧图企业网站定制
如果你身边有同事、朋友或群友经常让你帮忙“用 AI 查个问题”你大概会有一种很熟悉的体验打开网页版 DeepSeek把问题贴进去等回答再把结果复制回群里。一次两次还行次数多了就会想为什么不直接让 DeepSeek 住在 QQ 群里谁提问它自己回答这个需求听起来很酷实现起来也确实不复杂但网上很多教程要么只讲“某单一框架”要么默认你已经懂消息协议、事件回调、反向 WebSocket照着做还是会卡住。本文会用一套完整的保姆级流程把 DeepSeek 接入 QQ 机器人这件事讲透从方案选型、环境准备到 OneBot 服务端搭建、NoneBot2 项目初始化再到编写 DeepSeek 对话插件、联调验证和常见排错全程给可复制的代码和命令。先说结论最适合个人开发者的接入路线是“NoneBot2 OneBot 协议 DeepSeek API”。它消息链路清晰、文档成熟、可扩展性强而且不需要你维护复杂的 QQ 协议底层。读完这篇文章你可以在自己的 QQ 群里跑起一个支持多轮对话、支持权限控制、能低成本扩展技能的 DeepSeek 聊天机器人。1. 为什么要把 DeepSeek 接进 QQ 机器人先别急着动手想清楚这个问题的答案能帮你避免后面走偏。如果你只是偶尔问几个问题网页版完全够用。但一旦进入真实使用场景QQ 机器人有几个网页版替代不了的价值一是入口成本低群里直接 机器人就能问不需要让每个群友都去注册和配置 DeepSeek 账号二是信息沉淀方便问答留在群聊记录里后面检索、回顾都比打开几十个浏览器标签页更高效三是可以做自动化扩展比如让机器人定期推送技术资讯、处理简单指令、对接内部工具这些是网页聊天做不到的。过去的传统做法是直接基于 QQ 协议库自己处理登录、消息收发、心跳、事件解析、重连不仅工作量大而且协议一旦变动维护成本非常高。现在更通用的做法是把“与 QQ 平台通信”和“处理业务逻辑”拆成两层下面一层用 OneBot 协议的标准实现处理 QQ 消息收发上面一层用 NoneBot2 这类框架写实际功能。你专注写插件平台差异交给适配层。所以这篇文章选择的方案本质上是在解决“开发成本可控”和“后续可维护”这两个核心问题。如果你熟悉 Python这条路的效率比想象中高得多。2. 核心概念与接入架构在写代码之前先理清四个关键概念。很多教程跳过了这部分导致读者在配置时不知道每一项到底在配什么。2.1 DeepSeek API 是什么DeepSeek 提供了 OpenAI 兼容的 API 接口你可以通过标准 HTTP 调用来发起对话补全请求。对开发者来说这意味着你不需要研究任何私有的模型调用方式直接使用 OpenAI SDK 或httpx、requests这类通用请求库就能接入。常用配置是Base URLhttps://api.deepseek.comAPI Key在 DeepSeek 开放平台申请对话模型deepseek-chat推理模型deepseek-reasoner把 DeepSeek API 想象成一个“AI 问答服务”你的机器人只是这个服务的搬运工把群里的消息打包成 API 请求再把返回结果送回群里。2.2 OneBot 协议是什么OneBot 是一套 QQ 机器人通信标准它定义了“QQ 消息事件”如何被序列化、如何通过 WebSocket / HTTP 转发给上层应用。它把 QQ 平台的具体协议实现藏在了后面你的业务程序不需要关心 QQ 客户端内部的登录和收发细节。从材料看OpenAI 兼容接口是当前最稳妥的接入方式。DeepSeek API 的 endpoint、模型命名可能随时调整实践时以官方文档最新说明为准。2.3 NoneBot2 是什么NoneBot2 是 Python 生态里非常成熟的机器人聊天框架。它基于 OneBot 事件模型用“插件”机制组织业务逻辑。你写的每个插件对应一类能力比如天气查询、新闻推送、AI 对话。框架本身负责事件分发、权限管理、会话生命周期你只需要关注插件内部逻辑。2.4 整体架构分层整个系统从下到上可以分成四层层级职责代表组件QQ 平台提供真实聊天环境产生消息事件QQ 客户端 / 账号OneBot 实现连接 QQ 平台把消息转为 OneBot 事件NapCat、Lagrange 等机器人框架处理事件分发、插件管理、会话状态NoneBot2AI 能力处理用户文本并生成回复DeepSeek API这种分层设计的好处是每一层都能独立替换。你想换一个 OneBot 实现机器人插件代码基本不用动你想换一个 AI 模型只要改动 DeepSeek API 调用模块消息链路可以完全保留。3. 环境准备与前置条件下面开始实操。请按顺序确认环境避免中途出现版本问题。3.1 运行时环境操作系统Windows 10/11、Ubuntu 20.04 或 macOS 均可。Python 版本建议 3.10 或更高。NoneBot2 对 Python 3.9 也支持但 3.10 更省心。包管理工具pip或uv。终端工具支持运行命令行即可Windows 推荐 PowerShell 或 Windows Terminal。你可以先确认 Python 版本python --version3.2 创建虚拟环境强烈建议给本项目创建独立虚拟环境避免和系统 Python 的包互相污染。mkdir deepseek-qq-bot cd deepseek-qq-bot python -m venv venv激活虚拟环境Windowsvenv\Scripts\activatemacOS / Linuxsource venv/bin/activate激活后命令行前缀会出现(venv)说明当前已进入虚拟环境。3.3 获取 DeepSeek API Key前往 DeepSeek 开放平台注册账号然后在 API Keys 页面创建一个新的 Key。拿到 Key 后立即将它保存到安全的地方。因为很多教程会直接把 Key 写进代码这是非常危险的习惯。如果 Key 泄露到 GitHub 或公开仓库别人就可以用你的额度调用模型产生不必要的费用。正确做法是放到环境变量里。后面写代码时会通过os.getenv(DEEPSEEK_API_KEY)读取而不是硬编码在源码中。3.4 准备一个可用于机器人登录的 QQ 账号这一步需要特别谨慎。QQ 机器人接入存在平台风控风险请务必使用小号或专用账号测试不要用常用大号。用大号跑机器人一旦触发异常登录检测可能影响正常使用。从项目实践看使用独立小号、保持正常的登录频率、避免短时间内大量发送消息是降低风险的有效手段。3.5 选择 OneBot 实现OneBot 是一个协议标准具体实现有很多种。早期常用 go-cqhttp但它已经停止维护不建议新项目使用。当前社区活跃的方案包括 NapCat、Lagrange 等它们都支持 OneBot 协议能通过正向 WebSocket、反向 WebSocket 或 HTTP 上报事件。本文重点演示“OneBot 反向 WebSocket NoneBot2”这种最常用的组合。你会先启动 NoneBot2它监听一个本地端口然后 OneBot 实现主动连上来。这样内网穿透等因素不会影响消息链路。4. 搭建 OneBot 服务端消息通道不同 OneBot 实现的安装方式和界面不同但核心配置项基本类似。这里以 NapCat 类实现为例说明通用思路具体菜单名称以你实际下载的版本为准。安装并启动 OneBot 实现后找到它的 WebSocket 或网络配置界面你需要重点关心几个配置项配置项推荐值作用反向 WS 地址ws://127.0.0.1:2370/onebot/v11/ws通知 OneBot 实现主动连接 NoneBot2 的地址消息上报类型反向 WebSocketNoneBot2 默认的 OneBot V11 适配方式访问令牌自定义字符串可选用于消息通道鉴权建议开启登录账号信息专用小号机器人实际使用的 QQ 账号把反向 WS 地址填成ws://127.0.0.1:2370/onebot/v11/ws是因为后面 NoneBot2 会在本机2370端口监听。如果你的 2370 端口被占用可以换一个但要保证两边配置一致。配置完成后先保存暂不启动或保持运行皆可。接下来开始创建 NoneBot2 项目。需要说明的是不同 OneBot 实现的具体操作路径差异很大不建议死记某一张截图。只要理解“反向 WS 地址指向 NoneBot2 的监听端口”这一层关系无论界面怎么变你都能找到对应配置。5. 创建 NoneBot2 项目并安装依赖5.1 安装 NoneBot2 脚手架在虚拟环境中安装nonebot2和脚手架工具nb-clipip install nonebot2 nb-cli5.2 初始化项目使用nb命令创建项目。在交互式提示中选择“内置插件”为echo即可后续可以删掉。nb create按提示输入项目名例如qq-deepseek-bot然后进入项目目录cd qq-deepseek-bot5.3 安装 OneBot V11 适配器NoneBot2 本身不直接处理 QQ 消息它需要适配器来理解 OneBot 协议。安装 OneBot V11 适配器nb adapter install nonebot-adapter-onebot5.4 安装 OpenAI SDKDeepSeek API 兼容 OpenAI 接口直接安装官方openaiPython SDK 是最省力的做法pip install openai如果你希望减少依赖也可以只用httpx手写请求。但从工程化角度openaiSDK 帮你处理了请求重试、超时和一些边界细节推荐使用。6. 编写 DeepSeek 机器人插件这是文章的核心部分。我们从头到尾实现一个插件让机器人在群里被 时调用 DeepSeek API 并返回回答。6.1 插件目录结构NoneBot2 的插件可以是一个文件也可以是一个目录。这里用目录结构方便后续扩展src/plugins/deepseek_chat/ ├── __init__.py └── config.py如果你的 NoneBot2 项目没有src目录需要检查pyproject.toml或nb命令生成的默认结构。在pyproject.toml里nonebot.load_plugins的路径和你放插件的位置必须一致。6.2 编写插件主逻辑__init__.py文件负责注册事件响应器和调用 DeepSeek API。先看完整代码# 文件路径src/plugins/deepseek_chat/__init__.py import os from nonebot import on_command, on_regex from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent from nonebot.rule import to_me from nonebot.log import logger from openai import OpenAI # 读取环境变量 API_KEY os.getenv(DEEPSEEK_API_KEY, ) BASE_URL os.getenv(DEEPSEEK_BASE_URL, https://api.deepseek.com) MODEL os.getenv(DEEPSEEK_MODEL, deepseek-chat) client OpenAI(api_keyAPI_KEY, base_urlBASE_URL) # 当机器人被 或私聊时触发 chat on_regex(r.*, ruleto_me(), priority10, blockTrue) # 简单多轮记忆以 session_id 为 key存储最近消息 memory {} def get_reply(user_message: str, session_id: str) - str: messages memory.get(session_id, []) messages.append({role: user, content: user_message}) # 控制上下文长度避免无限增长 if len(messages) 12: messages messages[-12:] resp client.chat.completions.create( modelMODEL, messagesmessages, max_tokens800, temperature0.7, ) reply resp.choices[0].message.content messages.append({role: assistant, content: reply}) memory[session_id] messages return reply chat.handle() async def handle_message(bot: Bot, event: MessageEvent): user_text event.get_plaintext().strip() if not user_text: await chat.finish(请问你想了解什么呢直接输入问题即可。) # 群聊时按群号用户ID隔离上下文私聊时按用户ID隔离 if isinstance(event, GroupMessageEvent): session_id fgroup_{event.group_id}_user_{event.user_id} else: session_id fprivate_user_{event.user_id} try: reply get_reply(user_text, session_id) await chat.finish(reply) except Exception as e: logger.error(fDeepSeek API 调用失败: {e}) await chat.finish(抱歉模型服务暂时不可用请稍后再试。)这段代码的关键点有三个。第一to_me()规则。它让机器人只在被 时回复群消息也可以接收私聊消息。这样机器人不会在群里回复每一句话避免刷屏。第二on_regex(r.*)匹配任意文本。配合to_me()实际效果是“只要 机器人就当作一次对话请求”简单直观。如果你想加更多指令可以用on_command处理。第三简易多轮记忆。代码里用memory字典保存每个会话最近 12 条消息实现基本的上下文对话。这个实现有三个问题需要注意内存占用会随会话数上升、机器人重启后记忆清空、不同群的不同用户上下文被隔离。生产环境可以换成 Redis 或数据库但对本地试验足够。6.3 配置环境变量在项目根目录创建.env文件内容如下DEEPSEEK_API_KEYsk-你的密钥 DEEPSEEK_BASE_URLhttps://api.deepseek.com DEEPSEEK_MODELdeepseek-chat重要提醒这个文件包含敏感信息一定不要提交到 Git。建议在项目的.gitignore中加入.env和venv.env venv/6.4 理解 NoneBot2 项目加载机制NoneBot2 默认从src/plugins目录加载插件。在pyproject.toml中通常可以看到类似plugin_dirs [src/plugins]的配置。如果你的目录结构不同请以实际项目为准。如果插件没有被加载启动时会看到类似“未找到模块”的警告。解决办法是检查插件目录是否存在、__init__.py是否存在、路径是否匹配。7. 启动运行与效果验证完成上述步骤后进行联调。7.1 启动 NoneBot2在项目根目录执行nb run如果一切正常你会看到类似输出OneBot V11 适配器已加载 运行在 ws://127.0.0.1:2370/onebot/v11/ws说明 NoneBot2 已启动并在 2370 端口监听。如果看到端口被占用可以配置环境变量PORT或HOST调整监听地址。7.2 启动 OneBot 服务端接着启动之前安装的 OneBot 实现。它启动后会主动连接ws://127.0.0.1:2370/onebot/v11/ws。连接成功后NoneBot2 日志会出现一条正向连接或反向连接成功的信息。从材料看这类工具最常出现的问题就是“两边都启动了但没有连接上”。先确认 OneBot 实现填写的地址和 NoneBot2 启动时显示的地址完全一致再检查是否有访问令牌不一致的情况。7.3 群里测试登录机器人 QQ 小号把它拉进测试群然后执行以下步骤在群里发机器人 你好预期机器人回复一段正常的打招呼内容。继续发机器人 用一句话解释什么是 TCP 三次握手预期机器人能基于上下文完成回答。如果收到回复说明整条链路已经打通QQ 消息 - OneBot 实现 - NoneBot2 - DeepSeek API - 反向一路回到群里。7.4 如何判断成功与失败判断标准如下现象结论机器人无响应NoneBot2 日志中没有任何事件大概率 OneBot 实现没有连上 NoneBot2OneBot 有连接日志但插件没触发检查to_me()规则是否被满足是否真的 了机器人插件触发了但回复报“API 调用失败”检查 API Key、网络连通性、余额机器人回复很慢超过 10 秒可能是 DeepSeek API 响应慢也可能是消息通道超时设置太短8. 常见问题与排查思路这一段是实践中最常踩坑的地方。我把高频问题整理成一张表问题现象可能原因排查方式解决方案机器人完全不回复OneBot 实现未连接成功查看 NoneBot2 窗口是否有 WS 连接日志核对反向 WS 地址和 token重启两边只有被 不回复私聊正常to_me()规则限制了群聊触发方式检查群消息是否真的包含 机器人群内手动 机器人或改用管理员白名单指令报错 401 UnauthorizedAPI Key 无效或未加载打印环境变量是否读取成功检查.env文件路径确认 Key 正确报错 429 Too Many Requests请求频率超出限制查看 DeepSeek 开放平台的余额和限流信息增加请求间隔减少并发降低max_tokens机器人回复非常慢模型推理耗时较长抓取 API 耗时日志改用deepseek-chat模型限制上下文长度机器人会乱回消息to_me()规则不生效或模块未加载检查插件是否被加载确认插件目录被load_plugins正确加载私聊上下文串群session_id 设计有问题查看 memory 的 key 结构群聊和私聊使用不同的 session_id 前缀机器人重启后失忆memory 存在内存中用 Redis 或文件持久化改为存储到数据库触发一次请求后机器人连续回复多条事件响应器匹配了多条规则检查是否注册了多个相同事件响应器只保留一个on_regex响应器并使用blockTrue当你遇到问题时不要急着改代码。第一个动作应该是看日志。NoneBot2 的日志会打印事件内容、插件加载情况、异常堆栈大部分问题都能在日志里找到线索。另一个常见误区是把问题归结为“代码写错了”实际上往往是“分隔符没对上”或“环境变量没读取到”。建议在插件入口加一行临时日志打印 API Key 是否存在不要打印完整 Key帮助快速定位。9. 成本控制与权限管理最佳实践把机器人跑通只是开始真正要在群里稳定运行还需要关注成本和权限。9.1 控制 API 调用成本DeepSeek API 按 token 计费。如果群里很多人高频使用费用会增长得非常快。建议在代码里做三层控制设置max_tokens上限避免模型生成长篇大论。控制上下文长度只保留最近若干条消息而不是全部历史。增加单用户或单群的冷却时间比如 5 秒内不允许重复请求。冷却时间可以加一个简单装饰器或前置检查import time last_call_time {} def check_cool_down(session_id: str, seconds: int 5) - bool: now time.time() if session_id in last_call_time and now - last_call_time[session_id] seconds: return False last_call_time[session_id] now return True9.2 权限分级你的 QQ 群可能不是所有人都适合直接调用 AI。比如学生群、兴趣群你希望只有管理员能触发某些指令。NoneBot2 有Permission机制可以按超级用户限制from nonebot.permission import SUPERUSER chat on_regex(r.*, ruleto_me(), permissionSUPERUSER, priority10, blockTrue)这样只有配置的超级用户可以触发机器人其他人在群里 机器人不会得到响应。如果你的目标是全员可用就不用加这个权限参数。9.3 日志与异常告警真实群聊场景下总会出现 DeepSeek API 超时、返回空内容、群里有人恶意刷消息等异常。建议使用logger.error记录详细错误。对 API 异常设置重试次数但不是无限重试。不要在生产环境打印完整的对话内容避免隐私泄露。9.4 遵守平台规则与合规使用这一点必须强调。任何 QQ 机器人项目都有平台风控要求接入时应注意使用专用小号避免影响正常账号。不要高频发送消息不要刷屏。不要收集用户隐私数据。不要利用机器人发送违法违规内容。群内使用时应获得群主或群成员同意避免被投诉。如果机器人账号被限制或封禁最常见的诱因是短时间内高频发送消息、异地登录、行为模式异常。接入过程中保持正常节奏优先保证链路可控。10. 给新手的最后建议回到开头的问题为什么这条路线值得实践因为它把一个“看起来涉及复杂协议”的事情拆成了三次独立的技术选择选对协议标准、选对机器人框架、选对模型调用方式。每一步都有大量成熟生态支撑。如果你是从零开始我的建议是先不要追求功能丰富。把本文的代码跑通让机器人能在群里回复一句话这已经是一个完整的闭环。然后你再逐步加多轮记忆、加权限控制、加图片回复、加联网搜索、加定时任务。NoneBot2 的插件机制决定了后续每加一个功能都只是在src/plugins下新增一个目录而不是改动原有代码。从热搜词看DeepSeek 接入各种 IM 工具是当前开发者非常关注的方向。这套“OneBot 协议 机器人框架 LLM API”的组合同样可以推广到企业微信、Telegram、飞书等其他平台只是适配器不同。你现在花费在这篇文章上的时间本质上是在为后面的整个 LLM Agent 应用打基础。如果你在配置过程中被某个步骤卡住优先按“日志 - 地址 - 权限”三个维度去排查而不是怀疑代码有问题。多数接入失败都发生在通信层而不是模型层。先把这个最小链路跑通后面的扩展都是水到渠成的事。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价