CAPSOLVER
ブログ
C# を使用して Cloudflare Turnstile CAPTCHA チャレンジを解決する方法

C# を使用して Cloudflare Turnstile CAPTCHA チャレンジを解決する方法

Logo of CapSolver

Sora Fujimoto

AI Solutions Architect

17-Sep-2024

CAPTCHA の複雑さを乗り越えることは、特に Cloudflare の Turnstile に関しては難しい課題になる可能性があります。ベテランの開発者として、私は長年多くの CAPTCHA システムに出会ってきましたが、Cloudflare Turnstile は自動化システムを阻止するように設計された洗練されたアルゴリズムのため、独特の課題を呈しています。このガイドでは、C# を使用して Cloudflare Turnstile CAPTCHA の課題に取り組む方法について説明し、自動化の取り組みを強化するための実用的な洞察とテクニックを提供します。

目次

  1. Cloudflare Turnstile の概要
  2. C# 開発環境のセットアップ
  • .NET のダウンロードとインストール
  • VS Code の C# 開発用設定
  1. API 使用の前提条件の取得
  • CapSolver の登録
  • Turnstile の SiteKey の取得
  1. CapSolver API を使用して Turnstile トークンを取得する
  2. コードの完全な例
  3. エラー処理とトラブルシューティング
  • リクエスト失敗エラー
  1. コードの説明
  2. まとめ

Cloudflare Turnstile の理解

Cloudflare Turnstile は、正当なユーザーへの摩擦を最小限に抑えながら、ウェブサイトを自動化されたボットから保護するために設計された高度な CAPTCHA システムです。従来の CAPTCHA は、パズルを解いたり、オブジェクトを識別したりすることが多いですが、Turnstile はより微妙なアプローチで動作します。訪問者が人間かボットかを判断するために、ユーザーの行動とさまざまなウェブインタラクションを分析します。
Turnstile は、マウスの動き、クリックのパターン、インタラクション時間など、さまざまなシグナルを使用して、自動化システムでは解くのが難しい課題を生成します。これは、ウェブサイトのセキュリティにとって強力なツールですが、自動化にとっては難しい障害でもあります。

ボーナスコード

トップの CAPTCHA ソリューションの ボーナスコード を取得してください。CapSolver: WEBS。コードを引き換えると、各チャージ後に追加の 5% ボーナスが与えられ、無制限になります。

C# 開発環境のセットアップ

1. .NET のダウンロードとインストール

  • このページ を訪問して .NET をダウンロードします。
  • 使用しているオペレーティングシステムに合わせた指示に従って .NET をインストールします。

2. VS Code の C# 開発用設定

  • VS Code 用の C# 拡張機能をインストールします。
    • VS Code で、拡張機能マーケットプレースで「C#」を検索し、Microsoft の公式プラグインをインストールします。
    • この拡張機能は、IntelliSense やコードフォーマットなどの機能を提供し、C# の開発を容易にします。
  • JSON データを処理するための JSON パージングパッケージ Newtonsoft.Json をインストールします。
    • このパッケージは、次のコマンドを使用して NuGet でインストールできます。
      bash Copy
      dotnet add package Newtonsoft.Json

API 使用の前提条件の取得

1. CapSolver の登録

  • CapSolver にアカウントを作成して、API サービスにアクセスします。
  • 登録後、CapSolver の CAPTCHA 解決サービスにアクセスするために必要な API キーを受け取ります。

2. Turnstile の SiteKey の取得

  • Cloudflare Turnstile CAPTCHA の課題の場合、ターゲットウェブサイトの siteKey を取得することが不可欠です。siteKey は、デコード API を使用して CAPTCHA を解決するために必要です。
  • CapSolver 拡張機能 を使用して siteKey を抽出することができます。この拡張機能は、プロセスを簡素化します。

CapSolver API を使用して Turnstile トークンを取得する

CapSolver API とやり取りし、CAPTCHA 解決を要求し、Turnstile トークンを取得するためのコードを以下に示します。

csharp Copy
public static async Task<string> CallCapsolver()
{
    // // GET リクエストを送信
    // var todoItem = await GetTodoItemAsync(API_URL);
    // Console.WriteLine("GET リクエストの結果:");
    // Console.WriteLine(todoItem);

    var data = new
    {
        clientKey = CAPSOLVER_API_KEY,
        task = new
        {
            type = "AntiTurnstileTaskProxyLess",
            websiteURL = PAGE_URL,
            websiteKey = SITE_KEY,
            metadata = new { action = "login" }
        }
    };

    // POST リクエストを送信
    var response = await PostTodoItemAsync("https://api.capsolver.com/createTask", data);
    Console.WriteLine("POST リクエストの結果:");
    var responseString = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseString);
    JObject taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
    var taskId = taskResp["taskId"].ToString();
    if (string.IsNullOrEmpty(taskId))
    {
        Console.WriteLine("タスク ID が受信されませんでした。");
        return "";
    }
    Console.WriteLine($"作成されたタスク ID: {taskId}");

    while (true)
    {
        await Task.Delay(1000); // 1 秒間待機
        var resultData = new
        {
            clientKey = CAPSOLVER_API_KEY,
            taskId = taskId
        };

        // content = new StringContent(JsonConvert.SerializeObject(data), System.Text.Encoding.UTF8, "application/json");
        // response = await httpClient.PostAsync(uri, content);

        response = await PostTodoItemAsync("https://api.capsolver.com/getTaskResult", resultData);
        responseString = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseString);
        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine($"タスクの結果を取得できませんでした: {responseString}");
            return "";
        }

        taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
        Console.WriteLine(taskResp);
        var status = taskResp["status"].ToString();

        if (status == "ready")
        {
            Console.WriteLine("成功 => " + responseString);
            return taskResp["solution"]["token"].ToString();
        }

        if (status == "failed")
        {
            Console.WriteLine("失敗! => " + responseString);
            return "";
        }
    }
}

コードの完全な例

csharp Copy
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace HttpExample
{
    public class Program
    {
        private const string CAPSOLVER_API_KEY = "CAI-xxxxxxxxxxxxxxxxxxx";
        private const string PAGE_URL = "https://dash.cloudflare.com/login";
        private const string SITE_KEY = "0x4AAAAAAAJel0iaAR3mgkjp";

        public static async Task Main(string[] args)
        {
            var token = await CallCapsolver();
            Console.WriteLine($"トークン: {token}");
            await Login(token);
        }

        public static async Task<string> CallCapsolver()
        {
            // // GET リクエストを送信
            // var todoItem = await GetTodoItemAsync(API_URL);
            // Console.WriteLine("GET リクエストの結果:");
            // Console.WriteLine(todoItem);

            var data = new
            {
                clientKey = CAPSOLVER_API_KEY,
                task = new
                {
                    type = "AntiTurnstileTaskProxyLess",
                    websiteURL = PAGE_URL,
                    websiteKey = SITE_KEY,
                    metadata = new { action = "login" }
                }
            };

            // POST リクエストを送信
            var response = await PostTodoItemAsync("https://api.capsolver.com/createTask", data);
            Console.WriteLine("POST リクエストの結果:");
            var responseString = await response.Content.ReadAsStringAsync();
            Console.WriteLine(responseString);
            JObject taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
            var taskId = taskResp["taskId"].ToString();
            if (string.IsNullOrEmpty(taskId))
            {
                Console.WriteLine("タスク ID が受信されませんでした。");
                return "";
            }
            Console.WriteLine($"作成されたタスク ID: {taskId}");

            while (true)
            {
                await Task.Delay(1000); // 1 秒間待機
                var resultData = new
                {
                    clientKey = CAPSOLVER_API_KEY,
                    taskId = taskId
                };

                // content = new StringContent(JsonConvert.SerializeObject(data), System.Text.Encoding.UTF8, "application/json");
                // response = await httpClient.PostAsync(uri, content);

                response = await PostTodoItemAsync("https://api.capsolver.com/getTaskResult", resultData);
                responseString = await response.Content.ReadAsStringAsync();
                Console.WriteLine(responseString);
                if (!response.IsSuccessStatusCode)
                {
                    Console.WriteLine($"タスクの結果を取得できませんでした: {responseString}");
                    return "";
                }

                taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
                Console.WriteLine(taskResp);
                var status = taskResp["status"].ToString();

                if (status == "ready")
                {
                    Console.WriteLine("成功 => " + responseString);
                    return taskResp["solution"]["token"].ToString();
                }

                if (status == "failed")
                {
                    Console.WriteLine("失敗! => " + responseString);
                    return "";
                }
            }
        }

        public static async Task Login(string token)
        {
            using var httpClient = new HttpClient();
            // リクエストヘッダーを追加
            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Cookie", $"cf_clearance={token}");
            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Host", "dash.cloudflare.com");
            var data = new {
                cf_challenge_response = token,
                email = "[email protected]",
                password = "123456",
            };
            var json = JsonConvert.SerializeObject(data);
            var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

            var response = await httpClient.PostAsync("https://dash.cloudflare.com/api/v4/login", content);

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception($"リクエストに失敗しました。ステータスコード: {response.StatusCode}");
            }

            var responseString = await response.Content.ReadAsStringAsync();
            Console.WriteLine(responseString);
        }

        private static async Task<HttpResponseMessage> GetTodoItemAsync(string url)
        {
            using var httpClient = new HttpClient();
            var response = await httpClient.GetAsync(url);

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception($"リクエストに失敗しました。ステータスコード: {response.StatusCode}");
            }

            // var responseString = await response.Content.ReadAsStringAsync();
            return response;
        }

        private static async Task<HttpResponseMessage> PostTodoItemAsync(string url, object item)
        {
            using var httpClient = new HttpClient();
            var json = JsonConvert.SerializeObject(item);
            var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

            var response = await httpClient.PostAsync(url, content);

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception($"リクエストに失敗しました。ステータスコード: {response.StatusCode}");
            }

            return response;
        }
    }
}

エラー処理とトラブルシューティング

  • リクエスト失敗:「リクエスト失敗」エラーが発生した場合は、API キーとサイトキーが正しいかどうかを確認してください。
    • CapSolver アカウントから有効な API キーを持っていることを確認します。
    • siteKey がターゲットウェブサイトのものと一致することを確認してください。

説明

  1. タスクの設定: CallCapsolver メソッドでは、タスクタイプ AntiTurnstileTaskProxyLesswebsiteURLwebsiteKey を定義します。これらのパラメータは、CAPTCHA 解決タスクを作成するために CapSolver に送信されます。
  2. タスクステータスのポーリング: タスクが作成されると、コードは getTaskResult エンドポイントをポーリングしてタスクのステータスをチェックします。タスクが準備完了の場合、ソリューション(Turnstile トークン)を取得します。失敗した場合、エラーを返します。
  3. トークンの使用: Login メソッドは、CapSolver から受信したトークンを使用して、Cloudflare で保護されたウェブサイトへのログインリクエストを認証します。

まとめ

このガイドに従うことで、C# を使用して Cloudflare Turnstile CAPTCHA の課題を解決する複雑さを克服することができます。CapSolver の API は、自動化プロセスを信頼性が高く効率的に実行する方法を提供し、自動化機能を向上させます。詳細情報や最新情報については、CapSolver をご覧ください。

コンプライアンスに関する注意

重要: ウェブスクレイピングを行う際は、法律および倫理的ガイドラインに従うことが重要です。常に、ターゲットウェブサイトをスクレイピングする許可を得ていることを確認し、ウェブサイトの robots.txt ファイルと利用規約を尊重してください。CapSolver は、当社のサービスを非コンプライアンスな活動に悪用することを固く禁じています。 適切な承認なしに CAPTCHA を回避するために自動化されたツールを悪用すると、法的影響を受ける可能性があります。潜在的な問題を回避するために、スクレイピング活動がすべての適用される法律および規制に準拠していることを確認してください。

コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。CapSolverは、すべての適用される法律および規制の遵守に努めています。CapSolverネットワークの不法、詐欺、または悪用の目的での使用は厳格に禁止され、調査されます。私たちのキャプチャ解決ソリューションは、公共データのクローリング中にキャプチャの問題を解決する際に100%のコンプライアンスを確保しながら、ユーザーエクスペリエンスを向上させます。私たちは、サービスの責任ある使用を奨励します。詳細については、サービス利用規約およびプライバシーポリシーをご覧ください。

もっと見る

Webスクレイピングと自動化のためのCloudflare JSチャレンジの解決方法
Webスクレイピングと自動化のためのCloudflare JSチャレンジの解決方法

CloudflareのJavaScriptチャレンジを解決し、シームレスなウェブスクレイピングと自動化を実現する方法を学びましょう。ヘッドレスブラウザ、プロキシローテーション、そしてCapSolverの先進的なCAPTCHA解決機能の活用など、効果的な戦略を発見してください。

Cloudflare
Logo of CapSolver

Sora Fujimoto

05-Mar-2025

Cloudflare TLSフィンガープリンティング:その仕組みと解決策
Cloudflare TLSフィンガープリンティング:概要と解決策

CloudflareのTLSフィンガープリンティングによるセキュリティへの活用、ボットの検出とブロック方法、ならびにWebスクレイピングや自動ブラウジングタスクにおける解決策を学びましょう。

Cloudflare
Logo of CapSolver

Sora Fujimoto

28-Feb-2025

Cloudflareで保護されたウェブサイトからデータを取得する方法
Cloudflare保護ウェブサイトからのデータ抽出方法

このガイドでは、Cloudflareで保護されたウェブサイトからデータを抽出するための倫理的で効果的な手法を探ります。

Cloudflare
Logo of CapSolver

Sora Fujimoto

20-Feb-2025

2025年にPythonとGoを使ってCloudflareを解決する方法
2025年にPythonとGoを使ってCloudflareを解決する方法

Cloudflare Turnstile についての洞察を共有し、Python と Go を使用してこれらのタスクを実行します。Turnstile が Python スクラッパーを検出できるかどうか、そして CapSolver などのソリューションを使用してそれを効果的にバイパスする方法について説明します。

Cloudflare
Logo of CapSolver

Sora Fujimoto

05-Nov-2024

Selenium を使用して Cloudflare Turnstile キャプチャを解決する方法
Selenium で Cloudflare Turnstile キャプチャを解決する方法

本ブログでは、Selenium を使用して Cloudflare Turnstile Captcha を克服するための効果的な手法をいくつか紹介します。

Cloudflare
Logo of CapSolver

Sora Fujimoto

11-Oct-2024

ウェブ自動化のためのJavaにおけるCloudflare Turnstile CAPTCHA 解決ガイド
ウェブオートメーションにおけるJavaでのCloudflare Turnstileキャプチャの解決ガイド

Java でウェブ操作を自動化し、実用的なツールとコーディングテクニックを使って Cloudflare Turnstile CAPTCHA を回避する方法を学びましょう。

Cloudflare
Logo of CapSolver

Sora Fujimoto

08-Oct-2024