Skip to content
Advertisement

Telegram sendPhoto with multipart/form-data not working?

Hi I am trying to send an image. The documentation states that I can send a file using multipart/form-data.

enter image description here

Here is my code:

// I checked it, there really is a file.
$file = File::get(Storage::disk('local')->path('test.jpeg')) // it's the same as file_get_contents();

// Here I use the longman/telegram-bot library.
$serverResponse = Request::sendPhoto([
    'chat_id' => $this->tg_user_chat_id,
    'photo' => $file
]);

// Here I use Guzzle because I thought that there might be an 
// error due to the longman/telegram-bot library.
$client = new Client();
$response = $client->post("https://api.telegram.org/$telegram->botToken/sendPhoto", [
    'multipart' => [
        [
            'name'     => 'photo',
            'contents' => $file
        ],
        [
            'name'     => 'chat_id',
            'contents' => $this->tg_user_chat_id
        ]
    ]
]);

Log::info('_response', ['_' => $response->getBody()]);
Log::info(env('APP_URL') . "/storage/$url");
Log::info('response:', ['_' => $serverResponse->getResult()]);
Log::info('ok:', ['_' => $serverResponse->getOk()]);
Log::info('error_code:', ['_' => $serverResponse->getErrorCode()]);
Log::info('raw_data:', ['_' => $serverResponse->getRawData()]);

In both cases, I get this response:

{"ok":false,"error_code":400,"description":"Bad Request: invalid file HTTP URL specified: Wrong URL host"}

Other download methods (by ID and by link) work. Can anyone please point me in the right direction?

Advertisement

Answer

Using the php-telegram-bot library, sendPhoto can be used like so:

<?php

    require __DIR__ . '/vendor/autoload.php';
    use LongmanTelegramBotTelegram;
    use LongmanTelegramBotRequest;

    // File
    $file = Request::encodeFile('/tmp/image.jpeg');

    // Bot
    $key = '859163076:something';
    $telegram = new Telegram($key);

    // sendPhoto
    $chatId = 000001;
    $serverResponse = Request::sendPhoto([
        'chat_id' => $chatId,
        'photo' => $file
    ]);

The trick is to use Request::encodeFile to read the local image.

User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement