You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telegram机器人answerInlineQuery返回STICKER_DOCUMENT_INVALID错误求助

解决 Telegram 内联查询返回 STICKER_DOCUMENT_INVALID 错误的方案

我之前也碰到过一模一样的问题,折腾了好一阵才找到根源,给你几个排查和解决的方向:

1. 先确认贴纸文件本身是否符合要求

Telegram 对贴纸的格式和尺寸有严格限制,这是最常见的出错原因:

  • 静态贴纸必须是 WebP 格式,分辨率要求是宽/高中至少有一个为 512px,另一个维度不超过 512px(比如 512x300 是允许的,但 600x600 不行)
  • 动画贴纸必须是 TGS 格式(仅限贴纸集使用,内联查询支持的话也需要符合这个要求)

你通过 uploadStickerFile 上传时,Telegram 可能不会严格校验格式(比如允许上传 PNG/JPG),但实际作为贴纸返回时就会触发 STICKER_DOCUMENT_INVALID 错误。建议先把你的图片转换成标准的 WebP 格式再尝试上传。

2. 验证你拿到的 file_id 是否真的可用

有时候 uploadStickerFile 返回的 file_id 只能用于创建贴纸集,不能直接用于内联查询。你可以先做个测试:
用这个 file_id 调用 sendSticker 发送到任意聊天窗口:

ctx.telegram.sendSticker('your_chat_id', 'file_id_obtained_from_upload_sticker_method')
  .then(msg => console.log('贴纸发送成功:', msg.sticker.file_id))
  .catch(err => console.log('发送失败,文件本身有问题:', err))

如果发送失败,说明这个 file_id 对应的文件不符合贴纸要求;如果发送成功,你可以用返回的 msg.sticker.file_id 作为内联查询的 sticker_file_id,这个才是真正有效的贴纸文件 ID。

3. 检查内联结果的参数规范

虽然你的代码看起来符合文档,但有两个细节可以调整试试:

  • 内联结果的 id 字段最好用唯一字符串(比如随机生成的 ID),虽然官方允许用 '0',但不排除某些情况下会有隐性校验
  • 确保没有遗漏必填字段,InlineQueryResultSticker 的必填字段只有 type、id、sticker_file_id,但你可以尝试添加 thumb_url(指向贴纸缩略图的 URL),有时候能解决一些隐性的校验问题

修改后的示例代码:

// 用随机字符串作为 id
const uniqueId = Math.random().toString(36).substring(2, 10);
// 使用 sendSticker 返回的有效 file_id
const sticker = { 
  type: 'sticker', 
  id: uniqueId, 
  sticker_file_id: 'valid_file_id_from_sendSticker' 
};
ctx.telegram.answerInlineQuery(query.id, [sticker]);

4. 尝试通过贴纸集获取可用的 file_id

如果上面的方法都不行,可以试试把上传的贴纸添加到一个贴纸集里,再从贴纸集中获取 file_id:

  1. 调用 createNewStickerSet 创建一个新的贴纸集
  2. 调用 addStickerToSet 把你上传的贴纸添加进去
  3. 调用 getStickerSet 获取贴纸集详情,拿到里面的贴纸 file_id
  4. 用这个 file_id 作为内联查询的结果

这种方法获取的 file_id 是完全符合 Telegram 贴纸规范的,基本不会出现校验错误。

内容的提问来源于stack exchange,提问作者Tomas Javurek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:02:39