Зимой 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
Автор: Stepic.org