C#でreCAPTCHA Enterpriseを解く
C# から solvethree を直接呼び出せます。以下の例では、reCAPTCHA v3 Enterprise トークンをリクエストし、タスクが完了するまで状態を確認し、解決に失敗した場合は停止します。
このページの内容
実行前の準備
.NET 8+ を使用してください。追加の NuGet パッケージは不要です。
- コンソールで、対象ホスト名に対応する有効なサイトプロファイルを作成してください。サイトプロファイルの設定を参照してください。
SOLVETHREE_API_KEYにワークスペースの API キーを、SOLVETHREE_PROXYに HTTP(S) プロキシ URL を設定してください。accounts.example.comとloginを、使用するホスト名とページで使用されているアクションに置き換えてください。siteには、スキームやパスを含めずにホスト名を指定します。
タスクを作成して結果を待つ
dotnet new console で .NET コンソールプロジェクトを作成し、Program.cs をこのコードに置き換えて、dotnet run を実行してください。
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json.Nodes;
var key = Environment.GetEnvironmentVariable("SOLVETHREE_API_KEY")
?? throw new Exception("Set SOLVETHREE_API_KEY");
var proxy = Environment.GetEnvironmentVariable("SOLVETHREE_PROXY")
?? throw new Exception("Set SOLVETHREE_PROXY");
using var http = new HttpClient { Timeout = TimeSpan.FromSeconds(30) };
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", key);
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(180));
async Task<JsonObject> Api(HttpMethod method, string path, JsonObject? body = null)
{
using var request = new HttpRequestMessage(method, "https://api.solvethree.com/v1" + path);
if (body is not null)
request.Content = new StringContent(body.ToJsonString(), Encoding.UTF8, "application/json");
using var response = await http.SendAsync(request, deadline.Token);
response.EnsureSuccessStatusCode();
return JsonNode.Parse(await response.Content.ReadAsStringAsync(deadline.Token))!.AsObject();
}
var requestId = Guid.NewGuid().ToString(); // Save with these inputs for recovery.
var input = new JsonObject {
["site"] = "accounts.example.com", ["action"] = "login",
["proxy"] = proxy, ["requestId"] = requestId
};
var task = await Api(HttpMethod.Post, "/tasks?waitMs=0", input);
while (task["status"]!.GetValue<string>() is "pending" or "solving")
{
var id = Uri.EscapeDataString(task["id"]!.GetValue<string>());
task = await Api(HttpMethod.Get, "/tasks/" + id + "?waitMs=15000");
if (task["status"]!.GetValue<string>() is "pending" or "solving")
await Task.Delay(1000, deadline.Token);
}
if (task["status"]!.GetValue<string>() != "ready")
throw new Exception("Task failed: " + task["errorCode"]?.GetValue<string>()
+ ": " + task["error"]?.GetValue<string>());
var solution = task["solution"]!.AsObject();
// Use solution["token"], ["userAgent"] and ["secChUa"] with the original proxy.
Console.WriteLine("Ready task: " + task["id"]!.GetValue<string>());POST は waitMs=0 を使用してタスクを即座に返します。その後、各 GET は更新を最大 15 秒待機します。ループは pending または solving の間は継続し、ready または failed で停止します。
リクエストのデフォルトは Enterprise v3 です。標準の v3 を使用するには、recaptchaType: v3 を追加してください。reCAPTCHA のタスク本文には type と url を含めないでください。
アプリケーションでトークンを使用する
トークンは solution["token"]!.GetValue<string>() です。プログラムが出力するタスク ID はタスクの取得用です。アプリケーションの CAPTCHA フィールドにはトークンの値を使用してください。
対象へのリクエストの User-Agent ヘッダーと sec-ch-ua ヘッダーには、solution["userAgent"] と solution["secChUa"] を読み取って使用してください。
そのリクエストは、解決に使用したものと同じプロキシ経由で送信してください。その後、アプリケーションのレスポンスを確認します。トークンが生成されても、対象がリクエストを受け入れたことを意味するわけではありません。
リクエストが失敗した場合
失敗したタスクには errorCode と error が含まれます。この例では処理を停止し、それらを報告します。解決に失敗した場合は返金されます。401 や 402 などの HTTP エラーは、これとは別のリクエストの問題です。再試行する前にAPI エラーリファレンスを確認してください。
タイムアウトやプロセスの再起動後に復旧する必要がある場合は、requestId と正確なタスク入力を保存してください。タスク ID がある場合は、そのタスクをポーリングします。ない場合は、同じ requestId で元の入力を再送信します。単にプログラムを再起動すると別の ID が生成され、課金対象の解決処理がもう 1 件作成される可能性があります。
呼び出し元は期限に達すると待機を停止しますが、すでに作成されたタスクはキャンセルされません。手順全体については、ポーリングとタイムアウトからの復旧を参照してください。
最初のタスクを実行しましょう。
$5のワークスペースクレジットで始められます。