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:
- 调用
createNewStickerSet创建一个新的贴纸集 - 调用
addStickerToSet把你上传的贴纸添加进去 - 调用
getStickerSet获取贴纸集详情,拿到里面的贴纸 file_id - 用这个 file_id 作为内联查询的结果
这种方法获取的 file_id 是完全符合 Telegram 贴纸规范的,基本不会出现校验错误。
内容的提问来源于stack exchange,提问作者Tomas Javurek
相关产品推荐
相关产品推荐

