Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save sashachabin/7c6fdcf305a6464ac71bd3c4c02eaf7a to your computer and use it in GitHub Desktop.
Save sashachabin/7c6fdcf305a6464ac71bd3c4c02eaf7a to your computer and use it in GitHub Desktop.
УрФУ. Разработка бота в Telegram с Webhook. Создание админки на Flask-Admin
ФО-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