Telegram Compose技能使用说明
Telegram 消息撰写
通过直接API,使用HTML格式编排并发送格式丰富、易于浏览的Telegram消息。
此技能的使用方式
此技能由主会话代理自动调用。无需其他技能知晓其存在。
决策规则(供主会话代理使用)
在向Telegram发送消息前,请检查:
- 简短回复(少于3行,无结构化内容):直接通过OpenClaw消息工具发送。完成。
实质性内容(超过3行,或包含列表/统计数据/章节/报告):将此技能作为子代理启动。 - 启动子代理主会话代理调用
sessions_spawn
并附带以下参数:任务模板:重要:
sessions_spawn(
model: "claude-haiku-4-5",
task: "<task content — see template below>"
)
调用方必须指定使用哪个机器人账户。子代理不得自动选择或遍历账户。
Read the telegram-compose skill at {baseDir}/SKILL.md for formatting rules, then format and send this content to Telegram.
Bot account: <account_name> (e.g., "main" — must match a key in channels.telegram.accounts)
Chat ID: <chat_id>
Thread ID: <thread_id> (omit this line if not a forum/topic chat)
Content to format:
---
<raw content here>
---
After sending, reply with the message_id on success or the error on failure. Do NOT include the formatted message in your reply — it's already been sent to Telegram.
IMPORTANT:The caller MUST specify which bot account to use. The sub-agent must NOT auto-select or iterate accounts.
重要:子代理的公告会路由回主会话,而不是Telegram。因此主会话在生成后应回复NO_REPLY以避免重复发送消息。是子代理的curl调用将内容递送到Telegram。
子代理接收的内容
- 技能路径——以便它能读取格式规则
- 机器人账户名称——指定使用哪个Telegram机器人账户(必须明确指定,切勿自动选择)
- 聊天ID——发送目的地
- 主题ID——适用的主题线程(如果存在)
- 原始内容——待转换为富文本消息的未格式化文本/数据
凭证
机器人令牌:存储在OpenClaw配置文件的channels.telegram.accounts.<名称>.botToken路径下。
账户名称始终由调用方提供。切勿自动选择或遍历账户。
# Auto-detect config path
CONFIG=$([ -f ~/.openclaw/openclaw.json ] && echo ~/.openclaw/openclaw.json || echo ~/.openclaw/clawdbot.json)
# ACCOUNT is provided by the caller (e.g., "main")
# Validate the account exists before extracting the token
ACCOUNT="<provided_account_name>"
BOT_TOKEN=$(jq -r ".channels.telegram.accounts.$ACCOUNT.botToken" "$CONFIG")
if [ "$BOT_TOKEN" = "null" ] || [ -z "$BOT_TOKEN" ]; then
echo "ERROR: Account '$ACCOUNT' not found in config or has no botToken"
exit 1
fi
发送中
CONFIG=$([ -f ~/.openclaw/openclaw.json ] && echo ~/.openclaw/openclaw.json || echo ~/.openclaw/clawdbot.json)
# ACCOUNT provided by caller — never auto-select
BOT_TOKEN=$(jq -r ".channels.telegram.accounts.$ACCOUNT.botToken" "$CONFIG")
# Without topic thread
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d "$(jq -n \
--arg chat "$CHAT_ID" \
--arg text "$MESSAGE" \
'{
chat_id: $chat,
text: $text,
parse_mode: "HTML",
link_preview_options: { is_disabled: true }
}')"
# With topic thread
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d "$(jq -n \
--arg chat "$CHAT_ID" \
--arg text "$MESSAGE" \
--argjson thread $THREAD_ID \
'{
chat_id: $chat,
text: $text,
parse_mode: "HTML",
message_thread_id: $thread,
link_preview_options: { is_disabled: true }
}')"
格式规则
HTML标签
<b>bold</b> <i>italic</i> <u>underline</u> <s>strike</s>
<code>mono</code> <pre>code block</pre>
<tg-spoiler>hidden until tapped</tg-spoiler>
<blockquote>quote</blockquote>
<blockquote expandable>collapsed by default</blockquote>
<a href="url">link</a>
<a href="tg://user?id=123">mention by ID</a>
转义
仅在文本内容中(而非HTML标签内)转义以下字符:&
→&(首先执行此操作以避免双重转义)<→<>→>常见陷阱:若未转义,
含有 & 符号的内容(如"研发部"、"问答区")将导致HTML解析失败。结构模式
样式规则
EMOJI <b>HEADING IN CAPS</b>
<b>Label:</b> Value
<b>Label:</b> Value
<b>SECTION</b>
• Bullet point
• Another point
<blockquote>Key quote or summary</blockquote>
<blockquote expandable><b>Details</b>
Hidden content here...
Long details go in expandable blocks.</blockquote>
<a href="https://...">Action Link →</a>
伪标题格式:
- 表情符号 <b>大写标题</b>
EMOJI <b>CAPS TITLE</b>后面留空行 - 表情符号:每条消息使用1-3个作为视觉锚点,而非装饰
- 空白处理:各版块之间留空行
- 长内容:使用
<blockquote expandable>(可展开的区块引用) - 链接:独占一行,附带箭头:
链接文本 →
示例
状态更新:
📋 <b>TASK COMPLETE</b>
<b>Task:</b> Deploy v2.3
<b>Status:</b> ✅ Done
<b>Duration:</b> 12 min
<blockquote>All health checks passing.</blockquote>
警报:
⚠️ <b>ATTENTION NEEDED</b>
<b>Issue:</b> API rate limit at 90%
<b>Action:</b> Review usage
<a href="https://dashboard.example.com">View Dashboard →</a>
列表:
✅ <b>PRIORITIES</b>
• <s>Review PR #234</s> — done
• <b>Finish docs</b> — in progress
• Deploy staging
<i>2 of 3 complete</i>
移动端友好的数据显示
切勿使用<pre>(预格式化文本标签)来显示统计数据、摘要或视觉布局。 <pre>(预格式化文本标签)使用等宽字体且在移动设备上换行效果差,会破坏对齐和树状字符。请仅将<pre>(预格式化文本标签)保留用于实际代码/命令。
对于结构化数据,使用表情符号 + 粗体 + 分隔符:
❌ BAD (wraps on mobile):
<pre>
├─ 🟠 Reddit 32 threads │ 1,658 pts
└─ 🌐 Web 8 pages
</pre>
✅ GOOD (flows naturally):
🟠 <b>Reddit:</b> 32 threads · 1,658 pts · 625 comments
🔵 <b>X:</b> 22 posts · 10,695 likes · 1,137 reposts
🌐 <b>Web:</b> 8 pages (supplementary)
🗣️ <b>Top voices:</b> @handle1 · @handle2 · r/subreddit
其他模式:
记录卡片:
<b>Ruby</b>
Birthday: Jun 16 · Age: 11
<b>Rhodes</b>
Birthday: Oct 1 · Age: 8
项目符号列表:
• <b>hzl-cli:</b> 1.12.0
• <b>skill:</b> 1.0.6
限制与分割
- 消息最大长度:4,096 个字符
- 标题最大长度:1,024 个字符
如果格式化消息超过 4,096 个字符:
- 在章节边界处分割(即
<b>标题</b>块之间的空行) - 每个块必须是有效的 HTML(不要在标签内拆分)
- 按顺序发送块,块之间延迟 1 秒
- 第一个块包含完整标题;后续块添加一个继续指示符:
<i>(续)</i>
错误处理
如果 Telegram API 返回错误:
| 错误 | 操作 |
|---|---|
错误请求:无法解析实体 | HTML格式不正确。请去除所有HTML标签,以纯文本形式重新发送。 |
错误请求:消息过长 | 请根据上述规则分割内容后重试。 |
错误请求:未找到消息线程 | 重试时请移除message_thread_id 参数(消息将发送至“常规”板块)。 |
请求过多:请在 X 秒后重试 | 等待 X 秒后,重试一次。 |
| 任何其他错误 | 请反馈该错误;不要重试。 |
后备规则:如果HTML格式化连续失败两次,请以纯文本形式发送,而不是完全不发送。确保送达比格式更重要。
子代理执行清单
作为子代理运行时,请遵循以下顺序:
- 解析任务— 提取Bot账户名称、聊天ID、线程ID(如有)、技能路径和原始内容
- 阅读此 SKILL.md 文件— 加载格式化规则
- 格式化内容— 应用HTML标签、结构模式、样式规则,移动端友好的数据显示
- 转义特殊字符—
&然后<然后>仅限文本内容中(不在你的HTML标签内) - 检查长度— 如果超过4,096个字符,在章节边界处分割
- 获取机器人令牌— 自动检测配置路径,为指定账户提取令牌(如果未找到则报错)
- 通过curl发送— 使用适当的模板(带/不带线程ID)
- 检查响应— 解析curl输出以查找
"ok": true - 处理错误— 遵循上方的错误处理表
- 报告结果— 成功时回复message_id,失败时回复错误详情


微信扫一扫,打赏作者吧~