
Sora Fujimoto
AI Solutions Architect

CAPTCHA の複雑さを乗り越えることは、特に Cloudflare の Turnstile に関しては難しい課題になる可能性があります。ベテランの開発者として、私は長年多くの CAPTCHA システムに出会ってきましたが、Cloudflare Turnstile は自動化システムを阻止するように設計された洗練されたアルゴリズムのため、独特の課題を呈しています。このガイドでは、C# を使用して Cloudflare Turnstile CAPTCHA の課題に取り組む方法について説明し、自動化の取り組みを強化するための実用的な洞察とテクニックを提供します。
目次
- Cloudflare Turnstile の概要
- C# 開発環境のセットアップ
- .NET のダウンロードとインストール
- VS Code の C# 開発用設定
- API 使用の前提条件の取得
- CapSolver の登録
- Turnstile の SiteKey の取得
- CapSolver API を使用して Turnstile トークンを取得する
- コードの完全な例
- エラー処理とトラブルシューティング
- リクエスト失敗エラー
- コードの説明
- まとめ
Cloudflare Turnstile は、正当なユーザーへの摩擦を最小限に抑えながら、ウェブサイトを自動化されたボットから保護するために設計された高度な CAPTCHA システムです。従来の CAPTCHA は、パズルを解いたり、オブジェクトを識別したりすることが多いですが、Turnstile はより微妙なアプローチで動作します。訪問者が人間かボットかを判断するために、ユーザーの行動とさまざまなウェブインタラクションを分析します。
Turnstile は、マウスの動き、クリックのパターン、インタラクション時間など、さまざまなシグナルを使用して、自動化システムでは解くのが難しい課題を生成します。これは、ウェブサイトのセキュリティにとって強力なツールですが、自動化にとっては難しい障害でもあります。
トップの CAPTCHA ソリューションの ボーナスコード を取得してください。CapSolver: WEBS。コードを引き換えると、各チャージ後に追加の 5% ボーナスが与えられ、無制限になります。

Newtonsoft.Json をインストールします。
dotnet add package Newtonsoft.Json
siteKey を取得することが不可欠です。siteKey は、デコード API を使用して CAPTCHA を解決するために必要です。siteKey を抽出することができます。この拡張機能は、プロセスを簡素化します。CapSolver API とやり取りし、CAPTCHA 解決を要求し、Turnstile トークンを取得するためのコードを以下に示します。
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 "";
}
}
}
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 = "1111111@gmail.com",
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;
}
}
}
siteKey がターゲットウェブサイトのものと一致することを確認してください。CallCapsolver メソッドでは、タスクタイプ AntiTurnstileTaskProxyLess、websiteURL、websiteKey を定義します。これらのパラメータは、CAPTCHA 解決タスクを作成するために CapSolver に送信されます。getTaskResult エンドポイントをポーリングしてタスクのステータスをチェックします。タスクが準備完了の場合、ソリューション(Turnstile トークン)を取得します。失敗した場合、エラーを返します。Login メソッドは、CapSolver から受信したトークンを使用して、Cloudflare で保護されたウェブサイトへのログインリクエストを認証します。このガイドに従うことで、C# を使用して Cloudflare Turnstile CAPTCHA の課題を解決する複雑さを克服することができます。CapSolver の API は、自動化プロセスを信頼性が高く効率的に実行する方法を提供し、自動化機能を向上させます。詳細情報や最新情報については、CapSolver をご覧ください。
重要: ウェブスクレイピングを行う際は、法律および倫理的ガイドラインに従うことが重要です。常に、ターゲットウェブサイトをスクレイピングする許可を得ていることを確認し、ウェブサイトの
robots.txtファイルと利用規約を尊重してください。CapSolver は、当社のサービスを非コンプライアンスな活動に悪用することを固く禁じています。 適切な承認なしに CAPTCHA を回避するために自動化されたツールを悪用すると、法的影響を受ける可能性があります。潜在的な問題を回避するために、スクレイピング活動がすべての適用される法律および規制に準拠していることを確認してください。
Cloudflareエラー1005:アクセスが拒否されました。ウェブスクリーピング中にこれを修正する方法を学びましょう。リジデンシャルプロキシ、ブラウザファイントラッキング、CAPTCHA用のCapSolverなどの解決策を発見してください。データ抽出を最適化してください。

Cloudflare TurnstileをAIワークフローで効果的に処理する方法を学び、Playwrightのステルス手法とCapSolverを活用して信頼性の高いキャプチャ解決を実現します。実用的な統合戦略と、途切れることのないオートメーションのためのベストプラクティスを学びましょう。
