Shadowrocketのサブスクリプションを解析できない・リストが空になるときの確認手順

Shadowrocketでサブスクリプションを読み込めない、更新後にリストが空になる場合の確認方法を、リンク・サービス側の状態・更新タイミングに分けて解説します。

この記事の要点

利用中のサービスとサブスクリプションがあり、Shadowrocketに読み込めない、更新後にリストが空になる、または古い項目が表示される場合に確認してください。現在の記録を残したうえで、リンクの誤り、リクエストの失敗、レスポンス形式の非対応、リストの表示上の問題を順に切り分けます。一度に変更する条件は一つにし、表示されたメッセージを手がかりに次の確認へ進みましょう。接続テストの失敗とサブスクリプションの解析失敗を混同しないことも大切です。

1. リクエスト・解析・接続テストを切り分ける

ShadowrocketはAppleプラットフォーム向けのクローズドソースの有料アプリです。主にiPhone / iPadで利用でき、入手先はApp Storeのみです。アプリは買い切り方式です。アプリの買い切りと接続サービスのプランは別です。この記事は、すでにサブスクリプションを利用していることを前提としています。当サイトではノード、サブスクリプション、サービス提供元の提供・販売・推奨は行っていません。価格、システム要件、対応状況はApp Storeの記載をご確認ください。

「サブスクリプションの更新に成功した」ことと「ノードに接続できる」ことは別です。更新時にはまずサブスクリプションURLにリクエストを送り、レスポンス内の項目を解析します。認識可能な項目が取得できて初めて、ノードへの接続、認証、通信の転送が関係します。リストが空のときにノードのポートを変更したり、プロトコルを切り替えたりしても、通常は問題の発生箇所に対処できません。

リンクを読み取る サブスクリプションをリクエストする 内容を解析する 項目を表示する 接続をテストする

2. サブスクリプションURL全体を確認する(認証情報は変更しない)

利用中のサービスのアカウントページに戻り、Shadowrocket用のサブスクリプションURLをコピーし直してください。チャットに表示された省略済みのプレビュー、スクリーンショットから読み取った文字、ブラウザのアドレスバーにあるアカウントページのURLから推測しないでください。サブスクリプションURLには通常、認証パラメーターが含まれます。1文字欠けるだけで別のリクエストになることがあります。

https://example.com/sub?token=xxxx

上記は実際のサブスクリプションには使えないダミー値で、構造の説明にのみ使用しています。プロトコルは https、ホスト名は example.com、パスは /sub、クエリパラメーターには token が含まれます。実際のURLのパスとパラメーターは利用中のサービスによって異なり、この例と同じである必要はありません。

  1. 先頭と末尾を確認:誤ってコピーした空白、改行、引用符、日本語の句点を取り除いてください。URLの途中に元からある記号は削除しないでください。
  2. パラメーターを確認:?、&、= の後に続く値が欠けていないか確認します。%を含む文字列を自分でデコードして再構成しないでください。
  3. URLの用途を確認:アカウントのログインページ、購入履歴ページ、サブスクリプションURLはそれぞれ別のものです。ノード単体の共有情報も、継続的に更新できるサブスクリプションURLとは異なります。
  4. 認証情報がリセットされていないか確認:アカウントページでサブスクリプションの認証情報をリセットしたことがある場合、以前のURLはすぐに無効になることがあります。コピーし直したURLを使用してください。
  5. 登録元を確認:Homeで該当するサブスクリプションの編集画面を開き、保存済みのURLを確認してください。変更を保存する前に、所属グループと既存項目の数を記録します。同じ名前のサブスクリプションを複数追加しないようにしてください。

3. ネットワーク障害とサーバーによる拒否を切り分ける

更新を一度実行したら、表示されたメッセージをすべて記録してから、ネットワークとアカウントのどちらを確認するか判断してください。以下はレスポンス、ログ、診断結果に現れる場合がある標準的なHTTPステータスです。Shadowrocketのすべての画面にそのまま表示されるとは限りません。実際の判断は今回のリクエスト記録に基づいてください。

エラー:401 Unauthorized

原因:サーバーが現在のリクエストの認証情報を受け付けていません。認証情報が無効になっている可能性があります。対処:利用中のアカウントページでサブスクリプションの利用権限を確認し、URLをコピーし直してください。有効な値を探るためにtokenを何度も変更しないでください。

エラー:403 Forbidden

原因:サーバーがアクセスを拒否しています。権限、アクセス方針、リクエスト元の制限などが考えられます。対処:発生時刻とネットワークの種類を記録し、利用中のサービス提供元に制限の理由を確認してください。403だけでアカウントの期限切れとは判断できません。

エラー:404 Not Found

原因:リクエスト先のパスが見つかりません。リンクの欠落、接続先の変更、または無効なリソースを隠すためにサーバーがこのステータスを返している可能性があります。対処:アカウントページからサブスクリプションURL全体を取得し直し、保存済みのURLと照合してください。パスを推測して手動で追加しないでください。

エラー:429 Too Many Requests

原因:サーバーがリクエスト頻度を過剰と判断しています。対処:連続更新を止めてください。レスポンスにRetry-Afterがある場合は指定時間待ち、記載がない場合はサービス提供元の案内に従ってから再試行してください。

リクエストがタイムアウトした場合やドメインを解決できない場合、サーバーにリクエストが届いていない可能性があります。現在のWi-FiでWeb認証が必要か確認し、可能であればモバイル通信に切り替えて比較してください。証明書エラーの場合は、端末の日付と時刻、ネットワークの認証状態、サーバー証明書を確認します。証明書検証を無効にして問題を隠さないでください。

443
HTTPSの標準ポートです。URLにポートが明示されている場合は、そちらを優先します
3種類
ネットワーク障害、HTTPステータス、内容の解析結果を分けて記録
1項目
各回で変更する条件は一つだけにし、ほかの設定は比較用に維持

結論:拒否レスポンスを受け取ったら、まず権限を確認

401や403などのレスポンスがある場合は、まずサブスクリプションの権限とサーバー側のアクセス要件を確認します。レスポンスが届いていない場合は、ネットワーク経路を確認してください。この2つをどちらも「ノードのプロトコルを変更する」ことで解決しようとしないでください。

4. リクエスト完了後、レスポンスを解析できるか確認する

HTTPリクエストが成功したことは、通信が成立してレスポンスを取得できたことを示すだけで、有効なサブスクリプションが返された保証にはなりません。サーバーが200を返していても、ログインページ、操作が必要な認証ページ、メンテナンス通知、空のテキストが含まれることがあります。ブラウザでURLを開けても、Shadowrocketがそこからノード項目を読み取れるとは限りません。ブラウザにはログイン状態が残っていても、アプリのサブスクリプションリクエストにはその状態が引き継がれない場合があります。

確認できた結果考えられる状況次の手順
ログインページまたは認証ページが返る取得したのはWebページであり、そのまま解析できるサブスクリプション内容ではありません専用のサブスクリプションURLを使っているか確認し、サービス提供元にインターフェースのレスポンスを確認してもらう
空の内容が返る今回のレスポンスには解析可能な本文がありませんアカウントのサブスクリプション状態、表示対象の項目、サーバー側での生成結果を確認する
本文はあるが、すべて解析に失敗する形式に対応していない、内容が途中で切れている、またはデータ項目が不足している可能性がありますShadowrocketに対応すると明記されたサブスクリプション形式を使用し、個人情報を隠したエラー情報を保存する
一部の項目だけ表示される一部のレコードが無効か、現在の画面ですべての結果が表示されていない可能性がありますまず検索条件を解除し、グループを展開してから、サーバー側で返されるはずの項目と照合する

Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuardはプロトコル名であり、サブスクリプション全体のテキストが有効かどうかを判断する十分な条件ではありません。これらの名称が含まれていても、各レコードの認証情報、アドレス、ポート、通信パラメーターがそろっているとは限りません。読み込みを「成功したように見せる」ために、プロトコル名を一括変更したり、ポートを適当に入力したり、Webページのソースをノード情報として貼り付けたりしないでください。

5. Homeに戻り、表示と更新タイミングの問題を確認する

Homeで検索を解除し、サブスクリプショングループを展開して、別の同名グループではなく目的のサブスクリプションが表示されているか確認してください。更新前の項目数と、引き続き使用できる古い項目があるかを記録します。更新に失敗しても古いリストが残る場合、最新の内容を取得できたことにはなりません。リストが突然空になっても、それだけでアプリが有効なデータを削除したとは判断できません。

  1. 現在の状態を記録:グループ名、更新前の項目数、エラーメッセージ、今回の操作時刻を記録してください。グループ全体を削除したり、アプリを再インストールしたりするのは後にしてください。
  2. 対象だけを更新:Homeで目的のサブスクリプションを開き、手動更新を一度実行してください。画面レイアウトによって操作メニューが異なる場合は、現在のサブスクリプション項目にある更新操作を使用します。
  3. 結果を待つ:今回のリクエストが完了してから確認してください。更新を連続して実行したり、複数のグループを同時に更新して結果を混同したりしないでください。
  4. 通信経路を確認:サブスクリプションをプロキシ経由で更新する設定がある場合は、現在の接続が利用可能か確認してください。空のリストにあるノードを使って同じサブスクリプションを取得しようとすると、成立しない依存関係が生じます。
  5. 通常の設定に戻す:調査中に自動更新を一時停止したりアクセス経路を変更したりした場合は、問題の解決後に元に戻してください。次回の自動更新で同じ失敗を繰り返さないよう、成功した条件を記録しておきましょう。

Global RoutingのConfig、Proxy、Direct、Sceneは通信の扱い方を指定するもので、サブスクリプション形式を変換する機能ではありません。サブスクリプションのリクエストがプロキシを経由するかどうかは、アプリの更新関連設定と現在のネットワーク経路によって決まります。Proxyに切り替えただけで、必ずプロキシ経由で更新されるとは限りません。Settings → On Demandは条件に応じて接続を開始する機能であり、無効なリンクや解析できないレスポンスを修復するものではありません。

結論:古い項目が使える場合は、残してから確認する

まずサブスクリプションのリクエストまたはレスポンス内容を修正し、その後で項目が戻ったかを確認してください。更新できるかを試すために、現在使える項目を削除しないでください。比較材料と利用可能な接続経路を同時に失うおそれがあります。

6. よくある質問と調査情報のまとめ方

上記の順に確認しても原因が特定できない場合は、試行を繰り返すより、失敗時の記録を一度まとめるほうが有効です。「リンク、リクエスト、レスポンス、解析、表示」のどの段階の問題かを絞れば、同じ確認の繰り返しを減らせます。アカウント権限の問題を、クライアントの接続設定で解決しようとすることも避けられます。

ブラウザではサブスクリプションを開けるのに、アプリで解析に失敗するのはなぜですか?

ブラウザに表示されているのがサブスクリプション内容ではなく、ログインページや認証ページではないか確認してください。ブラウザにはログイン状態が残っていることがあります。アカウントページから専用のサブスクリプションURLをコピーし直し、未ログイン状態のリクエストに対して返される内容をサービス提供元に確認してもらってください。

項目は表示されるのにすべてタイムアウトします。再インポートが必要ですか?

まずサブスクリプションを残し、Homeで既存項目の接続テストを行い、サーバーの状態とノードの認証情報を確認してください。項目が表示されているなら、少なくとも何らかの内容は解析されています。接続のタイムアウトだけでサブスクリプションURLの誤りとは判断できません。

更新直後にリストが空になりました。続けて更新してもよいですか?

まずリクエストの繰り返しを止め、検索条件を解除してグループを展開し、アカウントページに項目があるはずか確認してください。サーバーから本当に空の内容が返された場合や429が発生した場合は、更新を続けず、内容の問題への対処または制限解除を待ってください。

ネットワークを変えたら成功しました。すべてのノードを変更する必要がありますか?

一括変更は不要です。成功時と失敗時に使ったネットワーク、プロキシ経由かどうか、表示されたエラーを記録し、サブスクリプションのドメイン解決、ネットワーク認証、アクセス制限を重点的に確認してください。ノードのパラメーターとサブスクリプションのリクエストは、別々に確認する項目です。

利用中のサービス提供元へ連絡する前に、次の情報を準備する

調査完了の目安は、対象のサブスクリプションへのリクエストが完了し、レスポンスを解析でき、Homeに想定した項目が表示されたうえで、ノードの接続結果を個別に確認できていることです。エラーメッセージが消えただけで復旧と判断しないでください。一度更新に成功しても、その後すべての接続先が必ず利用できるとは限りません。

App Storeで正規アプリを確認