Telegram Bot发送动画贴纸的编码要求:从TGS格式到API实现

深入解析Telegram Bot发送动画贴纸的编码要求,涵盖TGS文件格式规范、sendSticker API参数、尺寸限制、帧率要求及常见错误处理,帮助开发者快速集成。

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

动画贴纸是Telegram聊天中最具表现力的元素之一,而通过Bot发送动画贴纸可以为用户带来更生动的交互体验。但动画贴纸的编码要求与普通图片或视频完全不同,稍有不慎就会导致发送失败。本文将聚焦Telegram Bot发送动画贴纸的编码要求,从TGS格式规范到sendSticker API的每个细节,帮助你彻底掌握这一技能。

一、动画贴纸的TGS格式规范

Telegram动画贴纸使用TGS格式,它是基于Lottie的矢量动画文件。与传统的GIF或WebP不同,TGS文件实际上是一个经过压缩的JSON文件,其中包含矢量图形、动画曲线和关键帧数据。因此,编码要求首先体现在文件结构上。

  • 文件扩展名:必须为.tgs,但发送时无需显式指定扩展名,系统根据文件内容识别。
  • 文件大小:单个TGS文件最大为64KB,超过此限制的贴纸无法被Telegram接受。
  • 画布尺寸:固定为512×512像素,但实际可视内容应居中并预留安全边距。
  • 帧率:建议为60fps,但Telegram会将其转换为30fps播放,编码时无需强制60fps。
  • 颜色模式:支持RGBA,透明背景是必须的,因为贴纸需要与聊天背景融合。
  • Lottie JSON限制:顶部必须是{"v":"5.x.x","fr":...,"ip":...,"op":...}结构,且不支持的表达式和复杂特效会被拒绝。

值得注意的是,TGS文件不能直接由Bot上传作为贴纸包使用,但Bot可以发送已存在于Telegram服务器上的动画贴纸(通过file_id)或通过URL发送符合上述规范的TGS文件。

二、sendSticker API的编码要求

Telegram Bot API的sendSticker方法负责发送贴纸,其核心参数是sticker。该参数接受两种编码形式:

  1. file_id:一个字符串,表示Telegram服务器上已存在的贴纸文件。使用file_id发送时无需处理编码,只需确保该贴纸属于你的Bot或已被Bot使用过。file_id具有唯一性,但可能因Bot不同而失效。
  2. URL:一个HTTP/HTTPS链接,指向公开可访问的TGS文件。使用URL发送时,Telegram服务器会尝试下载并验证文件是否符合规则,如果不符合,请求会报错。

另外,sendSticker还支持emoji参数,表示贴纸对应的表情符号,但这只是元数据,不影响编码验证。对于动画贴纸,sticker_type属性在发送时通常自动推断,但确保文件为动画类型至关重要。

三、通过file_id发送动画贴纸

最稳定可靠的方式是使用file_id。当你的Bot第一次收到用户发送的动画贴纸时,可以通过getUpdatesgetMessage获取到该贴纸的file_id。之后,编辑即用即可:

POST https://api.telegram.org/bot<TOKEN>/sendSticker
{
  "chat_id": 123456789,
  "sticker": "CAACAgIAAxkBAAEYqV5nM6..."
}

注意:不同Bot之间的file_id不通用,且如果贴纸被删除,file_id会失效。因此,建议在发送前先调用getFile验证file_id的有效性。

四、通过URL发送动画贴纸

如果你有自建贴纸或临时生成的TGS文件,可以将其托管到可公开访问的URL,然后通过URL发送。编码要求在此刻显得尤为重要:

  • URL必须直接指向.tgs文件,不能是包含贴纸的网页。
  • 服务器响应需返回Content-Type: application/octet-streamapplication/x-tgs,但Telegram主要校验文件内容。
  • 文件必须完整且不超过64KB,否则会返回STICKER_TGS_NOT_VALID错误。
  • 确保URL支持HTTPS,且不要求认证或包含重定向(Telegram会跟随少量重定向,但建议避免)。

示例代码(Python + requests):

import requests

url = "https://example.com/sticker.tgs"
response = requests.post(
    f"https://api.telegram.org/bot/sendSticker",
    data={
        "chat_id": chat_id,
        "sticker": url
    }
)
print(response.json())

五、常见错误与故障排查

发送动画贴纸时,最常见的错误包括:

  • 400 Bad Request: STICKER_TGS_NOT_VALID:TGS文件不符合规范,请检查文件大小、JSON结构、尺寸和帧率。
  • 400 Bad Request: STICKER_EMOJI_INVALID:emoji参数包含无效字符,仅支持标准Unicode表情。
  • 404 Not Found:file_id不存在或已被删除,需重新获取。
  • 网络超时:URL无法访问或下载速度过慢,建议使用CDN或压缩文件。

调试时,可以先手动下载TGS文件并检查其JSON内容。使用Lottie官方预览工具验证动画是否正常。同时,建议在Bot代码中加入异常处理,捕获API响应中的错误码。

总结

Telegram Bot发送动画贴纸并不复杂,但严格遵循编码要求是成功的关键。从TGS格式的50KB限制到512×512尺寸,再到file_id与URL的选择,每个细节都影响最终的体验。建议开发者优先使用file_id,确保稳定性和速度;若使用URL,务必验证文件的有效性。希望本文能帮助你避免踩坑,让你的Bot动画贴纸功能完美落地。

FAQ

多平台客户端选择

常见问题

Telegram动画贴纸的TGS文件最大不能超过多少KB?

单个TGS文件最大为64KB,超过此限制的贴纸无法被Telegram接受。

通过URL发送动画贴纸时,Telegram如何验证文件?

Telegram会下载URL指向的文件,检查其格式是否为有效的TGS(Lottie JSON),并验证文件大小、画布尺寸等规范,不符合则返回STICKER_TGS_NOT_VALID错误。

file_id发送和URL发送动画贴纸有何区别?

file_id是Telegram服务器上已存在文件的标识,发送快速且稳定,但不同Bot之间不通用;URL需要公开可访问,Telegram需下载验证,可能存在延迟或失败风险。