September 2, 2022

Бот для заучивания

  • Насколько сложно сделать простого бота для телеграм.
  • Почему гугл таблицы это классно и нет.
  • Как https://t.me/vocabulary_coach_bot может помочь в заучивании ответов (фраз, новых слов)

Причины создания бота

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

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

Поик альтернатив не увенчался успехом. Все идут по самому халявному пути - выбери один из вариантов. Конечно, так проще, но толку меньше. Тогда она попросила меня сделать ей гугл табличку, куда бы она вбивала ответы на вопросы, а формула проверяла и говорила верный ответ или нет.

Я подумал, а почему бы не сделать сразу бота для такой задачи. А раз уж требуется разработка, то нужно изучить все альтернативы. Пересмотрел я около 2х десятков ботов и разочаровался: кривые, тормозные, багованные. Есть, впрочем, неплохие платные решения. Однако, ни в одном боте не было режима, который нужен Томе.

Сначала думал сделать совсем простого бота только для Томы, но в ближайших от событий гостях разговор зашёл о “мудаках разрабах того приложения”, потом о боте. Гостили мы у репетитора английского, которого очень заинтересовала идея такого бота для учеников.

Ещё неделю я думал, делать ли совсем говно решение, или всё-таки доступное и другим людям. В итоге остановился на промежуточном решении: гугл-таблица + телеграм бот. Так и мне чуть меньше разрабатывать, и данные у вас в любом случае останутся, и вносить данные будет проще.

Нюансы разработки

Здесь техническая часть, можно пропустить, если не интересна разработка.

Разработка, развёртывание, оформление и всё такое заняли порядка 40 часов. Конечно, делай я совсем костыльного бота, ушло бы в 10 раз меньше времени. Более того, Томе не нужен был режим с угадываем слов, но ещё посмотрим. На деле, работы ещё много.

Гугл таблицу я сделал достаточно быстро, рука набита. Однако, взаимодействие с ней значительно медленнее, чем с базой. Запрос нового вопроса может занять 2-5 секунд, что отстой. Сделать простенькую БД для вопросов в боте это ещё быстрее, но нужно реализовать интерфейс для занесения вопросов. А это уже совсем непросто, требует тестирования и проработки.

Большинство существующих решений как раз страдают в плане занесения слов. Вывести свой словарь из них вообще нереально. А если вы хотите занести сразу серию вопросов, к примеру, для подготовки к экзамену по пдд. Или целый толковый словарь? А если вы хотите что-то отредактировать или удалить серию вопросов. В этот момент все сервисы прячут лапки, потому что их делают сосунки.

Ранее я уже решил, что предпочтение отдаю сервисам с возможностью быстрого вывода моих данных, а уж тем более создавать новые я просто обязан с наличием такой фичи. Вот и получился не столько сервис для тренировки слов, сколько движок для заучивания.

Технические детали для интересующихся:

  • python
  • всё на асинхроне: aiogram, aiohttp, aioshedule
  • redis в качестве БД для состояний и текущих настроек пользователя
  • развернул на одноплатник orange Pi

Нечто, которым я хочу отдельно поделиться со спецами: я попробовал сделать локализацию через Enum классы, чтобы при разработке работало автозавершение и синтаксический анализ. Имхо получилось круто.

Что за бот и как работает

Кратко

  • К боту привязывается ваша таблица вопросов, которая ведётся независимо
  • Бот может напоминать вам о тренировках каждые 12-72 часа неактивности
  • Пока что есть 2 режима тренировок: ввести ответ и выбрать из списка
  • При написании бот комментирует схожесь с правильным ответом
  • Есть возможность внесения подсказок
  • В вопросах с помощью разметки можно вносить форматированные тексты, изображения и даже код

Подробно

Для работы с ботом нужно сделать копию таблицы и развернуть её. Вот подробный пошаговый план со скриншотами каждого действия. Делается за 20-60 сек. В конце вы получите ссылку для работы с таблицей, её и нужно передать боту. В будущем эту ссылку можно будет поменять в настройках. Вдруг я выпущу вторую версию таблицы…

При запуске бот попросит ссылку на “развёрнутый” вами экземпляр таблицы, а также указать частоту напоминаний.

Изменить настройки можно через команду /settings. Если будут затруднения, можете смотреть /help, где приведены все доступные команды. Обе команды являются стандартными для телеграм и должны по идее быть доступны из интерфейса клиента отдельным кнопочками в настройках бота. Да и меню ещё есть.

Но прежде чем переходить к тренировкам нужно внести первые записи в таблицу. Для режима с написанием ответа достаточно даже одного слова, а вот для режима угадайки нужно не меньше 8 записей.

Я пока криво сделал обработку ошибок, так что проверки на наличие хотя бы 8 слов пока нет. Не пытайтесь в выбор ответов, пока не занесёте их достаточно.

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

Очевидно, что вам стоит потереть все мои записи и внести свои. Главное, не трогайте лишний раз столбики со статистикой и не меняйте названия столбиков. А вот порядок столбиков можно менять, как и форматирование ячеек.

Статистику в боте я пока не реализовал, но вы можете использовать инструменты таблиц, чтобы анализировать свои результаты. …и расстраиваться.

Чтобы поддерживать фокус, бот через 5 секунд удаляет все неактуальные сообщения:

  • Неверные ответы
  • Вопросы с верными ответами
  • Пропущенные вопросы

Кстати, вот так будут отображаться изображения.

Если вы пропускаете вопрос, то я счёт важным показать правильный ответ. Надеюсь, это поможет в заучивании. Да и будет чем заняться, пока гугл таблица отдаёт новый вопрос. Отображение ответа сопровождается небольшой шизо-анимацией с глазами.

На мобилках с телегой есть проблема: не всегда влезает в кнопки весь текст. Клавиатуру для выбора варианта ответа бот строит гибко в зависимости от длины выпавших слов. По идее с фразами до 60 символов вообще не должно быть проблем. На моём вообще 100 взлезает.

Логика выбора нового вопроса

  • Сначала задаются слова, которые не задавались в течение суток
  • Затем слова сортируются в порядке количества раз, которые они задавались. Задаётся то, которое меньше задавалось
  • При равных показателях используется случайный выбор

В итоге таблица может несколько раз подряд выдавать один и тот же вопрос.

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

Такие условия я сделал, чтобы вопросы задавались более-менее равномерно. Да, это явно не идеально, т.к. совсем свежий вопрос таблица будет подгонять по показателям, но дополнительные проверки из разряда "не задавалось ли это слово только что" требуют немало дополнительной логики, которая значительно замедлит работу таблицы. Вот в настоящей базе данных в будущем уже можно будет намутить что угодно.

Перспективы и на…я

Действительно, можно было сделать совсем простое решение чисто для Томы, но проведя анализ рынка, я понял, что там одно г…о. Кроме того, есть сносное г…о, которое продаётся по подписке, да не одно. А это значит, что спрос некоторый есть. Да и вдруг мне в будущем потребуется.

Более того, я уже описывал, что меня иногда захватывает идея “попробовать это сделать так”. В общем, не жалею, хоть и времени ушло значительно больше, чем я ожидал. Сколько раз я наступал на эти грабли, а всё равно продолжаю удивляться, как, казалось бы, небольшая задача оказывается такой многогранной и трудоёмкой в исполнении. Ну если не на похер делать.

Я попробую опубликоваться этого бота в нескольких местах. Если он вызовет интерес, то постараюсь повысить его удобство. Планы описал на гитхабе. Посмотрите, как губу раскатал:

https://t.me/etonikmedoed