用 AstrBot + NapCat 搭建可扩展的 DeepSeek QQ 机器人
为什么要把 AstrBot 和 NapCat 拆开用?
很多人想给 QQ 账号接个 AI,但一上来就卡在“消息收不到”或“AI 不回话”。其实问题往往出在职责没分清。

NapCat 的任务很单一:登录你的 QQ 账号,然后通过 OneBot v11 协议把消息吐出来。它不关心你用什么模型、要不要人设、有没有插件——它只负责让 QQ 在线,并提供标准接口。
AstrBot 则是真正的“大脑”:它监听 OneBot 消息,决定是否调用大模型(比如 DeepSeek),是否启用特定人格,要不要触发插件或 MCP 工具,最后把结果发回去。
这种拆分的好处是排查快。QQ 登不上?查 NapCat。收不到消息?看 OneBot 链路通不通。AI 不说话?检查模型配置。功能没生效?回 AstrBot 插件或 MCP 设置。各管一段,互不干扰。
用 Docker 一键拉起两套服务
不管是 Windows 还是 Linux,推荐直接用 Docker Compose 启动整套环境。作者提供了现成的 astrbot.yml 文件,里面定义了两个容器:napcat 和 astrbot,分别暴露 6099 和 6185 端口。
在 Windows 上,打开 PowerShell 执行:
irm https://gitee.com/jun-wan/script/raw/master/astrbot/deploy_astrbot.ps1 | iexLinux 用户则可以手动创建目录并下载配置:
mkdir astrbot && cd astrbot
wget https://raw.githubusercontent.com/NapNeko/NapCat-Docker/main/compose/astrbot.yml
sudo docker compose -f astrbot.yml up -d
启动后先别急着配 QQ,先确认两个 Web 页面都能打开:

- AstrBot 管理后台:
http://localhost:6185 - NapCat 控制台:
http://localhost:6099

这两个页面能访问,说明 Docker 层已经跑通。这是后续所有操作的基础。

NapCat 登录 QQ 账号

访问 http://localhost:6099,首次登录需要 Token。这个 Token 在容器启动日志里会打印出来。如果日志被清了,可以用以下命令重新获取:

# Windows PowerShell
docker logs napcat | Select-String "Token"

# Linux
docker logs napcat | grep "Token"
复制 Token 填入 Web 页面,然后用你准备作为机器人的 QQ 账号扫码登录。这一步完成后,NapCat 就真正拥有了一个在线的 QQ 身份,并可通过 OneBot 接口被外部调用。

注意:QQ 安全机制可能弹出设备锁或异地登录提醒,需手动在手机 QQ 上确认。建议使用小号测试,避免主号被限制。

让 AstrBot 接收 NapCat 的消息

打开 AstrBot 后台 http://localhost:6185,默认账号密码都是 astrbot。首次登录会强制修改密码,改完后重新登录。

进入【机器人】→【创建机器人】,选择“QQ个人号”,启用后保存。如果提示安全警告,本地测试可选“无视并继续”。

关键验证来了:用另一个 QQ 账号给机器人账号发一条消息(比如“你好”),然后回到 AstrBot 后台查看【平台日志】。如果日志里出现了这条消息,说明 QQ → NapCat → AstrBot 的链路已经打通。

这一步必须成功,否则后面所有 AI 功能都是空谈。如果收不到消息,检查 NapCat 是否在线、AstrBot 是否正确配置了 OneBot 地址(默认应为 http://napcat:6099,因为 Docker 内部网络已自动解析)。

接入 DeepSeek 大模型
现在让机器人真正“会说话”。先去 DeepSeek 平台 创建 API Key。进入 API Keys 页面,点击“创建”,记下生成的密钥(只显示一次)。
回到 AstrBot,进入【模型提供商】→【新增】,选择 DeepSeek,填入 API Key 并保存。保存后点击【测试】,如果返回“测试成功”,说明模型连接正常。
再用测试 QQ 发条消息,比如“今天天气怎么样?”。如果机器人能回复,就证明 AstrBot → DeepSeek → 回复 QQ 的闭环已建立。
这里有个细节:AstrBot 默认使用 deepseek-chat 模型。如果你有更高权限,也可以在配置里指定 deepseek-coder 或其他变体,但普通用户用默认即可。
自定义机器人“性格”:人格设定
默认回复太像客服?AstrBot 支持通过“人格设定”改变系统提示词。进入【更多功能】→【人格设定】,新建一个人格,比如叫“猫娘”,提示词写:
你现在是一只可爱的猫娘,说话带“喵~”,喜欢撒娇,但也会认真回答问题。
保存后,在 QQ 聊天窗口输入:
/persona 猫娘再发消息,机器人就会用新风格回复。查看所有人格用 /persona list,切换后建议执行 /reset 清空上下文,避免旧对话影响新人格表现。
作者还提供了一份预设人设包(123云盘链接),包含多种角色模板,适合不想自己写提示词的用户。
回复太长?开启流式分段
大模型经常一口气输出几百字,不适合 QQ 聊天场景。AstrBot 支持流式回复,把长文本拆成多条消息发送。
这个功能需要修改配置文件。进入 Docker 容器或挂载目录,找到 config.json,将 stream_mode 设为 true,然后重启 AstrBot 容器。之后的回复就会自动分段,体验更自然。
插件:给机器人加具体功能
人格管“怎么说话”,插件管“能做什么”。AstrBot 内置插件市场,搜索“音乐”就能找到点歌插件。
安装时建议先做 GitHub 加速节点测试,选延迟低的源。装好后,在 QQ 输入:
/点歌 恋人机器人会返回歌曲卡片,点击可直接播放。这类插件本质是封装好的 API 调用,适合高频、固定场景的功能扩展。
MCP:让 AI 调用外部工具
插件是“预设动作”,MCP(Model Context Protocol)则是“动态工具调用”。它允许大模型在对话中自主决定是否调用外部服务。
文中以 12306-mcp 为例。先在 ModelScope 找到该 MCP 服务,复制其配置:
{
"mcpServers": {
"12306-mcp": {
"command": "npx",
"args": ["-y", "12306-mcp"]
}
}
}
粘贴到 AstrBot 的【MCP】→【新增服务器】,测试通过后保存。然后在 QQ 直接问:“查一下北京到上海明天的高铁”。

如果配置正确,机器人会调用 12306 接口,返回车次、时间、余票和价格。这比插件更灵活——用户不用记命令,自然语言提问即可触发工具。

远程管理:用 cpolar 暴露后台

机器人跑在家里的 Windows 主机上,出门后想改配置怎么办?这时候才需要内网穿透。

cpolar 的作用只有一个:把本地 6185 端口映射到公网。先下载安装 cpolar,注册账号后访问 http://127.0.0.1:9200 登录 Web UI。

编辑默认的 website 隧道,把本地端口改成 6185,协议选 HTTP。保存后,在【在线隧道列表】会看到一个随机域名(如 xxx.cpolar.top)。用这个地址就能在外网访问 AstrBot 后台。

但随机域名每天会变。如果要长期使用,去 cpolar 后台【保留二级子域名】,比如申请 astrbot,地区选 China Top。然后回到隧道设置,把域名类型改成“二级子域名”,填入 astrbot。更新后,公网地址就固定为 https://astrbot.cpolar.top(实际前缀可能不同)。

注意:cpolar 只穿透管理页面,QQ 消息收发完全依赖 NapCat 和 AstrBot 的本地通信,不受影响。不要试图把 NapCat 的 6099 也暴露出去——没必要且增加风险。

整条链路总结

从零到可远程管理的 AI QQ 机器人,完整路径是:

- Docker 启动 AstrBot(6185)和 NapCat(6099)
- NapCat 用 Token 登录 Web 控制台
- QQ 扫码完成账号在线
- AstrBot 创建 QQ 个人号机器人
- 用测试消息验证消息接收
- 配置 DeepSeek API Key 并测试
- 实际对话确认 AI 回复
- 设置人格并用
/persona切换 - 启用流式回复改善体验
- 安装点歌插件验证功能扩展
- 添加 12306 MCP 实现工具调用
- 用 cpolar 随机域名临时访问后台
- 保留二级子域名实现长期远程管理

这套方案的价值不在“一键变 AI”,而在清晰的分层:NapCat 管 QQ 连接,AstrBot 管逻辑和扩展,DeepSeek 提供智能,cpolar 只解决远程运维。每层独立验证,出问题时不会手忙脚乱。

对于想深入定制的开发者,AstrBot 还支持自定义插件开发、多模型路由、上下文管理等高级功能。但对大多数用户来说,按上述步骤走通基础链路,已经能获得一个稳定、可扩展的 AI 助手。




























