Ruby ile reCAPTCHA Enterprise çözün

solvethree tarafından3 dk okuma

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. 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. 2.

    Ortam değişkenlerini ayarlayın

    SOLVETHREE_API_KEY değişkenini çalışma alanınızın API anahtarına, SOLVETHREE_PROXY değişkenini ise token'ı hedefe gönderirken de kullanacağınız HTTP veya HTTPS proxy URL'sine ayarlayın. Anahtarı sunucuda tutun.

  3. 3.

    Örnek girdileri değiştirin

    accounts.example.com değerini tam URL ile değil hedef ana makine adıyla, login değerini ise hedefin gerektirdiği eylemle değiştirin. İstek tek bir proxy kullanır; ayrıca proxyCandidates eklemeyin. type ve url alanlarını dahil etmeyin. recaptchaType belirtilmezse varsayılan enterprise-v3 seç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

Ruby · tek bir oluşturma ve sonlu durum sorgulama
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
end

Betik 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 failed durumuna geçer.

Sonuçtaki hem errorCode hem de error alanlarını inceleyin. Örneğin fırlattığı hata mesajı yalnızca errorCode iç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 requestId değ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.

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

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

Çalışma alanı oluşturun
Ruby ile reCAPTCHA Enterprise çözün · solvethree