Hi I am trying to send an image. The documentation states that I can send a file using multipart/form-data.
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.
