1. 为什么要在 Docker 里折腾 OpenClaw-QQBot
OpenClaw 是一个可以自托管的智能体网关,QQBot 是腾讯官方开放的机器人通道,两者接上之后,你就能在 QQ 里直接和一个带大模型能力的机器人对话。而 Docker 部署的好处是环境隔离、迁移方便,尤其适合在 CentOS 这类服务器上跑长期服务。这篇记录聚焦的是 OpenClaw-QQBot 在 Docker 环境下的完整测试流程,核心围绕 python3 插件加载和统一 Key/API 通道配置展开。
适合谁看?如果你已经用 Docker 跑起了 OpenClaw,想接 QQ 机器人,同时希望所有模型请求走一个统一的 API 通道(而不是每个插件单独配 Key),那这篇就是给你写的。我会给出可复制的 config.toml 与 settings.json 骨架、插件目录挂载示例,以及启动后验证消息回传和排查报错的具体动作。整个过程我实测下来,最容易卡住的地方不是插件安装,而是 python3 运行时缺失和 API 通道地址写错,这两点后面会重点讲。
先明确一个前提:本文假设你已经有一个运行中的 OpenClaw Docker 容器。如果你还没部署,可以先按官方文档把基础服务跑起来,再回来接 QQBot。下面所有命令都可以直接复制,路径按你自己的实际情况调整。
2. TaoToken 前置:统一 Key 与 API 通道
在接 QQBot 之前,先把模型通道准备好。TaoToken 提供的是统一 API 入口,你只需要一个 Key,就能在 OpenClaw 里调用多种模型,不用为每个插件单独申请和轮换密钥。这对 QQBot 这种需要长期在线的场景特别友好——Key 集中管理,出问题只查一个地方。
官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api 。注意 API 地址后面不加任何 UTM 参数,配置里写干净的这个就行。
你需要做的准备只有两步:第一,在控制台创建一个 API Key;第二,确认你要用的模型名称。Key 的创建入口在 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,创建后复制保存,后面填进 config.toml。如果你还不确定用哪个模型,可以先去模型对话页面试一下效果,地址是 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite ,试好再把模型名写进配置。
这里有个细节:OpenClaw 的模型配置通常分两层,一层是全局的 provider 定义(base_url + api_key),一层是具体 agent 或 channel 引用的模型名。QQBot 插件本身不直接持有 Key,它走的是 OpenClaw 的模型路由。所以统一通道的意义就在于,你只改一处 provider,所有通道都生效。
注意:API Key 不要写进会提交到 Git 的文件里。测试阶段可以用环境变量或单独的 secrets 文件,正式环境建议用 Docker secrets 或挂载只读配置文件。
3. 可复制配置:config.toml 与 settings.json 骨架
这一节是全文的核心,直接给骨架。先看目录结构,我习惯把配置和插件分开挂载:
# 宿主机目录结构示例 /opt/openclaw/ ├── config/ │ ├── config.toml │ └── settings.json ├── plugins/ │ └── qqbot/ └── data/Docker 启动时这样挂载:
docker run -d \ --name openclaw \ -p 18789:18789 \ -v /opt/openclaw/config:/app/config \ -v /opt/openclaw/plugins:/app/plugins \ -v /opt/openclaw/data:/app/data \ openclaw/openclaw:latest然后是 config.toml 骨架。重点是 provider 段和 channel 段:
# /opt/openclaw/config/config.toml [provider.taotoken] base_url = "https://taotoken.net/api" api_key = "sk-你的Key" default_model = "你的模型名" [gateway] port = 18789 host = "0.0.0.0" [channel.qqbot] enabled = true token = "QQBot的Token" plugin = "qqbot" agent = "default" [agent.default] provider = "taotoken" model = "你的模型名" system_prompt = "你是一个简洁友好的助手。"settings.json 主要管插件加载路径和运行时参数:
{ "plugins": { "dir": "/app/plugins", "auto_load": true, "list": ["qqbot"] }, "runtime": { "python": "/usr/bin/python3", "timeout": 30 }, "logging": { "level": "info", "file": "/app/data/openclaw.log" } }两个文件的分工要清楚:config.toml 管通道和模型路由,settings.json 管插件目录和运行时。python3 路径写在 settings.json 的 runtime.python 里,如果容器里 python3 不在 /usr/bin 下,这里要改成实际路径,否则插件加载会直接失败。
4. python3 插件环境与 QQBot 安装
OpenClaw 的 QQBot 插件是 python3 写的,所以容器里必须有 python3 和 pip。很多精简镜像默认不带,这是第一个坑。先确认:
# 进入容器 docker exec -it openclaw sh # 查看 python3 版本 python3 --version如果没有输出或报 not found,就装。Alpine 系镜像用 apk:
apk update apk add --no-cache python3 py3-pip python3 --versionDebian/Ubuntu 系镜像用 apt:
apt update apt install -y python3 python3-pip python3 --version装完 python3 后,安装 QQBot 插件。如果你之前装过旧版,先卸载再装,避免版本冲突:
# 按需卸载旧插件 openclaw plugins uninstall qqbot openclaw plugins uninstall openclaw-qqbot # 安装最新版 openclaw plugins install @tencent-connect/openclaw-qqbot@latest安装完成后,确认插件目录里出现了 qqbot 相关文件:
ls -la /app/plugins/你应该能看到 qqbot 目录或对应的插件包。如果这里为空,说明插件没装到挂载目录里,检查 settings.json 的 plugins.dir 是否和挂载路径一致。
接下来是 QQBot 侧的绑定。去 QQ 机器人注册页面创建机器人,拿到 Token 后,用 channels add 命令绑定:
openclaw channels add --channel qqbot --token "你的QQBot Token"这条命令会把 Token 写进配置。执行完再启动网关:
openclaw gateway --port 18789启动日志里如果出现 qqbot channel loaded 和 provider taotoken ready,说明通道和模型都挂上了。
5. 验证请求与消息回传
配置写完不算完,得验证消息真的能回传。分三步走。
第一步,确认网关在监听:
curl -s http://127.0.0.1:18789/health返回 ok 或类似状态就说明服务活着。如果连不上,先查容器端口映射和 gateway.host 是否为 0.0.0.0。
第二步,直接测模型通道,绕过 QQBot,确认 TaoToken 这条链路通:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "你的模型名", "messages": [{"role": "user", "content": "你好"}] }'能返回正常内容,说明 Key 和模型名没问题。这一步很关键,因为如果这里就失败,QQBot 那边再怎么调都是白搭。
第三步,在 QQ 里给机器人发消息。发一句“你好”,观察两件事:QQ 里有没有回复,以及容器日志里有没有对应的请求记录:
docker logs -f openclaw正常的话,日志会先出现 qqbot message received,然后出现 provider request,最后是 response sent。如果只看到 received 没有 response,问题多半在模型通道;如果连 received 都没有,问题在 QQBot 绑定或 Token。
我试过在测试阶段把日志级别调到 debug,能看到更细的插件调用链:
{ "logging": { "level": "debug", "file": "/app/data/openclaw.log" } }改完重启容器生效。debug 日志会打印 python3 插件的加载路径和参数,排查路径错误特别有用。
6. 本篇常见错排查
下面这几个错,是我在测试 OpenClaw-QQBot 时实际踩到的,按出现频率排序。
python3 not found:容器里没装 python3,或者 settings.json 里的 runtime.python 路径不对。先which python3确认实际路径,再改配置。Alpine 装完通常在 /usr/bin/python3。
插件加载失败 plugin load error:多半是 plugins.dir 和实际挂载路径不一致。检查 docker run 的 -v 参数和 settings.json 里的 dir 是否指向同一个容器内路径。另外确认插件安装时用的用户有写权限。
QQBot Token 无效:channels add 时 Token 复制错了,或者 Token 已过期。重新去 QQ 机器人后台生成,再执行一次 add 命令覆盖。
消息发出无回复:先看日志有没有 provider request。如果没有,说明 agent 没绑定 provider,检查 config.toml 里 agent.default.provider 是否等于 provider.taotoken。如果有 request 但报 401,就是 Key 错了;报 404,就是 base_url 或模型名错了。
端口冲突:18789 被占用时网关起不来。换端口要同时改 config.toml 的 gateway.port 和 docker run 的 -p 映射,两处必须一致。
配置改了不生效:OpenClaw 不会热加载所有配置,改完 config.toml 或 settings.json 后要重启容器。养成改完就docker restart openclaw的习惯。
提示:排查时优先用 curl 直连 TaoToken API,把模型通道和 QQBot 通道解耦验证。这样能快速定位问题在哪一层,不用在日志里大海捞针。
如果你在接入过程中遇到通道配置或 Key 相关的问题,可以直接去 API Keys 页面核对密钥状态,地址是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。接入细节和参数说明可以查接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。如果你打算长期跑编码类或 Agent 类任务,Coding Plan 会更划算,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。想先验证模型效果再去配 QQBot,模型对话页面最直接:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。
最后补一个实用技巧:把 config.toml 里的 api_key 换成环境变量引用,Docker 启动时用 -e 传入,这样配置文件可以安全地放进版本管理。OpenClaw 支持${TAOTOKEN_API_KEY}这种写法,具体语法看你的版本,改完记得重启验证。