· 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キーを作り、環境変数に入れます。
export HAPI_API_KEY="hapi_live_..."手順3: 1つの告知を、すべての場所へ送る
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)
この呼び出しが一番効くのは、デプロイスクリプトの最後です。リリースが出た瞬間に告知が流れます。
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 で、チャンネルごとに文面を変えられます。
{
"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時に出したいのに、デプロイが終わった時刻になっていませんか。時刻を足します。
{
"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に足ります。