Ruby ile reCAPTCHA Enterprise çözün
Bir reCAPTCHA Enterprise görevi oluşturmak ve hazır olana veya başarısız olana kadar durumunu sorgulamak için Ruby'nin Net::HTTP kütüphanesini kullanın. Aşağıdaki örnek, solvethree REST API'sini doğrudan çağırır; Ruby SDK'sı gerektirmez.
Bu sayfada
Siteyi ve ortamı yapılandırın
- 1.
Site profilini etkinleştirin
Hedef ana makine adını solvethree konsolunda ayarlayın ve profilinin çalışma alanınız için etkin olduğundan emin olun. Ana makine adı ve eylem göndermek profil oluşturmaz. Site profili kurulumuna bakın.
- 2.
Ortam değişkenlerini ayarlayın
SOLVETHREE_API_KEYdeğişkenini çalışma alanınızın API anahtarına,SOLVETHREE_PROXYdeğişkenini ise token'ı hedefe gönderirken de kullanacağınız HTTP veya HTTPS proxy URL'sine ayarlayın. Anahtarı sunucuda tutun. - 3.
Örnek girdileri değiştirin
accounts.example.comdeğerini tam URL ile değil hedef ana makine adıyla,logindeğerini ise hedefin gerektirdiği eylemle değiştirin. İstek tek birproxykullanır; ayrıcaproxyCandidateseklemeyin.typeveurlalanlarını dahil etmeyin.recaptchaTypebelirtilmezse varsayılanenterprise-v3seçilir.
Örneği solve.rb olarak kaydedin ve bu değişkenleri ayarladıktan sonra Ruby ile çalıştırın. Örnek net/http, json ve securerandom kütüphanelerini yükler; JSON, istek gövdesini ve API yanıtlarını işler.
Bir kez oluşturun, ardından görev kimliğiyle sorgulayın
require 'net/http'
require 'json'
require 'securerandom'
api = 'https://api.solvethree.com/v1'
input = {site: 'accounts.example.com', action: 'login', proxy: ENV.fetch('SOLVETHREE_PROXY'), requestId: SecureRandom.uuid}
deadline = Process.clock_gettime(Process::CLOCK_MONOTONIC) + 180
call = lambda do |method, path, body = nil|
remaining = deadline - Process.clock_gettime(Process::CLOCK_MONOTONIC)
raise 'Local deadline reached' if remaining <= 0
uri = URI(api + path)
request = method == :post ? Net::HTTP::Post.new(uri) : Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer ' + ENV.fetch('SOLVETHREE_API_KEY')
request['Accept'] = 'application/json'
if body
request['Content-Type'] = 'application/json'
request.body = JSON.generate(body)
end
# Net::HTTP's own proxy configuration is separate from input[:proxy].
http = Net::HTTP.new(uri.hostname, uri.port, nil)
http.use_ssl = uri.scheme == 'https'
http.open_timeout = [10, remaining].min
http.read_timeout = [25, remaining].min
http.write_timeout = [25, remaining].min
http.max_retries = 0
response = http.request(request)
raise "API HTTP #{response.code}" unless response.is_a?(Net::HTTPSuccess)
JSON.parse(response.body)
end
task_id = nil
begin
result = call.call(:post, '/tasks?waitMs=0', input)
task_id = result.fetch('id')
while %w[pending solving].include?(result.fetch('status'))
result = call.call(:get, '/tasks/' + URI.encode_www_form_component(task_id) + '?waitMs=15000')
sleep(1) if %w[pending solving].include?(result.fetch('status'))
end
raise "Task failed: #{result['errorCode']}" unless result['status'] == 'ready'
puts "Ready task: #{task_id}"
# Submit result['solution']['token'] with its userAgent/secChUa and original proxy.
rescue StandardError => error
warn "Recovery requestId=#{input[:requestId]} taskId=#{task_id || 'unknown'}"
raise error
endBetik tek bir oluşturma isteği gönderir, döndürülen görev kimliğini kaydeder ve durumu pending veya solving olduğu sürece görevi sorgular. Yalnızca ready, kullanılabilir bir çözüm sağlar. Her yanıtın gövdesi başarılı sonuç verisi olarak ayrıştırılmadan önce başarılı bir HTTP durumuna sahip olması gerekir.
HTTPS açıkça etkinleştirilir. Otomatik yeniden denemeler devre dışıdır ve yönlendirmeler takip edilmek yerine HTTP durum kontrolüyle reddedilir. Görev gövdesindeki proxy çözüm işlemi içindir; Ruby'den solvethree API'sine yapılan bağlantıyı yapılandırmaz.
Ortak monoton son süre, sorgulamaya 180 saniyelik yerel bir süre bütçesi tanır. Bağlantı, okuma ve yazma zaman aşımları, her istek başladığında kalan süreye göre sınırlandırılır. Bu bütçeyi, devam eden bir isteği kesin olarak iptal eden bir zamanlayıcı değil, sorgulama sınırı olarak değerlendirin. Ruby Net::HTTP belgeleri, ayrı zaman aşımı ayarlarını açıklar.
Token'ı tarayıcı kimliğiyle gönderin
Örnek token'ı değil, hazır görevin kimliğini yazdırır. Hazır sonuçtan solution.token değerini okuyun ve hedef isteğin beklediği token alanına yerleştirin. Bunun yerine görev kimliğini göndermeyin.
User-Agent başlığı için döndürülen solution.userAgent, Sec-CH-UA için ise solution.secChUa değerini kullanın. Bu göreve verilen aynı proxy üzerinden amaçlanan hedefe gönderin. Döndürülen kimliği ilgisiz bir tarayıcının başlıklarıyla değiştirmeyin.
Hazır bir görev, solvethree'nin bir çözüm ürettiği anlamına gelir. Uygulama isteğinizi kabul edip etmediğini belirlemek için hedefin yanıtını ayrıca kontrol edin.
Yinelenen görevler oluşturmadan hataları işleyin
- Betik bir API HTTP hatası fırlatır.
Başarısız HTTP yanıtını inceleyin. Bu, görevin nihai sonucu değil, istek düzeyinde bir hatadır.
Şunu deneyin: Yeniden denemeden önce bu yanıtı inceleyerek sorunun nedenini belirleyin. Değiştirilmemiş geçersiz girdileri tekrar tekrar göndermeyin.
- Görev
faileddurumuna geçer. Sonuçtaki hem
errorCodehem deerroralanlarını inceleyin. Örneğin fırlattığı hata mesajı yalnızcaerrorCodeiçerir.Şunu deneyin: Bu görevi sorgulamayı durdurun ve bildirilen nedeni giderin. Başarısız çözümlerin ücreti iade edilir; başarısızlık mutlaka yetersiz bakiye anlamına gelmez.
- Görev kimliği alınmadan önce oluşturma işlemi zaman aşımına uğrar.
Standart hata çıktısına yazılan kurtarma
requestIddeğerini saklayın. Zaman aşımı, oluşturma işleminin başarısız olduğunu kanıtlamaz.Şunu deneyin: Aynı görev isteğini aynı istek kimliğiyle göndererek kurtarma işlemi yapın. Betiği doğrudan yeniden çalıştırmayın: yeni bir çalıştırma yeni bir kimlik üretir ve başka bir görev oluşturabilir.
- Sorgulama yerel son süreye ulaşır veya bağlantısını kaybeder.
Günlüğe kaydedilen görev kimliğini ve istek kimliğini saklayın.
Şunu deneyin: Başka bir görev oluşturmadan önce bilinen görev kimliğiyle görevi alın. Yerel bir istisna, nihai görev durumu değildir.
Süreç yeniden başlatıldığında kurtarma yapabilmek için POST isteğini göndermeden önce istek kimliğini ve özgün görev girdilerini saklayın, ardından görev kimliği döndüğünde onu da saklayın. Bir istek kimliğini aynı girdilerle yeniden kullanmak mevcut görevi döndürür; aynı kimliği koruyup girdileri değiştirmek çakışmaya neden olur. Sonraki tanılama adımı için API hata işlemeye bakın.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.