Блог - Momentum-Bots
+

Our blog

Чат-бот для проверки, будут ли популярны Ваши фото в Instagram?
Авторы развлекательной научной телепрограммы BBC Tomorrow’s World создали чат-бота для проверки привлекательности фото, которое человек собирается запостить в Instagram.Чат-бот использует данные о лайках и комментариях к различным фото в Instagram. Он оценивает фото по его цветовой палитре, выражению лица объекта на снимке и наличию достопримечательностей. Для того чтобы использовать бота, нужно начать с ним в чат в Facebook-мессенджере.

BBC bot

Далее вам нужно войти в Instagram. Затем бот попросит попросит вас выбрать фотографию, которую вы хотите опубликовать в Instagram. После того как вы загрузите фотографию, бот проанализирует снимок и выдаст результат о том, сколько лайков сможет набрать данная фотография.

Photo analysis

По данным программы, выше всего потенциал обычно у фото, где человек улыбается или стоит рядом с какой-то крупной достопримечательностью. Лучше всего оцениваются фото, где присутствует не слишком много разных цветов.

Деплоймент бота на Heroku

Предисловие

Рано или поздно в разработке ботов вы столкнетесь с проблемой хостинга бота. Скорее всего, у вас нет своего собственного сервера, а платить за виртуальный не каждый хочет, да и настройка виртуального сервера может казаться чем-то непосильным для начинающих разработчиков. К счастью, есть много сервисов, предоставляющих хостинг приложений бесплатно. Одним из таких есть Heroku. Сегодня я расскажу, как легко и быстро развернуть простенького бота на данной платформе.

heroku logo

Почему именно Heroku? Она была одной из первых платформ, предоставляющих услуги типа PaaS (Platform as a Service) и есть лидером в этой сфере. Используя такие облачные сервисы, разработчик должен предоставить только приложение. Обо всем остальном – серверное железо, операционная система, интерпретатор языка и база данных, позаботится сервис.

PaaS

По умолчанию, Heroku предлагает до 5 приложений на аккаунт и дает 550 бесплатных дино-часов в месяц. Если же подключить к аккаунту банковскую карту, их к-во расширится до 1000. Подробнее о фри дино-часах можно почитать здесь.

Регистрация и установка клиента Heroku

Прежде всего, для использования Heroku, нужно авторизироваться. Если у вас нет аккаунта, создайте его, перейдя по этой ссылке. Затем нужно установить Heroku Toolbelt. Эта утилита на данный момент поддерживает основные ОС: Windows, macOS и Linux.

Скачать и установить Heroku CLI на Windows или macOS можно прямо отсюда. На Ubuntu/Debian платформах вам понадобится ввести данную комманду:

После установки, чтобы убедиться, что все установилось, откройте консоль и введите heroku:

code

Если все работает, логинимся, используя данные, введенные при регистрации:

Создание приложения

Сегодня мы будем деплоить бота, написанного во второй части. Для начала создадим наше приложение под названием momentumbots:

code

Вывод команды показывает, что приложение было успешно создано и доступно на https://momentumbots.herokuapp.com.

code

Имя momentumbots уже занято мной, так что придумайте свое 🙂

Если же не указывать название приложения, то будет сгенерировано рандомное название:

code

Ставим Вебхуки

В прошлых частях мы писали ботов, использующих Long Polling. Суть его в том, что на сервера Телеграмма периодически приходят запросы на получение обновлений. Это ненадежно, т.к. сервера Telegram могут возвращать ошибку 504, вырубая бота. Используя же вебхуки, мы устанаваливаем URL, на который будут приходить обновления автоматически, таким образом избавляясь от этой проблемы. Вебхуки в тг работают только по HTTPS. Благо, Heroku предоставляет доступ к приложению через HTTPS и SSL-сертификат, освободжая нас от заботы о создании сертификатов.

В качестве веб-сервера будем использовать Flask, однако вам не составит труда разобраться с другими фреймворками. На Github-странице pyTelegramBotAPI, помимо Flask’а, есть примеры для aiohttp, CherryPy, CPython и Tornado.

Добавим в config.py переменную, которая хранит название нашего приложения:

Создаем файлик run_server.py:

Подготовка к деплою

Создаем Procfile

Чтобы указать Heroku, какой скрипт запускать, надо создать файл с названием Procfile (без расширений):

web: gunicorn run_server:server

Что такое Gunicorn? Это HTTP-сервер для WSGI-приложений, написанный на Python. Почему не Flask? В отличии от Gunicorn, он обрабатывает только один запрос за раз, что может значительно замедлить нашего бота.

Создание локального репозитория

Чтобы отправлять изменения на Heroku, нам понадобится git.

Инициализируем новый репозиторий:

Файл requirements.txt

Прежде чем загружать наше приложение на Heroku, нужно указать, какие модули необходимы для запуска. При каждом деплое Heroku ищет в корневой папке файл requirements.txt и устанавливает все модули, находящиеся в нем с помощью pip.

Поэтому обновим наш файлик, теперь, учитывая последние изменения, он должен выглядеть так:

Развёртывание

Вот мы и дошли до финальной стадии. Введите данные комманды

Теперь, если все прошло гладко и вы введете адрес расположения вашего приложения (в нашем случае https://momentumbots.herokuapp.com), вы должны увидеть:

code

Проверяем нашего бота:

code

Как видите, все работает. Теперь наш бот доступен в любой момент, и мы не потратили на это ни цента.

Дополнения

1) Логи

Если у вас что-то не так, стоит заглянуть в логи, которые Heroku автоматически записывает. Просто введите комманду:

$ heroku logs

Если все ок, то вы увидите вывод наподобии этого:

code

2) Heroku Add-ons

Расширения Heroku – это компоненты, которые поддерживают ваше приложение, такие как хранение и обработка данных, мониторинг, аналитика и многие другие. Они полностью управляются Heroku, так что разработчики могут сфокусироваться на логике приложений.

Список всех доступных аддонов можно найти здесь. Самые популярные из бесплатных: mLab MongoDB, Papertrail, SendGrid, New Relic APM и MemCachier.

Добавление одного из них мы рассмотрим в следующем уроке.

3) Обход засыпания бота

К сожалению, если ваше приложение не используется в течение 30 минут, Heroku приостанавливает его, и следующий ваш запрос будет значительно длительнее обычного. У пользователей вашего бота может сложиться впечатление, что он сломался, хотя он просто “просыпается” 🙂

momentum

Я долго искал, как обойти это ограничение, и остановился на отличном сервисе UptimeRobot. Он прослеживает падения вашего сайта или же сервера, делая туда запросы с определенным интервалом времени и оповещат вас, если ваш сайт лёг. В фри-версии вам будет доступно до 50 мониторов, которые можно трекать каждые 5 минут. Зная URL нашего бота (https://momentumbots.herokuapp.com/), мы легко обойдем ограничения Heroku.

После регистрации, кликаем на Dashboard, затем Add New Monitor. Появляется такое окошко.

monitor

Заполняем поля, как в примере выше, и нажимаем на правую нижнюю кнопку Create Monitor. Готово. Теперь наш бот всегда бодрствует 🙂

Код урока можно глянуть здесь. Спасибо за внимание.

Dima Kit

<- Четвертая часть

Все части обучения:

  1. Наш первый бот
  2. Структура проекта бота (создаём проект)
  3. База данных пользователей
  4. Рассылки
  5. Деплоймент бота на Heroku
Рассылки

Предисловие

Данное обучение будет полезно тем, кто хочет делать рассылку пользователям, которые отписали боту и попали в базу данных. Это продолжение прошлого урока, в котором мы научились добавлять пользователей в базу данных MongoDB.

Здесь мы рассмотрим простой скрипт для рассылок, а в будущем я планирую рассказать как интегрировать полноценную админ панель с рассылкой, но в любом случае, он базирован на том, что мы сейчас напишем.

Вот пример лайтовой админки на одном из наших проектов:

admin panel1
admin panel2

Никнеймы зарисованы по понятным причинам.

Также познакомимся с конструкцией try: чтобы рассылка не прерывалась, если бот к примеру заблокирован пользователем, или возникла какая-то ошибка.

Реализация

Реализация на удивление проста.

Создадим файл sender.py

Вот так выглядит элементарная рассылка. Ее можно выполнять пока бот работает. Достаточно открыть второй терминал/консоль и ввести

code1

Дальше вводим запрашиваемое сообщение и проверяем, сработала ли рассылка.

code2

Все пришло!)

result

На всякий случай вот код урока на github.

Спасибо за внимание!

Anton Yurash

<- Третья часть | Пятая часть ->

Все части обучения:

  1. Наш первый бот
  2. Структура проекта бота (создаём проект)
  3. База данных пользователей
  4. Рассылки
  5. Деплоймент бота на Heroku
База данных пользователей

Предисловие

Почти всегда хочется иметь возможность видеть список всех пользователей бота, чтобы собирать статистику. Также было бы круто иметь возможность делать рассылки пользователям бота, к примеру уведомление о технических работах, что бот не будет корректно работать несколько часов, или рекламную рассылку, если вашим ботом пользуется много людей.

Для получения списка всех пользователей бота, к сожалению у телеграмма нет api и нам придется решать это своими усилиями. Для этого будем использовать базу данных. Часто для ботов используют реляционные базы данных: SQLite, PostgreSQL. Но чтобы разобраться с ними и научится работать корректно нужен не один час, а большинство фич их широкого функционала вы не будете использовать в процессе разработки ботов.

По этому в свое время я решил использовать нереляционную MongoDB. Чтобы установить ее на свой линукс и разобраться с ней я потратил минут 30, при том что до этого я не работал вообще ни с какими базами данных.

Спустя несколько лет и перепробовав несколько разных БД я только убедился что мое решение в свое время было правильным. Единственной БД, которую я использовал на продакшне в боте помимо MongoDB был Redis. У него есть преимущество – он значительно быстрее любых других баз данных (данные хранятся в оперативной памяти, а не в статической, как во остальных БД), но его минус – отсутствие некоторых привычных контейнеров и данные приходится декодировать ибо они хранятся в байтах.

MongoDB logo

Установка MongoDB

Windows

Открываем консоль как в первом уроке. (Win+R -> “cmd” -> enter).

Так мы узнаем какая у нас ОС и архитектура. Зависимо от этих данных качаем отсюда .msi установщик. Кликаем на установщик и ставим себе MongoDB.

Linux

Для последних релизов Ubuntu/Debian есть очень простое решение как установить и добавить в автозапуск MongoDB. Открываем терминал и пишем:

Готово.

Для других дистрибутивов переходим по ссылке.

MacOS

Качаем бинарь отсюда.

Разархивируем через терминал:

Создаем папку и копируем:

Добавляем ее в PATH:

Если есть brew:

Подключаем MongoDB в наш проект

Устанавливаем пакет Python

Надеюсь у вас корректная структура проекта, и/или вы прошли этот урок.

Открываем проект и добавляем в requirements.txt

После этого вводим:

Все. Мы установили пакет для python для работы с нашей базой данных.

Пишем код добавления пользователей в базу данных

Создаем файл db.py. Пишем в него такой код:

Таким образом мы создали базу “tutorial_bot”, подключились к ней и создадим коллекцию “users_db” как только запишем в нее первого юзера.

Чтобы сделать добавление пользователя в базу данных после того как он впервые написал боту (нажал Start) добавим такой код в bot_handlers.py:

Импорт:

В функцию def send_welcome(message):

Проверили, есть ли пользователь в базе и если его там нет, то добавляем. Для рассылок достаточно знать chat id.

Применение

Можем сделать интереснее – если пользователь нажал /start впервые – говорить “Добро пожаловать в бота”, а если не впервые – говорить ему “Снова привет!)” Так мы применим нашу базу данных и сможем ее протестировать.

Добавим новое сообщение в messages.py:

В bot_andlers.py добавим нашу логику:

Вот и все, запускаем бота и проверяем. Должно получится вот так:

welcome bot

На всякий случай вот код урока на github.

Спасибо за внимание!

Anton Yurash

<- Вторая часть | Четвертая часть ->

Все части обучения:

  1. Наш первый бот
  2. Структура проекта бота (создаём проект)
  3. База данных пользователей
  4. Рассылки
  5. Деплоймент бота на Heroku
Структура проекта бота (создаём проект)

Предисловие

Я считаю очень важным в каждом проекте правильно его структурировать – разбивать код проекта на файлы и папки, чтобы было удобнее находить и править нужные куски кода, и в целом навигация по проекту была интуитивно понятной.

Не видел нигде стандартов как правильно структурировать проект бота, по этому дальше – мое субъективное мнение как должен выглядеть фолдер с проектом и если вы имеете замечания или идеи – отпишите мне, обсудим.

bot files structure

Вот к примеру структура проекта нашего викибота.

Сейчас мы в команде переходим на парадигму ООП, и там другие структуры проектов, но для начинающих в любом случае лучше работать с функциональным программированием и структура проекта адаптирована именно под него.

Основные файлы

В любом проекте константы, настройки и сущности, которые используються в совершенно разных кусках кода стоит выностить в отдельные файлы.

В любом проекте должны быть файлы:

  • config.py (Файл с настройками)
  • bot.py (Файл, который содержит объект бота)
  • bot_handlers.py (Хэндлеры бота)
  • messages.py (Константы сообщений)
  • requirements.txt (Библиотеки/пакеты проекта)

Разберем подробнее

(Расширим бота созданного в первой части)

Создаем папку mybot/ и в ней файлы:

  • Файл config.py

Константы принято писать БОЛЬШИМИ_БУКВАМИ, вконце файла всегда принято оставлять пустую строчку

  • Файл messages.py

Сообщения в отдельном файле, чтобы их было удобно менять

  • Файл bot.py

Теперь при запуске, если все впорядке будем видеть параметры бота, благодаря строчке print(bot.get_me())

  • Файл bot_handlers.py

Обратите внимание – мы добавили важную составляющую любого бота – хэндлер команды “/start” – когда человек впервые заходит в бота. Между функциями принято ставить 2 enter.

Запуск

Зпаускаем файл bot_handlers.py так же, как и bot.py в прошлом уроке. Если все впорядке видим:

Пишем боту. Должно получится так:

bot example

Поздравляю, если все получилось.

UPD requirements.txt

Файл requirements.txt используется для того, чтобы было проще переносить проект и устанавливать библиотеки через pip. Поскольку мы используем pyTelegramBotApi, добавим его в этот файл.

Каждый новый пакет пишется через enter

Чтобы установить все пакеты из файла вводим

На всякий случай вот код урока на github.

Спасибо за внимание.

Anton Yurash

<- Первая часть | Третья часть ->

Все части обучения:

  1. Наш первый бот
  2. Структура проекта бота (создаём проект)
  3. База данных пользователей
  4. Рассылки
  5. Деплоймент бота на Heroku
Наш первый бот
bot with computer

Регистрация бота

Откройте клиент телеграмма, найдите @BotFather и начните беседу. Отправьте команду /newbot и следуйте инструкциям. После выполнения первых шагов вы получите:

bot registration

Собственно, вот и всё. На данном этапе ваш бот полностью пассивен.

Установка программ для разработки ботов

Мы, в компании Momentum bots разрабатываем ботов на языке Python 3, и обучаем новеньких тоже на этом языке программирования. Он один из самых легких и имеет очень много готовых качественных библиотек для самых разнообразных задач. Идеальный инструмент для разработки ботов).

Если вы пользуетесь ос Windows:

Заходим на https://python.org/downloads/windows/, выбираем “latest python release” и python 3. Скачиваем и устанавливаем, важно – при установке поставить галочку в поле Add to PATH.

Если вы пользуетесь ос Linux:

У вас скорее всего уже установлен пайтон. Откройте консоль (обычно ctrl+alt+t). Введите в консоли:

Скорее всего, вас любезно поприветствует python 3:

Если это так, то можно вас поздравить: у вас уже стоит python 3. В противном случае нужно установить пакет python3 с помощью пакетного менеджера вашего дистрибутива (apt/yum/etc)

Если вы используете MacOS:

Открыть www.python.org

В пункте меню 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.

Если у Вас пока что нет этих программ, откроем файл с помощью блокнота и вставим этот код:

Вместо токена в коде вставьте свой токен, который получили при регистрации через @BotFather.

Откройте консоль (напомню Windows – Win+R, cmd) и введите

Windows: python bot.py

Linux: python3 bot.py

Теперь ваш бот работает. Напишите в телеграмме своему боту и он ответит на ваше сообщение.

bot example

Спасибо за внимание.

На всякий случай вот код урока на github.

Вторая часть ->

Anton Yurash

Все части обучения:

  1. Наш первый бот
  2. Структура проекта бота (создаём проект)
  3. База данных пользователей
  4. Рассылки
  5. Деплоймент бота на Heroku