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.