アプリを起動すると、予測できない動作をすることがあります: データが読み込まれない、広告が表示されない、アカウントが目に見えない理由で禁止されるなどです。「何が起こっているのか」を理解するためには、アプリとサーバー間の実際のHTTPリクエストを確認する必要があります。これが、トラフィックをリアルタイムでキャプチャ、分析、置き換えることを可能にするツール、Charles Proxyの存在意義です。
このガイドでは、iOSおよびAndroid用のCharles Proxyの完全な設定、HTTPSの取り扱い、サーバーの応答の置き換え、外部プロキシサーバーとの統合について説明します。余分な理論は省き、実践に焦点を当てます。
Charles Proxyとは何か、なぜ必要か
Charles Proxyは、Windows、macOS、Linux用のデスクトップアプリケーションで、あなたのデバイス(スマートフォン、エミュレーター)とインターネットの間にHTTP/HTTPSプロキシとして機能します。トラフィックをCharles経由で送信すると、プログラムはすべてのリクエストとレスポンスを記録し、アプリがサーバーに送信するデータのバイトをすべて確認できます。
本質的に、CharlesはChromeブラウザのDevToolsと同じことを行いますが、組み込みのインスペクターを持たないモバイルアプリ用です。これは特に重要で、以下のことを理解する必要があるときに役立ちます:
- アプリがアカウントの認証や登録時にどのパラメータを送信するか
- サーバーに送信されるヘッダー(User-Agent、Device-ID、トークン)
- Facebook、TikTok、Instagramがログイン時にデバイスをどのように確認するか
- 特定の条件でアプリがエラーを返す理由
- マーケットプレイスが価格やカタログをリクエストする際に送信するデータ
アービトラージャーにとって、Charles Proxyは情報収集のツールです: Facebook Adsがデバイスから収集するフィンガープリンティングデータを実際に見ることができ、アカウントがログイン直後に禁止される理由を理解することができます。SMM専門家は、InstagramやTikTokのAPIを分析するためにCharlesを使用し、リクエストの制限やパターンを理解します。開発者やテスターは、サーバーの応答を模倣し、アプリの動作を非標準の状況で確認するために使用します。
Charles Proxyの主な機能:
- HTTPおよびHTTPSトラフィックのキャプチャ(TLS 1.3を含む)
- リクエストとレスポンスのボディを便利な形式(JSON、XML、テキスト)で表示
- サーバーの応答の置き換え(リライト、ローカルマップ、リモートマップ)
- リクエストを手動で編集するためのブレークポイント
- 遅いインターネットをシミュレートするための接続の遅延
- セッションの記録と再生
- 外部プロキシのサポート(HTTP、SOCKS5)
Charles Proxyのインストールと初期設定
Charles Proxyは、30日間の試用期間を持つ有料アプリケーションとして配布されています。公式サイトcharlesproxy.comからダウンロードできます。macOS、Windows、Linux用のバージョンは、機能的には同じです。
ステップ 1. アプリケーションのインストール
お使いのオペレーティングシステムに合ったインストーラーをダウンロードし、起動して標準的なインストール手順に従ってください。Charlesを起動すると、すぐにコンピュータのポート8888をリッスンし始めます。このポートはデフォルトで、デバイスがトラフィックを送信するために使用します。
ステップ 2. コンピュータのIPアドレスの確認
モバイルデバイスがCharlesに接続できるようにするためには、同じWi-Fiネットワークに接続されている必要があります。ローカルネットワーク内のコンピュータのIPアドレスを確認してください:
- macOS: システム環境設定 → ネットワーク → Wi-Fiを選択 → IPアドレス
- Windows: コマンドプロンプト →
ipconfig→ IPv4アドレス - Charles内: ヘルプ → ローカルIPアドレス
このアドレスをメモしておいてください。スマートフォンでプロキシを設定する際に必要になります。通常、192.168.1.Xのような形式です。
ステップ 3. デバイスからの接続を許可する
モバイルデバイスが初めて接続されると、Charlesは「IP xxx.xxx.x.xからの接続を許可しますか?」というダイアログボックスを表示します。「許可」をクリックしてください。ウィンドウが表示されない場合は、WindowsまたはmacOSのファイアウォールがCharlesをブロックしていないか確認してください。macOSでは、システム環境設定 → セキュリティ → ファイアウォールで、受信接続を明示的に許可する必要がある場合があります。
Android用Charles Proxyの設定
Androidでの設定は2つの部分から成ります: Charlesを介してトラフィックを送信し、HTTPSを復号化するための証明書をインストールします。証明書がないと、暗号化されたデータのみが表示され、無意味な文字の集合になります。
AndroidでのWi-Fiプロキシの設定
- 設定 → Wi-Fiを開く
- 接続されたネットワークを長押し → ネットワークを変更
- 詳細設定を有効にする
- プロキシのフィールドで手動を選択
- プロキシホスト: コンピュータのIPアドレス(例:
192.168.1.5) - ポート:
8888 - 設定を保存
これで、デバイスからのすべてのHTTPトラフィックがCharlesを介して送信されます。アプリケーションの画面にリクエストの記録が表示され始めます。
AndroidにCharles証明書をインストールする
- デバイスでブラウザを開き、
chls.pro/sslにアクセス - 証明書ファイル.pemがダウンロードされます
- 設定 → セキュリティ → 証明書のインストールを開く
- ダウンロードしたファイルを選択し、CA証明書としてインストール
- 任意の名前を設定します(例:「Charles SSL」)
Android 7以降では、アプリはデフォルトでユーザー証明書を信頼しません。これにより、システムアプリやほとんどのサードパーティアプリ(Facebook、Instagram、TikTok)がキャプチャをブロックします。このようなアプリで作業するには、rootアクセスが必要になるか、証明書をシステムストレージにインストールできるAndroidエミュレーター(例: GenymotionやAndroid Studio Emulator)を使用する必要があります。
⚠️ Android 7+に重要
Android 7(Nougat)以降、アプリはnetwork_security_config.xmlファイルでユーザー証明書への信頼を明示的に宣言する必要があります。ほとんどの人気アプリ(Facebook Ads、Instagram)はこれを行いません。それらを分析するには、rootを持つエミュレーターまたは修正されたAndroidビルドを使用する必要があります。
iOS用Charles Proxyの設定
iOSでは手順が少し簡単です。Appleはプロファイルを介して証明書をインストールするための標準的なメカニズムを提供しており、ほとんどのアプリはシステムのプロキシ設定を尊重します。
iPhone/iPadでのWi-Fiプロキシの設定
- 設定 → Wi-Fiを開く
- 接続されたネットワークの横にある(i)アイコンをタップ
- HTTPプロキシセクションまでスクロール
- 手動を選択
- サーバー: CharlesがインストールされているコンピュータのIPアドレス
- ポート:
8888 - 認証: オフ(Charlesで設定されていない場合)
iOSにCharles証明書をインストールする
- iPhoneでSafariブラウザを開き、
chls.pro/sslにアクセス - Safariが構成プロファイルのインストールを提案します — 許可をクリック
- 設定 → 一般 → VPNとデバイス管理に移動
- Charlesプロファイルを見つけてインストールをクリック
- 必要に応じてデバイスのPINコードを入力
- その後、設定 → 一般 → このデバイスについて → 証明書の信頼に移動
- Charles Proxy CAの横にあるスイッチをオンにします
これで、CharlesはほとんどのiOSアプリのHTTPSトラフィックを復号化できるようになります。ただし、証明書ピンニングが有効なアプリ(銀行アプリや特定のInstagramバージョンなど)は除外されます。それらを分析するには、脱獄とSSL Kill Switchのような特別なツイックが必要です。
HTTPSトラフィックのキャプチャ: SSLプロキシの設定
Charles証明書をインストールした後でも、デフォルトではHTTPSトラフィックを復号化しません。どのドメインに対してSSLプロキシを有効にするかを明示的に指定する必要があります。これは、インターフェースを余分なデータで混雑させないために意図的に行われています。
SSLプロキシを有効にする方法
- Charlesのメニューからプロキシ → SSLプロキシ設定を選択
- SSLプロキシを有効にするにチェックを入れる
- インクルードセクションで追加をクリック
- ホストフィールドに
*(アスタリスク = すべてのドメイン)を入力 - ポートフィールドに
443を入力 - OKをクリックし、キャプチャを再起動
これで、CharlesはすべてのドメインのHTTPSトラフィックを復号化します。特定のサービスに関心がある場合は、アスタリスクの代わりにそのドメインを指定してください。たとえば、Instagramを分析するには*.instagram.com、Facebookの場合は*.facebook.comを入力します。
SSLプロキシを有効にした後に見えるもの
Charlesの左側のパネルにドメインのツリーが表示されます。任意のリクエストをクリックすると、右側に詳細情報が表示されます: URL、メソッド(GET/POST)、リクエストヘッダー、リクエストボディ(存在する場合)、サーバーの応答。リクエストとレスポンスタブは、生のデータまたは便利なフォーマット(JSON、XML、HTML)でデータを表示します。
特に重要なのはリクエストヘッダーです — ここには認証トークン、デバイスID、アプリのバージョン、プラットフォームが検証に使用するその他のデータが含まれています。Facebook AdsやTikTokへのリクエストで疑わしいパラメータが表示される場合は、アカウントが禁止される理由を理解するための第一歩です。
分析ツール: ブレークポイント、リライト、ローカルマップ
Charlesはトラフィックのビューアだけでなく、その修正のための強力なツールでもあります。最もよく使用される3つの主要なツールは次のとおりです:
ブレークポイント — 停止ポイント
ブレークポイントを使用すると、リクエストまたはレスポンスが通過する際にキャプチャし、受信者に到達する前にデータを手動で編集できます。これはテストのための強力なツールです: リクエストのパラメータを変更したり、別のトークンを挿入したり、サーバーの応答を修正したりできます。
ブレークポイントを設定するには: リスト内のリクエストを右クリック → ブレークポイント。次回アプリがこのURLにアクセスすると、Charlesは転送を一時停止し、編集ウィンドウを開きます。任意のパラメータを変更し、実行をクリックして続行します。
リライト — データの自動置き換え
リライトは自動的に機能します: 「リクエストにXが含まれている場合はYに置き換える」というルールを設定すると、Charlesはそのルールをすべての適切なリクエストに適用します。これは大量テストに便利です: たとえば、特定のドメインへのすべてのリクエストで特定のヘッダーの値を置き換えることができます。
設定: ツール → リライト → 追加 → ルールセットの名前を指定 → ルールを追加 → タイプ(ヘッダー、ボディ、URLなど)、検索内容、置き換える内容を指定します。
ローカルマップ — ローカルファイルでの応答の置き換え
ローカルマップを使用すると、サーバーの応答をローカルファイルの内容に置き換えることができます。これは、実際のバックエンドなしでアプリをテストするために不可欠です: 必要なデータを含むJSONファイルを作成し、アプリはAPIの実際の応答の代わりにそれを受け取ります。
設定: ツール → ローカルマップ → 追加 → キャプチャするURLとローカルファイルへのパスを指定します。これで、このURLへのすべてのリクエストがファイルの内容を返します。これにより、境界ケースをテストできます: 空の商品のリスト、サーバーエラー500、非標準のデータ形式など。
| ツール | 使用するタイミング | 難易度 |
|---|---|---|
| ブレークポイント | 一時的な手動修正 | 低 |
| リライト | ルールに基づく自動置き換え | 中 |
| ローカルマップ | API応答をローカルファイルで置き換え | 低 |
| リモートマップ | リクエストを別のサーバーにリダイレクト | 中 |
| スロットル | 遅い接続をシミュレート | 低 |
Charlesを介して外部プロキシサーバーを接続する方法
Charles Proxyは、ローカルキャプチャとしてだけでなく、デバイスと外部プロキシサーバーの間の中継点としても機能します。これは、トラフィックを分析しながら特定のIPアドレスを介して送信する必要がある場合に特に便利です。たとえば、アプリが他の国から接続した場合やモバイルIPを介して接続した場合の動作を確認するためです。
この構成は次のようになります: スマートフォン → Charles Proxy(コンピュータ) → 外部プロキシサーバー → インターネット。Charlesでトラフィック全体を確認できますが、リクエストは必要なIPを介して送信されます。
Charlesでの外部プロキシの設定
- プロキシ → 外部プロキシ設定を開く
- 外部プロキシサーバーを使用するにチェックを入れる
- HTTPトラフィックの場合: Webプロキシ(HTTP)を有効にし、プロキシのホストとポートを入力
- HTTPSトラフィックの場合: セキュアWebプロキシ(HTTPS)を有効にし、同じ情報を入力
- プロキシが認証を必要とする場合は、ユーザー名とパスワードを入力
- OKをクリック
CharlesはHTTPおよびSOCKS5プロキシをサポートしています。SOCKS5の場合は、同じ設定内のSOCKSプロキシタブを使用します。住宅プロキシを使用してIPをローテーションする場合、各新しいリクエストは異なるアドレスを介して送信されるため、IP変更時のプラットフォームの動作をテストするのに便利です。
ローカルトラフィックの例外
一部のトラフィックを直接(外部プロキシなし)で送信する必要がある場合は、以下のホストに対して外部プロキシをバイパスのフィールドに例外を追加します。たとえば、ローカルアドレスlocalhostや127.0.0.1は通常、ローカルサービスを壊さないように除外する必要があります。
Charlesで外部プロキシが必要な場合:
- アプリのジオロケーションテスト(アメリカ、ドイツ、ブラジルからの動作確認)
- 異なる地域でのコンテンツの可用性の確認
- モバイルプロキシを介して作業する際のリクエストの分析 — モバイルIPに対するプラットフォームの反応を理解するため
- テスト中の地域制限の回避
実用的なシナリオ: アービトラージ、SMM、アプリのテスト
Charles Proxyが実際の作業で使用される具体的なタスクを考えてみましょう — 余分な理論は省きます。
シナリオ 1. アービトラージ — Facebook Adsのフィンガープリンティング分析
アービトラージャーの主なタスクの1つは、なぜFacebookがアカウントをログイン直後に禁止するのかを理解することです。Charlesを使用すると、Facebookアプリの最初のリクエストをキャプチャし、Metaのサーバーに送信されるデバイスに関するデータを確認できます。
graph.facebook.comへのリクエストで、device_id、hardware_id、advertiser_idなどのパラメータが表示されます。これにより、複数のアカウントを扱う際に、Dolphin AntyやAdsPowerのようなアンチデテクトブラウザで隔離する必要があるデータを理解できます。
また、禁止された際のサーバーの応答をキャプチャすることも有用です — 通常、そこにはエラーコードと時折、Facebookがアプリのインターフェースで表示しないブロックの理由が含まれています。
シナリオ 2. SMM — InstagramとTikTokのAPIの研究
10〜50のクライアントアカウントを管理するSMM専門家は、プラットフォームの制限にしばしば直面します: Instagramは、1時間あたりのいいね、フォロー、コメントの数を制限しています。Charlesを使用すると、アカウントを手動で操作する際にこれらの制限を正確に測定できます。
i.instagram.comへのリクエストをキャプチャすると、APIの構造: エンドポイント、パラメータ、認証トークンが表示されます。これにより、実際のユーザーの動作を模倣し、ブロックされないように自動化を設定できます。TikTokでも同様に機能し、api16-normal-c-useast1a.tiktokv.comへのリクエストを分析することで、プラットフォームがチェックするパラメータを確認できます。
シナリオ 3. Eコマース — マーケットプレイスのAPIの分析
Wildberries、Ozon、Avitoのセラーは、競合の価格を監視するために積極的に利用しています。Charlesを使用すると、マーケットプレイスのモバイルアプリケーションのリクエストをキャプチャし、価格や在庫に関するデータがどのエンドポイントを介して読み込まれるかを確認できます。これにより、モバイルアプリケーションの動作を模倣するパーサーを設定するのに役立ちます — これらのリクエストは、ブラウザのパーサーからのリクエストよりもはるかに簡単に通過します。
たとえば、Wildberriesアプリでは、catalog.wb.ruへのリクエストをキャプチャし、フィルタリングやページネーションのパラメータの正確な構造を確認できます。これにより、保護を回避するためのパーサーを構築するためのテンプレートが得られ、ブラウザのリクエストを再現しようとするよりもはるかに効果的です。安定したパーシングには、データセンターのプロキシが必要です。
シナリオ 4. モバイルアプリのQAテスト
テスターは、非標準の状況でアプリの動作を確認するためにCharlesを使用します。Map Localを使用して、サーバーの応答をエラー500に置き換え、アプリがバックエンドの障害をどのように処理するかを確認できます。Throttleを使用すると、遅いインターネット(3G、Edge)をシミュレートし、アプリが長時間の読み込みでフリーズしないかを確認できます。ブレークポイントを使用すると、データを手動で変更し、境界ケースを確認できます — たとえば、サーバーが商品のリストの代わりに空の配列を返した場合に何が起こるかを確認できます。
よくある問題とその解決策
Charles Proxyを使用する際、初心者は定期的に同じ問題に直面します。最も一般的な問題を見てみましょう。
問題 1: CharlesがHTTPSリクエストの内容の代わりに「unknown」を表示する
原因: SSLプロキシが有効になっていないか、デバイスに証明書がインストールされていません。
解決策: プロキシ → SSLプロキシ設定でSSLプロキシが有効になっていることと、ホスト*:443が追加されていることを確認してください。Charlesの証明書がデバイスにインストールされており、完全な信頼が有効になっていることを確認してください(iOSでは証明書の信頼設定を介して)。
問題 2: トラフィックがキャプチャされず、リクエストのリストが空である
原因: デバイスがCharlesを介してトラフィックを送信していないか、Charlesが接続を受け入れていません。
解決策: デバイスとコンピュータが同じWi-Fiネットワークに接続されていることを確認してください。デバイスのプロキシ設定に正しいコンピュータのIPアドレスとポート8888が指定されていることを確認してください。Charlesがキャプチャモードになっていることを確認してください: プロキシ → 録音を開始(またはツールバーの赤い点のボタン)。
問題 3: Charlesが有効な状態でアプリが動作しない
原因: アプリが証明書ピンニングを使用しており、信頼のチェーンだけでなく、特定のサーバー証明書も確認しています。Charlesの証明書は期待されるものと一致しません。
Androidでrootがある場合の解決策: MagiskモジュールTrustUserCertsをインストールするか、SSLピンニングを回避するためにFridaを使用します。iOSで脱獄がある場合は、SSL Kill Switch 2が必要です。root/jailbreakなしで証明書ピンニングを回避するのは非常に困難です。
問題 4: Charlesがトラフィックを過剰にキャプチャし、インターフェースが遅くなる
原因: デバイス上のすべてのアプリケーションからのトラフィックが記録されており、システムサービスも含まれています。
解決策: フィルタリングを使用します。フィルタフィールド(左パネルの下部)に興味のあるサービスのドメインを入力します。または、プロキシ → アクセス制御設定でアクセス制御を設定し、Charlesが特定のアプリからの接続のみを受け入れるようにします。
問題 5: Charlesを閉じた後にインターネットが機能しない
原因: モバイルデバイスにプロキシ設定が残っているが、Charlesはすでに起動していないため、トラフィックが行き場を失っています。
解決策: Charlesの作業が終了した後は、常にデバイスのプロキシ設定を削除してください。Wi-Fi設定でプロキシのパラメータを「なし」または「オフ」に戻します。
| 問題 | 迅速な解決策 |
|---|---|
| HTTPSが「unknown」を表示 | SSLプロキシを有効にして証明書をインストール |
| リクエストリストが空 | IP、ポート、Charlesが録音モードであることを確認 |
| アプリが開かない | 証明書ピンニング — root/jailbreakが必要 |
| インターフェースが遅い | フィルタフィールドにドメインを追加 |
| 閉じた後にインターネットがない | デバイスのプロキシ設定を削除 |
結論
Charles Proxyは、モバイルアプリケーションに関わるすべての人にとって最も便利なツールの1つです: Facebook Adsの検証メカニズムを理解したいアービトラージャー、InstagramのAPIを研究しているSMM専門家、非標準の条件でアプリの動作をテストしている開発者などです。インストールには15〜20分かかりますが、設定後に開かれる可能性は計り知れません。
重要なことは、Charlesは分析とデバッグのツールであり、匿名化のためのものではないということです。複数のアカウントでの作業、異なるジオロケーションからのテスト、プラットフォームの制限を回避するためには、実際のIPアドレスを持つプロキシサーバーが必要です。
アービトラージやソーシャルメディアアカウントの分析のためにモバイルアプリのトラフィックを分析している場合は、住宅プロキシとCharlesを組み合わせることをお勧めします — それにより、テストやアカウントの作業中にブロックのリスクを最小限に抑えることができます。速度と接続の安定性が重要なタスク、たとえばマーケットプレイスのAPIの大量パーシングには、高いアップタイムを持つデータセンターのプロキシが適しています。
```