zaimAPIで作ったアプリをlambdaで動かした話
こんばんは、かささぎです。
最近家計簿アプリとしてzaimを使ってます。
https://zaim.net/
カテゴリの分類や予算の設定などができ、収入・支出などを見える化できます。
UIがシンプルで使いやすかったり、撮影したレシートを自動で登録してくれる機能があったりと、なかなか気に入っています。(課金もしました)
そしてもう一つ、zaimにはWeb APIが提供されているというメリットがあります。
レシートのCRUDの機能が備わっているため、各々が思うような家計簿を作ることができます(エンジニアなら)。
今回はzaim appをpythonで作成し、AWS lambdaのラムダ関数として登録して定期実行させることにしました。
順を追って説明していきます。
作るアプリ
今回はzaim appのHello world として、外税を内税に変換する簡単なアプリを作りました。
zaimでレシートを記録していて気づいたのですが、レシートには内税で計算されているものと外税で計算されているものの二つが存在します。
zaimでは収支をカテゴリに分けて記録しているので、外税だと扱いが大変です。
例えば以下の例
商品1 | 1000円 | カテゴリA |
商品2 | 4000円 | カテゴリB |
外税 | 400円 | カテゴリ? |
合計 | 5400円 |
このようなレシートは正確には以下のように外税を分割して登録すべきです。
商品1 | 1080円 | カテゴリA |
商品2 | 4320円 | カテゴリB |
合計 | 5400円 |
あるいは
商品1 | 1000円 | カテゴリA |
商品2 | 4000円 | カテゴリB |
外税1 | 80円 | カテゴリA |
外税2 | 320円 | カテゴリB |
合計 | 5400円 |
しかしこれを手動で登録するのは面倒です。
そこで外税カテゴリに登録した外税を自動的に内税に変換させるappを作ることにしました。
zaim api
zaim apiを使うにはZaim Developers Centerからアプリの登録を行います。
https://dev.zaim.net/
今回はクライアントアプリで作りました。
アクセスレベルには全チェックを入れました。
登録するとIDとシークレット、そして各種URLが発行されます。
情報は全部英語ですが、わかりやすいつくりをしているのでなんとかなりました。
アクセストークンの取得
以下のページを参考にさせていただきました。
https://qiita.com/kosystem/items/7728e57c70fa2fbfe47c
access token と access token secretが発行されます。
これらのパラメータは.envファイルに記述します。
Main.py
メインの処理はこのファイルです。
まずoauth認証を行います。
処理は「昨日の登録データ」に対して行います。
日付をパラメータとしたget_dict_data関数でGETメソッドを用い辞書データとして取得します。
convert_receipt_dict関数では扱いやすいデータに変換してます。
receipt_dictには複数のレシートのリストが格納されます。
それらからfor文で一つずつ取り出して処理していきます。
get_amounts関数ではレシート内のそれぞれの商品の課税対象額と外税の額を取得します。
外税カテゴリにデータがない場合はoutside_taxが0となるので、ここでcontinueします。
そしてこの値をもとにcalc_addition関数で加算額を決定します。
調整前後で金額に差が出ないようにいろいろ処理してます。
その後create_update_receipt関数で新しいレシートデータを作り、update_data関数で登録しています。
u["amount"]が負なら金額が負の外税処理を省いたデータなので処理を行いません。
0のデータは外税の金額を入れていたデータなので、DELETEします。
正のデータは新しい金額にUPDATEします。
実行結果
こんな感じになります。
変更前↓
変更後(プログラム実行後)↓
AWS lambdaでの実行
AWS lambdaはAWSのサービスの一つで、サーバレスなコンピューティングサービスです。(カタカナ語を使えばいいと思ってる)
簡単に言えば必要な時だけサーバが立ち上がって、アプリケーションなどを実行できるサービスです。
AWS lambdaの操作については省略します。
コードはlambda_function.pyを作成し、lambda_handler(event,context)関数からmain関数を呼び出します。
注意しなければならないのは、zipファイルにする際に外部モジュールを読み込ませる必要があることです。
参考↓
https://hacknote.jp/archives/48083/
以下のコマンドで読み込ませることができます。
pip install --target <library> <path> |
追加したフォルダは.gitignoreに追加して、gitによる管理から外します。
1.5MB程度のzipファイルの保存に1分近くかかったんですが、なぜでしょうかね?
いくら回線が遅いとはいえさすがに…って感じです。
10MB以上はS3を推奨、とあるように、なんらかのチェックなどがあってzipファイルでのアップロードは時間がかかるのかもしれませんね。