使用MadelineProto下载Telegram频道照片未生成文件问题排查与解决
MadelineProto 频道照片下载问题排查与实现
核心问题原因
- 传入
downloadToFile的参数不符合接口要求:你当前传入的$message是messageMediaPhoto结构,并非MadelineProto可直接识别的照片对象或完整消息对象。getHistory返回的messages[0]为完整message对象,照片资源嵌套在media字段下,此处属于取数层级错误,直接传messageMediaPhoto会导致方法无法识别嵌套的照片资源,出现静默失败,不生成文件也无明显报错。 - 未指定照片下载尺寸:Telegram照片存在多档分辨率(你返回的元数据包含
i/m/x三种类型),MadelineProto下载照片时必须明确指定尺寸类型,否则无法匹配对应文件分片。 - 次要排查点:如果输出路径
/tmp.png未给PHP进程开放写入权限,也会导致文件无法生成。
修正后的实现代码
<?php if (!file_exists('madeline.php')) { copy('https://phar.madelineproto.xyz/madeline.php', 'madeline.php'); } include 'madeline.php'; $MadelineProto = new \danog\MadelineProto\API('session.madeline'); $MadelineProto->start(); $channel = '@example'; $offset_id = 0; $limit = 1; $messages_Messages = $MadelineProto->messages->getHistory([ 'peer' => $channel, 'offset_id' => $offset_id, 'offset_date' => 0, 'add_offset' => 0, 'limit' => $limit, 'max_id' => 0, 'min_id' => 0, 'hash' => 0 ]); $latestMessage = $messages_Messages['messages'][0]; // 校验最新消息是否为带照片的媒体消息 if (!isset($latestMessage['media']['_']) || $latestMessage['media']['_'] !== 'messageMediaPhoto') { die('频道最新消息不是照片类型'); } // 下载方式1:传入完整消息对象,自动识别照片资源 $MadelineProto->downloadToFile( $latestMessage, '/tmp.png', // 指定要下载的尺寸,可选值对应元数据中的type字段:i(缩略图)/m(中等尺寸)/x(高清尺寸) ['photo_size' => 'x'] ); // 下载方式2:单独提取照片对象下载,效果与方式1完全一致 // $photo = $latestMessage['media']['photo']; // $MadelineProto->downloadToFile($photo, '/tmp.png', ['photo_size' => 'x']);
额外排查建议
- 可先将输出路径改为当前PHP运行目录下的文件(如
./test.png),排除系统路径权限不足的问题 - 下载完成后可通过
var_dump(file_exists('/tmp.png'));验证文件是否成功生成 - 可通过遍历
$latestMessage['media']['photo']['sizes']获取当前照片所有可用的尺寸类型,按需选择下载
内容的提问来源于stack exchange,提问作者HAGEN _
相关产品推荐
相关产品推荐

