Çözümleri yinelemeden Python SDK hatalarını işleyin

solvethree tarafından3 dk okuma

Bağlantı zaman aşımı, görev oluşturmanın başarısız olduğunu kanıtlamaz. Özgün görev girdilerini ve requestId değerini saklayın; başka bir çözüm işlemi oluşturmadan önce bu isteği kurtarın.

Bu sayfada

Görev hatalarını HTTP hatalarından ayrı yakalayın

Senkron Python SDK'sının solve yöntemi bir görevi bir kez oluşturur ve hazır olana veya hata verene kadar yoklar. Başarısız bir çözüm işlemini kesintiye uğrayan bir HTTP isteğinden ayırt edebilmek için özel istisnaları SolvethreeError öncesinde yakalayın.

SOLVETHREE_API_KEY ve SOLVETHREE_PROXY değişkenlerini ayarlayın, ardından örnekteki ana makine adını ve eylemi hedefinizin değerleriyle değiştirin. Sitenin çözülebilmesi için etkin bir çalışma alanı profiline ihtiyacı vardır.

Python · hataları ayırt etme ve kesintiye uğrayan istekleri kurtarma
import os
import uuid
from solvethree import Solvethree, ApiError, TaskFailedError, SolvethreeError

client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
task = {"site": "accounts.example.com", "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"], "requestId": str(uuid.uuid4())}
try:
    result = client.solve(task, timeout=180)
    print("Ready task:", result["id"])
    # Submit result["solution"] privately through the target application.
except TaskFailedError as error:
    print("Failed task:", error.task_id, "code:", error.error_code)
    # This task is terminal. Inspect it before starting different work.
except ApiError as error:
    print("HTTP status:", error.status, "retry delay:", error.retry_after)
    print("Recovery IDs:", error.request_id, error.task_id)
    # A known task_id means resume get_task; otherwise replay the exact task
    # with error.request_id. Do not generate a new logical request to recover it.
except SolvethreeError as error:
    print("Recovery IDs:", error.request_id, error.task_id)
    # Save these IDs and the original task inputs for explicit recovery.
  • TaskFailedError: görev nihai failed durumuna ulaştı. error.task_id ve error.error_code alanlarını inceleyin; bu görevi yoklamaya devam etmeyin.
  • ApiError: bir HTTP isteği başarısız oldu. error.status ve saniye cinsinden ölçülen error.retry_after alanlarını inceleyin. Bu, nihai bir görev hatasıyla aynı şey değildir.
  • SolvethreeError: açıkça kurtarma yapabilmek için error.request_id ve error.task_id değerlerini saklayın. Oluşturmanın hiç gerçekleşmediğini varsaymak yerine mevcut kimlikleri kullanın.

Örnek, kurtarma bilgilerini yazdırır ancak bunları kalıcı olarak saklamaz veya kurtarma işlemi yapmaz. Süreç yeniden başlatıldığında da çalışmaya devam etmesi gereken bir entegrasyonda, solve çağrısından önce özgün görev girdilerini ve istek kimliğini kaydedin, ardından döndürülen görev kimliğini de saklayın. Proxy kimlik bilgileri içeren kayıtlı girdileri koruyun.

Görev kimliğiyle devam edin; oluşturmayı istek kimliğiyle kurtarın

  1. 1.

    task_id varsa get_task ile devam edin

    solve yöntemini yeniden çağırmak yerine bu görevi alın. get_task, görev kimliğini ve bir wait_ms bağımsız değişkenini kabul eder; varsayılan bekleme süresi 15000 milisaniyedir. Durum pending veya solving olduğu sürece devam edin. Çözümü yalnızca durum ready olduğunda kullanın ve failed durumunda durun.

  2. 2.

    Görev kimliğini almadan önce oluşturma kesintiye uğradıysa create_task çağrısını yeniden gönderin

    Gerektiğinde kurtarılan request_id değerini kullanarak aynı görev girdilerini aynı requestId ile gönderin. Bu kimliği aynı istekle yeniden kullanmak mevcut görevi döndürür; girdileri değiştirmek çakışmaya yol açar. Görev kimliğini aldıktan sonra get_task ile devam edin.

  3. 3.

    Kurtarma sırasında başka bir kimlik üretmeyin

    Örnek, UUID değerini solve çağrısından önce üretir. Kurtarma sırasında bu değeri koruyun; görev oluşturma kodunu yeniden çalıştırıp yanlışlıkla değiştirmeyin. Yeni bir kimlik, kesintiye uğrayan isteğin yeniden denenmesini değil, ayrı bir isteği temsil eder.

SDK, belirtmezseniz bir requestId üretir, hatalarda kurtarma kimliklerini sunar ve görev oluşturmayı asla otomatik olarak yeniden denemez. solve sırasında, geçici yoklama hatalarında çözümün son süresi içinde Retry-After'a uyar. Çağrı yine de hata verirse başka bir çözüm işlemi başlatmak yerine kayıtlı kimlikleri kullanarak devam edin.

Kurtarma, geçersiz istekleri tekrarlamak için bir gerekçe değildir

ApiError durumunda herhangi bir şeyi yeniden göndermeye karar vermeden önce HTTP hatasını inceleyin. Sonuç belirsiz olduğunda kesintiye uğrayan oluşturmayı kurtarmak uygundur; değiştirilmemiş geçersiz girdileri körü körüne yeniden göndermek uygun değildir.

TaskFailedError durumunda görev tamamlanmıştır. Alınan başarısız bir görev errorCode ve error içerir; Python istisnası kodu error.error_code olarak sunar. Nelerin değiştirilmesi gerektiğine karar vermek için bu bilgileri kullanın. Örneğin site-unreachable, hesapta kredi olmadığını varsaymayı değil, hedefin erişilebilirliğini araştırmayı gerektirir. Başarısız çözüm işlemlerinin ücretleri iade edilir.

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

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

Çalışma alanı oluşturun
Çözümleri yinelemeden Python SDK hatalarını işleyin · solvethree