todoki

使い方

アプリで発行した URL に HTTP POST するだけです。このページでは payload の書き方と送信例を説明します。

以下の例の $TODOKI_URL は、アプリの URL 一覧からコピーしたあなたの Webhook URLhttps://hook.todoki.dev/hook/<id> 形式)に置き換えてください。URL 末尾の id が秘密鍵の役割を果たすため、URL は公開リポジトリ等に書かず、CI の secret として扱ってください

最小の例

curl -X POST "$TODOKI_URL" \
  -H 'content-type: application/json' \
  -d '{"title":"デプロイ完了","body":"v1.2.3 を本番反映"}'
# => 202 {"ok":true}

JSON を組み立てるのも面倒なら、プレーンテキストを投げるだけでも通知になります(叩くだけモード):

curl -X POST "$TODOKI_URL" -H 'content-type: text/plain' -d 'ビルド終わったよ'

payload フィールド

JSON で送る場合、以下のフィールドが使えます。すべて省略可能です。

フィールド意味
title通知タイトル"ビルド失敗"
body本文"main ブランチ"
priority優先度。high(即時)/ normal / low"high"
click通知タップ時に開く URL"https://example.com/build/123"

適用の優先順位は「payload の明示フィールド > URL に設定したテンプレート > 既定値」です。

タップで URL を開く

curl -X POST "$TODOKI_URL" -H 'content-type: application/json' \
  -d '{"title":"CI 失敗","body":"ログを開く","click":"https://example.com/ci/run/123"}'

緊急度を上げる

curl -X POST "$TODOKI_URL" -H 'content-type: application/json' \
  -d '{"title":"アラート","body":"CPU 90%","priority":"high"}'

URL ごとのテンプレート

送信側のサービスが決まった形の JSON を送ってくる場合(例: {"repo":"...","msg":"..."})、URL 側にテンプレートを設定しておけば、送信側は生の JSON を送るだけで整形された通知になります。テンプレートはアプリの URL 設定から登録します。

# URL に設定したテンプレート: {"title":"{{repo}}","body":"{{msg}}"}

curl -X POST "$TODOKI_URL" -H 'content-type: application/json' \
  -d '{"repo":"todoki/backend","msg":"build passed"}'
# => 通知: タイトル「todoki/backend」 本文「build passed」

{{a.b}} のようなドット記法でネストした値も参照できます。

CI からの利用例

GitHub Actions

# Webhook URL はリポジトリの Secrets に TODOKI_URL として登録しておく
- name: Notify
  if: always()
  run: |
    curl -sf -X POST "${{ secrets.TODOKI_URL }}" \
      -H 'content-type: application/json' \
      -d "{\"title\":\"${{ github.repository }}\",\"body\":\"${{ job.status }}: ${{ github.workflow }}\"}"

シェルスクリプト(長時間処理の完了通知)

./long-running-job.sh; \
curl -X POST "$TODOKI_URL" -H 'content-type: text/plain' \
  -d "job finished: exit=$?"

レスポンス

状況コードbody
受け付けた202{"ok":true}
URL が再発行で失効済み410{"error":"url revoked"}
URL が存在しない404{"error":"url not found"}

セキュリティ上の理由から、応答には配信の詳細(端末への到達結果やミュート状態など)を含めません。202 は「受け付けた」ことを意味します。

URL の管理