Kasasagi’s memorandum

JavaとかProcessingとか。最近はAtcoderとか。

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/

f:id:yh9092:20190623174128p:plain

今回はクライアントアプリで作りました。
アクセスレベルには全チェックを入れました。

登録するとIDとシークレット、そして各種URLが発行されます。


APIの使い方はREAT APIの項に情報があります。

情報は全部英語ですが、わかりやすいつくりをしているのでなんとかなりました。

アクセストークンの取得

以下のページを参考にさせていただきました。

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します。

実行結果

こんな感じになります。

変更前↓
f:id:yh9092:20190623202422j:plain

変更後(プログラム実行後)↓
f:id:yh9092:20190623202438j:plain

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ファイルでのアップロードは時間がかかるのかもしれませんね。

cron処理

cronにはCloudWatch Managementを利用します。

ルールから、トリガを設定します。

トリガの設定はLinuxのcronとやや違うので注意が必要です。

またリージョンが日本でも、グリニッジ標準時だったりするので、そこにも注意が必要です。

1日1回の定期実行なので、(おそらくzaimを触らない)午前3:00にトリガを設定しました。

実行され、こんな感じのログが残れば成功です。

f:id:yh9092:20190623205044p:plain

しかしトリガ設定ではGMTで、残るログはUTCなのはなんとかなりませんかね。。。

感想

クラウドサービスの利用は初めてでいろいろ苦戦しましたが、何とか動かすことができました。

zaimAPIを活用して、自分が使いやすい家計簿アプリに改造していきたいと思います。


それでは。