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

如何用$MadelineProto->messages->getHistory()获取消息中的全部照片?

解决方法

你的问题核心是没处理多图消息的messageMediaAlbum类型,再加上变量引用和初始化的错误,导致只能拿到单张图。直接看修正后的代码和关键说明:

foreach($channels as $channel){
  $messs[$channel] = $this->MadelineProto->messages->getHistory(['peer' => $channel, 'limit' => 1]);
}
foreach ($messs as $key => $messages) {
  foreach ($messages['messages'] as $message) {
    $text = $message['message'];
    // 初始化files为数组,避免首次赋值报错
    $files = [];

    if (isset($message['media'])) {
        $media = $message['media'];
        // 处理单张照片
        if ($media['_'] === 'messageMediaPhoto') {
            $file = $this->MadelineProto->downloadToDir($media, '../../img');
            $files[] = $file;
        }
        // 处理多图相册(这是你之前漏掉的核心逻辑)
        elseif ($media['_'] === 'messageMediaAlbum') {
            foreach ($media['album'] as $albumItem) {
                // 只处理相册里的照片类型
                if ($albumItem['_'] === 'messageMediaPhoto') {
                    $file = $this->MadelineProto->downloadToDir($albumItem, '../../img');
                    $files[] = $file;
                }
            }
        }
    }
     
    // 调整存入条件:有图片或文本都存入,可按需修改
    if(!empty($files) || $text !== ''){
        $posts[] = ['media' => [$key => $files] ];
    }
  }
}

关键修正点:

  • 初始化$files为数组:原来的null会导致第一次$files[]赋值触发错误,改成[]才能正常收集多张图片路径。
  • 修复变量错误:把错误的$text['media']改成$message['media'],你之前混淆了文本内容和消息对象的引用。
  • 新增messageMediaAlbum处理:频道多图消息会被包装成messageMediaAlbum类型,album字段是所有媒体项的数组,遍历它就能拿到每一张照片。
  • 调整存入条件:原来只在有文本时存入,现在改成有图片或文本都存入,适配更多场景。

内容的提问来源于stack exchange,提问作者Алексей С

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:39:58