- 人工智能
- 大模型
- LLM 网关
- AI Agent
- 即时通讯
【免费下载链接】openclaw-zero-token
OpenClaw: Use All Major AI Models NO API Token! Claude/ChatGPT/Gemini/DeepSeek/Doubao/Grok/Qwen/Manus/Kimi
本指南围绕 OpenClaw 仓库中 Twitch 频道插件 展开,讲解如何把 Twitch(twitch.tv)聊天室接入 OpenClaw:从插件安装、Bot 账号凭据生成、单账号/多账号配置,到
requireMention、allowFrom、allowedRoles三层访问控制,再到 Token 自动刷新、消息收发链路、状态诊断与故障排查。读完本文,你可以独立完成一个"只看频道、只回指定用户/角色"的 Twitch 聊天机器人,并理解其底层实现原理。
一、插件概览:OpenClaw 的 Twitch 频道接入是什么
Twitch 频道插件是 OpenClaw 的官方频道插件之一,插件 ID 为twitch,包名为@openclaw/twitch。它通过 Twitch 的 IRC 聊天协议(底层基于 Twurple 的ChatClient),让 OpenClaw 以一个 Twitch 用户(Bot 账号)的身份加入指定频道并收发聊天消息。
从源码结构看,插件的核心入口是 twitch/index.ts,通过defineChannelPluginEntry注册了插件主体 twitch/src/plugin.ts,并声明了频道元信息(twitch/openclaw.plugin.json):
id: "twitch",频道类型为group(Twitch 聊天室按群组型频道处理,见 twitch/src/plugin.ts 中capabilities.chatTypes的声明);- 别名
twitch-chat,文档路径/channels/twitch; - 安装要求宿主版本
>=2026.3.28(见 twitch/package.json)。
插件在 OpenClaw 中承担的角色可以用 twitch/src/plugin.ts 中注册的适配器概括:
| 适配器 | 职责 |
|---|---|
outbound | 向 Twitch 频道发送文本/媒体消息(twitch/src/outbound.ts) |
actions | 向 Agent 暴露twitch工具动作(当前支持send,twitch/src/actions.ts) |
resolver | 通过 Twitch Helix API 把用户名/用户 ID 互相解析(twitch/src/resolver.ts) |
status | 汇总账号状态、探测连接、收集配置问题(twitch/src/status.ts、twitch/src/probe.ts) |
gateway | 启停账号对应的 Twitch 连接与消息监控(twitch/src/monitor.ts) |
setupWizard | 为 CLI 配置向导提供 Twitch 专属的交互式引导(twitch/src/setup-surface.ts) |
官方完整文档见 docs/channels/twitch.md。
二、安装插件
Twitch 以插件形式分发,不随核心安装包捆绑,需要单独安装。
2.1 从 npm 注册表安装
openclaw plugins install @openclaw/twitch2.2 从本地源码安装
从 git 仓库运行时,可以安装本地目录(本仓库中插件源码位于 twitch/ 目录,安装路径需指向你本地 checkout 的实际位置):
openclaw plugins install ./extensions/twitch2.3 通过 Onboarding 引导安装
在 OpenClaw 的初始化引导(Onboarding)流程中,直接选择Twitch并确认安装提示,即可自动拉取并安装该插件(对应 twitch/src/setup-surface.ts 中提供的twitchSetupWizard配置向导)。
三、凭据准备:创建 Bot 账号并生成 Token
Twitch 接入依赖一组 OAuth 凭据,官方文档给出如下步骤(详见 docs/channels/twitch.md):
- 创建专用 Bot 账号:为机器人单独注册一个 Twitch 账号(也可以复用已有账号),避免与个人账号混淆。
- 生成凭据:使用 Twitch Token Generator(
twitchtokengenerator.com):- 选择Bot Token类型;
- 确认勾选
chat:read与chat:write两个 scope——分别对应"读取聊天消息"与"发送聊天消息",两者缺一不可; - 复制生成的Access Token与Client ID。
- 查询自己的 Twitch 用户 ID:
allowFrom白名单使用的是数字用户 ID而非用户名,可通过 Twitch 用户名转 ID 的在线工具(如streamweasels.com/tools/convert-twitch-username-to-user-id)查询。 - 配置 Token(见下一节)。
- 启动 Gateway。
需要注意:Token Generator 生成的 Token 有效期只有数小时,且无法自动刷新,过期后需要重新生成。需要长期稳定运行的 Bot,建议走第四节介绍的"自建应用 + 自动刷新"方案。
四、最小配置:把机器人接进一个频道
4.1 最小单账号配置
在 OpenClaw 配置文件的channels.twitch下填入以下内容(配置格式为 JSON5):
{ channels: { twitch: { enabled: true, username: "openclaw", // Bot 的 Twitch 账号名(负责登录鉴权) accessToken: "oauth:abc123...", // OAuth Access Token(可加 oauth: 前缀,源码会自动规范化) clientId: "xyz789...", // Token Generator 生成的 Client ID channel: "vevisk", // 要加入的频道名(必填) allowFrom: ["123456789"], // (推荐)仅允许你自己的 Twitch 用户 ID }, }, }字段语义(源码 twitch/src/types.ts 的TwitchAccountConfig与之对应):
username:Bot 账号名,即"谁在登录";channel:要加入的哪个聊天室,与username是两个不同概念——Bot 可以以账号 A 的身份加入账号 B 的频道;clientId:OAuth 应用标识,缺失时无法建立连接(twitch/src/twitch-client.ts 中会直接抛出Missing Twitch client ID);channel为必填项(配置模式校验见 twitch/src/config-schema.ts,z.string().min(1))。
⚠️重要提醒:
requireMention默认值为true。请务必配置访问控制(allowFrom或allowedRoles),否则任何能进入该频道的用户都可以触发机器人响应。
4.2 通过环境变量提供 Token(仅默认账号)
除了写入配置文件,Token 也可以放到环境变量中:
OPENCLAW_TWITCH_ACCESS_TOKEN=oauth:abc123...源码 twitch/src/token.ts 明确了 Token 解析优先级:
- 配置文件中的账号级
accessToken(accounts.{id},或简化配置的顶层accessToken); - 环境变量
OPENCLAW_TWITCH_ACCESS_TOKEN(仅对 default 账号生效)。
即:配置优先,环境变量兜底;环境变量只作用于 default 账号。同时该文件会对 Token 做oauth:前缀规范化——缺少前缀时自动补上,已有则保留,因此两种写法都合法。
五、配置参数全解
综合 twitch/README.md 与源码 twitch/src/config-schema.ts,账号级配置项如下:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
username | string | 是 | Bot 的 Twitch 用户名 |
accessToken | string | 是 | 带chat:read/chat:write的 OAuth Access Token |
clientId | string | 是 | Twitch Client ID(来自 Token Generator 或自建应用) |
channel | string | 是 | 要加入的频道名 |
enabled | boolean | 否 | 是否启用该账号,默认true |
clientSecret | string | 否 | 用于自动刷新 Token(需配合refreshToken) |
refreshToken | string | 否 | 用于自动刷新 Token 的 Refresh Token |
expiresIn | number | 否 | Token 有效期(秒),供刷新逻辑计算 |
obtainmentTimestamp | number | 否 | Token 获取时间戳,供刷新逻辑计算 |
allowFrom | string[] | 否 | 用户 ID 硬白名单(最安全) |
allowedRoles | string[] | 否 | 角色白名单:"moderator" \| "owner" \| "vip" \| "subscriber" \| "all" |
requireMention | boolean | 否 | 是否要求 @提及才触发回复,默认true |
responsePrefix | string | 否 | 该账号/频道的外发回复前缀覆盖 |
Provider 层(channels.twitch顶层)配置项:
| 参数 | 说明 |
|---|---|
enabled | 是否在 Gateway 启动时拉起 Twitch 连接 |
name/markdown | 频道名称与 Markdown 处理选项(通用频道配置) |
username/accessToken/clientId/channel | 简化单账号模式下的账号字段(隐式生成 default 账号) |
accounts.<accountName> | 多账号模式下,每个账号名对应的完整账号配置 |
配置模式由 twitch/src/config-schema.ts 中的TwitchConfigSchema统一约束:它由"简化单账号 Schema"与"多账号 Schema"组成 union,两种模式互斥、结构清晰。
六、单账号与多账号:两种配置模式的合并规则
6.1 简化单账号模式
把账号字段直接写在channels.twitch顶层,源码会据此隐式生成名为default的账号(DEFAULT_ACCOUNT_ID = "default",见 twitch/src/config.ts)。这也是上文最小配置的写法。
6.2 多账号模式(进阶)
需要在多个频道同时运行机器人时,改用accounts对象按账号名组织:
{ channels: { twitch: { enabled: true, accounts: { default: { username: "openclaw", accessToken: "oauth:abc123...", clientId: "xyz789...", channel: "vevisk", }, channel2: { username: "openclaw", accessToken: "oauth:def456...", clientId: "uvw012...", channel: "secondchannel", }, }, }, }, }注意事项:
- 每个账号需要各自的 Token(一个 Token 对应一个频道,不可跨频道复用);
getAccountConfig(twitch/src/config.ts)实现了一套合并规则:default 账号优先读取顶层字段,顶层字段优先于accounts.default中的同名项;非 default 账号只从accounts对象读取;listAccountIds会把"顶层隐式 default"与"显式 accounts"合并去重(对应测试见 twitch/src/config.test.ts)。
七、访问控制:三层防护的判定逻辑
这是本插件最重要的安全机制。源码 twitch/src/access-control.ts 中的checkTwitchAccessControl按如下优先级依次判定:
requireMention(默认 true):消息必须包含@bot用户名(通过@(\w+)正则提取提及,忽略大小写)才会放行;allowFrom(硬白名单):若配置了该字段,只有命中用户 ID 的发送者才被允许。它是一票否决式白名单——一旦设置,未列出的用户一律拒绝;allowedRoles(角色白名单):仅在未设置allowFrom时生效。发送者需至少命中一个角色;"all"表示任何人。
三种访问控制配置示例:
// 1) 仅 @提及 触发,且只允许指定用户 ID(最安全) { channels: { twitch: { accounts: { default: { allowFrom: ["123456789", "987654321"], }, }, }, }, } // 2) 按角色限制 { channels: { twitch: { accounts: { default: { allowedRoles: ["moderator", "vip"], }, }, }, }, } // 3) 关闭 @提及 要求(响应频道内所有消息,需配合白名单使用) { channels: { twitch: { accounts: { default: { requireMention: false, }, }, }, }, }角色判定依赖消息携带的发送者元数据:isMod、isOwner(主播)、isVip、isSub,这些由 twitch/src/twitch-client.ts 从 Twitch IRC 消息的 userInfo 中提取。对应的行为测试见 twitch/src/access-control.test.ts,覆盖了"默认 requireMention 为 true""未提及被拒绝""白名单拦截"等关键场景。
为什么用用户 ID 而不是用户名?用户名可以更改,存在被仿冒的风险;用户 ID 是 Twitch 分配的永久标识,不可变更。
八、Token 刷新:短命 Token 的长期运行方案
8.1 两种认证提供者
twitch/src/twitch-client.ts 的createAuthProvider会根据配置自动二选一:
- StaticAuthProvider(默认):未提供
clientSecret时使用,Token 过期后需要手动重新生成; - RefreshingAuthProvider(自动刷新):提供了
clientSecret时启用,配合refreshToken可自动续期,并通过onRefresh/onRefreshFailure事件输出刷新日志。
8.2 开启自动刷新的前提
Token Generator 生成的 Token不支持自动刷新;要实现自动刷新,需要:
- 在 Twitch Developer Console(
dev.twitch.tv/console)自建一个应用,获取clientSecret; - 通过 OAuth 流程获取
refreshToken; - 写入配置:
{ channels: { twitch: { accounts: { default: { clientSecret: "your_client_secret", refreshToken: "your_refresh_token", expiresIn: 14400, // Token 有效期(秒),可选 obtainmentTimestamp: 1706092800000, // 获取时间戳,可选 }, }, }, }, }提供clientSecret与refreshToken后,客户端会在 Token 过期前自动刷新并记录日志(形如Access token refreshed for user 123456 (expires in 14400s));若只配置了clientSecret而没有refreshToken,日志会提示token refresh disabled (no refresh token)(该问题也会被 twitch/src/status.ts 收集为配置告警)。
九、消息链路:从入站监听到出站回复
一条消息从 Twitch 聊天室到 Agent 回复的完整链路,由 twitch/src/monitor.ts 驱动:
- 连接:Gateway 启动账号时调用
monitorTwitchProvider,通过client-manager-registry(twitch/src/client-manager-registry.ts)获取/创建TwitchClientManager,建立ChatClient连接(开启rejoinChannelsOnReconnect断线重连加入频道、requestMembershipEvents请求成员事件); - 过滤:忽略机器人自己发的消息;对每条消息执行访问控制检查(见第七节);
- 路由与封装:
resolveAgentRoute把频道消息路由到对应 Agent;每个账号映射到独立的会话 Keyagent:<agentId>:twitch:<accountName>,实现确定性路由——回复永远回到 Twitch 频道; - 会话记录:记录入站会话与消息上下文(
From: twitch:user:{userId}、To: twitch:channel:{channel}等); - 回复管线:调用核心回复管线生成回复,通过
deliver回调把回复送回 Twitch; - 出站发送:回复先经
stripMarkdownForTwitch剥离 Markdown(Twitch 聊天不支持 Markdown,twitch/src/utils/markdown.ts 会移除图片/链接/粗斜体/代码块/标题/列表并把换行替换为空格),再经client.say()发出。
出站关键限制(见 twitch/src/outbound.ts):
- 单条消息 500 字符上限(Twitch 聊天协议硬限制),超长内容由词边界分块器
chunkTextForTwitch自动分块发送; - 分块前先剥离 Markdown,避免把 Markdown 标记截断成半截语法;
- 不自行限速,依赖 Twitch 内置的速率限制;
- 媒体消息(
sendMedia)不支持直接上传,而是把媒体 URL 作为文本附带发送。
Agent 工具动作(twitch/src/actions.ts):Agent 可以通过twitch工具执行send动作主动发消息,参数为message(必填)与to(可选,覆盖账号默认频道):
{ action: "twitch", params: { message: "Hello Twitch!", to: "#mychannel", }, }十、状态监控与故障排查
10.1 诊断命令
接入遇到问题时,先运行诊断命令:
openclaw doctor openclaw channels status --probe--probe会触发 twitch/src/probe.ts 的probeTwitch:插件会临时用StaticAuthProvider建立一个测试性ChatClient连接,验证 Token 是否有效、能否登录,并在超时(timeoutMs)内返回connected、channel、elapsedMs等结果。
10.2 状态告警
twitch/src/status.ts 的collectTwitchStatusIssues会自动检查并上报以下常见问题:
| 问题 | 修复建议 |
|---|---|
账号未正确配置(缺username/accessToken/clientId) | 补齐必填字段 |
| 账号被禁用 | 设置enabled: true |
缺clientId | 从 Twitch Developer Portal 获取并填写 |
Token 带oauth:前缀 | 无碍,源码会自动规范化剥离 |
有clientSecret但无refreshToken | 自动刷新不生效,两者需成对提供 |
allowFrom为空数组 | 移除该字段或填入用户 ID,或用allowedRoles |
allowedRoles: ["all"]又同时配了allowFrom | 二选一,避免意图冲突 |
| 账号从未成功连接 | 启动 Twitch Gateway,检查连接日志 |
| 连接运行超过 7 天 | 考虑重启连接刷新(长连接 Token 可能过期) |
10.3 常见问题速查
机器人不响应消息:
- 检查访问控制:确认自己的用户 ID 在
allowFrom中;临时排障可移除allowFrom并设置allowedRoles: ["all"]; - 确认 Bot 确实加入了
channel指定的频道。
连接失败 / 认证错误:
- 确认
accessToken是 OAuth Access Token(通常以oauth:开头,前缀可选); - 确认 Token 具备
chat:read与chat:writescope; - 若使用自动刷新,确认
clientSecret与refreshToken均已配置。
自动刷新不生效:检查日志是否出现token refresh disabled (no refresh token)——此时需要同时补齐clientSecret与refreshToken。
十一、安全与运维建议
综合官方文档 docs/channels/twitch.md 与本插件实现,长期运行建议如下:
- Token 视同密码:切勿把
accessToken、clientSecret、refreshToken提交进 git; - 长期 Bot 务必启用自动刷新:否则 Token 数小时即过期;
- 访问控制优先用用户 ID 白名单(
allowFrom),而不是用户名; - 最小化授权 scope:只申请
chat:read与chat:write,不要为 Bot 申请不必要的权限; - 监控日志:关注 Token 刷新事件与连接状态(每次刷新、每次连接/断连都有日志输出);
- 卡住时重启 Gateway:确认没有其他进程占用会话后重启,多数异常可恢复。
十二、完整配置示例(进阶)
以下是一个集成了多账号、自动刷新、双重访问控制的完整示例(同时展示顶层 provider 项与accounts.default的合并用法):
{ channels: { twitch: { enabled: true, username: "openclaw", accessToken: "oauth:abc123...", clientId: "xyz789...", channel: "vevisk", clientSecret: "secret123...", refreshToken: "refresh456...", allowFrom: ["123456789"], allowedRoles: ["moderator", "vip"], accounts: { default: { username: "mybot", accessToken: "oauth:abc123...", clientId: "xyz789...", channel: "your_channel", enabled: true, clientSecret: "secret123...", refreshToken: "refresh456...", expiresIn: 14400, obtainmentTimestamp: 1706092800000, allowFrom: ["123456789", "987654321"], allowedRoles: ["moderator"], }, }, }, }, }至此,从安装、凭据、配置、访问控制到消息链路与排障,一条完整的 Twitch 接入路径已经打通。如果想深入阅读实现细节,可以继续查看 twitch/src/config.ts(账号解析)、twitch/src/access-control.ts(访问控制)、twitch/src/twitch-client.ts(连接与鉴权)以及对应的测试文件 twitch/src/config.test.ts、twitch/src/access-control.test.ts。
- 人工智能
- 大模型
- LLM 网关
- AI Agent
- 即时通讯
【免费下载链接】openclaw-zero-token
OpenClaw: Use All Major AI Models NO API Token! Claude/ChatGPT/Gemini/DeepSeek/Doubao/Grok/Qwen/Manus/Kimi
相关推荐
OpenClaw Twitch 频道插件完全指南:安装、账号配置、访问控制与聊天消息收发
OpenClaw Twitch 频道插件完全指南:安装、账号配置、访问控制与聊天消息收发 OpenClaw 通过 @openclaw/twitch 频道插件以
人工智能大模型LLM 网关AI Agent即时通讯OpenClaw Twitch 聊天集成指南:插件安装、凭证配置、访问控制与消息收发全解析
OpenClaw Twitch 聊天集成指南:插件安装、凭证配置、访问控制与消息收发全解析 本文围绕 OpenClaw 的 Twitch 聊天渠道插件( @op
人工智能大模型LLM 网关AI Agent即时通讯ClickClack 频道插件接入 OpenClaw:安装、配置、会话讨论与消息治理实战指南
ClickClack 频道插件接入 OpenClaw:安装、配置、会话讨论与消息治理实战指南 ClickClack 是 OpenClaw 官方渠道插件,让 Op
AI 应用AI Agent交互助手后端即时通讯网关
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考