Skip to content

消息格式化

Bot API 支持带格式的消息文本。发送时通过 parse_mode 参数指定解析模式,服务端会把标记解析为格式实体(entities)后下发给客户端。

  • 可选值:MarkdownV2MarkdownHTML,不区分大小写。
  • 在 SafeW 中,MarkdownMarkdownV2 由同一解析器处理,行为完全一致。
  • 提供 parse_mode 时,请求中的 entities / caption_entities 参数会被忽略;不提供 parse_mode 时才使用手动传入的实体列表。

支持 parse_mode 的位置:

方法作用字段
sendMessagesendMessageDrafteditMessageTexttext
sendPhotosendVideosendVoicesendAudiosendDocumentsendMediaGroupcaption

MarkdownV2 风格

语法总览:

*粗体* 或 **粗体**
_斜体_
__下划线__
~删除线~
||剧透文本||
[内联链接](https://www.example.com)
[提及用户](safew://user?id=123456789)
![😀](safew://emoji?id=5368324170671202286)
`行内代码`
```代码块```
```python
多行代码块
(第一行反引号后的首个单词作为语言标识)
```
> 引用第一行
> 引用第二行
**> 可折叠引用,以 || 结束||

文本样式

样式写法说明
粗体*文本***文本**单星号和双星号等价,均为粗体
斜体_文本_
下划线__文本__
删除线~文本~单个波浪线
剧透||文本||内容默认打码,点击后显示

样式可以嵌套(如 *粗体 _粗斜体_*),也可以在引用内使用。注意 ***文本*** 不会产生「粗斜体」——三个星号会被解析为 ***,两者都是粗体标记,互相抵消后不产生任何格式。

代码

写法效果
`代码`行内代码(等宽显示)
```代码```(同一行)代码块,无语言标识
``` 起止的多行块代码块;开头 ``` 之后同一行的第一个单词作为语言标识(如 ```python

代码内部不解析其他格式标记,但反斜杠转义依然生效(例如在行内代码中用 \` 可输出反引号本身)。

链接、提及与自定义表情

写法效果
[显示文本](https://example.com)内联链接。URL 仅支持 http://https://safew:// 协议,其他协议的链接会被丢弃、只保留文本
[显示文本](safew://user?id=<用户ID>)提及用户(无需知道用户名,点击跳转到该用户)
![占位文本](safew://emoji?id=<表情文档ID>)自定义表情;URL 必须形如 safew://emoji?id=<数字>,占位文本在表情不可用时显示

引用

  • 行首的 >(后可跟一个空格)开始一段引用,连续以 > 开头的行合并为同一段引用。
  • 行首的 **> 是可折叠引用语法,以 || 结束。当前版本会接受该语法,但客户端按普通引用显示(暂不支持折叠)。
  • 引用内可以继续使用文本样式、行内代码等标记;可折叠引用内不要使用剧透标记(|| 会被视为引用结束符)。

转义

在标记字符前加反斜杠 \ 可以按原样显示该字符。支持转义的字符集为:

* _ ~ | [ ] ( ) ` > \

与 Telegram 官方 MarkdownV2 的差异:

  • 官方要求转义 . ! # + - = { } 等所有保留字符,SafeW 不需要——这些字符本身没有特殊含义;并且对上述字符集之外的字符使用 \ 时,反斜杠会原样保留(如 \. 会显示为 \.)。
  • 官方对未闭合的标记返回 400 错误;SafeW 不报错,未闭合的标记会一直作用到文本末尾。建议始终成对书写标记。

Markdown 风格

parse_mode=MarkdownMarkdownV2 完全等价(同一解析器),不存在 Telegram 官方的旧版 Markdown 差异。新接入建议直接使用 MarkdownV2

HTML 风格

html
<b>粗体</b>、<strong>粗体</strong>
<i>斜体</i>、<em>斜体</em>
<u>下划线</u>、<ins>下划线</ins>
<s>删除线</s>、<strike>删除线</strike>、<del>删除线</del>
<span class="safew-spoiler">剧透</span>、<safew-spoiler>剧透</safew-spoiler>
<a href="https://www.example.com">内联链接</a>
<code>行内代码</code>
<pre>代码块</pre>
<pre class="language-python">带语言标识的代码块</pre>
<blockquote>引用</blockquote>
<safew-emoji emoji-id="5368324170671202286">😀</safew-emoji>

注意事项:

  • 仅支持上表中的标签,不支持的标签会连同尖括号原样显示(不会报错)。
  • 正文中的 <>& 需分别写成 &lt;&gt;&amp;
  • 代码块的语言标识写在 <pre> 标签的 class="language-xxx" 上;<pre><code>...</code></pre> 嵌套时只生成一个代码块实体。
  • <a>href 为任意非空值时生成链接。
  • <blockquote>expandable 属性当前不生效,按普通引用显示。
  • <safew-emoji>emoji-id 为自定义表情的文档 ID,标签内的文本作为表情不可用时的占位。

示例

MarkdownV2

bash
curl -X POST "https://api.safew.bot/<token>/sendMessage" \
  -H "Content-Type: application/json" \
  -d '{
    "chat_id": 987654321,
    "text": "*订单已发货* 🎉\n单号:`SF1234567890`\n>物流信息请点击 [此处](https://example.com/track) 查询",
    "parse_mode": "MarkdownV2"
  }'

HTML

bash
curl -X POST "https://api.safew.bot/<token>/sendMessage" \
  -H "Content-Type: application/json" \
  -d '{
    "chat_id": 987654321,
    "text": "<b>订单已发货</b> 🎉\n单号:<code>SF1234567890</code>\n<blockquote>物流信息请点击 <a href=\"https://example.com/track\">此处</a> 查询</blockquote>",
    "parse_mode": "HTML"
  }'