В наше время крайне популярна подписочная модель монетизации, и у активного пользователя интернета обычно подключено сразу несколько подписок. Сервисы стриминга музыки и видео, магазины видеоигр, приложения, Сбер, Mail.Ru и Вастрик — все хотят получать деньги с потребителя каждый месяц. Я тоже регулярно оплачиваю ряд сервисов и приложений, и мне всегда хотелось как-то это контролировать — считать общую сумму за месяц, переводить суммы в рубли, получать уведомления о приближающейся дате платежа, желательно с доступом к данным со всех своих устройств. Существует много мобильных приложений для учета подписок, но мне не хотелось устанавливать еще одно приложение ради такой несложной функциональности. Приложения показывают рекламу, пытаются собирать информацию о пользователях, постоянно обновляются и расходуют заряд батареи; отображение нескольких строчек текста того не стоит. В принципе, можно было бы вести список подписок в Excel-таблице и синхронизировать ее через Dropbox, но в таком варианте не получилось бы использовать актуальные курсы валют и отправлять уведомления.
Из таких требований родилась идея Telegram-бота для ведения списка подписок. Интерфейсных возможностей для перечисленных целей вполне хватает, и не нужно ставить отдельное приложение, так как мессенджер уже установлен на всех устройствах. В тот момент подобных (рабочих) ботов найти не удалось. Так как идея была больше пожеланием, чем сильной болью, то была отложена в стол, и я вспомнил о ней, только когда выбирал пет-проджект для изучения языка Scala.
Для такой цели проект подошел хорошо, так как был не очень масштабным, но и не совсем игрушечным. Он стал для меня песочницей, в которой я пробовал различные концепции и библиотеки из экосистемы Scala и несколько раз переписывал части кода, когда узнавал что-то новое. Это стало причиной долгой разработки, первые коммиты были сделаны в августе 2019-го года, и только сейчас бот приобрел некоторые законченные очертания первой версии. Получившийся продукт мне очень нравится, с удовольствием им пользуюсь. Надеюсь, что и другим он окажется полезен, особенно сейчас, когда за время самоизоляции и удаленки количество подключенных подписок у многих сильно увеличилось.
Как пользоваться
Функциональность аналогична нескольким приложениям для учета подписок, которые я пробовал. Список моих подписок выглядит так:
В списке отображается, сколько тратится на каждую подписку за неделю/месяц/год, а также общая сумма за период. Для удобства цены переводятся в дефолтную валюту — не забудьте выбрать ее в настройках (кнопка Settings или команда /settings
). Курсы валют обновляются раз в сутки. В квадратных скобках указано, сколько времени осталось до следующего платежа.
На странице подписки находится цена в исходной валюте, периодичность, дата следующего платежа, и сумма, потраченная с даты первого платежа. Периодичность при создании можно не указывать, чтобы отслеживать разовые платежи.
Уведомления включаются отдельно для каждой подписки. Они стали главной проблемой при разработке бота — изначально хотелось сделать гибкую настройку оповещений, отправку сообщений за произвольное количество дней или часов, как в календарях. Но API для Telegram-ботов не позволяет узнать часовой пояс пользователя, а без этого не получится вычислить точное время отправки сообщения. Мне не удалось придумать, как реализовать простой и удобный выбор временной зоны в Telegram-боте, поэтому уведомления отправляются за сутки до даты платежа по времени UTC. Так один пользователь получит сообщение за 23 часа, а другой за час до платежа, это кривое решение, но ничего лучше пока нет, а мне уведомлений с такой точностью хватает.
Создание и редактирование подписок производится в диалоговом режиме, а если вы застряли или не понимаете, что происходит, всегда можно вызвать команду /reset
или /start
, чтобы выйти из диалога.
Бот полностью бесплатный, монетизация не планируется, за потенциальным исключением в виде ссылки для пожертвований.
Технологический стек
Главной целью разработки было попробовать современное функциональное программирование на Scala, IO-монады и концепцию Tagless Final. Это определило стек, бот написан с использованием библиотеки для ФП — Cats Effect, для взаимодействия с базой данных используется doobie. Разработка была интересной, об одном из решений написал отдельный пост в своем блоге: для данных в кнопках инлайн-клавиатур бота используется формат CSV с мапингом в алгебраические типы. Деплоится бот в виде systemd-сервиса с запуском jar-файла на VPS.
Для взаимодействия с Telegram Bot API используется библиотека Telegramium. Это функциональная библиотека на Scala, которую я помогаю разрабатывать, пользователи и контрибуторы приветствуются.
Заключение и ссылки
В итоге бот помог мне сделать вывод, что на подписки уходит не так много денег, и пока что можно на них не экономить. Если не включать в список оплату съемной квартиры, конечно.
На этом все, замечания и пожелания пишите в комментарии или мне в Telegram johnspade. Исходный код бота можно найти на Github.
Еще раз ссылка на добавление бота в Telegram: s10ns_bot
Круто, спасибо за бота
Не мог добавить туда ещё UAH?;)
Где хранятся персональные данные?
Привет, очень круто!
Я правильно понимаю, что свою валюту не зарегистрировать?
Удобно, хорошо, спасибо за бота)
Создал платежи с начальной датой на пару лет назад, чтобы видеть, сколько было уплачено. Далее редактирую amount, т.к. с этого месяца изменяется цена. Цена изменилась и пересчиталась для всего предыдущего периода. Было бы здорово иметь возможность отключать пересчет для предыдущего периода при изменении цены.
Вообще топ тема! Использовал для этого всякие платные приложения для айфона, но очень быстро забивал на них. В наших европах особенно актуально, тут контракты заключают на год-два и нужно быть вундеркиндом чтобы не проебать момент его разорвать или перейти на более выгодный. Даже целые стартапы вокруг этого пуляют.
Тема! А часовой пояс у юзера можно спрашивать. Пусть город вбивает, дальше через geocoding api Яндекса нормализовать его и определять пояс.
Не получится сделать чтобы пользователь мог самостоятельно через команду задать свою таймзону (по умолчанию также и оставить как есть) - как нибуть вроде /timezone UTC+6 ?
Клево. Монетизировать будете?
Оч круто :)
Клавиатура с датам - вообще огонь
Бот крутой, буду использовать, спасибо.
По фидбеку: было бы хорошо, если бы на клавиатуре с датой верхняя кнопка с месяцем/годом была не декоративная, а по нажатию показывала бы сначала месяцы, а потом и года, как это происходит в типовых дейтпикерах. А то если первый платеж два года назад, то довольно неудобно листать. Ну и как вторичный вариант просто принимать дату текстом в каком-то формате
Классный бот, спасибо. Нашел его в теме про ежемесячные подписки, заполнил, теперь думаю так ли мне все они нужны 😃
А можно добавить BYN (беларусскую валюту)?
P.S. бот крутой!
Так вот что народу нужно, бот для отслежиавния подписок, а я дурак думал сообществу пользу принесу, уведомения из Bitbucket в Telegram сделаю, дурак :D
😱 Комментарий удален его автором...