ASP.NET Core arka ucundan solvethree'yi çağırın

solvethree tarafından4 dk okuma

Türlendirilmiş bir HttpClient kaydedin, görevi bir kez oluşturun, ardından belirli bir son süre içinde durumunu sorgulayın. API anahtarını sunucuda tutun ve istemciyi çağıran tüm uygulama rotalarını koruyun.

Aşağıdaki örnek, reCAPTCHA Enterprise için bir REST yardımcı sınıfıdır; resmî bir C# SDK’sı değildir. Görev oluşturma ve sorgulama işlemlerini ayrı tutar; böylece uygulamanızın çözüm tamamlanana kadar gelen bir isteği açık tutması gerekmez.

Bu sayfada

Türlendirilmiş istemciyi kaydedin

Önce konsolda çalışma alanınız için hedef sitenin profilini etkinleştirin. Ana makine adı ve eylem göndermek profil oluşturmaz. Site henüz yapılandırılmadıysa site profili kurulumuna bakın.

Çalışma alanı anahtarını sunucu yapılandırmasına SOLVETHREE_API_KEY olarak ekleyin. İstemci sınıfını ekleyin, ardından Program.cs altında gösterilen kayıt kodunu yorum satırı olmaktan çıkarıp builder.Build() öncesine yerleştirin.

ASP.NET Core · türlendirilmiş bir HTTP istemcisi
// CaptchaClient.cs; .NET 8+, System.Net.Http.Json and System.Text.Json.Nodes.
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json.Nodes;

public sealed class CaptchaClient(HttpClient http)
{
    public async Task<JsonObject> CreateAsync(string site, string proxy, string requestId,
        CancellationToken cancellationToken)
    {
        using var response = await http.PostAsJsonAsync("tasks?waitMs=0",
            new { site, action = "login", proxy, requestId }, cancellationToken);
        response.EnsureSuccessStatusCode();
        return (await response.Content.ReadFromJsonAsync<JsonObject>(cancellationToken))!;
    }
    public async Task<JsonObject> GetAsync(string id, CancellationToken cancellationToken)
    {
        using var response = await http.GetAsync("tasks/" + Uri.EscapeDataString(id) + "?waitMs=15000",
            cancellationToken);
        response.EnsureSuccessStatusCode();
        return (await response.Content.ReadFromJsonAsync<JsonObject>(cancellationToken))!;
    }
}
// Program.cs, before builder.Build(), in an existing authenticated ASP.NET app:
// builder.Services.AddHttpClient<CaptchaClient>(http => {
//     http.BaseAddress = new Uri("https://api.solvethree.com/v1/");
//     http.Timeout = TimeSpan.FromSeconds(25);
//     http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
//         "Bearer", builder.Configuration["SOLVETHREE_API_KEY"]
//             ?? throw new InvalidOperationException("Missing API key"));
// }).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler {
//     AllowAutoRedirect = false
// });
// Inject CaptchaClient into your authenticated controller/service. Pass its
// cancellation token, create once, save id and poll GetAsync with a finite deadline.

Kayıt işlemi API temel adresini, Bearer kimlik doğrulamasını ve 25 saniyelik aktarım zaman aşımını ayarlar; otomatik yönlendirmeleri devre dışı bırakır. Temel adresin sonundaki eğik çizgiyi koruyun: istemcinin göreli tasks yolları /v1/ altında çözümlenmelidir.

Yardımcı sınıf HttpClient’ın JSON uzantılarını kullanır ve bir JsonObject döndürür. Her iki metot da serileştirmeyi geri almadan önce HTTP yanıtının başarılı olduğunu kontrol eder. CaptchaClient sınıfını kimlik doğrulaması uygulanan bir denetleyiciye veya servise enjekte edin; yardımcı sınıfın kendisi uygulamanızı çağıranların kimliğini doğrulamaz veya yetkilerini denetlemez.

Bir kez oluşturun ve yeniden erişim bilgilerini kaydedin

  1. 1.

    Siteyi, eylemi ve proxy’yi seçin

    site olarak tam URL’yi değil, hedef ana makine adını iletin. Bu örnek action değerini login olarak sabitler; bunu hedefinizin beklediği eylemle değiştirin. Tek bir proxy gönderir ve varsayılan enterprise-v3 reCAPTCHA modunu kullanır. type veya url alanlarını eklemeyin.

  2. 2.

    CreateAsync çağrısından önce bir requestId kaydedin

    1–64 ASCII harfi, rakam, alt çizgi veya kısa çizgi kullanın. Yanıt kaybolursa aynı mantıksal göreve yeniden erişebilmek için bunu görev girdilerinin tam hâliyle birlikte kaydedin.

  3. 3.

    CreateAsync çağrısını yapın ve dönen görev kimliğini kaydedin

    CreateAsync, waitMs=0 ile tek bir POST isteği yapar. Çağıranın CancellationToken değerini iletin. Görev kimliğini aldıktan sonra başka bir görev oluşturmak yerine bu görevi sorgulamak için GetAsync kullanın.

Çalışma alanı kredilerini harcama iznini uygulamanızın yetkilendirme kontrolleriyle koruyun. Bu değerler gelen bir istekten alınıyorsa istenen site, eylem ve proxy’yi çağıranın kullanmasına izin verilen değerlerle karşılaştırarak doğrulayın.

Genel bir son süreyle durum sorgulayın

GetAsync, bilinen görev kimliğini kaçış işleminden geçirir ve waitMs=15000 ister. 25 saniyelik HttpClient zaman aşımı her HTTP isteğini sınırlar; uygulamanızın durum sorgulamak için harcadığı toplam süreyi sınırlamaz. Ayrı bir genel son süre belirleyin ve iptal bilgisini her çağrıya iletin.

  • pending veya solving: yalnızca sorgulama için belirlenen son süre ve çağıranın iptal durumu izin verdiği sürece devam edin.
  • ready: durum sorgulamayı bırakın ve çözümü okuyun. Kullanılabilir bir çözüm içeren tek durum budur.
  • failed: sorgulamayı durdurun ve errorCode ile error alanlarını inceleyin.

Tarayıcıya hizmet veren bir uygulamada, görev bitene kadar gelen tek bir isteğin içinde döngü kurmak yerine oluşturma ve sonraki durum kontrollerini ayrı, korumalı işlemler olarak tutun. Yerel son süre dolduğunda görev kimliğini saklayın; böylece daha sonraki yetkili bir istek görevi sorgulayabilir.

Token’ı amaçlanan hedefe gönderirken çözümde dönen userAgent ve secChUa kimlik bilgilerini ve çözüm için kullanılan aynı proxy’yi kullanın. Hazır bir görev, çözüm üretildiği anlamına gelir; uygulama isteğinizin başarılı olduğu anlamına gelmez.

Yinelenen iş oluşturmadan zaman aşımından sonra göreve yeniden erişin

CreateAsync, kimliği almadan önce zaman aşımına uğrar veya iptal edilir.

Sunucu görevi zaten oluşturmuş olabilir. Yerel iptal, uzaktaki işi iptal etmez.

Şunu deneyin: Aynı görev girdilerini kaydedilen requestId ile yeniden göndererek göreve yeniden erişin. Aynı kimlik ve girdiler mevcut görevi döndürür; aynı kimliği yeniden kullanırken girdileri değiştirmek çakışmaya yol açar.

GetAsync zaman aşımına uğrar veya durum sorgulama için belirlenen son süre dolar.

Zaten bir görev kimliğiniz olduğundan, yanıtın gelmemesi yeni bir görev oluşturmanızı gerektirmez.

Şunu deneyin: Kimliği saklayın ve bu görevi daha sonra süresi sınırlandırılmış yeni bir işlem içinde sorgulayın.

HTTP çağrısı başarılı olmayan bir yanıt döndürür.

EnsureSuccessStatusCode, yardımcı sınıf başarı yanıtının içeriğini okumadan önce istisna fırlatır. Bu, durumu failed olan bir görev almaktan farklıdır.

Şunu deneyin: HTTP hatasını ayrı ele alın. Geçersiz girdileri değiştirmeden yeniden denemek yerine düzeltin.

Görev failed durumuna geçer.

site-unreachable gibi görev hataları için errorCode ve error alanlarını okuyun.

Şunu deneyin: Bu görevin durumunu sorgulamayı bırakın ve başka bir çözüm başlatmadan önce bildirilen nedeni giderin.

Reddedilen bir API isteği ile nihai çözüm başarısızlığını ayırt etmeniz gerektiğinde API hata kılavuzunu kullanın.

İlk görevinizi çalıştırın.

$5 çalışma alanı kredisiyle başlayın.

Çalışma alanı oluşturun
ASP.NET Core arka ucundan solvethree'yi çağırın · solvethree