如何让Telegram Bot发送含可点击链接的格式化表格?
问题:Telegram Bot发送带可点击链接的格式化表格
我用prettytable模块生成了带链接的格式化表格,表格内容如下:
+-----------------------------------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Name | Arrival | Link | +-----------------------------------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Package #1 | 2022-08-06 | [1Z1234567890](https://www.ups.com/track?loc=en_US&tracknum=1Z1234567890&requester=WT/trackdetails) | [AS](https://somewebsite.com/1Z1234567890) | | Package #2 | 2022-08-07 | [1Z9876543210](https://www.ups.com/track?loc=en_US&tracknum=1Z9876543210&requester=WT/trackdetails) | [AS](https://somewebsite.com/1Z9876543210) | +-----------------------------------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
原本用以下代码发送:
update.message.reply_text(f'```{table}```', parse_mode='MarkdownV2', disable_web_page_preview=True)
但因为用了```代码块标签,链接只显示为Markdown代码,无法点击。想知道怎么发送这种格式化表格,同时让链接保持可点击状态?
解决方案
核心逻辑
不能将表格放在代码块中,要直接使用标准Markdown表格语法,同时满足Telegram MarkdownV2的特殊字符转义要求。
具体操作步骤
让prettytable生成Markdown格式表格
修改prettytable的输出格式,生成符合Markdown规范的表格,而不是ASCII边框样式:from prettytable import PrettyTable # 初始化表格并设置表头 table = PrettyTable() table.field_names = ["Name", "Arrival", "Link"] # 添加带Markdown链接的行 table.add_row([ "Package #1", "2022-08-06", "[1Z1234567890](https://www.ups.com/track?loc=en_US&tracknum=1Z1234567890&requester=WT/trackdetails) | [AS](https://somewebsite.com/1Z1234567890)" ]) table.add_row([ "Package #2", "2022-08-07", "[1Z9876543210](https://www.ups.com/track?loc=en_US&tracknum=1Z9876543210&requester=WT/trackdetails) | [AS](https://somewebsite.com/1Z9876543210)" ]) # 生成Markdown格式的表格字符串 markdown_table = table.get_string(format="markdown")转义MarkdownV2特殊字符
Telegram的MarkdownV2要求对_*[]()~>#+-=|{}.!`这些特殊字符添加反斜杠转义,否则会解析失败。可以用以下函数处理:def escape_markdown_v2(text): escape_chars = r'_*[]()~`>#+-=|{}.!' return ''.join(f'\\{char}' if char in escape_chars else char for char in text) # 对生成的Markdown表格进行转义 escaped_table = escape_markdown_v2(markdown_table)发送处理后的表格
去掉代码块标签,直接发送转义后的表格内容,指定解析模式为MarkdownV2:update.message.reply_text(escaped_table, parse_mode='MarkdownV2', disable_web_page_preview=True)
注意事项
- 链接中的特殊字符(如
&)无需额外转义,Telegram会自动识别URL部分并正确处理。 - 保持
disable_web_page_preview=True可以避免链接生成预览框,影响表格的排版整洁。
内容的提问来源于Stack Exchange,提问作者Bijan
相关产品推荐
相关产品推荐

