Проект: Телеграм бот для сбора и анализа трат  Публичный пост
10 мая 2022  2076
Телеграм бот для сбора и анализа трат
https://github.com/benyaming/family_finance

Привет, Клуб!

Невероятно, но у нас тут ЕЩЕ ОДИН бот для мониторинга трат!

А что случилось?

Последние лет 5, примерно раз в год, я пытаюсь привить себе финансовую дисциплину, иначе говоря — начать регулярно отслеживать траты, чтобы понимать, чего ожидать от следующих месяцев, планировать какие-то крупные траты, ну и вообще, привнести СТАБИЛЬНОСТЬ в финансовую жизнь.

Как правило, каждый такой эпизод характерен следующими шагами:

  1. резко понимаю, что так дальше жить нельзя, и надо срочно что-то менять
  2. нахожу очередное классное приложение, оно, конечно же с платной подпиской, покупаю подписку на год
  3. начинаю вносить туда всю информацию о всех счетах и картах, шарю аккаунт с женой, и начинаю вносить каждую трату с точностью до копейки
  4. пытаюсь создать идеальный набор категорий и групп категорий для расходов и доходов

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

Тут надо отметить, что в России это было несколько проще: на любой чих по карте тут же приходят смски с инфой, их можно легко парсить, и в принципе учет трат может вестись в большей степени автоматически, без вмешательства кожаного ублюдка (особенно если исключить наличку).

Но в Израиле все не так:

  1. смски о тратах не существуют практически нигде, а там где есть - в них очень мало деталей
  2. большинство карт кредитные, что означает, что траты суммируются в одну большую сумму, которая раз в месяц снимается со счета.

Там вообще все запутанно, это достойно отдельного поста, но суть в том, что автоматически ничего не сделаешь.

Есть несколько приложений, которые научились прикидываться юзером и заходить в ЛК банка от твоего имени, но тут две проблемы:

  1. для каждой синхронизации надо ждать смску и вводить ее (и так для каждой карты. У нас их 8). То есть я не могу просто открыть приложение и увидеть сводку, нужно сделать дофига действий. Просто омерзительный ux
  2. давать левому приложению доступ к банковскому кабинету — жопа с точки зрения безопасности

Что мне не нравится в приложениях:

  1. все привязано к сценариям, которые определил разработчик. Как только у тебя что-то не совпадает — все, уже неудобно, и ничего ты с этим не сделаешь
  2. если мало фич — "не, ну это какая-то срань, как таким можно пользоваться?". если много фич — я начинаю упарываться по "идеальной" настройке всего и вся, в итоге погружаясь в этот процесс с головой и совершенно теряя цель, ради которой изначально заходил.

Иначе говоря, я не нашёл пока что приложения с идеальным балансом обилия фич и нагруженностью экранов.

Еще раз, это не приложения плохие, а я недисциплинированный тип, склонный к преждевременной оптимизации. В итоге не очень получается с приложениями.
С другой стороны, есть полно людей, которые делают все вышеперечисленное с помощью табличек в экселе
Но я же программист, да еще и невыгоревший, с огнем в глазах!
Перефразируя поговорку, "когда у тебя в руках питон (гусары, молчать), любая проблема решается телеграм-ботом".

Да, я решил сделать ЕЩЕ ОДНО приложение (точнее бот), и вот почему:

  1. оно будет идеально соответствовать моим ожиданиям. Да и по опыту других ботов знаю, что когда делаешь для себя — получается самый кайф
  2. это успешный самообман — плодами своих трудов ХОЧЕТСЯ пользоваться
  3. я люблю делать прикольные проекты

Мне кажется, что 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, поэтому любой желающий легко может развернуть его в докере.

Связанные посты
12 комментариев 👇

А внутренние перемещения между карточками и перемещение в нал/безнал делали?
Я из-за этого (и не только продолжаю пользоваться Excel/гугл-таблицами. Просто у меня еще видимо профессиональное искажение - выглядит, как бюджет и P&L на работе. Есть долгосрочный бюджет... Я еще подтягиваю факт и сравниваю. Ну и меток у меня разных много (помимо вида доходов/расходов).

  Развернуть 1 комментарий

@tanya_vostrik, нет, я как раз хочу абстрагироваться от того, где лежат и откуда тратятся деньги, потому что мне это принципиально не меняет картину, зато приносит кучу сложностей и требует делать больше действий при использовании

А я как раз пытался сделать чтоб было максимально просто в плане внесения трат

  Развернуть 1 комментарий

Ну зачем придумывать велосипед? Ну кроме "хочу что-то пописать, потому что могу".
Описал свой форкфлоу ведения финансов и с 2013 года активно этим занимаюсь.
Вот описал полноценно: https://vas3k.club/post/10530/

В двух словах:

  • табличка excel c учетом всех доходов и расходов и все премудрости которые можно с этими суммами делать
  • приложение куда вписываю исключительно РАСХОДЫ, так как они постоянны, а доходы намного реже приходят

Какие профиты от этого?

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

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

Вот такое вот мнение.
То что как-то качнул свои скилы и напилякала такое, это приветствуется.

  Развернуть 1 комментарий

То есть я потратил половину поста для того чтобы рассказать, зачем я сделал свой велосипед под свои специфические нужды (под которые не подходит твой воркфлоу) и почему мне не подходят таблички, но ты все равно спрашиваешь, зачем?

  Развернуть 1 комментарий

@benyamin, перечитал ещё раз пост. Не нашел ни какой проблемы явной которую решил этим флоу.
Всё сводится к одному.
Открыл, добавил расход, закрыл.

Время от времени смотришь траты по категориям.

Что я такого "специфического' упустил?

  Развернуть 1 комментарий

@bakalov,

  1. я написал, что ощутимый процент успеха - использование СВОЕГО решения, потому что своим приятно пользоваться
  2. в твоем флоу есть куча вещей, которые мне не нужны (валюты, доход, баланс) - про лишнюю функциональность я тоже писал, и наоборот, нету, категорий и подписок
  3. мне помогает не забивать на ведение трат простота использования - ввести число в телегу и нажать кнопочку с категорией можно за 2 секунды, а вот открывать приложение с таблицами, искать нужную строчку и вносить туда данные - meh

Да и вообще, что за духота, я рассказал как сделал инструмент подходящий под мою ситуацию, и не призываю никого бежать им пользоваться, не претендую на уникальность, и не заявляю что мой бот круче всех таблиц и приложений. Зачем ты продолжаешь объяснять мне что надо было брать твою табличку?)

  Развернуть 1 комментарий

@benyamin, я поделился своим мнением на то что ты сделал. Ни больше ни меньше.

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

  Развернуть 1 комментарий

@bakalov, простите что врываюсь в ваш тред, но коль скоро он в самом вверху и я его прочитал, то не пройду мимо.

У меня сложилось впечатление, что ты, Богдан, "поделился мнением" (как ты это называешь) в достаточно пассивно-агрессивной манере.

Для меня (и, возможно, для автора) оно звучит вот так: "Ты проделал бесполезную работу и вышла у тебя фигня ненужная. Я — эксперт в этой теме, точно знаю как нужно делать правильно — вот тут я написал инструкцию".

Пониманию в таком контексте способствуют твои словечки "напилякал" и "изобретать велосипед". Звучит как обесценивание чужой работы, которую ты не заказывал и которую использовать тебя не заставляют.

Ну и раз я уж начал, напишу своё мнение про проект @benyamin и про твоё, Богдан, решение.

  • Бот в телеге — классный. Мне импонирует, что не нужно ставить ещё одно приложение, которым будешь забывать пользоваться (поначалу, пока вырабатываешь привычку). Я сам через это проходил и часто ловил себя, что за прошлый день никаких расходов не записал. С телегой, я считаю, такой риск уменьшаеьтся: телега постоянно мозолит глаза, несколько раз в день скорее всего её открываешь, потому заметить там бота и записать расходы — нормальный старт.
  • Телеграм предлагает простой и удобный интерфейс. Подобрать подходящее приложение для трекинга финансов — очень непросто. Особенно если мы говорим о семейном бюджете. У меня — Анлдроид, у жены — Айфон. А если ещё разная структура доходов — скажем, я — фрилансер и получаю деньги разными траншами примерно раз в неделю, а она — на постоянной зарплате, получат раз в месяц. Мы возвращаемся к твоему же "Если ты что-то зарабатываешь каждый день(чаевые например), просто найди самый удобный способ записывать суммы (в блокнот, заметки, сохраненные сообщения в телеграмме😅)" — так вот тебе удобный способ!
  • Из телеги можно легко отправлять данные в эксель или куда угодно для постоянного хранения, визуализации и люой аналитики. Например, я игрался с Metabase таким образом. Дальше экспериментов дело не зашло, но вообще можно построить из телеги и Metabase (ну или что там ещё опенсорсное есьть) вполне себе даже продукт.

Так что автор — молодец!

  Развернуть 1 комментарий

@zahhar, да, про разницу приложений я забыл упомянуть, но это тоже жиза, все так

  Развернуть 1 комментарий

@zahhar, я вас понял. Ну что сказать сорян за критику такую.
Всё норм расписал.

Нет единственного верного метода, но по прежнему считаю это overengineering.

Если это кому-то поможет вкатиться в трекинг своих финансов, это прекрасно.

Ну хоть попиздели нормально)

  Развернуть 1 комментарий

@bakalov, прекрасно попиздели :) всем мир!

  Развернуть 1 комментарий

Мне от приложений трекинга расходов не хватало такой фичи: сфоткать чек и отложить его, чтобы разобрать потом. Чеки-то я фоткал камерой, но потом тупо забывал к ним вернуться и разобрать.

Сценарии тут такие:

  • сидели с друганами в баре, я заплатил за всех и обещал прислать кто мне сколько должен (дада, решается всякими SplitItWise и т.п., но это ещё одно приложение)
  • на одном счёте несколько категорий, которые надо забукать отдельно — например, зашел в магазин купить подарок, но купил ещё что-то домой.
  • фотка чека нужна для налогового отчёта, если ты покупаешь как ИП или покупаешь на свою фирму или ты живёшь в стране, где сам администрируешь свои налоги и можешь претендовать на вычет по предъявлению подтверждающих чеков.

Ну и чтобы 2 раза не вставать: помимо категорий хорошо было бы иметь теги. Сценарий — всё тот же налоговый вычет, который может быть в принципе практически из любой аналитической категории (ремонт, самообразование, транспорт и даже еда, кроме алкоголя).

Тегать и загружать фотку можно было бы сразу одним махом, типа "100 #tax"

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб