ブログ

· 1分で読めます

1回のAPI呼び出しで、Discord・Slack・Telegramに告知を送る

リリースノートや告知を、Discord、Slack、Telegramのチャンネルへアプリから一斉に送れます。RESTは1回。登録する開発者アプリはありません。

コミュニティは3か所にいます。Discordサーバー、Slackワークスペース、Telegramチャンネルです。リリースのたびに、誰かが同じ告知を3つへ手で貼っています。遅れることが多く、1か所だけ抜け、書式もなかなか揃いません。

自前で自動化するなら、連携は3種類です。

  • Discord は、チャンネルWebhookへJSONを送ります。画像はembedで、文字数は2,000までです。
  • Slack は、Incoming WebhookのURLへ、別の形のペイロードを求めます。
  • Telegram は、BotトークンとチャットIDが必要で、テキスト、写真、動画、アルバムでメソッドが違います。

このガイドでは、Hapiを使い、同じ告知を1回のリクエストで3つすべてに送る方法を説明します。3つとも開発者アプリもプラットフォーム審査も不要なので、10分ほどで本番に出せます。

手順1: 各プラットフォームから認証情報を取る

Discord: サーバーを開き、Server Settings → Integrations → Webhooks → New Webhook へ進みます。チャンネル(たとえば #announcements)を選び、Copy Webhook URL をクリックします。

Slack: ワークスペースのIncoming Webhookを作り、投稿先のチャンネル(たとえば #launches)を選びます。https://hooks.slack.com/services/ で始まるURLをコピーします。

Telegram: @BotFather に /newbot を送り、Botトークンをコピーします。Botをチャンネルに 管理者として 追加します。チャットIDは、チャンネルの @username です。非公開チャンネルなら数値のIDです。

手順2: Hapiで連携する

Hapiのアカウントを無料で作成し、Accounts → Connect を開いて、それぞれの認証情報を貼り付けます。Hapiは保存前に、Webhook URLが本物のDiscordまたはSlackのWebhookかを確認します。Webhook URLとBotトークンは保存時に暗号化され(AES-256-GCM)、ブラウザへは返さないので、ダッシュボードからチームの誰かがコピーして持ち出すことはできません。

続いて API keys でAPIキーを作り、環境変数に入れます。

bash
export HAPI_API_KEY="hapi_live_..."

手順3: 1つの告知を、すべての場所へ送る

bash
curl -X POST https://hapi.tools/v1/posts \
  -H "Authorization: Bearer $HAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: release-2-4-0" \
  -d '{
    "content": "v2.4 is out 🎉 Dark mode, CSV export and 3x faster search. Full notes: https://example.com/changelog",
    "platforms": ["discord", "slack", "telegram"],
    "mediaUrls": ["https://example.com/v2.4-banner.png"]
  }'

返ってくるのは 201 と、チャンネルごとの結果です。Discord、Slack、Telegramのどれに届いたか、すぐに分かります。

リリースのパイプラインから(Node.js)

この呼び出しが一番効くのは、デプロイスクリプトの最後です。リリースが出た瞬間に告知が流れます。

js
await fetch("https://hapi.tools/v1/posts", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.HAPI_API_KEY}`,
    "Content-Type": "application/json",
    // Same key on a retried deploy = no duplicate announcement.
    "Idempotency-Key": `release-${process.env.RELEASE_VERSION}`,
  },
  body: JSON.stringify({
    content: `${process.env.RELEASE_VERSION} is live 🚀 ${process.env.RELEASE_NOTES_URL}`,
    platforms: ["discord", "slack", "telegram"],
  }),
});

ここで Idempotency-Key が効きます。CIのジョブは再実行されます。これがないと、不安定なデプロイが同じリリースを3回告知しかねません。

手順4: チャンネルごとに文面を変える

Slackは顧客向け、Telegramはより広いコミュニティ向け、ということがあります。同じリクエストの platformOptions で、チャンネルごとに文面を変えられます。

json
{
  "content": "v2.4 is out 🎉 Dark mode, CSV export and 3x faster search.",
  "platforms": ["discord", "slack", "telegram"],
  "platformOptions": {
    "slack": { "content": "v2.4 is live for all workspaces. Dark mode, CSV export and faster search. Questions? Reply in this thread." },
    "telegram": { "content": "v2.4 is out 🎉 Dark mode, CSV export, 3x faster search. Changelog: https://example.com/changelog" }
  }
}

Hapiはリクエストを受け付ける前に、各版をそのプラットフォームの制限と照合します。Discordの文面が2,000文字を超えていれば、リリースのあとではなく、今分かります。

手順5: 出す時刻を合わせる

ユーザーのタイムゾーンで午前9時に出したいのに、デプロイが終わった時刻になっていませんか。時刻を足します。

json
{
  "content": "Launch day 🚀 v3.0 is here.",
  "platforms": ["discord", "slack", "telegram"],
  "scheduledAt": "2026-11-20T09:00:00-05:00",
  "timezone": "America/New_York"
}

この3つのプラットフォームは、WebhookやBotでメッセージをあとから送る予約ができません。Hapiが投稿を預かり、時刻どおりに送り、チャンネルごとの結果を署名付きの post.published または post.failed Webhookでアプリへ返します。

知っておくとよいこと

  • 画像: Discordは最大10枚をembedで表示します。Telegramは写真か動画を1つ送るか、複数添付すると最大10件のアルバムになります。メディアを付けるとTelegramのキャプションは1,024文字までなので、画像付きの告知は短くしてください。
  • Telegramの返信: firstComment を付けると、Hapiは告知への返信として投稿します。「ここで話す」「変更履歴の全文」といった追記に向いています。
  • 削除: DiscordとTelegramの投稿は DELETE /v1/posts/{id} で削除できます。SlackのIncoming Webhookはメッセージを削除できないので、Slackの文面は出す前にもう一度見てください。
  • 同じ呼び出しで、ほかのネットワークへ: platforms に "x"、"linkedin"、"bluesky" を足すと、公開の告知も同時に出せます。

飛ばして済んだもの

  • 3種類のペイロード形式と、3組の制限
  • Webhook URLとBotトークンを安全に暗号化して保存すること
  • スケジューラー。これらのプラットフォームは、どれも代わりに予約してくれないからです
  • 重複しないリトライと、チャンネルごとの失敗報告

15日間のトライアルを始める → $5のトライアルは、15日間で連携チャンネル5件と投稿300件です。初日からDiscord、Slack、Telegramに足ります。