Процес скачування та відправлення файлів в Telegram бот аналогічний тому, як відбувається відправлення та отримання картинок.
Отримання та завантаження файлів Telegram
Якщо ми надішлемо боту якийсь файл через месенджер, то в наш файл message.txt на сервері буде записаний наступний запит від Telegram:
Array
(
[update_id] => 699174174
[message] => Array
(
[message_id] => 232
[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] => 1671007433
[document] => Array
(
[file_name] => Черги.xlsx
[mime_type] => application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
[file_id] => BQACAgIAAxkBAAPoY5mMyU1S7gM7XjYRX5cBrTaedUMAAgEgAAIm8MhIDO_GOO_9z1IsBA
[file_unique_id] => AgADASAAAibwyEg
[file_size] => 10794
)
)
)
Знаючи <file_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=BQACAgIAAxkBAAPoY5mMyU1S7gM7XjYRX5cBrTaedUMAAgEgAAIm8MhIDO_GOO_9z1IsBA
У відповіді буде отримано таку інформацію:
{"ok":true,"result":{"file_id":"BQACAgIAAxkBAAPoY5mMyU1S7gM7XjYRX5cBrTaedUMAAgEgAAIm8MhIDO_GOO_9z1IsBA","file_unique_id":"AgADASAAAibwyEg","file_size":10794,"file_path":"documents/file_2.xlsx"}}
Тут, в <file_path> вказана адреса файлу – documents/file_2.xlsx.
Тепер, ми можемо сформувати посилання, перейшовши по якому відбудеться завантаження файлу на ПК:
https://api.telegram.org/file/bot<token><file_path>
де,
- <token> – токен бота.
- <file_path> – шлях до файлу, який потрібно завантажити.
Ось приклад посилання, перейшовши по якому почнеться скачування файлу, який був відправлений боту в месенджері:
https://api.telegram.org/file/bot5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y/documents/file_2.xlsx
Збереження файлу на сервері Telegram
Отримання файлу та його збереження на сервері можна реалізувати наступним чином:
<?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']['document'])) {
$res = sendTelegram(
'getFile',
array(
'file_id' => $data['message']['document']['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() . '-' . $data['message']['document']['file_name'];
if (copy($src, $dest)) {
sendTelegram(
'sendMessage',
array(
'chat_id' => $data['message']['chat']['id'],
'text' => 'Файл збережено на сервері'
)
);
}
}
exit();
}
?>
Надсилання файлів Telegram боту
Для надсилання файлів Telegram боту використовують метод sendDocument.
<?php
// Приймаємо запит
$data = file_get_contents('php://input');
$data = json_decode($data, true);
file_put_contents(__DIR__ . '/message.txt', print_r($data, true)); //зберігаємо вхідні дані у файл
// Відповідь на повідомлення
// Отримуємо текст, який відправив користувач Телеграм боту в месенджері
if (!empty($data['message']['text'])) {
$text = $data['message']['text'];
// Відправляємо файл боту
if (mb_stripos($text, '/sendfile') !== false) {
sendTelegram(
'sendDocument',
array(
'chat_id' => $data['message']['chat']['id'],
'document' => curl_file_create(__DIR__ . '/myFile.xlsx')
)
);
exit();
}
}
?>
В даному прикладі, якщо користувач відправить нашому Телеграм боту команду /sendfile, то відповідь, він отримає файл myFile.xlsx, який знаходиться на сервері, в папці з нашим скриптом.
Весь код відправлення та збереження файлів в Telegram
<?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']['document'])) {
$res = sendTelegram(
'getFile',
array(
'file_id' => $data['message']['document']['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() . '-' . $data['message']['document']['file_name'];
if (copy($src, $dest)) {
sendTelegram(
'sendMessage',
array(
'chat_id' => $data['message']['chat']['id'],
'text' => 'Файл збережено на сервері'
)
);
}
}
exit();
}
// Відповідь на повідомлення
// Отримуємо текст, який відправив користувач Телеграм боту в месенджері
if (!empty($data['message']['text'])) {
$text = $data['message']['text'];
// Відправляємо файл боту
if (mb_stripos($text, '/sendfile') !== false) {
sendTelegram(
'sendDocument',
array(
'chat_id' => $data['message']['chat']['id'],
'document' => curl_file_create(__DIR__ . '/myFile.xlsx')
)
);
exit();
}
}
?>