- PVSM.RU - https://www.pvsm.ru -

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

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

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

Stepic Bot

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

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

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

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

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

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

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

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

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

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

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

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

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 [9].

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

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

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

Автор: Stepic.org

Источник [12]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/136034

Ссылки в тексте:

[1] eternnoir/pyTelegramBotAPI: https://github.com/eternnoir/pyTelegramBotAPI

[2] datamachine/twx.botapi: https://github.com/datamachine/twx.botapi

[3] nickoala/telepot: https://github.com/nickoala/telepot

[4] sourcesimian/txTelegramBot: https://github.com/sourcesimian/txTelegramBot

[5] неплохое руководство на русском: https://kondra007.gitbooks.io/telegram-bot-lessons/content/index.html

[6] документации к Telegram API: https://core.telegram.org/bots#deep-linking

[7] тут: https://github.com/nickoala/telepot#deep-linking

[8] конечный автомат: https://ru.wikipedia.org/wiki/Конечный_автомат

[9] telegram.me/stepicbot: https://telegram.me/stepicbot

[10] stepic.org/telegram: https://stepic.org/telegram

[11] telegram.me/addstickers/Stepic: https://telegram.me/addstickers/Stepic

[12] Источник: https://habrahabr.ru/post/303478/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best