电报机器人 API 错误 400 照片具有不受支持的扩展名


Telegram bot API error 400 Photo has unsupported extension

我正在尝试使用"sendPhoto"方法通过我的一个电报机器人发送动态创建的 png 图像(生成 png 文件的 php 脚本,[下面的代码])。

当我链接物理 png 文件(在多部分字段参数中)时,它工作正常,但是当我尝试使用 php 文件时,我从 Telegram 收到以下错误:

照片具有不支持的扩展名。使用.jpg、.jpeg、.gif、.png、.tif或.bmp之一

PHP代码很简单,当我在浏览器中打开文件时效果很好(我看到一个下载png文件的对话框,它在我的计算机上打开正常):

header("Content-type: image/png");
header('Content-Disposition: attachment; filename="moo.png"');
$image = imagecreatetruecolor(50, 50);
imagesavealpha($image, true);
$transparent = imagecolorallocatealpha($image, 0, 0, 0, 127); 
imagefill($image, 0, 0, $transparent); 
ob_start ();
imagepng($image);
ob_end_flush();
imagedestroy($image);

有没有办法绕过此扩展名检查并在电报请求中发送我的动态图像脚本(扩展名为.php的文件)?

事实证明,bot API与它无关。当我真的应该附加脚本输出时,我错误地附加了脚本文件(呃!因此,将输出缓冲区刷新到 tmp 文件中然后发送它就可以解决问题

    function pngCraft($width = 100, $height = 100, $asBase64 = FALSE)
    {
        $image = imagecreatetruecolor($width, $height);
        imagesavealpha($image, true);
        $transparent = imagecolorallocatealpha($image, 0, 0, 0, 127);
        imagefill($image, 0, 0, $transparent);
        ob_start ();
        imagepng($image);
        $image_data = ob_get_contents();
        ob_end_clean ();
        $out = ($asBase64) ? base64_encode($image_data) : $image_data;
        imagedestroy($image);
        return $out;
    }
    $file = tmpfile();
    fwrite($file, pngCraft());
    fseek($file,0);
    $a = stream_get_meta_data($file);
    $uri = $a['uri'];
    rename($uri, $uri.='.png'); 
    $fields[TG_METHOD_SENDPHOTO_PHOTO] = '@'.$uri;
    $fields[TG_METHOD_SENDPHOTO_CAPTION] = 'Yay!';