LINEにレシートを送るだけで経費管理できるBotを Claude APIで作った
LINEにレシートを送るだけで経費管理できるBotを Claude APIで作った
旅行やちょっとした買い物のログを書くのが面倒だったのでつくってみることにした。
財布の奥から出てくるくしゃくしゃのレシート。コンビニのレシート、交通費の領収書、外食の明細。領収書無しの小売店。これをひとつひとつ家計簿に手打ちしていく時間が、面倒だっった。
金額は? 取引先は? 勘定科目は何にする?
作ったもの
LINEにレシートの写真を送ると、Claude AIが内容を読み取って自動で経費登録してくれるBotだ。
日付・金額・取引先・勘定科目を画像から抽出してSupabaseに保存。月次集計、年次集計、CSV出力まで、すべてLINEのトーク画面から操作できる。
レシートを受け取った場所で、その場でスマホのカメラを向けるだけ。
技術スタックの選定
フレームワークはNext.js(App Router)、ホスティングはVercel、データベースはSupabase、AIはAnthropic Claude API、メッセージングはLINE Messaging API。
Vercelを選んだのは、LINEのWebhookが届いてから返信するまでの処理をServerless Functionsで完結させたかったからだ。常時起動のサーバーを立てる必要がない。
ただ、画像解析には少し時間がかかる。LINEのWebhookにはタイムアウトがある。
この問題を解決するために waitUntil() を使った。Webhookを受け取ったら即座に「解析中…」と返信し、画像の解析とDB保存をバックグラウンドで処理。完了したら pushMessage で結果を送る。ユーザー体験を損なわずに非同期処理を実現できた。
アーキテクチャの全体像
LINEユーザー
│ レシート画像を送信
▼
LINE Messaging API
│ Webhook POST
▼
Vercel(Next.js App Router)
POST /api/webhook
├─ 署名検証(HMAC-SHA256)
├─ [画像] → waitUntil()
│ └─ Claude Vision で抽出
│ └─ Supabase に保存
│ └─ pushMessage で結果返信
├─ [CSVファイル] → waitUntil()
│ └─ Claude API で勘定科目分類
│ └─ 重複チェック後 一括保存
└─ [テキスト]
├─ 月次/年次集計 → 返信
└─ 明細リスト生成 → 返信
LINEから届くメッセージの種類(画像・CSV・テキスト)によって処理が分岐する。署名検証はHMAC-SHA256で行い、不正なリクエストを弾く。
Claude Visionで何が取れるか
一番気になるのが、AIの読み取り精度だろう。
Claude Vision(claude-sonnet-4-6)に領収書の画像を渡すと、日付・金額・取引先・勘定科目を構造化されたJSONで返してくれる。
手書きのレシートは少し苦手だが、印字されたコンビニのレシートや飲食店の領収書は精度が高い。消費税の内訳まで読み取ってくれることもある。
重複登録を防ぐために、同じ日付・金額・取引先の組み合わせが既にDBにある場合はスキップする処理も入れた。うっかり同じレシートを2回送っても大丈夫だ。
CSVの一括インポートにも対応した
過去の経費データをまとめてインポートしたいケースもある。
CSVファイルをLINEに送ると、Claude APIが各行の内容を読んで勘定科目を自動分類してくれる。「交通費」「接待交際費」「消耗品費」など、勘定科目の判断をAIに任せられるのが便利だ。
自分で分類するより正確なこともある。
LINEのリッチメニューで操作を簡略化
テキストコマンドを覚えるのは面倒なので、6ボタンのリッチメニューを作った。
┌──────────────────┬──────────────────┐
│ 📊 今月の経費 │ 📅 先月の経費 │
│ まとめて │ まとめて │
├──────────────────┼──────────────────┤
│ 📄 今月の経費 │ 📋 先月の経費 │
│ をCSVで │ をCSVで │
├──────────────────┼──────────────────┤
│ 📖 使い方 │ 💹 今年の │
│ │ 経費合計 │
└──────────────────┴──────────────────┘
月次集計を出したいときはボタンをタップするだけ。科目別の合計とともに明細がテキストで返ってくる。
CSV出力に対応しているので、Excelや会計ソフトへの貼り付けもそのままできる。
Supabaseのスキーマ
データベースはシンプルにした。
create table keihi_expenses (
id uuid primary key default gen_random_uuid(),
line_user_id text not null,
date date not null,
amount integer not null,
vendor text not null,
category text not null,
memo text,
created_at timestamptz default now()
);
line_user_id でユーザーを識別するので、複数人で使い回せる構造にもなっている。家族や小規模チームで共有することもできる。
使ってみての感触
レシートをもらったその場でLINEに送るようになった。財布にレシートをためなくなった。
月末に「あのレシートどこいった?」と焦ることがなくなった。会計ソフトへの転記作業は楽だと思う。
ソースコードはGitHubに公開している。Next.js・Supabase・LINE Messaging APIを使っているので、セットアップはnpm installからVercelにデプロイするまで30分もあれば動く。