ZaimAPIを利用して月々の収支を見える化する

## 目的
家計簿アプリ(Zaim)への入力を自動化することで家計の見える化の労力を削減を目指します。

## 利用サービス・言語
・ZaimAPI(https://dev.zaim.net/home)
家計簿アプリへの入出力を提供しているAPIになります。

OAuth1.0
GoogleAPIとかはOAuth2だった気がする
違いがいまいちわかってないのでいつか記事にできたらと思います。

・Python3(https://docs.python.jp/3/tutorial/index.html)
説明は不要だと思います。

## 準備
・アクセストークンの取得
こちらを参考にさせていただきました。
http://qiita.com/kosystem/items/7728e57c70fa2fbfe47c

・カテゴリIDの取得
入力時、支出のカテゴリIDが必要になります。
今回はあらかじめ取得しておき、辞書型でglobalに置いておきます。
pythonからRestで取得する場合はこちら

```python:get_category.py
def category():
    endpoint = 'https://api.zaim.net/v2/category'
    r = requests.get(endpoint, auth=auth)
    return r.text
```


## コード

```python:Zaim.py
consumer_key = '**************************'
consumer_secret = '**************************'
access_token = '**************************'
access_secret = '**************************'


auth = OAuth1(consumer_key, consumer_secret, access_token, access_secret)

def register_payment(payment_list):
    endpoint = "https://api.zaim.net/v2/home/money/payment"
    company = '備考とかコメントとか'
    for pay in payment_list:
        data = {'mapping': 1, 'category_id': pay['category_id'],
                'genre_id': pay['genre_id'],
                'amount': pay['salary'], 'date': pay['salary_day'],
                'place': company, 'comment': pay['comment']}
        # print(data)

    # 出費を入力
    r = requests.post(endpoint, data=data, auth=auth)
    return r.text


def main():
    # 引き落とし日
    day = '20XX-0X-XX'
    # 出費の一覧
    out = {
            "社会保険":100,
            "生命保険":100,
            "所得税":100,
            "住民税":100,
            "電気代":100,
            "水道代":100,
            "携帯費":100,
            "Wifi費":100,
            "家賃":100
        }

    # 出費科目に対するジャンルとカテゴリの一覧
    spending_list = {
                    '社会保険':{'genre_id':'11301','category_id':'113'},
                    '生命保険':{'genre_id':'11301','category_id':'113'},
                    '所得税':{'genre_id':'11302','category_id':'113'},
                    '住民税':{'genre_id':'11304','category_id':'113'},
                    '電気代':{'genre_id':'10502','category_id':'105'},
                    '水道代':{'genre_id':'10501','category_id':'105'},
                    '家賃':{'genre_id':'10602','category_id':'106'},
                    '携帯費':{'genre_id':'10403','category_id':'104'},
                    'Wifi費':{'genre_id':'10403','category_id':'104'},
                    }
    # 出費科目と金額の取得
    for genre, salary in out.items():
      salary = str(salary)
      # print(genre, salary)
      category_id = spending_list[genre]['category_id']
      genre_id =  spending_list[genre]['genre_id']

      if not salary == '0':
        payment = [{'category_id': category_id, 'salary': salary, 'genre_id':genre_id,
        			'salary_day': day, 'comment': ''}, ]
        register_payment(payment)
```

## 解説
Get、Postはここを参考にさせてもらいました
http://d.hatena.ne.jp/wwwcfe/20120511/python_requests_oauth

開発を行っているSublimeText3上でinput()の入力を受ける方法を知らないのでテキストファイルからの読み込みにしています。
コマンドプロンプトからの実行で毎回手入力をする場合は読み込み部分をinput()に書き換えてください。

POSTは引数Paramsじゃなくてdata


## 課題
Webから見るとデータは即時反映されますがスマホアプリからだと反映が遅いと感じました。
→再ログインを促されるのでログインしなおすと反映されていました。

普段の買い物の記録を入れ忘れると貯金がたまっていっているように見える
→普段の買い物をすべてクレジット・デビッドカードにしてWEB通帳から入出金履歴を抜いてこれば解決する？


参考
http://qiita.com/kosystem/items/7728e57c70fa2fbfe47c