Коли користувач надсилає картинки боту, то на PHP скрипт приходить масив прев'ю цих картинок. Останнім елементом масиву є оригінальне зображення.
Максимальний допустимий розмір файлу зображення – 20 МБ.
Отримання та збереження графічних файлів
Якщо ми надішлемо боту картинку (у месенджері), то отримаємо від Telegram наступний запит:
Array
(
[update_id] => 699174148
[message] => Array
(
[message_id] => 192
[from] => Array
(
[id] => 1526361849
[is_bot] =>
[first_name] => FirstName
[last_name] => LastName
[username] => UserName
[language_code] => uk
)
[chat] => Array
(
[id] => 1526361849
[first_name] => FirstName
[last_name] => LastName
[username] => UserName
[type] => private
)
[date] => 1670943133
[photo] => Array
(
[0] => Array
(
[file_id] => AgACAgIAAxkBAAPAY5iRncFiTaQqFAGQRMV27WCzqbQAAq_FMRvPkMlI5UK0Qv021REBAAMCAANzAAMsBA
[file_unique_id] => AQADr8UxG8-QyUh4
[file_size] => 505
[width] => 90
[height] => 64
)
[1] => Array
(
[file_id] => AgACAgIAAxkBAAPAY5iRncFiTaQqFAGQRMV27WCzqbQAAq_FMRvPkMlI5UK0Qv021REBAAMCAANtAAMsBA
[file_unique_id] => AQADr8UxG8-QyUhy
[file_size] => 2654
[width] => 320
[height] => 226
)
[2] => Array
(
[file_id] => AgACAgIAAxkBAAPAY5iRncFiTaQqFAGQRMV27WCzqbQAAq_FMRvPkMlI5UK0Qv021REBAAMCAAN4AAMsBA
[file_unique_id] => AQADr8UxG8-QyUh9
[file_size] => 11414
[width] => 800
[height] => 566
)
[3] => Array
(
[file_id] => AgACAgIAAxkBAAPAY5iRncFiTaQqFAGQRMV27WCzqbQAAq_FMRvPkMlI5UK0Qv021REBAAMCAAN5AAMsBA
[file_unique_id] => AQADr8UxG8-QyUh-
[file_size] => 16763
[width] => 1280
[height] => 906
)
)
)
)
Нагадаю, що цей запит ми можемо побачити в файлі message.txt після відправки фото.
Тут нас цікавить file_id в якому вказано ID зображення.
Тепер ми можемо дізнатись шлях до файлу зображення і скачати його. Для цього можна ввести в адресному рядку браузера посилання з наступною конструкцією:
https://api.telegram.org/bot<token>/getFile?file_id=<the_file_id>
де,
- <token> – токен бота.
- <the_file_id> – ID файлу який потрібно завантажити.
Наприклад, щоб скачати картинку, яку я раніше відправив боту в месенджері, потрібно в адресному рядку браузера вписати наступне:
https://api.telegram.org/bot5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y/getFile?file_id= AgACAgIAAxkBAAPAY5iRncFiTaQqFAGQRMV27WCzqbQAAq_FMRvPkMlI5UK0Qv021REBAAMCAAN5AAMsBA
У відповіді ви отримаєте:
{"ok":true,"result":{"file_id":"AgACAgIAAxkBAAPAY5iRncFiTaQqFAGQRMV27WCzqbQAAq_FMRvPkMlI5UK0Qv021REBAAMCAAN5AAMsBA","file_unique_id":"AQADr8UxG8-QyUh-","file_size":16763,"file_path":"photos/file_0.jpg"}}
Тут, в file_path вказана адреса картинки.
Щоб скачати цю картинку ми можемо сформувати наступне посилання:
https://api.telegram.org/file/bot<token><file_path>
де,
- <token> – токен бота.
- <file_path> – шлях до файлу зображення, який ми отримали в результаті попереднього запиту (https://api.telegram.org/bot<token>/getFile?file_id=<the_file_id>)
Приклад посилання, перейшовши по якому ми завантажуємо картинку, яка була відправлена боту в месенджері:
https://api.telegram.org/file/bot5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y/photos/file_0.jpg
Отримання та збереження картинки на сервері
Отримання картинки за допомогою PHP та її збереження на сервері можна реалізувати таким чином:
<?php
// Приймаємо запит
$data = file_get_contents('php://input');
$data = json_decode($data, true);
file_put_contents(__DIR__ . '/message.txt', print_r($data, true)); //зберігаємо вхідні дані у файл
// Константа токен
define('TOKEN', '5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y');
// Функція виклику методів API
function sendTelegram($method, $response) {
$ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/' . $method);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
//відповідь на збереження картинки
if (!empty($data['message']['photo'])) {
$photo = array_pop($data['message']['photo']);
$res = sendTelegram(
'getFile',
array(
'file_id' => $photo['file_id']
)
);
$res = json_decode($res, true);
if ($res['ok']) {
$src = 'https://api.telegram.org/file/bot' . TOKEN . '/' . $res['result']['file_path'];
$dest = __DIR__ . '/' . time() . '-' . basename($src);
if (copy($src, $dest)) {
sendTelegram(
'sendMessage',
array(
'chat_id' => $data['message']['chat']['id'],
'text' => 'Картинка збережена на сервері'
)
);
}
}
exit();
}
?>
Відправлення картинок Telegram боту
Для надсилання файлів зображень Telegram боту використовують метод sendPhoto.
<?php
// Приймаємо запит
$data = file_get_contents('php://input');
$data = json_decode($data, true);
file_put_contents(__DIR__ . '/message.txt', print_r($data, true)); //зберігаємо вхідні дані у файл
// Константа токен
define('TOKEN', '5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y');
// Функція виклику методів API
function sendTelegram($method, $response) {
$ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/' . $method);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
// Відповідь на текстове повідомлення
// Отримуємо текст, який відправив користувач Телеграм боту в месенджері
if (!empty($data['message']['text'])) {
$text = $data['message']['text'];
// Відправили фото в Telegram бот, якщо користувач ввів команду /sendimg
if (mb_stripos($text, '/sendimg') !== false) {
sendTelegram(
'sendPhoto',
array(
'chat_id' => $data['message']['chat']['id'],
'photo' => curl_file_create(__DIR__ . '/foto-ua.jpg')
)
);
exit();
}
}
?>
В даному прикладі, якщо користувач відправить нашому Телеграм боту команду /sendimg, то у відповіді, він отримає картинку foto-ua.jpg, яка знаходиться на сервері в папці з нашим скриптом.
Код PHP з прикладом отримання та надсилання фото
<?php
// Приймаємо запит
$data = file_get_contents('php://input');
$data = json_decode($data, true);
file_put_contents(__DIR__ . '/message.txt', print_r($data, true)); //зберігаємо вхідні дані у файл
// Константа токен
define('TOKEN', '5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y');
// Функція виклику методів API
function sendTelegram($method, $response) {
$ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/' . $method);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
// Відповідь якщо користувач прислав фото в месенджері, а ми його зберегли на сервері
if (!empty($data['message']['photo'])) {
$photo = array_pop($data['message']['photo']);
$res = sendTelegram(
'getFile',
array(
'file_id' => $photo['file_id']
)
);
$res = json_decode($res, true);
if ($res['ok']) {
$src = 'https://api.telegram.org/file/bot' . TOKEN . '/' . $res['result']['file_path'];
$dest = __DIR__ . '/' . time() . '-' . basename($src);
if (copy($src, $dest)) {
sendTelegram(
'sendMessage',
array(
'chat_id' => $data['message']['chat']['id'],
'text' => 'Картинка збережена на сервері'
)
);
}
}
exit();
}
// Відповідь на текстове повідомлення
// Отримуємо текст, який відправив користувач Телеграм боту в месенджері
if (!empty($data['message']['text'])) {
$text = $data['message']['text'];
// Відправили фото в Telegram бот, якщо користувач ввів команду /sendimg
if (mb_stripos($text, '/sendimg') !== false) {
sendTelegram(
'sendPhoto',
array(
'chat_id' => $data['message']['chat']['id'],
'photo' => curl_file_create(__DIR__ . '/foto-ua.jpg')
)
);
exit();
}
}
?> 