Привет, Клуб!
Невероятно, но у нас тут ЕЩЕ ОДИН бот для мониторинга трат!
А что случилось?
Последние лет 5, примерно раз в год, я пытаюсь привить себе финансовую дисциплину, иначе говоря — начать регулярно отслеживать траты, чтобы понимать, чего ожидать от следующих месяцев, планировать какие-то крупные траты, ну и вообще, привнести СТАБИЛЬНОСТЬ в финансовую жизнь.
Как правило, каждый такой эпизод характерен следующими шагами:
- резко понимаю, что так дальше жить нельзя, и надо срочно что-то менять
- нахожу очередное классное приложение, оно, конечно же с платной подпиской, покупаю подписку на год
- начинаю вносить туда всю информацию о всех счетах и картах, шарю аккаунт с женой, и начинаю вносить каждую трату с точностью до копейки
- пытаюсь создать идеальный набор категорий и групп категорий для расходов и доходов
Все это занимает примерно неделю, в конце которой огонь в глазах уже не горит, и все заканчивается до следующего года.
Тут надо отметить, что в России это было несколько проще: на любой чих по карте тут же приходят смски с инфой, их можно легко парсить, и в принципе учет трат может вестись в большей степени автоматически, без вмешательства кожаного ублюдка (особенно если исключить наличку).
Но в Израиле все не так:
- смски о тратах не существуют практически нигде, а там где есть - в них очень мало деталей
- большинство карт кредитные, что означает, что траты суммируются в одну большую сумму, которая раз в месяц снимается со счета.
Там вообще все запутанно, это достойно отдельного поста, но суть в том, что автоматически ничего не сделаешь.
Есть несколько приложений, которые научились прикидываться юзером и заходить в ЛК банка от твоего имени, но тут две проблемы:
- для каждой синхронизации надо ждать смску и вводить ее (и так для каждой карты. У нас их 8). То есть я не могу просто открыть приложение и увидеть сводку, нужно сделать дофига действий. Просто омерзительный ux
- давать левому приложению доступ к банковскому кабинету — жопа с точки зрения безопасности
Что мне не нравится в приложениях:
- все привязано к сценариям, которые определил разработчик. Как только у тебя что-то не совпадает — все, уже неудобно, и ничего ты с этим не сделаешь
- если мало фич — "не, ну это какая-то срань, как таким можно пользоваться?". если много фич — я начинаю упарываться по "идеальной" настройке всего и вся, в итоге погружаясь в этот процесс с головой и совершенно теряя цель, ради которой изначально заходил.
Иначе говоря, я не нашёл пока что приложения с идеальным балансом обилия фич и нагруженностью экранов.
Еще раз, это не приложения плохие, а я недисциплинированный тип, склонный к преждевременной оптимизации. В итоге не очень получается с приложениями.
С другой стороны, есть полно людей, которые делают все вышеперечисленное с помощью табличек в экселе
Но я же программист, да еще и невыгоревший, с огнем в глазах!
Перефразируя поговорку, "когда у тебя в руках питон (гусары, молчать), любая проблема решается телеграм-ботом".
Да, я решил сделать ЕЩЕ ОДНО приложение (точнее бот), и вот почему:
- оно будет идеально соответствовать моим ожиданиям. Да и по опыту других ботов знаю, что когда делаешь для себя — получается самый кайф
- это успешный самообман — плодами своих трудов ХОЧЕТСЯ пользоваться
- я люблю делать прикольные проекты
Мне кажется, что 99% времени пользования такими приложениями — это внесение трат и управление категориями, поэтому все что умеет делать мой бот — принимать инфу, управлять категориями и группами категорий, рисовать статистику за месяц и пинговать меня раз в день, чтобы я не забыл ввести траты.
Все что я туда отправляю, бот в итоге записывает в несколько табличек в базе данных.
Как это выглядит внесение траты: я ввожу сумму, бот присылает кнопочки с категориями, причём сначала есть несколько кнопок для категорий, у которых больше всего транзакций за месяц, и это покрывает большую часть случаев, но можно выбрать любую другую группу/категорию.
В боте не так много фич, потому что над каждой я очень долго думаю — очень хочется сохранить тот баланс между простотой и продуманными фичами. Например, если открыть список категорий, и изменить одну из них, исходное сообщение обновится.
В ближайших планах добавить управление подписками для автоматических трат, типа квартплаты или подписок на сервисы, поддержку английского, а спустя время, когда накопятся данные, можно будет попытаться поиграть в аналитика и делать прогнозы и вот это все.
Мы с женой пользуемся ботом с 1 февраля, пока что там мало данных, поэтому я вообще не очень запаривался над визуализацией, и там всего один вид графиков... ладно, это враньё, я просто пипец как запарился:
Как я делал идеальный pie (donut) chart
Дисклеймер: все, что вы прочитаете в этой главе — шиза и блажь перфекциониста c погружением в нюансы рендеринга emoji. Смело пропускайте, если вам такое не интересно.
Первые пару месяцев я не добавлял никакой визуализации, потому что у меня развернут Metabase (спасибо, @Kirk!) — такая штука, которая может подключиться к практически любой базе, и нарисовать красивые графики для данных. Вот только ходить каждый раз туда довольно запарно, да и вообще отдает красноглазием, жена такое не осилит. Поэтому я решил добавить в бот стату за месяц.
И тут начались проблемы.
Я использую эмодзи в названиях категорий и групп категорий, это помогает быстрее ориентироваться. И пока они существуют на кнопках в телеге, все норм. Но как только ты начинаешь рисовать график, приходят проблемы.
Кратко про эмодзи: чтобы вы могли видеть у себя на экране красивые эмодзи, разработчик приложения/сайта должен использовать специальный шрифт с глифами (картинками). Этих шрифтов не так много: есть популярные шрифты от Apple, Google, Twitter, Microsoft, и еще какие-то. Из упомянутых, опен-сорсные только Google и Twitter.
Дело в том, что внутри телеги вшиты проприетарные Apple Emoji. Уж не знаю как Паша это провернул и его до сих пор не засудили, но факт остается фактом — в любой телеге на любом девайсе у вас всегда будут одинаковые эмодзи.
А вот с отрисовкой картинок все не так просто.
Ок, я нашел и скачал файл шрифта с эппловскими эмодзи, но это только начало.
Существуют две основные библиотеки под python для рисования графиков, MatPlotLib и Plotly.
Первый сразу пришлось выкинуть, потому что его внутренний бэкенд для рендера шрифтов не поддерживает шрифты с глифами (может конечно у меня руки кривые, но несколько бессонных ночей ни к чему не привели). В интернете есть буквально одна инструкция, как заставить MatPlotLib отрендерить эмодзи из шрифта, и вы можете сами оценить, какая это шиза.
Вторая попытка — Plotly. И вроде все хорошо, но видимо из-за того, что у него кишки написаны на js, ему нельзя скормить файл шрифта, зато он умеет брать шрифт из системы. Вот только тут проблема — эппловый шрифт никак не получилось установить в винду, на которой я сижу. Вместо этого он подтягивал майкрософтовские эмодзи, и посмотрите, какой это ад перфекциониста:
А в серверной убунте, которая в контейнере, разумеется, вообще никаких шрифтов с глифами нету, круто, да?
В итоге, спустя пару десятков экспериментов, оказалось, что если подложить во время сборки контейнера файл шрифтов в системную папку шрифтов убунты, оно сработает! Это была просто невероятная радость!
Еще для идеала было необходимо рисовать как сумму сегмента (снаружи графика), так и процент (внутри). Как оказалось, Plotly умеет рировать только одно из них, но спасла вот эта инструкция с гразным хаком.
Итого
Идея самообмана оказалась весьма успешной: идет четвертый месяц, привычка сразу после оплаты открывать бот и вносить трату уже плотно закрепилась, бесит только вводить ежемесячные траты.
Судя по всему, у меня таки получилось выдержать баланс между простотой и фичами, и сделать для себя инструмент, которым приятно и не особо запарно пользоваться.
Стек и Open Source
Тут без сюрпризов: python, любимый aiogram и postgres.
Поскольку речь идет о чувствительных данных, я пока что не стал заморачиваться с поддержкой юзеров. Это значит, бот селфхостед, им может пользоваться только тот, кто его развернул (ну и те кого он добавил в конфиг).
Я постарался написать максимально понятный readme, поэтому любой желающий легко может развернуть его в докере.
Мне от приложений трекинга расходов не хватало такой фичи: сфоткать чек и отложить его, чтобы разобрать потом. Чеки-то я фоткал камерой, но потом тупо забывал к ним вернуться и разобрать.
Сценарии тут такие:
Ну и чтобы 2 раза не вставать: помимо категорий хорошо было бы иметь теги. Сценарий — всё тот же налоговый вычет, который может быть в принципе практически из любой аналитической категории (ремонт, самообразование, транспорт и даже еда, кроме алкоголя).
Тегать и загружать фотку можно было бы сразу одним махом, типа "100 #tax"
А внутренние перемещения между карточками и перемещение в нал/безнал делали?
Я из-за этого (и не только продолжаю пользоваться Excel/гугл-таблицами. Просто у меня еще видимо профессиональное искажение - выглядит, как бюджет и P&L на работе. Есть долгосрочный бюджет... Я еще подтягиваю факт и сравниваю. Ну и меток у меня разных много (помимо вида доходов/расходов).
Ну зачем придумывать велосипед? Ну кроме "хочу что-то пописать, потому что могу".
Описал свой форкфлоу ведения финансов и с 2013 года активно этим занимаюсь.
Вот описал полноценно: https://vas3k.club/post/10530/
В двух словах:
Какие профиты от этого?
И к тому же, намного быстрее добавлять расходы в приложение, чем это вот всё через телеграм писать дополнительно.
Вот такое вот мнение.
То что как-то качнул свои скилы и напилякала такое, это приветствуется.