Last active
September 30, 2021 18:57
-
-
Save sashachabin/7c6fdcf305a6464ac71bd3c4c02eaf7a to your computer and use it in GitHub Desktop.
УрФУ. Разработка бота в Telegram с Webhook. Создание админки на Flask-Admin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ФО-350005 | |
Васильев А.М. | |
Чабин А.С. | |
Презентация: | |
https://docs.google.com/presentation/d/1fNtX24els90-WxOUPl1M_pt7j8pQ-TnHcSDGx08KcRc/edit?usp=sharing | |
Разработка бота в Telegram с Webhook. Создание админки на Flask-Admin | |
(продолжение доклада bit.ly/urfu_botapi) | |
-------------------------------------- | |
1. Проблемы | |
При разработке бота | |
1) Нестабильная работа через pull - опрос серверов Telegram методом getUpdates. | |
Раз в сутки выдает 503 ошибку, бот падает. | |
2) Требовалось в короткие сроки реализовать базовые функции управления базой данных, не тратя время на её разработку. | |
Решениями стали - работа с фреймворком Flask и использования готового решения Flask Admin. | |
2. Telegram Webhook | |
Кроме нестабильного pull, существует ещё один механизм получения уведомлений - Webhook, | |
когда сервер сервиса (Telegram) сам отправляет POST-запросы с информацией об обновлениях | |
(новых сообщениях). | |
Telegram требует наличие SSL-сертификата и отправляет сообщения только на 443, 80, 88, 8443 порты. | |
# Отправка данных о нашем сервере в Telegram | |
bot.set_webhook(url=WEBHOOK_URL_BASE+WEBHOOK_URL_PATH, | |
certificate=open(WEBHOOK_SSL_CERT, 'r')) | |
Обработка пользовательских команд: | |
WEBHOOK_URL_BASE = "https://%s:%s" % (WEBHOOK_HOST, WEBHOOK_PORT) | |
WEBHOOK_URL_PATH = "/%s/" % (API_TOKEN) | |
Удобнее всего для прослушивания POST-запроса использовать адрес вашего сервера и токен бота, | |
т.к. эти данные должны быть секретными. | |
Отправка данных о нашем сервере в Telegram | |
https://api.telegram.org/bot<TOKEN>/setWebHook?url=https://87.12.53.213:8443/<TOKEN>/ - пример | |
bot.set_webhook(url=WEBHOOK_URL_BASE+WEBHOOK_URL_PATH, | |
certificate=open(WEBHOOK_SSL_CERT, 'r')) | |
Обработка пользовательских команд: | |
@app.route(WEBHOOK_URL_PATH, methods=['POST']) | |
def webhook(): | |
if headers.get('content-type') == 'application/json': | |
json_string = flask.request.get_data().decode('utf-8') | |
update = telebot.types.Update.de_json(json_string) | |
bot.process_new_updates([update]) | |
return '' | |
Запуск сервера: | |
app.run(host=WEBHOOK_LISTEN, | |
port=WEBHOOK_PORT, | |
ssl_context=(WEBHOOK_SSL_CERT, WEBHOOK_SSL_PRIV), | |
debug=True) | |
Так же, механизм Webhook предоставляют такие крупные сервисы с API, как TimePad и GitHub. | |
3. SSL Сертификат | |
SSL (Secure Socket Layer) - цифровая подпись сайта, которая нужна для работы протокола защищенной передачи данных https. | |
SSL - это защита клиента во время онлайн транзакции (оплаты, авторизации, отправки конф. данных и т.д.). | |
Telegram допускает самодподписанные сертификаты, для этого можно воспользоваться утилитой OpenSSL. | |
Установка: | |
apt-get install openssl (Linux) | |
http://gnuwin32.sourceforge.net/packages/openssl.htm (Windows) | |
Создание ключа: | |
openssl genrsa -out webhook_pkey.pem 2048 | |
Создание сертификата: | |
openssl req -new -x509 -days 3650 -key webhook_pkey.pem -out webhook_cert.pem | |
(!) Необходимо указать IP-адрес в Common name: | |
Данным Country Name, Province Name, Locality Name, Organization Name и др. достаточно указать значения "." | |
4. Настройка Flask-Admin | |
Решения из коробки: | |
- Многоуровневое меню; | |
- Отображение базы данных с фильтрацией, поиском, сортировкой; | |
- Визуальный редактор; | |
- Файловый менеджер; | |
- Локализация | |
Полезные ссылки на Flask-Admin | |
Документация доступна по адресу: http://flask-admin.readthedocs.io/en/latest/ | |
Пример работы модулей: http://examples.flask-admin.org/ | |
Исходный код примеров: https://github.com/flask-admin/flask-admin/tree/master/examples |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment