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


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.