# C#

> YesCaptcha 的 C# 示例（.NET 6+，HttpClient + System.Text.Json）：查询余额，创建 reCAPTCHA v2 任务并每 5 秒轮询结果。

Source: https://docs.yescaptcha.com/zh/samples/csharp/ · Last verified: 2026-10-15

运行环境：.NET 6 以上，只用标准库（`HttpClient`、`System.Text.Json`）。

```bash
dotnet new console -o YesCaptchaDemo
cd YesCaptchaDemo
export YESCAPTCHA_CLIENT_KEY=你的clientKey
dotnet run
```

Program.cs

```csharp
// YesCaptcha C# sample (.NET 6+): check the balance, then solve a reCAPTCHA v2.
// Run: dotnet new console -o YesCaptchaDemo, replace Program.cs with this file, set YESCAPTCHA_CLIENT_KEY, then dotnet run
using System;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Threading.Tasks;

class Program
{
    const string Api = "https://api.yescaptcha.com";
    static readonly HttpClient Http = new HttpClient { Timeout = TimeSpan.FromSeconds(30) };
    static readonly string ClientKey = Environment.GetEnvironmentVariable("YESCAPTCHA_CLIENT_KEY") ?? "";

    static async Task<JsonNode> Call(string method, JsonObject payload)
    {
        payload["clientKey"] = ClientKey;
        var res = await Http.PostAsJsonAsync($"{Api}/{method}", payload);
        var data = JsonNode.Parse(await res.Content.ReadAsStringAsync())!;
        if ((int?)data["errorId"] != 0)
            throw new Exception($"{data["errorCode"]}: {data["errorDescription"]}");
        return data;
    }

    static async Task<JsonNode> Solve(JsonObject task)
    {
        var created = await Call("createTask", new JsonObject { ["task"] = task });
        if ((string?)created["status"] == "ready") return created["solution"]!; // synchronous types
        var taskId = (string)created["taskId"]!;
        for (var i = 0; i < 36; i++) // poll every 5 seconds, for up to about 3 minutes
        {
            await Task.Delay(5000);
            var result = await Call("getTaskResult", new JsonObject { ["taskId"] = taskId });
            if ((string?)result["status"] == "ready") return result["solution"]!;
        }
        throw new TimeoutException(taskId);
    }

    static async Task Main()
    {
        var balance = await Call("getBalance", new JsonObject());
        Console.WriteLine($"balance (points): {balance["balance"]}");

        var solution = await Solve(new JsonObject
        {
            ["type"] = "NoCaptchaTaskProxyless",
            ["websiteURL"] = "https://www.google.com/recaptcha/api2/demo",
            ["websiteKey"] = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
        });
        Console.WriteLine(solution["gRecaptchaResponse"]);
    }
}
```

换成其他任务类型时，只要改 `Solve` 里的任务对象，字段见各 [任务类型](https://docs.yescaptcha.com/zh/tasks/) 页。同步类型（图像识别、`ImageToTextTaskOcrBase`）在 `createTask` 里直接返回结果，`Solve` 已经处理了这种情况。
