“LoginFailure: Improper token has been passed” / TOKEN_INVALID
意味: ログインに使用しているトークンをライブラリが拒否しています(discord.js はLoginFailure/「An invalid token was provided」を投げ、他のスタックでは 401 の TOKEN_INVALID が返されます)。
発生理由:
- Discord Developer Portal でトークンが再生成または失効しました。新しいトークンを生成すると、それが使われているすべての場所で古いトークンが即座に無効になります。
- トークンの文字列に、誤ってコピーされた余分なスペースや引用符が含まれています。
- コードが誤った環境変数を読み込んでいます。
- Developer Portal → アプリケーション → Bot → Reset Token に移動します。
- Square Cloud ダッシュボードのこのアプリケーションの環境変数でトークンを更新します。トークンを
.zipにアップロードされるファイルにコミットしないでください。 - 値の前後に余分なスペースや引用符がないか再確認します。
- ライブラリを更新します(
discord.js@latestまたはpip install -U discord.py)。 - アプリケーションを再起動します。
“Used disallowed intents” / Message Content Intent
意味: ボットはログインしてオンラインに見えるものの、すべてのメッセージを無視するか、ゲートウェイが「used disallowed intents」で接続を拒否します。 発生理由: 2022 年以降、Message Content は特権インテントです。両方の場所で明示的に有効化されていないと、メッセージ内容が空で届くか(あるいはコードがアプリで有効化されていないインテントを宣言している場合はゲートウェイ接続自体が拒否されます)。 両方の場所での修正方法:- Discord Developer Portal → アプリケーション → Bot → Privileged Gateway Intents → Message Content Intent を有効化します。
- コード側でも宣言します。
- アプリケーションを再起動します。
ボットが 100 サーバーを超えると、Message Content を含む特権インテントには、同じ Developer Portal のページから申請する Discord の承認も必要になります。
Lavalink connection closed with code 1006
意味: ボットの Lavalink クライアントが WebSocket を異常終了(コード 1006)で閉じます。多くの場合、その直前に「Unexpected server response: 400」が出ています。 発生理由: これはバージョンの不一致です。Lavalink v4 は REST ベースであり、v3 向けに構築されたクライアントラッパーとは互換性がないため、ハンドシェイクが失敗しソケットが 1006 で閉じます。 修正方法:- ボットの Lavalink クライアントラッパーのバージョンを Lavalink サーバーのメジャーバージョンに合わせます(v3 クライアントには v3 サーバー、v4 クライアントには v4 サーバー)。
- Square Cloud 上では、Lavalink サーバー自体はポート
80をバインドしますが、ボットはエッジを通してポート443にsecure: trueで接続する必要があります。 - バージョンの不一致を修正した後、Lavalink アプリケーションとボットアプリケーションの両方を再起動します。
ローカルでは動くのに、デプロイ後ボットがオフラインになる
意味: ローカル環境でボットを実行するとログインは問題ないのに、デプロイ後にオフラインになる(または繰り返し再起動する)。 よくある発生理由:- ゲートウェイレベルでの接続が不安定で、再接続処理がない。
- ローカルでテストした依存関係のバージョンと、依存関係ファイルに記載されているバージョンが競合または非互換になっている。
- レート制限への過度なアクセスによる Discord API の悪用トリガー(この場合、アカウントに通知メールが届きます)。
- まずダッシュボードでアプリケーションのログを確認してください。実際のクラッシュ原因が示されます。
- 一時的なエラーでプロセスがクラッシュしないよう、エラーハンドラを追加します。discord.js では
process.on("unhandledRejection", ...)とclient.on("error", ...)、discord.py では同等の処理を行います。 - Square Cloud は、直前の稼働時間が 60 秒を超えていて、終了ステータスが 1 であり、過去 60 分以内に自動再起動していない場合に、クラッシュしたアプリを自動再起動します(マニフェストの
AUTORESTART)。これにより一時的なエラーを乗り越えてボットを稼働させ続けられますが、根本的なコードのエラー、構文エラー、依存関係の欠落は修正されないため、コード側での修正が必要です。 - Discord API のレート制限(429)に注意してください。グローバル制限はボットトークンあたり概ね 50 リクエスト/秒で、ルートごとにさらに厳しい制限があります(チャンネルの作成/編集はチャンネルあたり 10 分でおよそ 2 回まで)。積極的にキャッシュし、
X-RateLimit-Remaining/X-RateLimit-Reset-Afterヘッダーを尊重する非同期キューを使い、大量送信には Webhook を使用してください。

