загрузка файлов телеграм бот

Создание Telegram бота на PHP: Отправка и сохранение файлов. Урок 4

Процесс скачивания и отправки файлов в Telegram бот аналогичен тому, как происходит отправка и получение картинок.

Получение и скачивание файлов в Telegram

Если мы отправим боту какой-нибудь файл через мессенджер, то в наш файл message.txt на сервере, будет записан следующий запрос от Telegram:

Зная <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

В ответе будет получена следующая информация:

Здесь, в <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)); //зберігаємо вхідні дані у файл
    
// Константа токен
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'];
	
    // Відправляємо файл боту
	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();	
	}
}
?>

Main Menu