Как сохранить присланный боту медиа-файл? Рассмотрим на примере картинки, но принцип для остальных форматов одинаковый. Скачаем картинку на наш сервер.
В своей работе над ботом, который проводит розыгрыши, мне потребовалось сохранять у себя на сервере файлы, присылаемые пользователями. Очень интересный и простой процесс получился.
У Telegram Bot Api для этого есть специальный метод getFile. На входе он получает file_id
, на выходе объект File.
Параметров file_id
у картинки может быть больше одного, потому как телеграм присылает несколько вариантов размеров картинки, последний всегда оригинал. При загрузке картинки в бот приходит информация в виде объекта Photo, в котором лежит массив объектов PhotoSize.
Наш бот будет принимать только команду /start
и картинку, на остальные запросы он будет «ругаться». Чтобы определить, что нам пришло в нашем уже знакомом по предыдущим статьям методе init()
будем проверять ключи массива пришедших данных. Для реализации задуманного нам нужен только объект Message.
<?php
// проверяем если пришло сообщение
if (array_key_exists('message', $data)) {
//если пришла команда /start
if ($data['message']['text'] == "/start") {
$this->sendMessage($chat_id, "Приветствую! Загрузите картинку.");
} elseif (array_key_exists('photo', $data['message'])) {
// если пришла картинка то сохраняем ее у себя
$text = $this->getPhoto($data['message']['photo'])
? "Спасибо! Можете еще загрузить мне понравилось их сохранять."
: "Что-то пошло не так, попробуйте еще раз";
// отправляем сообщение о результате
$this->sendMessage($chat_id, $text);
} else {
// если пришло что-то другое
$this->sendMessage($chat_id, "Не понимаю команду! Просто загрузите картинку.");
}
}
?>
Картинки мы будем сохранять в директории
, располагается она рядом с файлом img
в котором наш код.index.php
.
..
[ img ]
index.php
В случае если прислали картинку, то мы передаем массив объектов PhotoSize
в метод getPhoto()
, он вернет результат в boolean. Внутри метода происходит 2 действия:
getPhotoPath()
получаем расположение файла на сервере TelegramcopyPhoto()
копируем картинку к себе на серверКартинка располагается на сервере Telegram по стандартному пути:
https://api.telegram.org/file/bot<token>/<file_path>
Выводит картинку по этому пути где-либо в сети не рекомендую, так как будет доступен ваш токен от бота.
Сохранять себе на сервер мы будем оригинал, поэтому нам надо узнать количество элементов в массиве, использовать будем функцию count().
Чтобы получить расширение файла, будем разбивать file_path
в массив по знаку .
функцией explode() и брать последний элемент используя функцию end(). Для копирования файлов пользуемся функцией copy().
<?php
// общая функция загрузки картинки
private function getPhoto($data)
{
// берем последнюю картинку в массиве
$file_id = $data[count($data) - 1]['file_id'];
// получаем file_path
$file_path = $this->getPhotoPath($file_id);
// возвращаем результат загрузки фото
return $this->copyPhoto($file_path);
}
// функция получения метонахождения файла
private function getPhotoPath($file_id) {
// получаем объект File
$array = json_decode($this->requestToTelegram(['file_id' => $file_id], "getFile"), TRUE);
// возвращаем file_path
return $array['result']['file_path'];
}
// копируем фото к себе
private function copyPhoto($file_path) {
// ссылка на файл в телеграме
$file_from_tgrm = "https://api.telegram.org/file/bot".$this->botToken."/".$file_path;
// достаем расширение файла
$ext = end(explode(".", $file_path));
// назначаем свое имя здесь время_в_секундах.расширение_файла
$name_our_new_file = time().".".$ext;
return copy($file_from_tgrm, "img/".$name_our_new_file);
}
?>
Сохранить картинку через Телеграм бот очень просто. Методы Bot API позволяют это сделать быстро. Для сохранения других типов файлов с Телеграм алгоритм аналогичный. Скачать исходный код можно по этой ссылке.