ないんのブログ

気になったネタをつぶやきます

家計管理のためのLINEボットを作った話

はじめに

我が家は共働きですので、僕と奥さんがそれぞれ毎月末に一定額ずつ家に入れるという運用をしています。 家に入れる際にその月に支払った家計費分を差し引いて共有の銀行口座に入金。 家計費予算以外の部分は各自好きに貯金したり買い物したりしています。

例えば手取りが20万で家計費枠が15万とすると、毎月5万が各自好きに使える金額、その月に8万の家計費支出があったとすると7万を銀行に入れるという感じです。

共働きだと似たような運用をしているご家庭も多いのではないでしょうか?
この運用を確立するまで色々と試行錯誤があったので共有したいと思います。

前半部分はつまらないので飛ばして貰って大丈夫です。

月毎の精算はキャッシュレスと相性が悪い

最近は様々なキャッシュレス施策やポイント施策があるため、複数枚のクレカや色々なPay系サービスを使っています。僕はメインはANAカード、携帯用にdカード、キャッシュレスにLINE Pay、また最近にはJCBやVISAの還元キャンペーンがあったのでさらに数枚のカードを使っています。奥さんはAmazonユーザーなのでAmazonカードのヘビーユーザーです。

これだけたくさんの支払い手段があると家計費の計算も一苦労です。
家計簿アプリを使えばほとんどの支出管理を集約できるので良いのですが、この時に問題になるのがクレジットカードです。クレジットカードは実際に使ってから明細への反映や引き落としまで結構なタイムラグがあるので「毎月の家計費」をどのように定義するのか考える必要があります。

f:id:osanine:20200521190217p:plain
支払い方法と反映タイミング

大きく分けて下記3パターンぐらい検討しました。

パターンA(利用日に計上)

上図の一番左の利用日を基準に計上する方法です。一番直感的です。一般的なご家庭の家計簿や家計簿アプリでも普通は利用日で計上していますよね。ただクレジットカードだとカード明細や家計簿アプリの反映までに月をまたいでしまう可能性があるので、月毎に家計費精算をする場合は別途管理する必要が出てきてしまいます。 そこまで細かく管理出来るほどマメでも無いのでNG。

パターンB(引き落とし日に計上)

上図の一番右の引き落とし日を基準に計上する方法です。一番簡単です。現金・カード含めて自分の手元からお金が減るタイミングで計上すれば、クレカの締め日や反映のタイミング等の問題が無くなります。 しかし問題点は、利用してから引き落としまでのタイムラグです。上図の通り利用タイミングによっては実際の引き落としが約2か月後になります。特にネットショッピングのヘビーユーザーはAmazon.co.jpが並ぶ明細を見ても2か月前に何に使ったか思い出せないのではないでしょうか。あと最近は支払い手段が多すぎて全ての確認も労力がかかります。 しかもこの方法では家計簿アプリの支援を得られないという問題点もあります。家計簿アプリの管理単位とクレカの明細単位がリンクしていないため、家計簿上のどの支払いがいつ引き落としになるかが分かりません。

なのでこちらもNG。

パターンC(Web明細への反映時に計上)

A・Bの問題点を踏まえて個人的に着目したのがこの方法です。上図の反映日を基準に計上します。 Web明細への反映タイミングならパターンAの月またぎ問題はありませんし、パターンBのように時間が経ちすぎて忘れているという心配も少ないです。 ただし最大の問題点が、明細反映のタイミングをリアルタイムで把握する方法が無い事です。手作業で明細のアップデート部分だけ抽出するなんて困難ですし、家計簿アプリでもこの部分にフォーカスしているアプリは無さそうでした。

そこで新着情報をうまく管理できるよう自分でプログラムを書いて技術的ハードルをクリア出来れば最高のエクスペリエンスを得られるのではないかと思い立ったのが3年前です。試作品を作って3年ほど運用してきましたが奥さんからの評判も良く、色々と改良を重ねて良い感じになったので情報共有したいと思います。

(本題) 家計管理のためのLINEボットを作ってみた

どうでも良い考察は終わってここからLINE Botのお話です。 LINE Botそのものの作り方は割愛します。

今回作ったボットの全体構想はこんな感じです。

f:id:osanine:20200521190336p:plain
全体構想

大きく分けて下記4パートに分かれています。

  • 支出情報の取得
  • 家計費の分類
  • 月末の精算
  • 家計支出の可視化

それぞれのパートについて説明します。

支出情報の取得

今回は家計簿サービスの僕と奥さんそれぞれのアカウントを定期的にスクレイピングしてレコードの差分を抽出するという方法を用いました。これなら支払い手段が増えても家計簿サービスに口座を登録するだけなので楽です。本当はAPIで抽出出来れば良いのですが個人向けにAPIを提供しているサービスはZaimだけで、ZaimもAPI経由だとクレジットカードの履歴は取得出来ないようでした(手動で登録したもののみしか取れない)。せめてプレミアムだけでもAPI経由の取得に対応してくれたらいいのに。。

スクレイピングはFirebase Functions (以前はAWS Lambda)の上で動かしています。Firebase FunctionsならPuppeteerが使えるので、割と複雑めなスクレイピングでも対応出来ます。詳細は割愛。

この辺の仕組みせいでソースコード公開しづらいのがつらいところです。(クローラー部分を取り除いたバージョンはいずれ公開しようかと思っています)

家計費の分類

スクレイピングして新規に登録された支出情報は、LINE Messaging APIを使って家計費として算出するかどうか各自に確認します。LINEでポチポチするだけで分類出来るので奥さんにも好評です(bot名は不評)。

そもそも僕自身がかなりズボラなのでこのぐらい簡単な仕組みじゃないと続かないんですよね。 家計簿アプリも最初こそ頑張って分類したりしていましたが3日で開かなくなりました。 目につくところに少量の情報をプッシュしていくというのは割と色々な所で使えるテクニックだと思います。

f:id:osanine:20200521192914p:plain:w300
確認画面
(最近Flex Messageに対応して良い感じの見た目になりました)

分類カテゴリは試行錯誤の結果下記4パターンに落ち着きました。あんまり多くても面倒なので家計費として管理するだけならこれで十分。食費とかのカテゴリ情報も一応家計簿サービスから取ってきてはいるので、必要になればそちらで分類すれば良いかなという感じです。

  • 生活経費 … 家賃・光熱費・食費等定常的に発生するもの
  • 特別費 … 旅行や家電等定常的ではない大型出費
  • 個人支出 … 家計費に算出しないもの全般
  • その他 … 立て替えとかその他全般

月末の精算

月末に月締め処理が走って集計結果が表示されます。
生活費枠から家計費支出を差し引いた分を各人が共用口座に入金します。本当は入金も自動化したいんですけどね。 月締め処理の時点で分類していなかったレコードは翌月分として精算されます。精算漏れの無い安心設計です。

f:id:osanine:20200521190641p:plain:w300
集計結果
(これは月の途中結果なので少なめです)

ちなみに僕はメインバンクがUFJ銀行(旧三和銀行)で共用口座(自分名義)がSBIネット銀行、奥さんのメインバンクはSBIネット銀行です。SBIネット銀行同士だとMoneyTapというアプリで手数料無料で簡単に送金出来て便利です。UFJからSBIへの入金も証券口座を経由すれば3日ほどかかるものの手数料がかからず良い感じです。

家計支出の可視化

最初は家計費レコードはZaimにAPIで登録していたんですけどズボラすぎて3年間一回も見に行っていない事に気付いてLINEアプリ内で確認出来るようにしてみました。リッチメニューとLIFF (LINE Front-end Framework)を使って実現しています。

f:id:osanine:20200521190813p:plain:w300
メニュー(一部は実装途中)

リッチメニューで家計簿を開くを選択するとLINE内でブラウザが立ち上がって内容を確認出来ます。LIFFを使うとログイン無しでユーザー情報を取得出来るので便利。サイト部分は普通のReactです。

f:id:osanine:20200521190921p:plain:w300f:id:osanine:20200521190947p:plain:w300
家計簿(内容はフィクションです)

個人支出は本人分のみ、家計費は家族分が確認出来る仕組みです。プリコネやエッチなサイトに課金したとしても家計費にしなければバレません。

共有する内容が選べるような家計簿アプリってありそうで無い。まあ↑の家計費選択のフローが無ければ分類難しそうだしなあ。

終わりに

気合で全部自分で作ったけど、共働きとかズボラーにフォーカスした家計簿アプリあると良いなあと思いました。もし良いサービスとかアイデアとかあればこっそり教えてく下さい!

botソースコードは少し整理して公開しようと思います。

おまけ

f:id:osanine:20200521204402j:plain:w300
かしこい幼女