Как сохранить присланный боту медиа-файл? Рассмотрим на примере картинки, но принцип для остальных форматов одинаковый. Скачаем картинку на наш сервер.
В своей работе над ботом, который проводит розыгрыши, мне потребовалось сохранять у себя на сервере файлы, присылаемые пользователями. Очень интересный и простой процесс получился. У Telegram Bot Api для этого есть специальный метод getFile. На входе он получает file_id , на выходе объект File. Параметров file_id у картинки может быть больше одного, потому как телеграм присылает несколько вариантов размеров картинки, последний всегда оригинал. При загрузке картинки в бот приходит информация в виде объекта Photo, в котором лежит массив объектов PhotoSize. Наш бот будет принимать только команду /start и картинку, на остальные запросы он будет «ругаться». Чтобы определить, что нам пришло в нашем уже знакомом по предыдущим статьям методе init() будем проверять ключи массива пришедших данных. Для реализации задуманного нам нужен только объект Message.
Как хранить токены, API ключи и секретную информацию в env переменных, на примере python приложений
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
через метод getPhotoPath() получаем расположение файла на сервере Telegram
через метод copyPhoto() копируем картинку к себе на сервер
Картинка располагается на сервере Telegram по стандартному пути:
https://api.telegram.org/file/bot/
Выводит картинку по этому пути где-либо в сети не рекомендую, так как будет доступен ваш токен от бота.
Сохранять себе на сервер мы будем оригинал, поэтому нам надо узнать количество элементов в массиве, использовать будем функцию count().
Чтобы получить расширение файла, будем разбивать file_path в массив по знаку . функцией explode() и брать последний элемент используя функцию end(). Для копирования файлов пользуемся функцией copy().
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 позволяют это сделать быстро. Для сохранения других типов файлов с Телеграм алгоритм аналогичный. Скачать исходный код можно по этой ссылке.
Источник: imakebots.ru
Создаем собственный текстовый квест в Telegram
Телеграм боты — это крутой способ взаимодействия с пользователем прямо в привычном ему мессенджере. Это гораздо быстрее и чаще удобнее, чем писать полноценное мобильное приложение. В этой статье мы постраемся создать собственного Telegram бота, который будет предлагать пользователю разыграть полноценный текстовый квест.
Нюансы сюжета вам придется продумать самостоятельно, ну а вся техническая часть — под катом!
Для начала давайте познакомимся с Telegram ботами, по ссылке представлено множество примеров таких программ, от прогноза погоды до общения с рандомным собеседником: https://uip.me/2016/04/50-popular-telegram-bots/.
Технически, телеграм бот — это программа, которая запущена на вашем компьютере и общается с серверами телеграма через интернет. Можно представить, что при регистрации бота, телеграм выделяет нам почтовый ящик, через который мы можем получать сообщения от пользователей и отправлять их им.
После получения токена нам потребуется установить библиотеку pyTelegramBotApi, как и обычно, это делается через pip:
pip install pytelegrambotapi
Пробуем создать бота
Давайте сделаем нашего первого бота — бота-попугая. На все сообщения он будет отвечать повторением.
Помимо текстовых сообщений, в телеграме есть команды, они начинаются со слэша, например, /start или /help . Их тоже можно обрабатывать.
Давайте добавим пояснение к нашему боту, которое объяснит пользователю, что он делает.
Взаимодействуем с несколькими пользователями одновременно
Предположим мы хотим сделать бота, которы будет запоминать какую-то фразу, а затем по просьбе пользователя напоминать ее ему. Чтобы решить эту задачу, нам понадобится где-то хранить последнее сообщение пользователя.
Если мы будем использовать переменную, то сможем сохранить сообщение только одного пользователя. Например, Вася попросил запомнить слово kitten . Мы положим эту строку в переменную note . А затем Петя, попросить запомнить слово puppy , и мы снова положим это переменную note . Когда Вася попросит нам напомнить его последнее сообщение, мы напишем ему puppy вместо kitten . Совершенно не годится!
> Удобнее всего хранить все данные, которые привязаны к конкретному пользователю в словаре. Ключем в этом словаре будет id пользователя, а значением — произвольные данные.
Предположим, что наш словарь называется notes — заметки. Теперь, когда Вася (id88000) пришлет слово kitten мы положим его в notes[88000] , а слово puppy от Пети (id5300) — в notes[5300] . Посколько теперь мы используем разные переменные для хранения слова, сообщения от разных пользователей не будут путаться.
Реализация:
Добавляем кнопки
Следующий пример демонстрирует, как добавить несколько кнопок к сообщению и реагировать на их нажатия.
Собираем текстовый квест
Источник: geekclass.ru