Telgram Bot Bad Gateway

时间:2015-07-04 13:21:01

标签: php guzzle telegram telegram-bot

我正在尝试使用TelegramBot 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 Bad Gateway 。我使用的方法是否正确?我在使用API​​获取 getMe 方面没有任何问题。

P.S我使用Guzzle 5.3.0来兼容php。

3 个答案:

答案 0 :(得分:1)

尝试将其作为多部分发布。

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);

Guzzle documentation reference

对于Guzzle 5.3

{{1}}

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

答案 1 :(得分:1)

我终于找到了解决方案。为别人贴上我的解决方案。

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>');
}

我很困惑为什么这种方法适用于这种Guzzle方法,而不是另一种方法。我怀疑Guzzle没有使用第一种方法设置正确的标题类型。

答案 2 :(得分:0)

来自Guzzle 3 documentation

  

Guzzle中的POST请求随附一个   如果是POST字段,则为application/x-www-form-urlencoded Content-Type标头   存在,但POST中没有发送文件。如果文件是   在POST请求中指定,然后Content-Type标头将   变为 multipart/form-data

     

客户端对象的post()方法接受四个参数:URL,   可选标头,发布字段和一组请求选项。至   在POST请求中发送文件,将@符号添加到数组中   值(就像你使用PHP curl_setopt一样)   功能)。   例如:

$request = $client->post('http://httpbin.org/post', array(), array(
    'custom_field' => 'my custom value',
    'file_field'   => '@/path/to/file.xml'
));

因此对于Telegram API,这将成为:

$request = $client->post('https://api.telegram.org/botMyApiKey/sendPhoto', array(), array(
    'chat_id' => 'xxxx',
    'photo'   => '@/path/to/photo.jpg'
));