PHP Telegram Bot SDK调用sendMediaGroup发多图失败如何解决
问题根源
你代码的错误都出在传参不符合API规则,一共3个核心问题:
caption、parse_mode不是sendMediaGroup的顶级参数,必须写在media数组的第一个媒体对象里——Telegram的媒体组只支持给第一个媒体挂载说明文字,最终会展示为整个组的统一说明,顶级传这两个参数会被API直接忽略media字段必须传入JSON序列化后的字符串,直接传PHP数组、或者刻意去掉json_encode的写法完全不符合API要求,必错- 用
file_get_contents拉取自身服务器的HTTP地址读图片属于多余操作,既浪费内存,又容易触发HTTPS证书校验、网络波动、权限配置等问题导致读文件失败
方案1:直接使用公网图片URL(最推荐)
如果你的图片路径可以通过公网直接访问,直接把URL填到media字段里即可,不需要调用InputFile、不需要读文件内容,稳定性最高:
$reply = "*photos*"; $serverHost = $_SERVER['SERVER_NAME']; $telegram->sendMediaGroup([ 'chat_id' => $chat, 'media' => json_encode([ [ 'type' => 'photo', 'media' => "https://{$serverHost}/newbot/screens/ctry/en1.jpg", 'caption' => $reply, // 说明必须放在第一个媒体项里 'parse_mode' => 'markdown' ], [ 'type' => 'photo', 'media' => "https://{$serverHost}/newbot/screens/ctry/en2.jpg" ] ]) ]);
注意:不要尝试去掉
json_encode,Telegram Bot API明确要求media参数传入JSON格式的字符串,直接传PHP数组会被接口拒绝。
方案2:上传非公开本地文件的写法
如果图片不能通过公网直接访问,需要走文件上传逻辑时,直接读本地磁盘路径即可,不要通过HTTP请求拉取自身服务器文件:
$reply = "*photos*"; // 直接拼接本地磁盘绝对路径,性能远高于HTTP请求读文件 $photo1Path = $_SERVER['DOCUMENT_ROOT']."/newbot/screens/ctry/en1.jpg"; $photo2Path = $_SERVER['DOCUMENT_ROOT']."/newbot/screens/ctry/en2.jpg"; $telegram->sendMediaGroup([ 'chat_id' => $chat, 'media' => json_encode([ [ 'type' => 'photo', 'media' => 'attach://photo1', 'caption' => $reply, 'parse_mode' => 'markdown' ], [ 'type' => 'photo', 'media' => 'attach://photo2' ] ]), 'photo1' => InputFile::create($photo1Path), 'photo2' => InputFile::create($photo2Path) ]);
避坑提示
- 只要图片能通过公网正常访问,优先用URL传参,不需要走文件上传逻辑,请求速度更快、出错概率更低
- 用Markdown解析模式时,记得转义说明文本里的特殊字符(
*、_、[、]、(、)等),否则会触发API的格式解析错误 - 单次sendMediaGroup最多支持传10个媒体文件,超过数量会直接报错
内容的提问来源于stack exchange,提问作者Phoz
相关产品推荐
相关产品推荐

