Discord

Discordステータス自動更新ボットの作り方とデプロイ手順(2026年最新版)

ⓘ本ページはプロモーションが含まれています

Contents

スポンサードリンク

1️⃣ アプリ作成と Bot トークン取得(2026 年版)

手順概要

手順 操作内容
https://discord.com/developers に管理者アカウントでログイン
左サイドバー ApplicationsNew Application をクリック
名前を入力し Create
アプリ詳細画面左メニューの Bot タブへ移動
Add Bot → デフォルトで PUBLIC BOT が有効になる
TOKEN セクションで Copy(※一度だけ表示)

トークン取得時の注意点

  1. 「一度だけ」表示されることを忘れない
  2. 表示された瞬間に .env ファイルやシークレットマネージャーへ保存してください。画面上で再表示はできません。
  3. 漏洩防止策
  4. 公開リポジトリに絶対にコミットしない(.gitignore に必ず .env を追加)。
  5. 何らかの形でトークンが流出したら、Developer Portal の Bot ページから Regenerate ボタンで即座に再生成できます。
  6. 再生成後は全てのデプロイ環境(Docker・CI/CD シークレット)を同時に更新してください。
  7. 安全な保管先例
  8. ローカル:.envdotenv でロード
  9. CI/CD:GitHub Actions の Secrets, Railway/Fly.io の Environment Variables
  10. クラウド:AWS Secrets Manager、GCP Secret Manager、Azure Key Vault 等

Privileged Gateway Intents の有効化

Intent 説明
PRESENCE INTENT client.user.setPresence が機能するために必須
SERVER MEMBERS INTENT メンバー情報取得が必要な場合にだけチェック

⚠️ 公式ドキュメント確認:Intents の有効化は Developer Portal 上で行い、Bot 起動時の GatewayIntentBits と合わせて必ず設定してください。


2️⃣ 開発環境構築(Node.js v20・discord.js v14)

必要ソフトウェア

ソフト 推奨バージョン
Node.js v20 LTS(2026 年時点)
npm 10.x 系
discord.js v14(最新の API スキーマに対応)

プロジェクト初期化

開発時にだけ必要な依存関係

パッケージ 用途
eslint コード品質チェック
prettier フォーマット自動化
jest テスト実装

Docker で開発する場合は、マルチステージビルドを利用し npm ci(devDependencies 含む)を最初のステージで走らせ、最終イメージでは --production フラグに切り替えるとサイズが小さくなります。

VS Code 推奨設定

.env の例


3️⃣ ステータス設定と最新 Activity 仕様

2026 年時点の公式 APIhttps://discord.com/developers/docs/topics/gateway#activity-object

setPresence の基本構文(変更なし)

Activity Type と必須フィールド(2026 年版)

タイプ ActivityType 必要/推奨フィールド
Playing ActivityType.Playing { name: 'ゲーム名' }
Watching ActivityType.Watching { name: 'イベント' }
Listening ActivityType.Listening { name: '音楽名' }
Competing ActivityType.Competing { name: '大会名' }
Streaming ActivityType.Streaming { name: '', url: 'https://twitch.tv/...' }
Custom ActivityType.Custom 必須 type, name(空文字列可), state, emoji(任意)

Custom アクティビティの正確な JSON 例

注意custom_id フィールドは Interaction オブジェクト(ボタンや選択メニュー)で使用され、Activity ペイロードには含まれません。過去の情報に混同しないようご留意ください。


4️⃣ 動的ステータス更新ロジックとレートリミット回避策

① レートリミットの実際の上限(公式確認)

  • Gateway 経由での Presence 更新は「5 回 / 20 秒」が上限です。
  • 1 分間に最大 15 回という解釈は誤りです。(PATCH /users/@me/settings のレートリミットと混同しやすいため、実装時は公式ドキュメントの Presence Update Rate Limits を必ず参照してください)

② 安全な更新関数(Retry‑After ヘッダー+指数バックオフ併用)

③ 定時実行(cron)例

④ 「非アクティブ → idle」自動遷移を上書きするロジック

client.presenceundefined(Bot ユーザーには presence プロパティが無い)ため、現在のステータスは client.user.presence?.status で取得します。

⑤ レートリミット回避のベストプラクティスまとめ

手法 説明
更新頻度制御 5 回/20 秒 を超えないように cron の間隔を設計
Retry‑After ヘッダー利用 429 応答時はヘッダーの秒数で待機
指数バックオフ retry-after が無い場合でもバックオフで再試行
エラーログ化 winston に JSON 形式で残す → Loki/Grafana で可視化

5️⃣ ノーコードツール Yoom とハイブリッド連携

5‑1 外部リンクの耐久性確保

  • 元リンク:https://lp.yoom.fun/blog-posts/how-to-automatically-update-data-in-discord-bot-25w16
  • 代替策
  • 同内容を公式ドキュメント(GitHub リポジトリの docs/yoom-integration.md)にミラー。
  • 重要情報は Wayback Machine(例: https://web.archive.org/web/20260417000000/https://lp.yoom.fun/...)でバックアップを取得し、記事末尾に Archive URL を記載。

5‑2 Yoom の基本フロー

ステップ 内容
テンプレートインポート Yoom の「Discord ステータス自動更新」テンプレートをコピーし、Webhook URL に Bot 側エンドポイント(例:https://my-bot.example.com/webhook)を設定
データ取得(Salesforce / Google Sheets) 各サービスの OAuth2 認証 → 必要フィールドだけ抽出 → JSON へ変換
Transform(JSON 化) {{field}} を埋め込んだオブジェクト例:{ "type": "Playing", "name": "{{StageName}}" }
Webhook 送信 Yoom が生成した JSON を POST → Bot が受信し safeSetPresence に渡す

5‑3 Bot 側の Webhook エンドポイント例

5‑4 エラーハンドリング(Yoom 側)

  • Retry:最大 3 回、バックオフ間隔 5 秒
  • 通知先:失敗時は Slack または別 Discord チャンネルへ Webhook 通知

ポイント:ノーコード側でのリトライ設定と Bot の safeSetPresence による再試行が二重になることを防ぐため、Yoom 側では 最大 1 回 のリトライに留め、残りは Bot がハンドリングします。


6️⃣ ローカルテスト → 本番デプロイ・運用ベストプラクティス

6‑1 Dockerfile(マルチステージビルド推奨)

  • 開発コンテナdocker compose upnpm run dev(watch モード)を走らせ、--production を外したステージを利用すると便利です。

6‑2 docker-compose.yml(ローカル開発向け)

6‑3 CI/CD(GitHub Actions の例)

6‑4 監視・メトリクス

ツール 用途
winston + Loki/Grafana ログ集約・検索
prom-client + /metrics エンドポイント Prometheus が取得できる数値(アップタイム、エラー回数)
Docker の restart: unless-stopped コンテナクラッシュ時の自動再起動

簡易 /metrics 実装例

6‑5 運用上のチェックリスト

  • [ ] Token ローテーション:最低 90 日ごとに再生成し、CI/CD シークレットを更新
  • [ ] Intents 設定:Developer Portal とコードが一致しているか確認
  • [ ] レートリミットモニタリング:429 発生回数が閾値(例: 5/hour)を超えたらアラート
  • [ ] バックアップ.env、データベース(SQLite の status.db)は定期的に S3 / GCS にコピー

🎉 まとめ

  1. 正確なレートリミットは「5 回/20 秒」→実装時はこの上限を守る。
  2. Custom アクティビティtype, name(空文字), state, emoji が必須で、custom_id は不要。
  3. トークン管理は「一度だけ表示」→すぐ .env かシークレットマネージャーへ保存し、漏洩時は即再生成。
  4. 非アクティブ → idle の上書きclient.user.presence?.status を参照し、5 分ごとに強制 online に戻すロジックを実装。
  5. Dockerはマルチステージで devDependencies と production 依存を分離し、開発時は別ステージで npm ci(dev)を走らせる。
  6. レートリミット回避は指数バックオフだけでなく、429 の Retry-After ヘッダーを必ず利用。
  7. Yoom 連携は外部リンクのアーカイブ化と代替ドキュメントへの誘導を行い、ノーコード側のリトライ回数は最小限に抑える。
  8. 本番デプロイは Docker → CI/CD(GitHub Actions) → Railway/Fly.io のフローで自動化し、winstonprom-client による可観測性を確保。

これらのポイントを踏まえて実装すれば、2026 年でも安定・安全に Discord ステータス自動更新ボットを運用できます。 Happy coding! 🚀

スポンサードリンク

-Discord
-, , , , , , , , ,