Ваш банк может предлагать настройку SMS-уведомлений для различных триггеров. Возможно, у вас даже есть возможность получать периодические сводки о расходах по SMS (у меня такой опции нет!). Но как насчет ежедневной SMS-сводки о расходах по *всем* вашим счетам? Такую сводку сложнее найти, но, к счастью, вы можете создать ее самостоятельно, объединив Plaid — удобный API для финансовых сервисов — и Twilio SMS с небольшим количеством Python 3. Давайте приступим!
Начнем создание нашего приложения с подготовки основных строительных блоков. Весь код в одном месте для тех, кто следит за процессом и хочет сэкономить время на наборе.
Сначала зарегистрируйте песочницу в Plaid и добавьте свои учетные данные в переменные окружения `PLAID_CLIENT_ID`, `PLAID_SECRET` и `PLAID_PUBLIC_KEY`. Попутно запросите доступ к API для разработки (на одобрение может уйти несколько дней). Пока создайте переменную окружения `PLAID_ENV` и установите ее значение как ‘sandbox’. Это даст нам примерные данные для работы.
Нажмите «открыть ссылку», затем войдите в Chase с тестовыми учетными данными («user_good» и «pass_good» по состоянию на 26.05.2017), и приложение выведет токен доступа в ваше терминальное окно.
Скопируйте токен и добавьте его в переменную окружения `CHASE_ACCESS_TOKEN`. Повторите этот процесс для Bank of America и сохраните токен доступа в `BOFA_ACCESS_TOKEN`.
Наконец, установите несколько зависимостей проекта:
Теперь, когда основные блоки на месте, мы можем приступить к написанию кода нашего приложения.
Быстрый способ начать работу с Plaid — получить некоторые транзакции по счетам и изучить результат. Создайте новый файл под названием `get_some_transactions.py`. В этом файле создайте экземпляр `plaid.Client` и новую функцию `get_some_transactions`, которая принимает токен доступа и даты начала и окончания диапазона транзакций, которые вы хотите получить. Внутри функции вызовите метод `Transactions.get` клиента Plaid с этими параметрами. Следующий код выполнит эти шаги.
С этим кодом мы можем начать изучать, какую информацию возвращает Plaid. В том же скрипте вызовите `get_some_transactions`, добавив следующие две строки в конец файла. Они передают токен доступа Chase и широкий диапазон дат.
Запустите скрипт с помощью команды `python get_some_transactions.py`.
При выполнении этот код выводит: «всего 338 транзакций за указанный период». Сколько транзакций вернулось из нашего вызова API Plaid?
Очевидно, что `get_some_transactions` вернул 100 транзакций. Почему только 100? Похоже, это значение по умолчанию для параметра `count`, который является необязательным для `Transactions.get`, как видно в документации API Plaid.
Какие данные содержатся в транзакции?
Этот код выводит `dict_keys([‘account_id’, ‘account_owner’, ‘amount’, ‘category’, ‘category_id’, ‘date’, ‘location’, ‘name’, ‘payment_meta’, ‘pending’, ‘pending_transaction_id’, ‘transaction_id’, ‘transaction_type’])`. Для наших целей, похоже, достаточно поля `amount`, но что насчет `category`? Мы не создаем полноценного бота для бюджетирования, но есть ли транзакции, которые могут усложнить нашу сводку расходов?
Этот код дает нам следующий набор категорий: `{‘Food and Drink’, ‘Travel’, ‘Transfer’, ‘Airlines and Aviation Services’, ‘Payment’, ‘Credit Card’, ‘Coffee Shop’, ‘Fast Food’, ‘Restaurants’, ‘Deposit’}`. Это будет полезно для создания более избирательной функции `get_some_transactions`. Например, транзакции с категорией «Transfer» я бы не стал включать в ежедневные сводки, так как они не относятся к расходам. Но прежде чем мы переработаем код, давайте посмотрим, с какими счетами мы имеем дело и есть ли среди них те, которые стоит исключить.
Опуская менее релевантные поля, результат выполнения выглядит так:
Здесь тоже есть очевидные кандидаты на исключение: вряд ли мы будем тратить деньги со сберегательных или инвестиционных счетов — в худшем случае это будут переводы — так что давайте переработаем код!
Мы знаем, что хотим исключить транзакции с категорией «Transfer». Категории «Credit Card», «Payment» и «Deposit» тоже не помогут в анализе расходов, поэтому мы переработаем функцию `get_some_transactions`, чтобы пропускать транзакции с такими категориями. Как уже упоминалось, мы также хотим пропускать счета с подтипом «savings» или «cd».
Попутно давайте убедимся, что получаем все доступные транзакции с помощью пагинации, а не только первые 100 по умолчанию, и сосредоточимся только на элементе `transactions`, а не на других. Измените `get_some_transactions.py` следующим кодом (который также можно найти в файле get_some_transactions.py на GitHub).
Запустите код, и он сообщит, что найдено 265 транзакций. Есть ли среди них отрицательные?
Несколько транзакций действительно имеют отрицательные суммы:
Это выглядит логично — возврат за авиабилет, вероятно. Все транзакции с отрицательными суммами похожи на эту, так что оставим их.
Теперь давайте получим все транзакции за вчерашний день, убедившись, что мы берем их с обоих счетов. Создайте новый файл `get_yesterdays.py` и добавьте в него этот код:
По состоянию на 26.05.2017 самые последние транзакции в этих песочницах датируются 16.05.2017. Отсюда и жестко заданное значение «вчера» выше.
Давайте отправим себе SMS с общей суммой расходов за вчера! Создайте еще один новый файл `send_summary.py` и добавьте в него этот код:
Запустите код с помощью команды `python send_summary.py`, и вуаля!
—
Подводя итоги
Мы создали приложение, которое агрегирует все расходы по разным кредитным и банковским счетам, а затем отправляет общую сумму расходов на ваш телефон. Весь код доступен в одном месте. Чтобы развернуть его, вы можете создать cron-задание, которое будет запускать его каждый день в определенное время, и больше никогда не придется иметь дело с отдельными уведомлениями/сводками от каждого счета.
Но это лишь верхушка айсберга того, что можно создать с этими данными о расходах. Не знаю, как вы, но после создания этого прототипа мне захотелось бота, который отслеживает мои расходы и напоминает мне о необходимости категоризировать элементы, которые он не может классифицировать самостоятельно. Электронные таблицы — это здорово, но нужен ли мне неоплачиваемый подработчик по их ведению? То же самое касается существующих веб-приложений.
Более простым расширением этого приложения было бы настроить его для вашей бабушки и посмотреть, сможете ли вы добавить в него осмысленное голосовое взаимодействие.
Делитесь своими идеями и вопросами в комментариях ниже!