如何用$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,提问作者Алексей С
相关产品推荐
相关产品推荐

