Dima Kit, Author at Momentum bots. Розробка чатботів
+

Посты автора Dima_Kit

Dima_Kit

Dima Kit

Чат-бот для проверки, будут ли популярны Ваши фото в Instagram?

Опубликовано: Червень 1, 2018 в 10:41 am

Автор:

Категории: blog

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

BBC bot

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

Photo analysis

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

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

Опубликовано: Травень 24, 2018 в 2:40 am

Автор:

Категории: blog,courses

Предисловие

Рано или поздно в разработке ботов вы столкнетесь с проблемой хостинга бота. Скорее всего, у вас нет своего собственного сервера, а платить за виртуальный не каждый хочет, да и настройка виртуального сервера может казаться чем-то непосильным для начинающих разработчиков. К счастью, есть много сервисов, предоставляющих хостинг приложений бесплатно. Одним из таких есть 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

База данных пользователей

Опубликовано: Травень 22, 2018 в 6:19 pm

Автор:

Категории: blog,courses

Предисловие

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

Для получения списка всех пользователей бота, к сожалению у телеграмма нет 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