X / Twitter
X 插件将对你机器人账号的提及转换为代理会话,并将代理的回答作为公开回复发布。默认情况下,只有允许列表中的作者才能触发回复。除非启用访客模式,否则未知作者会被静默丢弃;他们不会收到配对提示。
每个 X 会话都是由其 conversation_id 标识的群线程。代理会接收触发提及,以及可用的祖先帖子、会话帖子和引用帖子。原始提及仍然是用户可见的消息。不支持私信、原始帖子、点赞、关注以及媒体上传。
设置¶
该插件随包含 extensions/x 的构建版本一起捆绑提供。要从本地检出将其添加到 OpenClaw 2026.9.8 安装中:
使用 X 机密 OAuth2 应用,并授权机器人账号具有 tweet.read tweet.write users.read offline.access 权限。保留其客户端 ID、客户端密钥和用户上下文刷新令牌。插件使用 HTTP Basic 客户端身份验证刷新访问令牌。可选的独立仅应用 Bearer 令牌可启用 Activity API。
X 在签发访问令牌时可能会轮换刷新令牌。插件将最新令牌保存在私有的、由 worker 支持的插件状态(x.oauth)中,以便在重启后仍然可用。更改配置的刷新令牌种子会开始新的令牌谱系。此存储不保证静态加密;请将 Gateway 的状态目录及其备份作为凭据加以保护。
设置机器人的数字用户 ID 和用户名,然后在 allowFrom 中添加至少一个维护者的数字 X 用户 ID:
{
channels: {
x: {
enabled: true,
userId: "123456789",
username: "example_bot",
clientId: "example-x-client-id",
clientSecret: { source: "env", provider: "default", id: "X_CLIENT_SECRET" },
refreshToken: { source: "env", provider: "default", id: "X_REFRESH_TOKEN" },
bearerToken: { source: "env", provider: "default", id: "X_BEARER_TOKEN" },
allowFrom: ["987654321"],
groupPolicy: "allowlist",
dmPolicy: "disabled",
events: { mode: "auto", pollSeconds: 60 },
threadContext: { maxPosts: 50 },
costLimits: { dailyUsd: 100, monthlyUsd: 1000, cycleStartDay: 1 },
},
},
bindings: [{ agentId: "main", match: { channel: "x" } }],
}
替换示例 ID 和用户名。使所引用的环境变量对 Gateway 可用。省略 bearerToken 可在不使用 Activity API 的情况下使用轮询。所有三个机密字段也接受明文或受支持的 SecretRef 输入。
运行 openclaw config validate 和 openclaw channels status。从允许列表中的账号在帖子中提及机器人。成功的一轮会在该帖子下方生成一条公开回复。常规 通道绑定 选择代理和会话;插件不会覆盖会话范围。
对于多个机器人,请将特定于账号的值放在 channels.x.accounts.<accountId> 下。根字段是共享默认值;默认账号 ID 为 default。
公开工作会话¶
设置 channels.x.accounts.<accountId>.autoPublishWorkSessions: true(或共享根默认值 channels.x.autoPublishWorkSessions),以发布由已准入的维护者提及直接生成的全新、隔离的可见工作会话。访客提及仍仅限于隐藏助手,并且无法发布工作会话。此功能默认关闭。它会在相同的规范 /chat 链接上将该子会话暴露给匿名读者;它不会更改 Team 协作权限。仅对旨在公开其工作的代理启用此功能。
发布需要配置仅应用 bearerToken。在准入之前,插件使用仅应用身份验证查找所提供线程上下文中的每个帖子,并要求明确的 protected: false 作者元数据。缺失、已编辑、受保护、被扣留或不可用的帖子以及查找失败会拒绝自动发布。永久链接或成功的用户上下文查找并不是公开受众的证明。验证读取共享该账号的 X API 预算;预算不足会拒绝发布,而不会绕过成本限制。
该权限仅属于该传入调用:它不会存储在 X 会话上,不会被孙代会话继承,也不会被接受在模型生成的生成参数中。分支、私有/草稿会话、隐身会话和现有会话无法自动发布。更改账号配置或允许列表会使进行中的发布权限失效。创建所有者会在子会话的第一轮之前与其一起提交公开授权,并且生成回执仅对已提交的授权报告 publicRead。没有该回执的链接会被标记为需要登录。此通道需要实时进程内 Gateway;它不会降级为会丢失调用权限的传输方式。
手动发布仍受现有创建者/管理员共享控制管理。任何 X 身份都不会提升为 Team 个人资料或管理员。
管理允许列表¶
以管理员身份在控制 UI 中打开 X 回复。该页面显示配置 allowFrom 条目和通过页面添加的用户的生效并集。添加用户名以将其解析为稳定的数字 X 用户 ID。存储的条目会保留解析后的用户名、显示名称、添加操作者和时间戳。从页面中删除存储的条目;配置条目是只读的,必须从配置中删除。
该页面还显示该账号今天和当前计费周期的预计 X API 支出及其限制。选择 刷新 以更新只读总计。相同的支出快照包含在 x.allowlist.list 中。
本地链接安装使用 自定义插件 UI 设置。启用 设置 → 实验室 → 自定义插件 UI,然后使用 Gateway 通过 HTTPS 或受信任回环提供的控制 UI。捆绑安装不需要该设置。
Gateway 方法 x.allowlist.list、x.allowlist.add 和
x.allowlist.remove 需要 operator.admin。按数字 ID 授权发送者,
可以是 987654321 或 x:987654321;handle 应放在按 handle 添加的 UI 中,而不是
allowFrom 中。
guests.enabled 控制维护者允许列表之外的准入。旧版
groupPolicy: "open" 设置没有必要,也无法绕过访客开关。
groupPolicy: "disabled" 会关闭所有入站回合。dmPolicy 只接受
disabled。
访客模式¶
访客模式允许维护者允许列表之外的人提出仓库问题。 默认关闭。配置下面的前置代理后,使用 X replies 上的 Guest mode 开关,或运行:
openclaw config set channels.x.guests.enabled true
openclaw config set channels.x.guests.enabled false
配置监视器会重新加载 X 通道,而无需重启 Gateway。UI
使用仅限管理员的 x.guests.set 方法,并持久化相同配置。
对于显式配置的账号,开关会写入该账号的覆盖项;
否则写入 channels.x.guests.enabled。账号覆盖项会从通道根继承
其他访客设置。
访客获得核心 read、ls、sessions_spawn、sessions_yield 和
subagents 工具,并进一步受代理正常策略限制。他们可以
启动同一代理的隐藏助手。助手继承访客受限的
工具和仓库根目录;它们不能成为可见的工作会话,也不能指向
另一个代理。sessions_yield 等待助手完成,而 subagents
列出、等待或取消助手。
访客不能编辑文件、运行命令、浏览或抓取网页、使用 memory、
发送消息,或检查无关会话。可选的 guests.tools.allow
可以缩小五个默认工具的范围;空数组会禁用所有工具。
guests.tools.deny 优先。这两个设置都不能添加更强的工具。
隐藏助手需要一个声明会执行这些限制的主机。
旧版主机会保留 read 和 ls 默认值,即使它们报告相同的
OpenClaw 版本。X replies 设置页面在缺少助手
支持时会显示升级指引。在旧版主机上显式仅选择助手工具
会禁用所有访客工具;它不会恢复默认 read 工具。
每个访客提及都会获得独立的通道会话和被引用的 X 线程 上下文。它不会复用维护者的对话历史、权限模式、 根目录或已选技能。维护者保留其现有会话、 工具和工作会话回复。访客回复可以引用文档 URL,但 OpenClaw 绝不会在访客回复后附加工作会话链接。
仓库隔离¶
仅靠工具名称无法限制文件系统读取。将 X 前置
代理的 cwd 和 workspace 配置为 OpenClaw 克隆,并启用核心的
仅限工作区的文件保护。受支持的访客设置还会禁用已选
技能和 Docker/远程沙箱模式:技能目录和沙箱挂载是
核心中的显式读取例外,可能会暴露该克隆之外的文件。
例如,向你的 X 绑定所选的代理添加这些字段:
```json5 validate=false { workspace: "/srv/openclaw", cwd: "/srv/openclaw", skills: [], sandbox: { mode: "off" }, tools: { fs: { workspaceOnly: true } }, }
生效的文件系统设置是
`agents.entries.<agentId>.tools.fs.workspaceOnly`,回退到
`tools.fs.workspaceOnly`。当该设置缺失或为 false、技能已启用,或沙箱模式
处于活动状态时,X 插件会在线程展开前拒绝访客。通道状态会将所需修正报告为
`guestModeBlockedReason`;维护者提及照常继续。
访客模式还要求一种不能引导或中断活动
回合的队列模式。在启用访客之前设置通道覆盖项:
```json5
{
messages: { queue: { byChannel: { x: "followup" } } },
}
collect 也受支持。如果没有通道覆盖项,messages.queue.mode
必须是 followup 或 collect;默认 steer 和显式 interrupt
会在线程展开前阻止访客准入。X replies 页面会在其现有的访客就绪消息中显示
所需设置。将队列模式改回任一不安全值会阻止后续访客提及。
核心负责路径和符号链接隔离,并以 Path escapes sandbox root 拒绝会话
根目录之外的读取。保持访客通道会话处于其
初始权限:不要授予完整权限、扩大其会话根目录,
或通过操作员控制附加外部技能或技能库固定项。
这些操作员操作会故意改变核心的文件系统权限。访客
回合没有可以做出这些更改的工具。当维护者工作需要更广泛的文件系统或技能时,将其放在其
正常工作会话中。
限制与身份¶
默认限制是 每位访客作者每个 UTC 日 5 次提及,
每个 bot 账号独立计算。将 guests.maxMentionsPerAuthorPerDay 设置为 0 到 1000;
0 表示不接纳访客。超限提及会在线程展开前被静默丢弃。访客线程上下文默认为 10 条帖子,由
guests.threadContextMaxPosts 控制;维护者保留 threadContext.maxPosts。
UI 和通道状态会暴露 guests.enabled、admittedToday 和
rateLimitedToday。接纳计数包括已预留回合,即使后续
线程查找或模型运行失败;重试会复用其预留。
使用情况保存在有界、由 worker 支持的插件状态(x.guest-usage)中,保留两天。容量耗尽会暂停新的访客接纳,而不是驱逐
当前作者的配额。近期被拒绝的帖子 ID 会被保留,以避免将
正常重试重复计数;在该有界历史之后异常迟到的重试可以
再次增加速率限制统计。入口队列会单独
抑制已完成事件的重放。
访客回合会产生与其他回合相同的 X API 和模型成本。线程读取 和每条回复帖子按正常计费;访客引用 URL 会适用 X 的 含 URL 回复的更高价格。作者配额不是美元预算。
安全: 主机仅根据 X 的数字 author_id 与已配置和管理员管理的允许列表条目的有效并集来确定权限层级。句柄、显示名称、帖子文本和模型输出永远不会授予维护者访问权限。每个面向代理的回合都以主机生成的发件人行开始;其下方的所有线程帖子都是引用数据。当访客模式开启时,从允许列表中移除维护者会使后续提及变为访客。
事件模式¶
| 模式 | 行为 |
|---|---|
auto |
当配置了 bearer token 且订阅成功时,使用 Activity API;否则轮询提及。 |
stream |
使用仅限应用的 bearer token 请求 Activity API 流式传输;当未配置 bearer token 时回退到轮询。 |
poll |
使用用户上下文 token 轮询提及端点。 |
默认值为 auto。流式传输使用仅限应用的 bearerToken 列出现有订阅,然后使用机器人的 OAuth2 用户访问 token(从 refreshToken 刷新)为机器人创建缺失的 post.mention.create 订阅。提及订阅要求用户授予 tweet.read。持久的 GET /2/activity/stream 连接使用仅限应用的 bearer token,如 X 的 Activity Stream API 中所述。
流式传输从 X 的 data.payload 信封中读取 post.mention.create 事件,检查帖子是否指向机器人,并忽略空白 keep-alive。其他事件类型不会创建入站回合;已送达的 post.* 事件仍会计入预算。在流停滞或断开后,它会使用退避重连。
每个连接使用用户 token 从已保存的游标运行一次提及回填,然后在流式传输期间每 events.pollSeconds × 4
重复一次(最少 60 秒,默认 240 秒)。此安全回填可恢复流中遗漏的提及。只有完成的回填页面才会推进游标,因此较新的流事件不会隐藏较早的遗漏提及。帖子 ID 对流和轮询事件进行去重。
在连续出现三个无法解析的提及事件或格式错误的行后,插件会记录一条警告,并将其显示在频道状态 message 中。空白 keep-alive 和有意忽略的事件类型不计入此警告。它包含事件类型和顶层键,但不包含帖子内容。下一个可解析的提及事件会清除该警告。
在 auto 模式下,任何订阅设置失败都会切换到轮询。在 stream
模式下,订阅 HTTP 403 会切换到轮询;其他设置错误会停止事件源。流 HTTP 401 或 403 会将任一模式切换到轮询。频道状态 message 包含失败的端点、HTTP 状态以及可用时的第一条 X 错误消息,凭据会被脱敏。例如:
X API /2/activity/subscriptions failed (HTTP 400): OauthAccessTokenRequired: OAuth user access token is required for this event type; polling
此消息解释为什么 Activity 无法启动;轮询仍保持活动。无法读取的错误主体仍会报告 HTTP 状态。网络和 token 刷新失败会报告其客户端错误,而不包含提供商响应详情。
轮询默认为 60 秒;events.pollSeconds 不能小于 15。
每个请求请求 10 条提及,这是 X 的最小页面大小,并在仍有积压时遵循分页。这使每个请求的预留保持较小,同时仍能追上所有可用提及。
入站帖子在游标推进之前会被持久化排队。已完成事件 ID 最多保留 30 天,每个账户限制 2,000 条已完成条目,从而在重连和重启后防止重复回合,只要这些条目仍被保留。
线程上下文与回复¶
插件按最旧优先的顺序渲染可用的线程帖子,格式为 @handle (time): text,并标记触发提及。它会跟踪回复祖先,读取近期对话,并包含引用帖子。threadContext.maxPosts 默认为 50;达到限制时,会保留根帖子和最新帖子。近期搜索覆盖范围限于七天,不可用或已删除的帖子无法包含。
对话搜索请求 10 到 100 条帖子,受剩余上下文配额限制;X 要求最少 10 条。达到上下文限制时分页停止。如果预算无法覆盖更多上下文,代理将收到提及和已获取的任何上下文,并标记为“线程上下文因预算被截断。”
回复被拆分为自回复链,每帖最多 280 个加权字符;每个 URL 计为 23 个字符。最后一个分块接收 replySignature,其默认值为 🤖 automated reply。将其设置为空字符串可禁用签名。
当维护者回合启动一个可见的工作会话时,除非文本已包含该 URL,否则其第一个会话 URL 会被追加到回复中。规范链接仅在创建回执确认发布时才可公开读取;否则会被标记为“工作会话(需要登录)。” 两者都使用 X 的包含 URL 的回复价格。
对于通过消息工具或 CLI 的直接回复,请使用 x: 前缀指定帖子 ID,或使用其完整的 X 状态 URL:
目标必须满足 X 的回复资格:其作者提及或引用了应用账户。不支持发送媒体或创建原创帖子。
成本与限制¶
插件默认为每个账户设置 每个 UTC 日 $100 和 每个计费周期 $1,000。这些限制仅涵盖 X API 调用;模型 token 单独计算。
将 costLimits.cycleStartDay 设置为您 X 计费周期开始月份的 UTC 日期,范围为 1 到 28。例如,20 表示周期从 20 日 00:00 UTC 开始,持续到下个月的 20 日。账户条目从 channels.x 继承这些字段,并可单独覆盖它们。
这两个限制均接受非负美元金额。0 会阻止付费请求。没有无限制设置;如需更高上限,请使用较大的限制值。X 自身的每个计费周期上限仍然适用,并且可以独立拒绝请求。
这些估算使用 X 的已发布的按使用量付费费率,已于 2026 年 10 月 4 日核实:
| 操作 | 预计 X API 价格 |
|---|---|
| 帖子读取 | 每个返回帖子 $0.005,包括展开的帖子 |
| 用户读取 | 每个返回用户 $0.01,包括展开的用户 |
Activity post.* 事件 |
每个已交付事件 $0.005 |
| 不含 URL 的回复 | 每个回复帖子 $0.015 |
| 包含 URL 的回复 | 每个回复帖子 $0.20 |
| 空资源响应 | $0 |
| 订阅管理、令牌刷新、无资源列表 | $0 |
线程展开会读取额外帖子。较长的回答会创建多个计费的回复帖子。在允许列表 UI 中添加一个 handle 会执行一次付费用户名查找。这些是 X API 成本,与 agent 的模型用量分开计算。
支出以整数微美元形式存储在插件的 worker 支持的状态中,每个账户分别具有每日和计费周期桶。插件在每次付费请求前预留最坏情况成本,并根据返回的资源进行结算,释放任何未使用的预留。并发请求共享同一账户预算。响应丢失、HTTP 5xx 或无法解析的成功响应会保留全部预留,因为请求可能已经成功发出;只有可证明未发出或明确的 HTTP 4xx 拒绝才会在不计资源的情况下释放预留。显示的支出包括待处理预留。跨越 UTC 午夜请求会保守地计入两天,但只计入共享计费周期一次。跨越计费周期边界会同时计入两个周期。中断的请求在重启后仍保留其全部预留。
会计处理有意忽略 X 在 UTC 一天内的资源去重,因此重复读取会再次计数。X 是否对展开用户计费尚未确认;插件将其计入以避免低估支出,包括随 Activity 事件返回的展开内容。所有已交付的 post.* Activity 事件均会计入,即使它们未产生 agent 回合。因此,估算值可能超过 X 的账单。X 的 Activity 页面和定价页面对于是否对 post.delete 计费存在不一致;插件保守地按与其他帖子事件相同的费率将其计入。
Activity 流使用固定的 $0.50 余量。如果任一剩余预算低于该余量,插件会关闭流,并使用受控提及轮询,直到受影响的预算重置。在流关闭前 X 已经交付的事件仍会被计费并接纳;它们可能使记录的支出超过限制。该余量可降低这种风险,但它不是对 X 已经交付的突发流量的严格上限。只有当完整预留可以容纳时,轮询请求才会继续。
当没有付费轮询可以容纳时,ingress 会暂停直到重置,且不推进其 since_id 游标。已获取的提及会被持久化接纳,其下一页令牌会保存在游标旁边,以便在重置或重启后回填可以继续处理更早的页面。如果 X 拒绝已保存的令牌,插件会从 since_id 重新开始该回填;ingress 队列会对已接纳的提及去重。通道状态会报告当前支出、限制、周期开始时间和恢复时间,并附带类似 X API daily budget of $100 reached; resumes at 2026-10-06T00:00Z 的原因。插件在达到限制时记录一次日志,在重置时记录一次日志。无法负担的回复会以不可重试错误拒绝;回复链按块计费。
当 Activity 事件省略提及实体时,插件会查找该帖子以验证其是否指向此 bot。如果预算无法覆盖验证,提及会被持久化排队,并在重置后、任何 agent 回合之前进行验证。未验证的事件以及针对其他 bot 的事件不会推进此账户的游标。如果提及实体仅提供用户名,插件会执行一次 $0.01 用户查找以验证数字接收者 ID;仅配置的用户名不能授权回复。
配置参考¶
除非另有说明,这些字段在 channels.x 和单个账户条目上均有效。
| 字段 | 默认值 | 用途 |
|---|---|---|
enabled |
true |
启用通道或账户。 |
name |
未设置 | 可选的账户显示名称。 |
userId |
必填 | bot 账户的数字用户 ID。 |
username |
必填 | 不带 @ 的 bot 用户名。 |
clientId |
必填 | OAuth2 机密应用客户端 ID。 |
clientSecret |
必填 | 应用密钥;支持 SecretRef。 |
| 字段 | 默认值 | 用途 |
|---|---|---|
refreshToken |
必填 | 机器人的用户上下文 OAuth2 refresh token;支持 SecretRef。 |
bearerToken |
未设置 | 仅应用的 bearer,用于 Activity 和公共上下文验证;支持 SecretRef。 |
autoPublishWorkSessions |
false |
为已验证的公共维护者提及发布新的可见工作会话。 |
events.mode |
auto |
auto、stream 或 poll。 |
events.pollSeconds |
60 |
提及轮询间隔,最小 15 秒。 |
allowFrom |
[] |
数字作者 ID,可选地带有 x: 前缀。 |
groupPolicy |
allowlist |
allowlist、open 或 disabled。 |
dmPolicy |
disabled |
仅接受 disabled。 |
threadContext.maxPosts |
50 |
包含在代理线程上下文中的最大帖子数,范围为 2 到 100。 |
guests.enabled |
false |
为非允许列表作者启用仅仓库回答。 |
guests.maxMentionsPerAuthorPerDay |
5 |
每位作者、每个账户的 UTC 日限制,范围为 0 到 1000。 |
guests.threadContextMaxPosts |
10 |
访客线程上下文上限,范围为 2 到 100 条帖子。 |
guests.tools.allow |
主机支持的默认值 | 缩小默认访客工具;空数组禁用所有工具。 |
guests.tools.deny |
[] |
进一步拒绝访客工具;deny 优先。 |
costLimits.dailyUsd |
100 |
每个 UTC 日的最大估算 X API 支出;0 阻止付费调用。 |
costLimits.monthlyUsd |
1000 |
每个计费周期的最大估算 X API 支出;0 阻止付费调用。 |
costLimits.cycleStartDay |
1 |
UTC 计费周期在每月的开始日,范围为 1 到 28。 |
replySignature |
🤖 automated reply |
添加到最后一个回复块;最多 140 个字符,空值禁用它。 |
accounts |
未设置 | 命名账户覆盖;仅限频道根。 |
defaultAccount |
default |
未指定时选择的账户;仅限频道根。 |
故障排除¶
无回复: 检查账户状态、数字机器人 ID 和生效的允许列表。 被丢弃提及计数器和最后被丢弃的作者解释了有意沉默。 没有配对流程。在默认策略下,空的允许列表会阻止所有作者。
流式回退: 检查状态消息中的 Activity 端点、
HTTP 状态和 X 错误详情。验证应用 bearer 和机器人的 OAuth2
授权,包括 tweet.read。如果没有应用 bearer,auto 和 stream 会使用
轮询。检查报告的事件模式、流连接/退避、最后事件
和游标。
当任一预算剩余少于 $0.50 时,流式也会切换到轮询,并在该预算重置后恢复。
预算暂停: 检查频道状态中的 spend 或 X 回复 页面。
状态消息会给出受影响的限制和重置时间。将
costLimits.cycleStartDay 与你的 X 计费周期对齐,并在需要时增加相应
限制。更改限制不会清除已记录的支出。
Token 刷新失败: 检查 client ID、client secret、refresh token 和 已授予的 OAuth2 范围。状态会报告刷新状态,而不会暴露机密。
回复被拒绝: 确认源作者提及或引用了应用
账户,并且应用具有 tweet.write。在重试部分发送的
回复链之前,检查错误。
回复 POST 之前的失败可以安全重试。如果 POST 的结果不确定, OpenClaw 会保留该不确定性,而不是自动再次发送回复。 在手动重试不确定或部分发送的回复之前,检查 X。
相关¶
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw