在开发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机器人。