Stepic.org в Telegram: как мы разрабатывали бота и что из этого получилось

в 9:18, , рубрики: api, bot, django, python, stepic, stepic.org, telegram, telegram api, telegram bots, Блог компании Stepic.org, Блог компании СПБАУ, ботоведение, боты, Системы обмена сообщениями, стажировка, стэпик

Зимой 2016 года у нас в Stepic.org возникла идея сделать для наших учащихся персонального помощника, поэтому мы позвали студента СПбАУ РАН Константина Чаркина на стажировку, результатом которой видели Telegram-бота. Это потом всё вышло из под контроля и появился набор стикеров и каналы по курсам… Но обо всём по порядку!

Stepic.org в Telegram: как мы разрабатывали бота и что из этого получилось - 1

Stepic Bot

Выбор языка и библиотеки

В качестве языка программирования был выбран Python, так как backend Стэпика написан на Django и самый простой способ интегрировать бота в общую инфраструктуру — это написание Django Application.
Из множества библиотек-оберток над Telegram API была выбрана eternnoir/pyTelegramBotAPI. Среди вариантов были еще три: datamachine/twx.botapi, nickoala/telepot, sourcesimian/txTelegramBot. Обусловлен выбор был тем, что, во-первых, она активнее поддерживалась, во-вторых, по ней есть неплохое руководство на русском для самых маленьких. Кстати, автор этого учебника создал группу в ВК, где отвечает на всякие вопросы, связанные с Telegram ботами, совершенно бесплатно и достаточно оперативно.

Связывание аккаунта

Чтобы бот мог выполнять некоторые полезные действия, необходимо связать аккаунт на Стэпике с аккаунтом в Telegram. Для этого используется механизм под названием Deep Linking. Почитать про него можно либо в документации к Telegram API, либо тут (вторая ссылка понятнее :).

В нашем случае механизм выглядит следующим образом:

  • В БД Stepic.org каждому пользователю присваивается некоторый уникальный, случайно сгенерированный token.
  • Для связывания аккаунта пользователь должен перейти по уникальной ссылке вида telegram.me/<bot_name>?start=%token%, которая находится в его профиле на сайте. Переход по данной ссылке эквивалентен тому, что бот получил от пользователя сообщение вида start %token%.
  • Бот при получении такого сообщения смотрит в БД, ищет там пользователя с таким token'ом, если находит, то запоминает, что данному пользователю соответствует Telegram аккаунт, с которого пришло это сообщение.

Также стоит учесть, что люди проходят курсы в основном с ПК, а пользуются Telegram на мобильных устройствах. Поэтому просить их, если они нашли бота не через сайт Stepic.org, сходить туда и нажать на эту ссылку — это плохая идея, т.к. вполне вероятно, что они не залогинены на данном устройстве, а пароль давно забыт. Поэтому есть второй вариант привязки аккаунта — через email. Бот, если ему написал незнакомый юзер, просит ввести его email, который использовался при регистрации, и если такой email находится, то туда отправляется уникальная ссылка, юзер заходит в свой почтовый клиент, кликает на эту ссылку и все готово.

Полезные действия

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

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

Проектирование

Наиболее простым способом моделирования поведения чат-ботов является конечный автомат.
В данном случае он выглядит следующим образом:

Stepic.org в Telegram: как мы разрабатывали бота и что из этого получилось - 2

Красные состояния — это состояния, в которых бот ожидает от пользователя некоторого ввода.
I — это начальное состояние, в котором бот ожидает одну из следующих команд:
Stepic.org в Telegram: как мы разрабатывали бота и что из этого получилось - 3
II — это выбор способа регистрации (через сайт или email);
III — состояние ожидания ввода email пользователем;
IV — это состояние, в котором бот ожидает одну из следующих команд:
Stepic.org в Telegram: как мы разрабатывали бота и что из этого получилось - 4
V — это поиск, бот ждет ввода запроса.

Собственно, смысл всех команд достаточно очевиден, далее несколько примеров использования.

Общение между учащимися реализовано самым простым способом — для курса создается чат и по запросу пользователя он получает список чатов по курсам, которые разделены на 2 категории в зависимости от того, записан ли пользователь на данный курс.

image

Тут, кстати, была заиспользована новая фича из botAPI 2.0, а именно встроенная клавиатура и редактирование сообщений. Можно было бы и выводить все чаты сразу, но чатов по курсам, на которые пользователь не записан, может быть достаточно много, и если пользователь и хочет увидеть несколько экранов, то пусть это делает осознанно.

Поиск курсов:

image

Удаление аккаунта:

image

Выбор способа регистрации:

image

Пример вывода команды /deadlines:

Stepic.org в Telegram: как мы разрабатывали бота и что из этого получилось - 9

Stepic.org в Telegram:

Бота можно найти по ссылке: telegram.me/stepicbot.

Или же сразу можно перейти к связыванию аккаунта на Stepic.org с аккаунтом в Telegram вот так: stepic.org/telegram.

Будем рады ответить на вопросы, конструктивная критика также приветствуется!

И на сладкое набор Stepic-стикеров: telegram.me/addstickers/Stepic

Stepic.org в Telegram: как мы разрабатывали бота и что из этого получилось - 10

Автор: Stepic.org

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js