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

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就可以下载照片资源。
  • 单次批量发送多张照片:
    1. 所有同批次的照片消息会携带相同的media_group_id字段
    2. 你需要本地维护一个临时缓存,以media_group_id为键,收集对应所有携带照片的消息对象
    3. 收到同媒体组的所有消息后,即可得到全部照片的集合

代码修改示例

// 临时缓存媒体组照片,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:06:04