Çözümleri yinelemeden Python SDK hatalarını işleyin
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.
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 nihaifaileddurumuna ulaştı.error.task_idveerror.error_codealanlarını inceleyin; bu görevi yoklamaya devam etmeyin.ApiError: bir HTTP isteği başarısız oldu.error.statusve saniye cinsinden ölçülenerror.retry_afteralanlarını inceleyin. Bu, nihai bir görev hatasıyla aynı şey değildir.SolvethreeError: açıkça kurtarma yapabilmek içinerror.request_idveerror.task_iddeğ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.
task_id varsa get_task ile devam edin
solveyöntemini yeniden çağırmak yerine bu görevi alın.get_task, görev kimliğini ve birwait_msbağımsız değişkenini kabul eder; varsayılan bekleme süresi 15000 milisaniyedir. Durumpendingveyasolvingolduğu sürece devam edin. Çözümü yalnızca durumreadyolduğunda kullanın vefaileddurumunda durun. - 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_iddeğerini kullanarak aynı görev girdilerini aynırequestIdile 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 sonraget_taskile devam edin. - 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.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.