“LoginFailure: Improper token has been passed” / TokenInvalid
意味: ボットのログインに使っているトークンを Discord が拒否しました。表示されるメッセージはライブラリによって異なります。- discord.py:
discord.errors.LoginFailure: Improper token has been passed. - discord.js v14:
Error [TokenInvalid]: An invalid token was provided. - 古い discord.js:
Error [TOKEN_INVALID]: An invalid token was provided. - その他のライブラリ: ログイン時に HTTP
401 Unauthorized。
- Discord Developer Portal でトークンが再生成または失効しました。新しいトークンを生成すると、それが使われているすべての場所で古いトークンが即座に無効になります。
- トークンの文字列に、誤ってコピーされた余分なスペースや引用符が含まれています。
- コードが誤った環境変数を読み込んでいるか、Square Cloud にその変数が設定されていません。
- Developer Portal → アプリケーション → Bot → Reset Token に移動します。
- アプリケーションの環境変数でトークンを更新します(ダッシュボードの 設定 → 環境変数、または
squarecloud app env set)。トークンを 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 アプリケーションとボットアプリケーションの両方を再起動します。
ローカルでは動くのに、デプロイ後ボットがオフラインになる
意味: ローカル環境でボットを実行するとログインは問題ないのに、デプロイ後にオフラインになる(または繰り返し再起動する)。 よくある発生理由:- ゲートウェイレベルでの接続が不安定で、再接続処理がない。
- ローカルでテストした依存関係のバージョンと、依存関係ファイルに記載されているバージョンが競合または非互換になっている。
- RAM や CPU の超過、または Discord API への過剰なリクエストによって、ボットが停止された。この場合、ログに
[SQUARE-SHIELD]の行が表示され、メールが届きます。ステータスの表を参照してください。
- まずダッシュボードでアプリケーションのログを確認してください。実際のクラッシュ原因が示されます。
- 一時的なエラーでプロセスがクラッシュしないよう、エラーハンドラを追加します。discord.js では
process.on("unhandledRejection", ...)とclient.on("error", ...)、discord.py では同等の処理を行います。 squarecloud.appにAUTORESTART=trueを追加して、クラッシュ後に Square Cloud がボットを再起動するようにします。デフォルトでは無効で、再起動されるのはAUTORESTARTに記載された条件のときだけです。一時的なエラーの間もボットを稼働させ続けられますが、無効なトークン、構文エラー、依存関係の欠落が直るわけではないため、それらはコード側での修正が必要です。- Discord API のレート制限(429)に注意してください。グローバル制限はボットトークンあたり概ね 50 リクエスト/秒で、ルートごとにさらに厳しい制限があります(チャンネルの作成/編集はチャンネルあたり 10 分でおよそ 2 回まで)。積極的にキャッシュし、
X-RateLimit-Remaining/X-RateLimit-Reset-Afterヘッダーを尊重する非同期キューを使い、大量送信には Webhook を使用してください。Discord へのリクエストを送り続けるボットはABUSE_REQUESTSで停止されます。
関連ガイド
- Discord ボットホスティングのチュートリアル: ボットをゼロからセットアップしてデプロイします。
- 環境変数: トークンをコードの外に保存します。
- アプリが起動しない: アップロードのエラー、モジュールの不足、その他の起動時の失敗。

