Php 电报机器人坏网关

Php 电报机器人坏网关,php,guzzle,telegram,telegram-bot,Php,Guzzle,Telegram,Telegram Bot,我试图上传图片使用电报机器人API使用以下代码 if(file_exists($_FILES['fileToUpload']['tmp_name'])){ $new = fopen($_FILES['fileToUpload']['tmp_name'], "rb"); $contents = fread($new, $_FILES['fileToUpload']['size']); fclose($new); $

我试图上传图片使用电报机器人API使用以下代码

if(file_exists($_FILES['fileToUpload']['tmp_name'])){
        $new = fopen($_FILES['fileToUpload']['tmp_name'], "rb");
        $contents = fread($new, $_FILES['fileToUpload']['size']);
        fclose($new);
        $client = new Client();
        $response = $client->post("https://api.telegram.org/botMyApiKey/sendPhoto", [
            'body'    => ['chat_id' => '11111111', 'photo' => $contents]
        ]);
        var_dump($response);
}else{
        echo("No File");
}
我得到了Nginx 502坏网关。我使用的方法正确吗?我使用API获取
getMe
没有问题


另外,为了与php兼容,我正在使用Guzzle 5.3.0。

尝试将其作为一篇多部分文章

$client->post(
    'https://api.telegram.org/botMyApiKey/sendPhoto', 
    array(
        'multipart' => array(
            array(
                'name'     => 'chat_id',
                'contents' => '1111111'
            ),
            array(
                'name'     => 'photo',
                'contents' => $contents
            )
        )
    )
);

对于Guzzle 5.3

use GuzzleHttp\Client;

$client = new Client(['defaults' => [
    'verify' => false
]]);

$response = $client->post('https://api.telegram.org/bot[token]/sendPhoto', [
    'body' => [
        'chat_id' => 'xxxxx',
        'photo' => fopen(__DIR__ . '/test.jpg', 'r')
    ]
]);

var_dump($response);

注意:您必须将文件句柄传递给“photo”属性,而不是文件的内容。

我终于找到了解决方案。为其他人粘贴我的解决方案

move_uploaded_file($_FILES['photo']['tmp_name'], __DIR__."/temp/".$_FILES['photo']['name']); //Important for Form Upload
$client = new Client();
$request = $client->createRequest('POST', 'https://api.telegram.org/botMyApiKey/sendPhoto');
$postBody = $request->getBody();
$postBody->setField('chat_id', '11111111');
$postBody->addFile(new PostFile('photo', fopen(__DIR__."/temp/".$_FILES['photo']['name'], "r") ));
try{
     $response = $client->send($request);
     var_dump($response);
}catch(\Exception $e){
     echo('<br><strong>'.$e->getMessage().'</strong>');
}
move_上传的文件($_文件['photo']['tmp_name'],[uu目录]/temp/“$_文件['photo']['name'])//对于表单上传很重要
$client=新客户端();
$request=$client->createRequest('POST','https://api.telegram.org/botMyApiKey/sendPhoto');
$postBody=$request->getBody();
$postBody->setField('chat_id','11111111');
$postBody->addFile(新的PostFile('photo',fopen('DIR.'/temp/“$”文件['photo']['name'],“r”)));
试一试{
$response=$client->send($request);
var_dump($response);
}捕获(\异常$e){
echo(“
”.$e->getMessage()。”); }

我很困惑,为什么这种狂饮方式有效,而不是另一种。我怀疑Guzzle在第一次进近时没有设置正确的收割台类型。

我使用的是Guzzle 5.3。“多部分”选项仅在最新版本中可用。为了与php兼容,我使用了旧的guzzle版本。见“张贴请求”一节。电报API要求您上传照片的多部分/表单数据请参见我的编辑,您必须传递文件句柄而不是文件内容。我尝试传递文件句柄,结果导致[状态代码]400[原因短语]请求错误。我不知道为什么。我用我使用的完整代码片段更新了我的答案。这对我来说非常合适。但是,当我传递文件内容时,我确实收到了502错误。