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



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 находится, то туда отправляется уникальная ссылка, юзер заходит в свой почтовый клиент, кликает на эту ссылку и все готово.

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

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

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

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



Красные состояния — это состояния, в которых бот ожидает от пользователя некоторого ввода.
I — это начальное состояние, в котором бот ожидает одну из следующих команд:

II — это выбор способа регистрации (через сайт или email);
III — состояние ожидания ввода email пользователем;
IV — это состояние, в котором бот ожидает одну из следующих команд:

V — это поиск, бот ждет ввода запроса.

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

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



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

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



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



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



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



Stepic.org в Telegram:


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

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

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

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