TeleDartMessage的photo属性长度恒为4 如何获取用户发给bot的全部照片
TeleDart 照片获取问题解答
为什么photo属性长度始终为4?
Telegram Bot API 中,PhotoSize 数组对应的是单张照片的不同分辨率版本,默认会生成缩略图、标清、高清、原图共4个尺寸,因此单张照片对应的photo属性长度固定为4,你看到的长度为4的数组,本质是同一张照片的多尺寸变体集合,不是多张照片的列表。
你批量发送多张照片时拿到的photo长度还是4,是因为批量发送的照片会被Telegram归类为「媒体组」,每张照片都会作为独立的Message对象推送,每个独立消息的photo字段依然对应单张照片的4个尺寸,所以打印出来的长度永远是4。
如何正确获取用户发送的全部照片?
分两种场景处理:
- 单次发送单张照片:直接读取当前消息的
photo数组即可,通常数组最后一个元素是分辨率最高的原图,取对应file_id就可以下载照片资源。 - 单次批量发送多张照片:
- 所有同批次的照片消息会携带相同的
media_group_id字段 - 你需要本地维护一个临时缓存,以
media_group_id为键,收集对应所有携带照片的消息对象 - 收到同媒体组的所有消息后,即可得到全部照片的集合
- 所有同批次的照片消息会携带相同的
代码修改示例
// 临时缓存媒体组照片,key为media_group_id,value为照片列表 Map<String, List<PhotoSize>> mediaGroupCache = {}; teledart.telegram.sendMessage( message.chat.id, 'add photos', ); final messageSubscription = teledart.onMessage().listen((_) {}); messageSubscription.onData((data) async { if (data.photo == null) return; // 不是媒体组的单张照片,直接处理 if (data.mediaGroupId == null) { print('收到1张照片,4个尺寸:${data.photo!.length}'); // 处理逻辑:取data.photo!.last的file_id下载 return; } // 是媒体组的批量照片,加入缓存 if (!mediaGroupCache.containsKey(data.mediaGroupId)) { mediaGroupCache[data.mediaGroupId!] = []; } mediaGroupCache[data.mediaGroupId!]!.add(data.photo!.last); // 延迟1秒等待同组所有消息收齐后统一处理 Future.delayed(const Duration(seconds: 1), () { final allPhotos = mediaGroupCache.remove(data.mediaGroupId!); print('收到批量照片数量:${allPhotos?.length ?? 0}'); // 批量处理逻辑 }); });
内容的提问来源于stack exchange,提问作者Alex K
相关产品推荐
相关产品推荐

