Telegram机器人如何发送Markdown格式的富文本?完整指南与代码示例

本文详细介绍Telegram Bot API中Markdown和MarkdownV2两种富文本格式的语法、转义规则及代码实现,帮助你快速让机器人发出样式丰富、可读性强的消息。

阅读提示建议先浏览小标题,再按需深入阅读具体段落。

在开发Telegram机器人时,纯文本消息往往显得单调且信息层次不清。如果你希望机器人发送的指令说明、通知或日报能带上粗体、斜体、行内代码甚至链接,那么Markdown格式就是最轻量高效的解决方案。本教程将带你彻底搞懂Telegram Bot API中两种Markdown解析模式,并给出可直接实战的代码示例。

Telegram Bot API支持的富文本格式概览

Telegram Bot API允许通过parse_mode参数指定消息的解析格式,可选值有三种:Markdown(经典版)、MarkdownV2(增强版)和HTML。其中Markdown家族使用特殊的标记符号,适合喜欢简洁书写的开发者;HTML则适合前端背景的开发者。本文重点聚焦Markdown与MarkdownV2,因为它们在处理转义时更容易踩坑,也最常被问及。

熟悉Markdown解析模式(经典版)的语法与限制

经典Markdown模式是Telegram最早支持的格式,语法简单,但功能有限且对转义要求较低。在调用API时设置parse_mode=Markdown即可。

支持的格式

  • 粗体*text*
  • 斜体_text_
  • 行内代码`code`
  • 预格式化文本```code block```
  • 行内链接[text](URL)

注意事项

经典Markdown模式不支持嵌套格式,且下划线(_)和星号(*)在文本中的转义都不够灵活。如果消息中包含这些字符,可能会导致格式意外触发或根本无法发送。

MarkdownV2详解:更强大的格式与转义规则

MarkdownV2是Telegram在Bot API 4.5版本后引入的升级版,语法更严格,功能更丰富,但也要求开发者必须正确转义所有非格式字符。使用parse_mode=MarkdownV2

MarkdownV2支持的常用格式

  • 粗体*text*(注意与经典版相同)
  • 斜体_text_
  • 下划线__text__
  • 删除线~text~
  • 行内代码`code`
  • 预格式化代码块```language\ncode```
  • 行内链接[text](URL)
  • 自定义实体[text](tg://user?id=123456789)(用于@用户)

必须遵守的转义规则

在MarkdownV2中,以下字符必须转义才能在文本中正常显示:_*[]()~`>#+-=|{}.!。如果不转义这些字符,API会返回400错误,消息发送失败。

实战示例:使用Python发送Markdown富文本消息

下面以Python的requests库为例,演示如何通过HTTP API发送经典Markdown和MarkdownV2格式的消息。你也可以轻松改造为其他语言。

示例1:发送经典Markdown格式

import requests

TOKEN = "YOUR_BOT_TOKEN"
chat_id = "YOUR_CHAT_ID"

url = f"https://api.telegram.org/bot/sendMessage"

# 消息内容:粗体、斜体、行内代码和链接
text = """
*这是粗体*,_这是斜体_,`这是行内代码`
[访问Telegram官网](https://telegram.org)
"""

payload = {
    "chat_id": chat_id,
    "text": text,
    "parse_mode": "Markdown"
}

resp = requests.post(url, data=payload)
print(resp.json())

示例2:发送MarkdownV2格式(注意转义)

import requests

TOKEN = "YOUR_BOT_TOKEN"
chat_id = "YOUR_CHAT_ID"

url = f"https://api.telegram.org/bot/sendMessage"

# 转义特殊字符:星号需要转义为\*,下划线转义为\_,括号保留但内部的文本也需处理
text = "*加粗\*不是列表\**,__下划线__,~删除线~,`code`,[链接](https://telegram.org)"
# 更复杂的示例:包含点号和感叹号时需要转义
text2 = "请注意:这句话的末尾有英文句号\\. 还有感叹号\\!"

payload = {
    "chat_id": chat_id,
    "text": text,
    "parse_mode": "MarkdownV2"
}

resp = requests.post(url, data=payload)
print(resp.json())

重要提示:在Python字符串中,反斜杠本身需要转义,所以书写时要用双反斜杠\\表示一个实际的反斜杠。上述代码中已经做了处理。

常见错误与调试技巧

1. 忽略转义导致400错误

经典Markdown模式下,某些字符不转义也能发送,但在MarkdownV2中必须严格转义。如果你收到Bad Request: can't parse entities,优先检查所有保留字符。

2. 嵌套格式在经典Markdown中失效

经典Markdown不支持嵌套格式,比如同时加粗和斜体只能用*_text_*,但往往不生效。MarkdownV2支持嵌套,但需要确保标签闭合顺序正确。

3. 使用纯文本调试

建议先用不带parse_mode的请求发送原文,确认内容本身合法,再逐步添加格式,方便定位问题。

4. 代码块语言标注

在MarkdownV2中,代码块第一行可以指定语言,例如```python,Telegram会高亮显示。

其他富文本方法:HTML模式与实体对象

除了Markdown,你还可以使用parse_mode=HTML,用标签<b><i><a href="URL">等实现类似效果,转义更直观,适合熟悉HTML的开发者。另外,通过entities字段可以在不支持解析模式下直接指定格式位置,适合动态构造消息。

总结

掌握Telegram机器人发送Markdown富文本的关键在于理解两种模式的差异:经典版简单但功能弱,MarkdownV2强大但必须严格转义。在实际开发中,建议优先使用MarkdownV2,并在代码里封装一个转义函数,统一处理特殊字符。同时,不要忘记测试每种格式在客户端上的最终渲染效果,确保文案可读性。希望本教程能帮你快速打造出更专业、更美观的Telegram机器人。

FAQ

安卓版下载指南

常见问题

Telegram机器人发送消息时如何选择Markdown还是MarkdownV2?

如果消息中只包含简单的粗体、斜体或链接,且不需要嵌套格式,使用经典Markdown即可。如果需要更多格式(如下划线、删除线、自定义实体),或希望避免经典模式的解析歧义,建议使用MarkdownV2。但使用MarkdownV2时必须对所有保留字符进行转义,否则会报错。

为什么我发送的Markdown格式没有生效,而是显示成了原始符号?

最常见的原因是发送请求时没有设置parse_mode参数,或者设置的值不正确。请确认在sendMessage请求中使用了parse_mode=Markdown或parse_mode=MarkdownV2。另外,某些客户端或API版本可能不支持,建议检查消息是否被其他中间件处理。

如何在MarkdownV2中安全地显示星号或下划线等特殊字符?

在MarkdownV2中,所有保留字符都必须用反斜杠转义。例如,要显示星号*,需要写成\*;要显示下划线_,需要写成\_。在Python字符串中,反斜杠本身要转义,所以实际写为"\\*"和"\\_"。