Авторы развлекательной научной телепрограммы 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. Готово. Теперь наш бот всегда бодрствует 🙂
Код урока можно глянуть здесь. Спасибо за внимание.
Данное обучение будет полезно тем, кто хочет делать рассылку пользователям, которые отписали боту и попали в базу данных. Это продолжение прошлого урока, в котором мы научились добавлять пользователей в базу данных MongoDB.
Здесь мы рассмотрим простой скрипт для рассылок, а в будущем я планирую рассказать как интегрировать полноценную админ панель с рассылкой, но в любом случае, он базирован на том, что мы сейчас напишем.
Вот пример лайтовой админки на одном из наших проектов:
Никнеймы зарисованы по понятным причинам.
Также познакомимся с конструкцией try: чтобы рассылка не прерывалась, если бот к примеру заблокирован пользователем, или возникла какая-то ошибка.
Реализация
Реализация на удивление проста.
Создадим файл sender.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
fromdb importusers_db
frombot importbot
defsend_message_to_all_users(message:str):
# Функция для рассылки, принимает сообщение
ifmessage!='':
# Перебираем всех пользователей в бд
foruserinusers_db.find():
# Пытаемся отправить сообщение
try:
bot.send_message(user['chat_id'],message)
# Если какая-то ошибка - выводим это
exceptExceptionase:
print('Something wrong')
if__name__=='__main__':
# Считываем сообщение с клавиатуры
input_message=input('Введите сообщение для рассылки: ')
send_message_to_all_users(input_message)
Вот так выглядит элементарная рассылка. Ее можно выполнять пока бот работает. Достаточно открыть второй терминал/консоль и ввести
1
python3 sender.py
Дальше вводим запрашиваемое сообщение и проверяем, сработала ли рассылка.
Почти всегда хочется иметь возможность видеть список всех пользователей бота, чтобы собирать статистику. Также было бы круто иметь возможность делать рассылки пользователям бота, к примеру уведомление о технических работах, что бот не будет корректно работать несколько часов, или рекламную рассылку, если вашим ботом пользуется много людей.
Для получения списка всех пользователей бота, к сожалению у телеграмма нет 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*# Инмпортируем все с файла сообщений
Я считаю очень важным в каждом проекте правильно его структурировать – разбивать код проекта на файлы и папки, чтобы было удобнее находить и править нужные куски кода, и в целом навигация по проекту была интуитивно понятной.
Не видел нигде стандартов как правильно структурировать проект бота, по этому дальше – мое субъективное мнение как должен выглядеть фолдер с проектом и если вы имеете замечания или идеи – отпишите мне, обсудим.
Сейчас мы в команде переходим на парадигму ООП, и там другие структуры проектов, но для начинающих в любом случае лучше работать с функциональным программированием и структура проекта адаптирована именно под него.
Основные файлы
В любом проекте константы, настройки и сущности, которые используються в совершенно разных кусках кода стоит выностить в отдельные файлы.
Константы принято писать БОЛЬШИМИ_БУКВАМИ, вконце файла всегда принято оставлять пустую строчку
Файлmessages.py
1
HELLO_MESSAGE='Добро пожаловать в нашего бота!'
Сообщения в отдельном файле, чтобы их было удобно менять
Файлbot.py
1
2
3
4
5
importtelebot
importconfig# подключаем конфиг, чтобы взять с него токен бота
bot=telebot.TeleBot(config.TOKEN)
print(bot.get_me())
Теперь при запуске, если все впорядке будем видеть параметры бота, благодаря строчке print(bot.get_me())
Файлbot_handlers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
frombot importbot# Импортируем объект бота
frommessages import*# Инмпортируем все с файла сообщений
@bot.message_handler(commands=['start'])
# Выполняется, когда пользователь нажимает на start
defsend_welcome(message):
bot.send_message(message.chat.id,HELLO_MESSAGE)
@bot.message_handler(content_types=["text"])# Любой текст
defrepeat_all_messages(message):
bot.send_message(message.chat.id,message.text)
if__name__=='__main__':
bot.polling(none_stop=True)
Обратите внимание – мы добавили важную составляющую любого бота – хэндлер команды “/start” – когда человек впервые заходит в бота. Между функциями принято ставить 2 enter.
Запуск
Зпаускаем файл bot_handlers.py так же, как и bot.py в прошлом уроке. Если все впорядке видим:
Пишем боту. Должно получится так:
Поздравляю, если все получилось.
UPD requirements.txt
Файл requirements.txt используется для того, чтобы было проще переносить проект и устанавливать библиотеки через pip. Поскольку мы используем pyTelegramBotApi, добавим его в этот файл.
Откройте клиент телеграмма, найдите @BotFather и начните беседу. Отправьте команду /newbot и следуйте инструкциям. После выполнения первых шагов вы получите:
Собственно, вот и всё. На данном этапе ваш бот полностью пассивен.
Установка программ для разработки ботов
Мы, в компании Momentum bots разрабатываем ботов на языке Python 3, и обучаем новеньких тоже на этом языке программирования. Он один из самых легких и имеет очень много готовых качественных библиотек для самых разнообразных задач. Идеальный инструмент для разработки ботов).
Если вы пользуетесь ос Windows:
Заходим на https://python.org/downloads/windows/, выбираем “latest python release” и python 3. Скачиваем и устанавливаем, важно – при установке поставить галочку в поле Add to PATH.
Если вы пользуетесь ос Linux:
У вас скорее всего уже установлен пайтон. Откройте консоль (обычно ctrl+alt+t). Введите в консоли:
1
python3
Скорее всего, вас любезно поприветствует python 3:
Если это так, то можно вас поздравить: у вас уже стоит python 3. В противном случае нужно установить пакет python3 с помощью пакетного менеджера вашего дистрибутива (apt/yum/etc)
В пункте меню Downloads под Download for Mac OS X выбрать и загрузить нужную версию python
Перейти в папку загрузок и открыть скачанный файл с расширением .dmg
Кликнуть на файл два раза (или раз правой клавишей и выбрать Открыть в программе – Установщик программ)
Пройти процесс инсталляции (помните, что устанавливать python нужно только на тот диск, с которого у вас грузится сама система Mac OS X — обычно он выбран по умолчанию)
Открыть консоль и проверить версию python запустив команду python3
Установка библиотеки для работы с Telegram:
Если вы корректно установили Python 3, то установить библиотеку для работы с телеграммом не составит труда:
Windows: жмем Win+R, вводим cmd, нажимаем Enter.
В открытой консоли вводим pip install pyTelegramBotApi
Linux/MacOS: Открываем терминал, вводим
sudo pip3 install pyTelegramBotApi
Готово)
Наконец-то код!
Поскольку это только тестовый проект – создадим исполняемый файл бота в корневой папке (в той, которая открывается при открытии терминала(простите за тавтологию)).
В виндовсе это обычно папка Documents, в linux не рутовый терминал открывается в корне папки юзера /home/вашеимя.
Открываем папку, создаем файл bot.py
Для удобного написания кода бота можно использовать редакторы кода, как Sublime text, Atom, или IDE, лучший выбор – Pycharm.
Если у Вас пока что нет этих программ, откроем файл с помощью блокнота и вставим этот код:
1
2
3
4
5
6
7
8
9
10
11
importtelebot
token='110355:ABD_GbIeVAUwk11O12vq4UeMUGHG12I'# Вставь свой токен
bot=telebot.TeleBot(token)
@bot.message_handler(content_types=["text"])
defrepeat_all_messages(message):
bot.send_message(message.chat.id,message.text)
if__name__=='__main__':
bot.polling(none_stop=True)
Вместо токена в коде вставьте свой токен, который получили при регистрации через @BotFather.
Откройте консоль (напомню Windows – Win+R, cmd) и введите
Windows: python bot.py
Linux: python3 bot.py
Теперь ваш бот работает. Напишите в телеграмме своему боту и он ответит на ваше сообщение.