Telegram Bot发送HTML消息的代码示例:从入门到实战

本文详细介绍Telegram Bot发送HTML消息的代码示例,涵盖HTTP API调用、Python与Node.js代码实现、HTML标签支持范围及常见错误处理,帮助开发者快速掌握富文本消息发送技巧。

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

引言

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实体(&lt;&gt;&amp;)。例如发送“1 < 2”应写为1 &lt; 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实现(不依赖第三方库)

如果你不想引入额外库,可使用标准库urllibrequests直接调用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>是无效的。
  • 特殊字符转义:&<>分别转义为&amp;&lt;&gt;
  • 链接地址:必须使用完整URL,且href属性值需用双引号包裹。
  • 不支持HTML实体:Telegram不会解析除上述三种外的其他实体,如&nbsp;不会生效。

如果使用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_modeHTML,遵守标签白名单,正确转义特殊字符。在实际项目中,建议封装一个发送消息的工具函数,统一处理错误和格式化,提升开发效率。

如果你希望进一步深入学习Bot开发,可以查看Telegram官方Bot API文档,或关注本站的“Bot开发”栏目,我们将持续带来更多实用教程。

FAQ

多平台客户端选择

常见问题

Telegram Bot发送HTML消息时,支持哪些HTML标签?

官方支持的标签包括:<b>、<strong>、<i>、<em>、<u>、<s>、<strike>、<a href>、<code>、<pre>、<tg-spoiler>、<blockquote>。其他HTML标签不会被解析,且特殊字符需要转义。

发送HTML消息时如何转义特殊字符?

只需转义三个字符:& 转义为 &amp;,< 转义为 &lt;,> 转义为 &gt;。注意不要在HTML标签中使用转义,否则标签会失效。

为什么我发送的HTML消息显示为纯文本?

最常见的原因是没有设置parse_mode参数,或者设置错误。确保请求中带有"parse_mode": "HTML"。另外,如果使用了代码块标签,需要确保<pre>和<code>正确嵌套。