PowerShell'den CAPTCHA API'sini çağırın
solvethree'yi doğrudan çağırmak için PowerShell 7.5+ ve Invoke-RestMethod kullanın. Aşağıdaki betik tek bir reCAPTCHA Enterprise görevi oluşturur ve görev tamamlanana veya yerel bekleme bütçesi tükenene kadar aynı görev kimliğini sorgular.
Bu sayfada
Kimlik bilgilerini ve hedef girdilerini ayarlayın
- 1.
Siteyi çalışma alanınızda kullanılabilir hale getirin
Konsolda hedef ana makine adı için etkin bir profil yapılandırın. Ana makine adı ve eylem göndermek profil oluşturmaz. Bu işlem henüz yapılmadıysa site profili kurulumuna bakın.
- 2.
Ortam değişkenlerini sağlayın
Normal gizli bilgi yönetimi yönteminizi kullanarak PowerShell işleminin ortamında
SOLVETHREE_API_KEYveSOLVETHREE_PROXYdeğişkenlerini ayarlayın. Çalıştırmadan önce ikisinin de değer içerdiğini kontrol edin. API anahtarı Bearer üstbilgisinde kullanılır; görev JSON'una konulmaz. - 3.
Örnek ana makine adını ve eylemi değiştirin
accounts.example.comvelogindeğerlerini entegrasyonunuzun gerektirdiği ana makine adı ve eylemle değiştirin. Tam URL değil, ana makine adı kullanın. İstek varsayılan olarak Enterprise v3 kullanır; bu nedenletypeveyaurlalanına ihtiyaç duymaz.
Bir kez oluşturun, ardından görev kimliğiyle sorgulayın
#requires -Version 7.5
$ErrorActionPreference = 'Stop'
$apiBase = 'https://api.solvethree.com/v1'
$headers = @{ Authorization = "Bearer $env:SOLVETHREE_API_KEY"; Accept = 'application/json' }
$taskInput = @{ site = 'accounts.example.com'; action = 'login'; proxy = $env:SOLVETHREE_PROXY; requestId = [guid]::NewGuid().ToString() }
$requestClock = [Diagnostics.Stopwatch]::StartNew()
function Call-TaskApi($Method, $Path, $Payload = $null) {
$remaining = 180 - $requestClock.Elapsed.TotalSeconds
if ($remaining -le 0) { throw 'Local deadline reached' }
$seconds = [int][Math]::Ceiling([Math]::Min(25, $remaining))
$options = @{ Method = $Method; Uri = "$apiBase$Path"; Headers = $headers;
ConnectionTimeoutSeconds = $seconds; OperationTimeoutSeconds = $seconds;
MaximumRetryCount = 0; MaximumRedirection = 0 }
if ($null -ne $Payload) { $options.Body = $Payload | ConvertTo-Json -Depth 6; $options.ContentType = 'application/json' }
Invoke-RestMethod @options
}
$taskId = $null
try {
$result = Call-TaskApi 'POST' '/tasks?waitMs=0' $taskInput
$taskId = $result.id
while ($result.status -in @('pending', 'solving')) {
$escapedId = [uri]::EscapeDataString($taskId)
$result = Call-TaskApi 'GET' "/tasks/$escapedId`?waitMs=15000"
if ($result.status -in @('pending', 'solving')) { Start-Sleep -Seconds 1 }
}
if ($result.status -ne 'ready') { throw "Task failed: $($result.errorCode)" }
Write-Host "Ready task: $taskId"
# Submit $result.solution.token with userAgent/secChUa and the original proxy.
} catch {
Write-Host "Recovery requestId=$($taskInput.requestId) taskId=$taskId"
throw
}Betik, /v1/tasks?waitMs=0 adresine bir POST gönderir. Sonraki istekler, döndürülen kimlik için waitMs=15000 kullanılarak yapılan GET istekleridir. pending ve solving döngüyü sürdürür; başka bir durum döngüyü sonlandırır.
ConvertTo-Json, elle tırnak içine alınmış JSON'a veya bir kabuk komutuna dayanmak yerine görev karma tablosunu serileştirir. Sorgulama başlamadan önce görev kimliğine URL kaçış işlemi uygulanır. Örneği uyarlarken bu kısımları koruyun.
Stopwatch, her API çağrısından önce 180 saniyelik yerel süre sınırını kontrol eder. Her çağrıya en fazla 25 saniyelik bağlantı ve işlem zaman aşımı tanınır; kalan süre azaldıkça bunlar da azaltılır. Sonlanmamış bir sorgulamadan sonra betik bir saniye bekler. Bu süre sınırı sonsuz sorgulamayı önler; geçen gerçek süreyi tam olarak sınırlamaz.
MaximumRetryCount = 0 otomatik HTTP yeniden denemelerini devre dışı bırakır; MaximumRedirection = 0 ise yönlendirmeleri reddeder. Burada kullanılan zaman aşımı parametreleri herhangi bir PowerShell 7 kurulumu değil, PowerShell 7.5+ gerektirir. Bu parametreler Microsoft'un Invoke-RestMethod başvuru belgesinde açıklanmıştır.
Görev kimliğini değil, token'ı kullanın
Durum ready olduğunda gönderilecek reCAPTCHA değeri $result.solution.token olur. $taskId yalnızca solvethree görevini tanımlar. Örnek, hedefinize uygulama isteği göndermeden önce durur.
Token'ı, döndürülen çözümün userAgent ve secChUa değerleriyle birlikte, ilk proxy'yi kullanarak gönderin. Bunların yerine ilgisiz bir tarayıcı kimliği kullanmayın veya token'ı farklı bir hedefe göndermeyin. ready, solvethree'nin bir çözüm ürettiği anlamına gelir; hedefin uygulama isteğinizi kabul ettiğini göstermez.
- Invoke-RestMethod bir HTTP veya bağlantı istisnası fırlatıyor
API isteği, betik başarılı bir yanıtı işleyemeden başarısız oldu. catch bloğu, kurtarma kimliklerini yazdırır ve asıl istisnayı yeniden fırlatır.
Şunu deneyin: Varsa HTTP durumunu ve yanıt ayrıntılarını inceleyin. Geçersiz girdileri değiştirmeden yeniden denemek yerine düzeltin. Görev oluşturmanın sonucu belirsizse aşağıda açıklandığı şekilde göreve yeniden erişin.
- Görev failed durumunu döndürüyor
Hem
$result.errorCodehem de$result.errordeğerini inceleyin. Betiğin sonlanmış görev için fırlattığı istisna yalnızca hata kodunu içerir.Şunu deneyin: Bu görevi sorgulamayı durdurun ve bildirilen nedeni giderin. Örneğin
site-unreachablebir görev hatasıdır; API isteğinin kendisinin başarısız olduğunun kanıtı değildir. CAPTCHA API hataları sayfasına bakın.
Başka bir görev oluşturmadan sonucu belirsiz bir isteği kurtarın
Zaman aşımı, oluşturma isteğinin başarısız olduğunu kanıtlamaz. catch bloğu requestId değerini ve alınmışsa taskId değerini yazdırır. Bu değerleri saklayın.
- 1.
Görev kimliğiniz varsa o görevi alın
Başka bir görev oluşturmak yerine GET
/v1/tasks/:idile devam edin. Betiğin yerel süre sınırına ulaşması, uzaktaki görevin başarısız olduğunu göstermez. - 2.
Oluşturma işleminden görev kimliği dönmediyse ilk isteği yeniden kullanın
Mevcut göreve yeniden erişmek için aynı görev girdilerini aynı
requestIdile tekrar gönderin. Bu kimliği yeniden kullanırken girdileri değiştirmek çakışmaya neden olur. - 3.
Kurtarma işlemi için bu betiği yeniden başlatmayın
Yeni bir çalıştırma yeni bir GUID, dolayısıyla yeni bir mantıksal istek üretir. Gözetimsiz kullanım için POST'tan önce ilk requestId değerini ve görev girdilerini güvenli biçimde kaydedin, ardından görev kimliği geldiğinde onu da kaydedin. Örnek, hata durumunda kurtarma kimliklerini yazdırır ancak işlem kaybı sonrasında bunları saklamaz.
Proxy URL'si kimlik bilgileri içeriyorsa kaydedilen girdileri normal günlüklere yazmayın. Kurtarma için API anahtarının başka bir kopyasına değil, ilk girdilere ihtiyacınız vardır.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.