Skip to content

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 設定の骨格

  1. Profile(イベント)
    EventPluginAutoNotificationIntercept
  2. App: PayPay
  3. 必要ならタイトル/本文マッチ

  4. Task(アクション)

  5. AutoNotification 変数を参照
  6. Get Location(Timeout 短め、失敗しても続行)
  7. HTTP Request で POST(位置が取れていれば JSON に含める)

Tasker の位置変数は版・設定で名前が違う(例: %LOC緯度,経度、または %LOCN / %LOCACC)。
実装時に実機で変数を確認してから JSON にマッピングする。

実装メモ(アプリ側)

INGEST_BEARER_TOKEN.env に入れると、finance-manager プロセスが 127.0.0.1:8000POST /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 ログ・バックアップ・誤表示。