blogs

Zaim APIとPythonを用いて、ZaimのデータをCSV出力する

目的

手順

API 登録

Zaim developers に登録

アプリケーションを登録

アプリケーションを登録する(登録画面)

アプリケーションを登録

認証情報を確認する

  1. 登録済みアプリケーションの一覧から作成したアプリケーションを選択し、詳細表示する 登録済みアプリケーション
  2. 詳細画面のコンシューマ IDコンシューマシークレットを控える 詳細表示

これで API 登録は完了です。 続いて Python でデータを取得するコードを実装します。

コードを実装

トークンを取得

API を呼び出すには先ほど控えた認証情報に加えて、アクセストークンアクセスシークレットが必要なので、それらを取得するコードを実装します。

Zaim のデータを取得・操作する Python パッケージを追加する

pip install pyzaim

トークンを取得するためのコードを追加する

from pyzaim import get_access_token

get_access_token()

トークン取得用コードを実行し、指示に従って認証情報を入力する

  1. コンシューマ ID とコンシューマシークレットを聞かれるので入力
  2. 認証ページの URL が表示されるので、アクセスして許可
  3. 遷移先ページのソースコードから「oauth_verifier」と書いてあるコードをコピーして入力
  4. 問題なければアクセストークンとアクセスシークレットが表示される
% python auth.py
Please input consumer ID : { consumer-key }
Please input consumer secret : { consumer-secret }


Please go here and authorize :  https://auth.zaim.net/users/auth?oauth_token={ oauth-token }
Please input oauth verifier : { oauth-token }


access token : xxxxx
access token secret : xxxxx
oauth verifier : xxxxx,xxxxx

続いて、取得したトークン情報を用いてデータを取得するコードを実装します。

データを取得するコードを追加する

env ファイルに取得したトークン情報を記載する

.envファイルを作成し、取得したトークンを記載します。

CONSUMER_KEY=
CONSUMER_SECRET=
ACCESS_TOKEN=
ACCESS_SECRET=

データを取得するコードを追加する

トークン情報を読み込むconfig.pyとデータを取得するzaim.py、各処理を呼び出すmain.pyを実装します。

# .env ファイルをロードして環境変数へ反映
from dotenv import load_dotenv
load_dotenv()

# 環境変数を参照
import os
CONSUMER_KEY = os.getenv('CONSUMER_KEY')
CONSUMER_SECRET = os.getenv('CONSUMER_SECRET')
ACCESS_TOKEN = os.getenv('ACCESS_TOKEN')
ACCESS_SECRET = os.getenv('ACCESS_SECRET')
import config
from pyzaim import ZaimAPI

def getZaimData():
    """Zaimのデータを取得する
    """

    consumer_key = config.CONSUMER_KEY
    consumer_secret = config.CONSUMER_SECRET
    access_token = config.ACCESS_TOKEN
    access_secret = config.ACCESS_SECRET

    api = ZaimAPI(consumer_key, consumer_secret,
                  access_token, access_secret, 'verifier')
    # データ一覧の取得
    datas = api.get_data()

    # カテゴリ一覧情報
    categories = api.category_itos

    # ジャンル一覧情報を取得
    genres = api.genre_itos

    # 口座一覧情報を取得
    accounts = api.account_itos

    msg = str(len(datas)) + " 件のデータを取得しました"
    print(msg)

    return [datas, categories, genres, accounts]
import zaim

# データ取得
datas, categories, genres, accounts = zaim.getZaimData()

データが取得できましたが、カテゴリや口座等は ID しか記載されていません。 そのため、ID をもとに各種名称を付与する処理を実装します。

ID をもとに、名称を付与する

名称を付与する処理を追記します。

def convertData(datas, categories, genres, accounts):
    """IDをもとに名称を付与する
    """

    for data in datas:

        # カテゴリ名を付与
        categoryId = int(data["category_id"])
        data["category"] = categories[categoryId] if categoryId > 0 else ""

        # 内訳名を付与
        genreId = int(data["genre_id"])
        data["genre"] = genres[genreId] if genreId > 0 else ""

        # 口座名を付与
        fromAccountId = int(data["from_account_id"])
        data["from"] = accounts[fromAccountId] if fromAccountId > 0 else "-"

        toAccountId = int(data["to_account_id"])
        data["to"] = accounts[toAccountId] if toAccountId > 0 else "-"

    return datas
# 種別名を付与する
datas = zaim.convertData(datas, categories, genres, accounts)

続いてカラム名を日本語に変更し、CSV 出力する処理を実装します。

データを出力するコードを追加

カラム名を日本語に変更し、ユーザ ID など不要なデータを除去します。 続いて、整頓されたデータを CSV 出力します。

import csv

def outputCSV(datas):
    """カラム名を日本語に置換し、CSV出力する
    """

    # 種別名を日本語に置換
    for data in datas:
        keys = {
            "date": "日付",
            "mode": "方法",
            "category": "カテゴリ",
            "genre": "カテゴリの内訳",
            "from": "支払元",
            "to": "入金先",
            "name": "品目",
            "comment": "メモ",
            "place": "お店",
            "currency_code": "通貨"
        }
        for k, v in keys.items():
            data[v] = data.pop(k)

        # 入出金
        data["収入"] = data.pop("amount") if data["方法"] == "income" else 0
        data["支出"] = data.pop("amount") if data["方法"] == "payment" else 0
        data["振替"] = data.pop("amount") if data["方法"] == "transfer" else 0

        # 不要なキーを削除
        unUsedKeys = ["id", "user_id", "category_id",
                      "genre_id", "from_account_id", "to_account_id", "active", "created", "receipt_id", "place_uid", "original_money_ids"]
        for key in unUsedKeys:
            if(key in data):
                data.pop(key)

    # ヘッダーを指定
    fieldName = list(keys.values())
    fieldName.extend(['収入', '支出', '振替'])

    # CSV出力
    with open('zaim-backup.csv', 'w', encoding='utf-8') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldName)
        writer.writeheader()
        writer.writerows(datas)
# CSV出力
zaim.outputCSV(datas)

これでコードの実装は完了です。

実装したコードを実行する

ターミナルなどシェルスクリプトが実行できるアプリケーションで、下記コマンドを実行します。

% python main.py

コンソールに取得件数が表示され、zaim-backup.csvというファイルが生成されます。

まとめ

今回実装したコードは下記リポジトリで公開しています。

参考文献