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

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

    image

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

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

    image

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

    image

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

    image

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



    Stepic.org в Telegram:


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

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

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

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

    Stepik.org

    52,00

    Открытые бесплатные курсы на технические темы

    Поделиться публикацией

    Похожие публикации

    Комментарии 5
      +2
      Бот у вас отличный получился, сам недавно для себя его открыл. И развиваетесь в целом активно. А вот обратная связь по отзывам у вас за год упала. Если уж у людей времени не хватает — и туда бота напишите, пусть на каждое обращение отвечает что-то типа «Ваш отзыв очень важен для ...». А то письма в пустоту уходят.
        0
        Здравствуйте! Наверное, Вы имеете в виду тот шаг на платформе, где мы собираем обратную связь.
        За последний год мы развернули хелпцентр, где ежедневно отвечаем на десятки обращений пользователей, он находится по адресу stepic.help. Шаг с пожеланиями действительно стоит как-то «очеловечить», он не менялся фактически с момента запуска платформы. Безусловно, мы читаем его и принимаем в расчёт при доработках, спасибо за Вашу активность!
          0
          Да я именно о нем. В остальном вас трудно упрекнуть :)
        0
        И это всё? Ну это же совсем скучно.
        Вы не использовали море крутых возможностей.
        Например, результаты поиска лучше сделать с пагинацией.
          0
          Это вы неправильно сказали!
          Результы сечинга надо делать с пагинацией!

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое