闲社服务运行正常AI智能体自动化平台
t

电报文件浏览器

技能标识:telegram-file-browser

Build or improve Telegram inline-button file browsers and menu-style navigators. Use when creating Telegram chat UIs for browsing directories, paging lists, previewing files, returning to parent views, closing menus, or exposing copyable file paths. Especially useful when the interaction should stay inside one message via button state updates instead of spamming new messages.

作者:admin | 来源记录:ClawHub
登记来源
ClawHub
版本
V 0.1.1
检测标记
后台标记通过
免费
免费获取
0
收藏
来源与检测标记为平台登记信息,并不代表已展示可复核的检测报告。使用前请核对版本、依赖和所需权限,建议先在隔离环境中运行。
概述
安装方式
版本历史

电报文件浏览器

技能名称: telegram-file-browser
详细描述:

⚠️ 🚨 关键按钮结构警告 🚨

脚本中的 buttons 数组是一个二维数组,其中每个内部数组代表一行。

始终直接将其传递给消息工具,无需修改。

  • - 在 OpenClaw 上下文中:直接使用 response[buttons]
  • 在 Python 脚本中:使用来自 buildmessagepayload() 的 payload[buttons]


❌ 切勿展平、重组、重新分组或字符串化行。

零失误协议

发送任何浏览器菜单时,请根据您的上下文遵循正确的工作流程:

如果在 OpenClaw 中(使用 exec + message 工具):

  1. 1. 通过 exec 工具运行 browser_dispatcher.py
  2. 使用 response[messageToolCall] 作为 message 工具的完整负载
  3. 不要触碰按钮 — 完全按照该负载中返回的方式使用它们
  4. 如果发送成功且响应包含 postSend,则更新 liveMessageId 并可选择删除之前的菜单

如果在独立的 Python 脚本中:

  1. 1. 通过 runbrowseraction.py 或导入函数生成计划
  2. 运行 buildmessagepayload(plan) 并要求 ok: true
  3. 使用验证结果中的 payload[message] 和 payload[buttons]

要避免的常见错误:

  • - ❌ 不要手动重写按钮
  • ❌ 不要将按钮展平成一行
  • ❌ 不要将按钮作为 JSON 字符串传递

Telegram 文件浏览器

围绕一个实时菜单构建 Telegram 文件浏览流程,并可选择添加用于预览、路径和下载的侧边消息。

调用

当用户明确调用 telegram-file-browser 或要求使用此技能时:

  1. 1. 在同一轮对话中立即打开一个交互式浏览器。
  2. 除非用户提供了路径,否则默认根目录为 ~/.openclaw/workspace。
  3. 当用户已经要求浏览时,不要用“你想让我做什么?”这样的对话式澄清来回复。
  4. 仅当目标路径或安全边界确实不明确时才提出后续问题。
  5. 如果输入是 config,则打开配置流程,而不是浏览器树。

当您已有足够信息启动 UI 时,不要停留在描述技能上。

运行时上下文

此技能可在两种不同的上下文中使用。选择与您的环境匹配的一种。

上下文 1:OpenClaw 工具调用(最常见)

当您在 OpenClaw 内部运行并使用 exec + message 工具时(就像现在这样),通过 exec 使用 browser_dispatcher.py,然后使用脚本中的精确 JSON 调用 message 工具。

⚠️ 脚本已经验证并返回正确的负载 — 直接使用它,不要重写任何内容。

步骤 1:通过 exec 工具运行脚本

python

运行调度器以获取最终的消息工具负载


result = exec(command=python3 ~/.openclaw/workspace/skills/telegram-file-browser/scripts/browser_dispatcher.py open-root)
response = json.loads(result) # response 包含 messageToolCall、postSend 和兼容性字段

步骤 2:使用脚本的输出调用 message 工具

python

✅ 正确:直接传递调度器负载


message(response[messageToolCall])

❌ 错误:不要自己重写按钮

message( action=send, message=response[message], buttons=[[{...}, {...}]] )

❌ 错误:也不要字符串化负载

message(action=send, message=response[message], buttons=json.dumps(response[buttons]))

完整示例:

python

1. 获取完整的消息工具负载


result = exec(command=python3 ~/.openclaw/workspace/skills/telegram-file-browser/scripts/browser_dispatcher.py open-root)
response = json.loads(result.stdout)

if response[ok] and response.get(messageToolCall):
# 2. 精确发送调度器返回的内容
msg_result = message(response[messageToolCall])

# 3. 如果请求,更新 liveMessageId
post_send = response.get(postSend) or {}
if msgresult.get(messageId) and postsend.get(updateLiveMessageId):
exec(command=python3 ~/.openclaw/workspace/skills/telegram-file-browser/scripts/browserdispatcher.py update-message-id + str(msgresult[messageId]))

# 4. 仅在新菜单成功后才删除之前的实时菜单
previousid = postsend.get(previousMessageId)
if previousid and postsend.get(cleanupPreviousMessage):
message(action=delete, messageId=previous_id)

回调处理:

python

1. 处理回调


result = exec(command=python3 ~/.openclaw/workspace/skills/telegram-file-browser/scripts/browserdispatcher.py handle-callback + callbackdata)
response = json.loads(result.stdout)

2. 执行脚本返回的精确工具负载

if response.get(messageToolCall): msg_result = message(response[messageToolCall])

post_send = response.get(postSend) or {}
if msgresult.get(messageId) and postsend.get(updateLiveMessageId):
exec(command=python3 ~/.openclaw/workspace/skills/telegram-file-browser/scripts/browserdispatcher.py update-message-id + str(msgresult[messageId]))

previousid = postsend.get(previousMessageId)
if previousid and postsend.get(cleanupPreviousMessage):
message(action=delete, messageId=previous_id)

当前 Telegram/OpenClaw 路由的重要说明:

如果按钮点击以纯文本入站消息的形式到达,例如 tfbrootv12w8,而不是原生回调事件,将该文本视为 callbackdata 并立即运行上述完全相同的回调流程。不要仅仅因为它作为消息到达就忽略它。

推荐的检测规则:

  • - 如果入站文本匹配 ^tfb(root|dir|preview|path|download|back|close)
  • 将其视为 telegram-file-browser 回调
  • 立即运行 browserdispatcher.py handle-callback text>
  • 不要询问用户他们的意图

上下文 2:独立 Python 脚本

当您编写独立的 Python 脚本时(不在 OpenClaw 内部),使用基于导入的方法配合 buildmessagepayload。

python
import sys
sys.path.insert(0, ~/.openclaw/workspace/skills/telegram-file-browser/scripts)
from runbrowseraction import openroot, handlecallback
from sendplan import buildmessage_payload

STATE = ~/.openclaw/workspace/.openclaw/telegram-file-browser/state.json
ROOT = ~/.openclaw/workspace

def sendbrowserplan(plan):
使用 OpenClaw 的消息工具或 Telegram API 发送消息。
if plan[toolAction] == noop:
return None
if plan[toolAction] == delete:
return {action: delete, messageId: plan[messageId]}
if plan[toolAction] == send-file:
return {action: send, path: plan[path], caption: plan.get(caption)}

# 必须通过 buildmessagepayload 验证
wrapped = buildmessagepayload(plan)
if not wrapped[ok]:
raise RuntimeError(wrapped[error])

payload = wrapped[payload]
return {
action: payload[action],
message: payload[message],
buttons: payload[buttons],
replyTo: payload.get(replyTo)
}

首次打开

sendbrowserplan(open_root(STATE, ROOT))

处理回调

sendbrowserplan(handlecallback(STATE, callbackdata))

为什么在 Python 脚本中需要 buildmessagepayload:

  • - 验证按钮结构(二维数组,每项一行)
  • 返回要发送的精确负载
  • 防止常见错误,例如展平按钮

为什么在 OpenClaw 上下文中不需要:

  • - browser_dispatcher.py 已经返回验证过的负载
  • 直接使用 JSON 值即可

⚠️ 对于 OpenClaw 工具调用:只需使用 browser_dispatcher.py — 请参阅上面的上下文 1。

下面的示例仅适用于独立 Python 脚本。

工具计划契约

在 OpenClaw 上下文(最常见)中:使用 browser_dispatcher.py — 它已经验证并返回正确的负载。直接使用 JSON 值即可。

在 独立 Python 脚本中:使用 runbrowseraction.py +

标签

skill ai

通过对话安装

以下为平台配置的接入选项,并非逐项实测通过。能否安装取决于客户端支持、技能来源和运行环境:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 telegram-file-browser-1776076579 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 telegram-file-browser-1776076579 技能

通过命令行安装

skillhub install telegram-file-browser-1776076579

下载

⬇ 下载 telegram-file-browser v0.1.1(免费)

文件大小: 24.03 KB | 发布时间: 2026-4-15 14:38

v0.1.1 最新 2026-4-15 14:38
Polish Telegram inline-button file browser workflow, validation, and dispatcher-based sending.
返回顶部