Где сохранить код на Телеграм бота

В статье пойдет речь о запуске платформы на базе Telegram бота, предназначенной для взаимодействия с самыми разными сервисами, например с GitHub и Яндекс.Метрикой.

Платформа позволяет создавать плагины для работы с каждым из них. Вы сможете в один клик настроить оповещения о коммитах, pull-реквестах, закрытии issues из каждого репозитория в нужный чат и установить внешний вид этих оповещений. Вы даже можете попросить бота присылать вам свежую статистику из Яндекс.Метрики в удобное для вас время. Мы в команде CodeX используем данное решение уже несколько месяцев и не представляем себе, как можно было работать без этого.

Для взаимодействия с ботом вы можете воспользоваться нашим облачным решением или установить бота самостоятельно на своем сервере.

Облачное решение

Запуск бота на своем сервере

Для запуска CodeX.bot вам потребуется выполнить следующие действия:

  • установить дополнительные библиотеки для языка Python
  • клонировать наш репозиторий с кодом бота
  • зарегистрировать нового бота в Telegram
  • отредактировать файл конфигурации

Установка дополнительных библиотек

CodeX.bot написан на языке Python с использованием некоторых дополнительных библиотек. Вам нужно установить их, прежде чем начать работу:

Прячем пароли и выкладываем python telegram bot на github

Клонирование репозитория с кодом

Клонировать репозиторий CodeX.bot можно выполнив команду:

git clone [email protected]:codex-team/codex.bot.git

Для работы системы вам понадобится создать Telegram бота. Просто следуйте инструкции из статьи или официального руководства.

Конфигурация

Теперь вам необходимо настроить конфигурацию системы. Для этого переименуйте директорию local.sample в local и отредактируйте содержимое файла config.py в соответствии с вашими предпочтениями:

SERVER_HOST — адрес вашего сервера. Если вы пользуетесь прокси ngrok, он будет выглядеть приблизительно так: ‘http://9b812f5d.ngrok.io’. LOCAL_SERVER_PORT — порт, на котором будет запущен ваш локальный сервер. LOGS_FILENAME — адрес файла для логов. По умолчанию равен ‘logs/logs.log’. SSL_CERTIFICATE — содержимое SSL сертификата сервера. По уполчанию равен None. API_TOKEN — токен вашего Telegram бота через которого будет работать система. TELEGRAM_CALLBACK_URL — адрес, по которому CodeX.bot будет обрабатывать все сообщения от Telegram. Например: ‘https://9b812f5d.ngrok.io/telegramcallback’.

Еще по теме:  Поиск по айди в ТГ онлайн

Установка Telegram Webhook

Telegram позволяет установить webhook для ботов. Это нужно для того, чтобы при каждом сообщении, отправленном в чат с ботом, Telegram устанавливал соединение с вашим сервером и передавал ему JSON с текстом и сервисной информацией. Поскольку Telegram работает только по протоколу HTTPS, вам понадобится SSL сертификат. Если у вас есть доверенный сертификат, то ничего дополнительно настраивать не придется, в случае использования самоподписанного сертификата, его нужно будет отправить при установке вебхука.

Сгенерировать сертификат можно следующей командой:

openssl req -new -x509 -nodes -newkey rsa:1024 -keyout server.key -out server.crt

Далее, openssl предложит вам заполнить несколько полей информации, важно указать поле FQDN равное адресу хоста-callback’а.

Для установки вебхука можно воспользоваться пакетом python-telegram-bot для Python.

import telegram TOKEN = » HOST = » # Параметр FQDN сертификата должен совпадать с данным адресом PORT = 8443 CERT = ‘path/to/ssl/server.crt’ bot = telegram.Bot(TOKEN) bot.setWebhook(webhook_url=’https://%s:%s/%s’ % (HOST, PORT, TOKEN), certificate=open(CERT, ‘rb’))

К счастью, CodeX.bot сделает установку вебхука за вас, если в настройках ему передать соответствующий параметр. Например:

SSL_CERTIFICATE = open(«/path/to/ssl/server.crt», ‘rb’)

Структура файловой системы

В файле local/db.py содержатся настройки базы данных, где CodeX.bot хранит всю необходимую информацию. По умолчанию у вас будет использоваться SQLite.

В файле components/core.py вы можете найти несколько глобальных функций, которые используются всеми компонентами системы:

  • send_to_chat — отправка сообщений в Telegram чат.
  • generate_hash — генерация уникальных идентификаторов для пользователей и чатов.
  • bgcolors — для вывода отладочной информации в консоль.

В файле main.py содержится код запуска системы. Запуск выполняется в следующем порядке:

  • Подключение файла вывода логов.
  • Установка вашего сервера в качестве webhook для Telegram бота.
  • Загрузка плагинов, описанных в глобальной конфигурации.
  • Запуск веб-сервера, получающего оповещения от Telegram бота.
Еще по теме:  Как вытащить 1 стикер Телеграмм

В файле modules/core/server.py находится код веб-сервера, который обрабатывает сообщения от Telegram и передает их нужным плагинам, вызывая у них метод telegram_command:

Разработчик плагина сам устанавливает какие команды обрабатывать. Например, модуль ответственный за Github оповещения принимает команду /github_start примерно так:

def telegram_command(self, message): if ‘/github_start’ in message.text: .

Плагин может самостоятельно принимать оповещения от сторонних сервисов в специальном методе set_rules:

def __init__(self): self.module_name = ‘github’ self.uri_prefix = ‘/github’ def set_rules(self, app): app.add_url_rule(‘%s/test’ % self.uri_prefix, ‘%s_test’ % self.module_name, test) app.add_url_rule(‘%s/’ % self.uri_prefix, ‘%s_callback’ % self.module_name, callback, methods=[«POST»])

Подробнее работу основных плагинов рассмотрим в следующей статье.

If you like this article, share a link with your friends

Read more

We talk about interesting technologies and share our experience of using them.

Источник: codex.so

Получение ботом медиа-файлов и сохранение их на своем сервере

Как сохранить присланный боту медиа-файл? Рассмотрим на примере картинки, но принцип для остальных форматов одинаковый. Скачаем картинку на наш сервер.

В своей работе над ботом, который проводит розыгрыши, мне потребовалось сохранять у себя на сервере файлы, присылаемые пользователями. Очень интересный и простой процесс получился. У Telegram Bot Api для этого есть специальный метод getFile. На входе он получает file_id , на выходе объект File. Параметров file_id у картинки может быть больше одного, потому как телеграм присылает несколько вариантов размеров картинки, последний всегда оригинал. При загрузке картинки в бот приходит информация в виде объекта Photo, в котором лежит массив объектов PhotoSize. Наш бот будет принимать только команду /start и картинку, на остальные запросы он будет «ругаться». Чтобы определить, что нам пришло в нашем уже знакомом по предыдущим статьям методе init() будем проверять ключи массива пришедших данных. Для реализации задуманного нам нужен только объект Message.

Еще по теме:  Почему в Телеграмме показывает неправильное время посещения

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

Рейтинг
( Пока оценок нет )
Загрузка ...