Этот чат-бот Telegram построен на случай чрезвычайной ситуации умеет отправлять SOS спасателям, если вдруг, например, кто-то окажется без зонта в проливной дождь. Он написан на Python с использованием AWS Lambda, Zappa и Flask.
AWS Lambda — это сервис вычислений, запускающий ваш код при определенных событиях и автоматически управляющий вашими вычислительными ресурсами.
Flask — фреймворк для создания веб-приложений на языке программирования Python, использующий набор инструментов Werkzeug, а также шаблонизатор Jinja2.
Проблема
Чат-бот решит проблему, если неожиданно вы попали под дождь или в еще какую неприятность. Любой может попросить зонтик. Бот спрашивает, где находится человек, сколько зонтов ему или ей может понадобиться, и когда они хотели бы, чтобы их «спасли».
Так ведет себя чат-бот, когда получает запрос на зонтик. Любой человек может зарегистрироваться как спасатель. Немного хорошей кармы никому не помешает.
Так можно стать спасателем
Спасателям приходят сообщения, когда кто-то рядом с ними оказался в «беде». Если человек решил помочь, то ему всего лишь нужно нажать кнопку.
При построении бота есть небольшие хитрости, которые помогут сделать его быстрее.
Что необходимо
AWS Lambda
Вместо запуска сервера 24/7 вы можете размещать функции в Lambda, чтобы сервер работал только в течение жизненного цикла запроса. Это прекрасно подойдёт для большого числа бесплатных запросов.
Zappa
Программа автоматизирует действия, необходимые для получения локального кода Python на AWS Lambda. Она также настраивает API-интерфейс Amazon, поэтому у вас будет хорошая конечная точка HTTPS для размещения функций вашего чат-бота
ngrok
Делает любые локальные серверы доступными через интернет. Это отличный способ прототипировать WebHooks, прежде чем фактического развертывания их в облаке.
Данные инструменты помогут избежать большой головной боли при создании бота (например, не надо будет арендовать сервер, настраивать его для HTTPS, выяснять, как сделать неблокирующий сервер).
Далее показано, как использовать эти инструменты для разработки чат-бота.
Итак, как сделать чат-бота без знания бота API Telegram, но со знанием работы Flask и Python. Если что-то покажется вам слишком простым, не стесняйтесь и пропустите ненужное.
Построение Telegram-бота
Зайдите в @Botfather. Введите /newbot и следуйте его инструкциям по настройке нового бота.
Подсказка: где-нибудь сохраните токен, он понадобится в ближайшее время!
Подберите изображение профиля бота, составьте текст его описания. Дайте ему любую личность.
Наберите команду/help и @Botfather даст вам полный список настроек, среди которых выберите нужные для вашего бота.
Настройка сервера разработки с помощью Flask
Я работал с pipenv для управления зависимостями Python моего проекта. Попробуйте, если вы все ещё используете pip и virtualenv. По ссылке найдёте инструкции по установке.проекта.
Далее установим Flask. Также будем использовать потрясающую библиотеку requests. В командной строке введите:
- pipenv install flask
- pipenv install requests
После установки создадим базовый сервер для тестирования нашего бота. Скопируйте следующий текст в файл с именем server.py.
Скопировать фрейм можно по ссылке.
Подсказка: Убедитесь, что вы заменили <,your-bot-token>, токеном от API, который получили от @Botfather.
Давайте разберемся, как работает API Telegram. Во-первых, когда кто-то посылает вашему боту сообщение, это сообщение отправляется на серверы Telegram. Затем Telegram отправляет это сообщение к тому, что мы определили как web-hook.
Скопировать фрейм можно по ссылке.
Функция process_update()и декоратор: когда кто-кто-нибудь будет отправлять в POST домен http://127.0.0.1:5000/<,your-bot-token>,, мы будем извлекаем из него JSON данные. Если это обычное текстовое сообщение, оно будет иметь ключ message в JSON. Проверяем, и если это нормальное сообщение, мы отвечаем с помощью process_message(update).
Функция process_message()создает полезную нагрузку, которую API Telegram ожидает как ответ на сообщение. Нужно указать текст ответа в data[text]и чат, на который мы отвечаем data[chat_id] .
Наконец, мы отправляем запрос на публикацию с этой полезной нагрузкой в Telegram API sendMessage методом.
Пришло время запускать сервер. Теперь в командной строке введите:
pipenv shell
Это дает нам доступ к Flask. Теперь нужно запустить сервер. Введите в командной строке:
export FLASK_APP=server.py
flask run
У нас есть запущенный сервер.Если нет параметра по умолчанию, запустите ihttp://127.0.0.1:5000/.
Подробнее читайте в документации Flask и quick-start.
Но это выполняется локально, и API Telegram не может отправлять свои POST-запросы локальному URL-адресу. Следовательно, мы будем использовать ngrok, чтобы сделать локальный сервер доступным в интернет.
Используйте ngrok, чтобы сделать локальный сервер доступным в интернет.
Получите пакет для своей операционной системы по этой ссылке на веб-сайте ngrok. После того, как вы скачали и установили его, перейдите в каталог, в котором распакуйте файл, и запустите следующую команду в командной строке.
./ngrok http 5000
В командной строке вы увидите нечто похожее. Теперь любой сервер, на котором вы работаете на localhost: 5000, отображается по следующим URL-адресам.
Подсказка: скопируйте https-url, он вам скоро понадобится. Далее снова будем использовать API Telegram, чтобы установить наш web-hook.
Создайте файл с именем webhook.py со следующим содержимым: