Сквозной трекер расходов с использованием API Gmail и Google Sheets.

2020 год - год улучшений - для себя, для правительства и существующих институтов, а также для привычек в расходах. Мой метод бюджетирования охватывал эту тему и прошел от полу-приемлемого процесса (с использованием Selenium and Beautiful Soup) до усовершенствованного и бесшовного (с использованием Gmail API).

Я впервые наткнулся на идею использования Gmail, когда заметил, что получаю электронное письмо каждый раз, когда я завершаю транзакцию с Venmo. Эти электронные письма содержали всю информацию, необходимую для моего бюджета - дату, продавца и сумму. Я исследовал API Gmail, чтобы узнать, смогу ли я проанализировать эту информацию и вставить ее в Google Таблицы. Это был на удивление безболезненный процесс, и я обнаружил, что могу получать похожие электронные письма с транзакциями с каждой из моих кредитных карт, включив уведомления по электронной почте для любых транзакций на сумму более 0,00 долларов США.

В отличие от моего предыдущего метода с Selenium и Beautiful Soup, использование API Gmail обеспечивает большую безопасность и доступ к историческим данным. API требует только одного шага аутентификации и не требует простого текстового пароля на вашем локальном компьютере. Вы также можете получить любую прошлую транзакцию в своем почтовом ящике, если формат электронной почты не изменился. Затем я использовал API Google Таблиц для загрузки всех этих извлеченных транзакций для удобного просмотра, категоризации и агрегирования. Эти существенные преимущества улучшают работу пользователей, чем раньше.

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

Полный код можно найти на моем Github здесь. Я буду рад помочь, если вы хотите создать свой собственный инструмент для составления бюджета - напишите мне по адресу [email protected].

Оглавление:

  1. Получение писем с транзакциями
  2. Извлечение данных транзакции
  3. Отправка в Google Таблицы
  4. Выполнение
  5. Заключение

Получение писем с транзакциями

Аутентификация

Сначала нам нужна аутентификация для доступа ко всем нашим электронным письмам. Python Quickstart Gmail API (также доступный на других языках) упрощает эту задачу, поскольку предоставляет образец с аутентификацией для выполнения вашего первого запроса. Поскольку мы будем использовать этот сценарий только на нашем локальном компьютере, этого метода аутентификации, показанного ниже, более чем достаточно для этого проекта.

Теперь, когда мы прошли аутентификацию, пришло время делать запросы.

Получение электронной почты с помощью Gmail Users.messages: list and get

Users.messages: список

response = service.users().messages().list(userId='me', q=query).execute()

list method возвращает идентификатор и threadId извлеченных нами писем, которые позже могут быть переданы в метод get для получения текста письма. Мы можем заставить метод возвращать только те электронные письма, которые нам интересны, благодаря параметру query. Здесь мы передаем аргумент в том же формате запроса, что и поле поиска Gmail. Поскольку электронные письма каждого банковского учреждения имеют разный формат, мы можем создать функцию, которая будет возвращать разные запросы в зависимости от выбора банка.

Мы используем следующий фрагмент кода из документации для просмотра нескольких страниц ответов.

Users.messages: получить

get method возвращает дополнительную информацию о конкретном письме с идентификатором из метода list.

msg = service.users().messages().get(userId='me', id=item['id'], format = raw_or_nah).execute()

Как видно выше, метод get имеет параметр format, в котором мы можем выбирать между «полным», «метаданными», «минимальным» и «необработанным» в качестве формата наших сообщений. Сначала мы должны определить, можем ли мы получить необходимые данные из фрагмента, который возвращается из формата «метаданные», который содержит тему и первые несколько строк электронного письма. Если в этом фрагменте нет нужной нам информации, мы можем выбрать формат «полный» или «необработанный», который возвращает полное сообщение электронной почты в виде строки в кодировке base64url. Я выбрал "сырое".

Теперь, когда у нас есть сообщения, пора извлечь пикантную информацию.

Извлечение данных транзакции

Разбор сообщений с форматом = «метаданные»

Требуемая информация о транзакции - это дата, продавец и сумма. Письма с уведомлениями о транзакциях от Bank of America и Venmo включают все три сообщения в сообщении, возвращаемом из формата «метаданные».

К сожалению, нелегко увидеть, где находится информация, поскольку каждое из этих сообщений представляет собой большой беспорядочный словарь. Мы должны прочитать словарь, чтобы увидеть, какие пары ключ-значение нам нужны. Дата, скорее всего, вложена в ключи «полезная нагрузка» и «заголовки», и мы можем извлечь значение даты с помощью parser.parse.

for msg in msgli:        
    # getting dates        
    headerli = msg['payload']['headers']        
    for nestdic in headerli:            
        if nestdic['name'] == 'Date':                
            date = parser.parse(nestdic['value']).date()
            dateli.append(date)

Остальная информация, вероятно, содержится в значении ключа 'snippet'. Мы можем использовать функцию price_str пакета анализатора денег, чтобы определить сумму транзакции и найти продавца, указав известные нам ключевые слова, указывающие, где информация / описание продавца лжет.

# getting amounts and description of transaction        
snippet = msg['snippet']        
amount_index = snippet.find("Amount")        
date_index = snippet.find("Date")        
where_index = snippet.find("Where")        
end_index = snippet.find("View details")        
if end_index == -1:            
    end_index = snippet.find("This may")         
amt_string = snippet[amount_index:date_index]        
where_string = snippet[where_index + 7:end_index]

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

Немного о Venmo

В выписке по кредитной карте возвращенные нам деньги указываются как отрицательный баланс, в отличие от транзакции расходов. Однако на Venmo, независимо от того, являемся ли мы плательщиком или получателем, сумма всегда положительна. Чтобы наши цифры расходов оставались точными, мы должны умножить количество случаев, когда нам платят, на -1. Чтобы увидеть код, обратитесь к строке 21 в parse_venmo.py выше.

Разбор сообщений с форматом = ‘raw’

Когда наша информация отсутствует в значении ключа 'snippet', нам нужны полные данные сообщения электронной почты, извлеченные с использованием формата 'raw'. Поскольку строка, возвращаемая этим форматом, является строкой base64url, ее необходимо декодировать, прежде чем она сможет быть прочитанным (строка 9). После декодирования нужная нам информация может быть извлечена таким же образом, как и информация о продавце в фрагменте метаданных - путем анализа строки на основе расположения ключевых слов.

Когда данных, которые вы хотите проанализировать, нет в электронном письме

Иногда жизнь ставит вас в тупик. В других случаях это делает Barclays. Электронные письма, которые отправляет Barclays, содержат только дату и сумму транзакции - без продавца. На самом деле мы ничего не можем с этим поделать, и мы можем захотеть получать информацию прямо с веб-сайта банка, используя такие инструменты, как Selenium and Beautiful Soup.

Отправка в Google Таблицы

Google Таблицы предоставляют доступную основу для создания достойного бюджетного интерфейса, пример которого приведен выше. Мы можем использовать API Google Sheets через pygsheets, чтобы отправлять всю информацию о транзакциях на лист в нашем файле бюджета. Приведенный ниже метод взят из сообщения Эрика Руда здесь. После классификации наших транзакций вручную в столбце Таблиц мы можем рассчитать общую сумму по каждой категории расходов с помощью формулы сумма, если.

Выполнение

Для упрощения выполнения мы можем добавить все вышеперечисленные функции к main функции, которая запускает весь процесс агрегации транзакций в соответствии с нашим выбором финансового учреждения (включая выбор «все»).

Заключение

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

Полный код можно найти на моем Github здесь. Я буду рад помочь, если вы хотите создать свой собственный инструмент для составления бюджета - напишите мне по адресу [email protected].