引言
Telegram Bot是构建自动化服务的强大工具,而发送HTML消息能让Bot的输出不再局限于纯文本,通过加粗、斜体、链接、代码块等富文本格式,显著提升消息的可读性与交互体验。本文将提供完整的代码示例,从HTTP请求到Python、Node.js实现,并深入解析Telegram Bot API中parse_mode参数的使用细节,帮助你在实际项目中快速落地。
Telegram Bot发送HTML消息的工作原理
Telegram Bot发送消息的核心是调用sendMessage方法。当需要发送HTML格式消息时,只需在请求参数中添加parse_mode并设为HTML。Telegram会解析消息文本中的HTML标签,渲染为富文本后展示给用户。
基本请求格式:
POST https://api.telegram.org/bot<token>/sendMessage
Content-Type: application/json
{
"chat_id": "@channel_or_user_id",
"text": "<b>粗体</b> 和 <i>斜体</i> 示例",
"parse_mode": "HTML"
}注意:parse_mode必须为HTML,且标签必须严格符合规范,否则API会返回400错误。
HTML标签支持范围与转义规则
Telegram Bot API支持的HTML标签有限,并非所有HTML5标签都可用。官方支持以下标签:
<b>或<strong>:加粗<i>或<em>:斜体<u>:下划线<s>或<strike>:删除线<a href="URL">:可点击链接<code>:行内代码<pre>:代码块,可搭配<code>实现多行代码<tg-spoiler>:隐藏消息(点击显示)<blockquote>:引用块(Telegram 2023年新增)
此外,<pre>标签中可通过language属性指定编程语言,如<pre><code class="language-python">...</code></pre>。
转义规则:在HTML模式下,除上述标签外,其他字符如<、>、&都需要转义为HTML实体(<、>、&)。例如发送“1 < 2”应写为1 < 2。
实际代码示例:Python实现
推荐使用python-telegram-bot库,它是官方维护的Python封装。首先安装库:
pip install python-telegram-bot以下是一个完整的发送HTML消息的异步示例:
import asyncio
from telegram import Bot
from telegram.error import TelegramError
TOKEN = "YOUR_BOT_TOKEN"
CHAT_ID = "YOUR_CHAT_ID" # 支持用户ID、群组ID或频道ID
async def send_html_message():
bot = Bot(token=TOKEN)
html_text = (
"<b>粗体</b> <i>斜体</i> <u>下划线</u>\n"
"<a href=\"https://t.me/telegram\">链接</a>\n"
"<code>inline code</code>\n"
"<pre><code class=\"language-python\">print('hello')</code></pre>\n"
"<tg-spoiler>隐藏内容</tg-spoiler>"
)
try:
await bot.send_message(chat_id=CHAT_ID, text=html_text, parse_mode="HTML")
print("消息发送成功")
except TelegramError as e:
print(f"发送失败: ")
if __name__ == "__main__":
asyncio.run(send_html_message())如果需要同步写法,可以使用updater方式,但异步更现代。
实际代码示例:Node.js实现
在Node.js中,可使用node-telegram-bot-api库。安装:
npm install node-telegram-bot-api示例代码:
const TelegramBot = require('node-telegram-bot-api');
const token = 'YOUR_BOT_TOKEN';
const chatId = 'YOUR_CHAT_ID';
const bot = new TelegramBot(token, { polling: true });
const htmlText = `
<b>粗体</b> <i>斜体</i> <u>下划线</u>
<a href="https://t.me/telegram">Telegram频道</a>
<code>npm install</code>
<pre><code class="language-javascript">console.log('hello');</code></pre>
<blockquote>这是一个引用</blockquote>
`;
bot.sendMessage(chatId, htmlText, { parse_mode: 'HTML' })
.then(() => console.log('发送成功'))
.catch(err => console.error('发送失败:', err));注意:使用polling模式时,确保没有与其他实例冲突。
Python纯HTTP实现(不依赖第三方库)
如果你不想引入额外库,可使用标准库urllib或requests直接调用API。以下为requests版:
import requests
url = f"https://api.telegram.org/bot/sendMessage"
payload = {
"chat_id": CHAT_ID,
"text": "<b>Hello</b> <i>World</i>",
"parse_mode": "HTML"
}
response = requests.post(url, json=payload)
print(response.json())此方法适合快速测试,但需自行处理重试和错误。
常见错误与解决方法
发送HTML消息时,最常见的错误是400 Bad Request: can't parse entities,原因通常是HTML标签不匹配或未转义。以下是一些排错技巧:
- 标签闭合:确保每个标签都有对应闭合,如
<b>text</b>。 - 标签嵌套:不能交叉嵌套,如
<b><i>text</b></i>是无效的。 - 特殊字符转义:将
&、<、>分别转义为&、<、>。 - 链接地址:必须使用完整URL,且
href属性值需用双引号包裹。 - 不支持HTML实体:Telegram不会解析除上述三种外的其他实体,如
不会生效。
如果使用python-telegram-bot,可以捕获TelegramError并打印详细信息。
进阶技巧:发送带键盘的HTML消息
你可以在HTML消息中附带内联键盘,实现交互功能。示例:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
keyboard = [[InlineKeyboardButton("访问官网", url="https://tg-telegram.com.cn")]]
reply_markup = InlineKeyboardMarkup(keyboard)
await bot.send_message(chat_id, html_text, parse_mode="HTML", reply_markup=reply_markup)这极大拓展了消息的用途,比如推送带“打开链接”按钮的图文消息。
总结
通过本文的代码示例,你应该已经掌握Telegram Bot发送HTML消息的核心方法。记住几个关键点:设置parse_mode为HTML,遵守标签白名单,正确转义特殊字符。在实际项目中,建议封装一个发送消息的工具函数,统一处理错误和格式化,提升开发效率。
如果你希望进一步深入学习Bot开发,可以查看Telegram官方Bot API文档,或关注本站的“Bot开发”栏目,我们将持续带来更多实用教程。