Авторы развлекательной научной телепрограммы BBC Tomorrow’s World создали чат-бота для проверки привлекательности фото, которое человек собирается запостить в Instagram.Чат-бот использует данные о лайках и комментариях к различным фото в Instagram. Он оценивает фото по его цветовой палитре, выражению лица объекта на снимке и наличию достопримечательностей. Для того чтобы использовать бота, нужно начать с ним в чат в Facebook-мессенджере.
Далее вам нужно войти в Instagram. Затем бот попросит попросит вас выбрать фотографию, которую вы хотите опубликовать в Instagram. После того как вы загрузите фотографию, бот проанализирует снимок и выдаст результат о том, сколько лайков сможет набрать данная фотография.
По данным программы, выше всего потенциал обычно у фото, где человек улыбается или стоит рядом с какой-то крупной достопримечательностью. Лучше всего оцениваются фото, где присутствует не слишком много разных цветов.
Рано или поздно в разработке ботов вы столкнетесь с проблемой хостинга бота. Скорее всего, у вас нет своего собственного сервера, а платить за виртуальный не каждый хочет, да и настройка виртуального сервера может казаться чем-то непосильным для начинающих разработчиков. К счастью, есть много сервисов, предоставляющих хостинг приложений бесплатно. Одним из таких есть Heroku. Сегодня я расскажу, как легко и быстро развернуть простенького бота на данной платформе.
Почему именно Heroku? Она была одной из первых платформ, предоставляющих услуги типа PaaS (Platform as a Service) и есть лидером в этой сфере. Используя такие облачные сервисы, разработчик должен предоставить только приложение. Обо всем остальном – серверное железо, операционная система, интерпретатор языка и база данных, позаботится сервис.
По умолчанию, Heroku предлагает до 5 приложений на аккаунт и дает 550 бесплатных дино-часов в месяц. Если же подключить к аккаунту банковскую карту, их к-во расширится до 1000. Подробнее о фри дино-часах можно почитать здесь.
Регистрация и установка клиента Heroku
Прежде всего, для использования Heroku, нужно авторизироваться. Если у вас нет аккаунта, создайте его, перейдя по этой ссылке. Затем нужно установить Heroku Toolbelt. Эта утилита на данный момент поддерживает основные ОС: Windows, macOS и Linux.
Скачать и установить Heroku CLI на Windows или macOS можно прямо отсюда. На Ubuntu/Debian платформах вам понадобится ввести данную комманду:
Имя momentumbots уже занято мной, так что придумайте свое 🙂
Если же не указывать название приложения, то будет сгенерировано рандомное название:
Ставим Вебхуки
В прошлых частях мы писали ботов, использующих Long Polling. Суть его в том, что на сервера Телеграмма периодически приходят запросы на получение обновлений. Это ненадежно, т.к. сервера Telegram могут возвращать ошибку 504, вырубая бота. Используя же вебхуки, мы устанаваливаем URL, на который будут приходить обновления автоматически, таким образом избавляясь от этой проблемы. Вебхуки в тг работают только по HTTPS. Благо, Heroku предоставляет доступ к приложению через HTTPS и SSL-сертификат, освободжая нас от заботы о создании сертификатов.
Чтобы указать Heroku, какой скрипт запускать, надо создать файл с названием Procfile (без расширений):
web: gunicorn run_server:server
Что такое Gunicorn? Это HTTP-сервер для WSGI-приложений, написанный на Python. Почему не Flask? В отличии от Gunicorn, он обрабатывает только один запрос за раз, что может значительно замедлить нашего бота.
Создание локального репозитория
Чтобы отправлять изменения на Heroku, нам понадобится git.
Инициализируем новый репозиторий:
1
2
$git init
$heroku git:remote-amomentumbots
Файл requirements.txt
Прежде чем загружать наше приложение на Heroku, нужно указать, какие модули необходимы для запуска. При каждом деплое Heroku ищет в корневой папке файл requirements.txt и устанавливает все модули, находящиеся в нем с помощью pip.
Поэтому обновим наш файлик, теперь, учитывая последние изменения, он должен выглядеть так:
1
2
3
pyTelegramBotAPI
flask
gunicorn
Развёртывание
Вот мы и дошли до финальной стадии. Введите данные комманды
1
2
3
$git add.
$git commit-am"first commit on Heroku"
$git push heroku master
Теперь, если все прошло гладко и вы введете адрес расположения вашего приложения (в нашем случае https://momentumbots.herokuapp.com), вы должны увидеть:
Проверяем нашего бота:
Как видите, все работает. Теперь наш бот доступен в любой момент, и мы не потратили на это ни цента.
Дополнения
1) Логи
Если у вас что-то не так, стоит заглянуть в логи, которые Heroku автоматически записывает. Просто введите комманду:
$ heroku logs
Если все ок, то вы увидите вывод наподобии этого:
2) Heroku Add-ons
Расширения Heroku – это компоненты, которые поддерживают ваше приложение, такие как хранение и обработка данных, мониторинг, аналитика и многие другие. Они полностью управляются Heroku, так что разработчики могут сфокусироваться на логике приложений.
Добавление одного из них мы рассмотрим в следующем уроке.
3) Обход засыпания бота
К сожалению, если ваше приложение не используется в течение 30 минут, Heroku приостанавливает его, и следующий ваш запрос будет значительно длительнее обычного. У пользователей вашего бота может сложиться впечатление, что он сломался, хотя он просто “просыпается” 🙂
Я долго искал, как обойти это ограничение, и остановился на отличном сервисе UptimeRobot. Он прослеживает падения вашего сайта или же сервера, делая туда запросы с определенным интервалом времени и оповещат вас, если ваш сайт лёг. В фри-версии вам будет доступно до 50 мониторов, которые можно трекать каждые 5 минут. Зная URL нашего бота (https://momentumbots.herokuapp.com/), мы легко обойдем ограничения Heroku.
После регистрации, кликаем на Dashboard, затем Add New Monitor. Появляется такое окошко.
Заполняем поля, как в примере выше, и нажимаем на правую нижнюю кнопку Create Monitor. Готово. Теперь наш бот всегда бодрствует 🙂
Код урока можно глянуть здесь. Спасибо за внимание.
Почти всегда хочется иметь возможность видеть список всех пользователей бота, чтобы собирать статистику. Также было бы круто иметь возможность делать рассылки пользователям бота, к примеру уведомление о технических работах, что бот не будет корректно работать несколько часов, или рекламную рассылку, если вашим ботом пользуется много людей.
Для получения списка всех пользователей бота, к сожалению у телеграмма нет api и нам придется решать это своими усилиями. Для этого будем использовать базу данных. Часто для ботов используют реляционные базы данных: SQLite, PostgreSQL. Но чтобы разобраться с ними и научится работать корректно нужен не один час, а большинство фич их широкого функционала вы не будете использовать в процессе разработки ботов.
По этому в свое время я решил использовать нереляционную MongoDB. Чтобы установить ее на свой линукс и разобраться с ней я потратил минут 30, при том что до этого я не работал вообще ни с какими базами данных.
Спустя несколько лет и перепробовав несколько разных БД я только убедился что мое решение в свое время было правильным. Единственной БД, которую я использовал на продакшне в боте помимо MongoDB был Redis. У него есть преимущество – он значительно быстрее любых других баз данных (данные хранятся в оперативной памяти, а не в статической, как во остальных БД), но его минус – отсутствие некоторых привычных контейнеров и данные приходится декодировать ибо они хранятся в байтах.
Установка MongoDB
Windows
Открываем консоль как в первом уроке. (Win+R -> “cmd” -> enter).
1
2
wmic osget caption
wmic osget osarchitecture
Так мы узнаем какая у нас ОС и архитектура. Зависимо от этих данных качаем отсюда .msi установщик. Кликаем на установщик и ставим себе MongoDB.
Linux
Для последних релизов Ubuntu/Debian есть очень простое решение как установить и добавить в автозапуск MongoDB. Открываем терминал и пишем:
Проверили, есть ли пользователь в базе и если его там нет, то добавляем. Для рассылок достаточно знать chat id.
Применение
Можем сделать интереснее – если пользователь нажал /start впервые – говорить “Добро пожаловать в бота”, а если не впервые – говорить ему “Снова привет!)” Так мы применим нашу базу данных и сможем ее протестировать.
Добавим новое сообщение в messages.py:
1
2
HELLO_MESSAGE='Добро пожаловать в нашего бота!'
HELLO_AGAIN_MESSAGE='Снова привет!)'
В bot_andlers.py добавим нашу логику:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
frombot importbot# Импортируем объект бота
frommessages import*# Инмпортируем все с файла сообщений