Android クライアント: Tasker + AutoNotification
関連: データ取込 / Cloudflare
方針
- 正式採用: Tasker + AutoNotification
- 有料(Tasker はおおよそ数百円)だが、自作 NotificationListener よりメンテが軽い
- システムの契約は「authenticated HTTP POST」のみ。Tasker はその実装手段
- 自作 Android アプリは作らない(将来の任意選択肢)
- 位置情報は Tasker 前提: PayPay 等は座標をくれないので、通知受信時に端末 GPS を一緒に送る
責務分担
| アプリ | 責務 | やらないこと |
|---|---|---|
| AutoNotification | 通知の検知。PayPay 等の title/text/app を取得し Tasker に渡す | HTTP 送信、トークン管理、会計判定、位置取得 |
| Tasker | プロファイル実行、その場の位置取得、JSON 組み立て、認証ヘッダ付き HTTP POST | 通知の低レベル監視そのもの |
一言:
- 誰が通知を読むか → AutoNotification
- 誰が位置を取るか → Tasker(通知トリガ直後)
- 誰がサーバへ届けるか → Tasker
連携フロー
PayPay が通知を出す
│
▼
AutoNotification
- アプリ = PayPay などでフィルタ
- タイトル / 本文を取得
- Tasker にイベント渡し
│
▼
Tasker プロファイル
Event: Plugin → AutoNotification → Intercept
│
▼
Tasker タスク
1. 変数確認(%anapp, %antitle, %antext など ※版により名前差あり)
2. Get Location(現在地)→ 緯度・経度・精度・取得時刻
3. JSON 作成(通知 + 位置)
4. HTTP Request
URL: https://ingest.finance.nkjm.dev/ingest/notifications
Headers:
CF-Access-Client-Id
CF-Access-Client-Secret
Authorization: Bearer ...
Body: { source, app, title, text, received_at, location }
│
▼
finance-manager
- raw 通知を保存
- location も支出イベントに紐づけ(取れなければ null)
境界:
[通知の世界] AutoNotification
[自動化の世界] Tasker(位置もここ)
[秘密・送信] Tasker のみ
[サーバ] finance-manager
位置情報の前提
決済アプリからは座標が来ないので、「支払通知が飛んだ瞬間の端末位置」 を購入位置の近似として使う。
| 項目 | 方針 |
|---|---|
| 取得タイミング | AutoNotification イベント直後の Tasker Get Location |
| 必須か | あると嬉しいが必須ではない。タイムアウト・屋内失敗時は location: null で送る |
| 精度 | accuracy_m も送る。粗いときは後で「参考値」扱いにできる |
| 待ち時間 | 数秒で諦め、通知本文の送信を優先(位置待ちで落とさない) |
| 権限 | Android の位置情報(可能なら「正確な位置」)を Tasker に許可 |
| 電池 | 常時トラッキングはしない。通知のときだけ取る |
| プライバシー | 自宅サーバの PostgreSQL に保存。Git / Discord に座標を出さない |
位置は近似値
- 通知が遅延すると「支払った店」から離れた位置になることがある
- 電車・地下街は取れない/粗いことがある → null や大きな
accuracy_mを許容 - Discord 手動入力経路は位置なし(または後から任意)。自動経路だけ Tasker 位置が本線
Tasker 設定の骨格
- Profile(イベント)
Event→Plugin→AutoNotification→Intercept - App: PayPay
-
必要ならタイトル/本文マッチ
-
Task(アクション)
- AutoNotification 変数を参照
Get Location(Timeout 短め、失敗しても続行)HTTP Requestで POST(位置が取れていれば JSON に含める)
Tasker の位置変数は版・設定で名前が違う(例: %LOC が 緯度,経度、または %LOCN / %LOCACC)。
実装時に実機で変数を確認してから JSON にマッピングする。
実装メモ(アプリ側)
INGEST_BEARER_TOKEN を .env に入れると、finance-manager プロセスが
127.0.0.1:8000 で POST /ingest/notifications を待つ。
成功時は支出保存+ Discord チャンネルへ残り返信(手動経路と同じ footer)。
Tunnel / Access / Tasker のインフラ手順はこの文書と Cloudflare を参照。
{
"source": "android_notification",
"app": "PayPay",
"title": "...",
"text": "...",
"received_at": "2026-08-08T01:55:00+09:00",
"location": {
"lat": 35.681236,
"lng": 139.767125,
"accuracy_m": 18.5,
"captured_at": "2026-08-08T01:55:01+09:00"
}
}
位置が取れなかったとき:
{
"source": "android_notification",
"app": "PayPay",
"title": "...",
"text": "...",
"received_at": "2026-08-08T01:55:00+09:00",
"location": null
}
サーバ側の保存イメージ(ingest 実装時):
expenses(または raw 通知テーブル)にlat/lng/location_accuracy_m/location_captured_atを持たせる- 位置なしでも支出としては保存する
認証ヘッダ(Tasker HTTP Request)
CF-Access-Client-Id: <Access Service Token の Client ID>
CF-Access-Client-Secret: <Access Service Token の Client Secret>
Authorization: Bearer <アプリ側の共有トークン>
詳細な Cloudflare 側手順は Cloudflare。
秘密情報の扱い
- Access / Bearer は Tasker の ローカル変数 に置く
- AutoNotification にはトークンを渡さない(通知本文の取得だけ)
- HTTP デバッグログにヘッダを出さない
- タスクのエクスポート / クラウドバックアップに秘密を載せない
- Git / Discord / メモに実トークンを書かない
- 端末紛失時は Access Service Token と Bearer を両方ローテーション
トークンを AutoNotification に渡さない
AutoNotification 経由でトークンが漏れる設計にはしない。 注意すべきは Tasker の HTTP ログ・バックアップ・誤表示。