FastAPI arka ucundan solvethree'yi çağırın
Görevi, tüm çözüm tamamlandıktan sonra değil, oluşturulduktan sonra döndürün. Çağıran, durum ready veya failed olana kadar görevi alır; çözüm başarılıysa token'ı hedefe gönderir.
Bu sayfada
Sunucuyu ve hedefi yapılandırın
Python 3.10 veya üzerini kullanın. FastAPI'yi python -m pip install "fastapi[standard]" ile, ardından resmi SDK'yı python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl ile yükleyin.
Uygulamayı başlatmadan önce sunucu sürecinde şu ortam değişkenlerini ayarlayın:
SOLVETHREE_API_KEY: çalışma alanı API anahtarınız. Sunucuda tutun; SDK bunu solvethree ile kimlik doğrulamak için kullanır.INTEGRATION_KEY: çağıranların FastAPI rotalarınızda kimlik doğrulamak içinX-Integration-Keybaşlığında gönderdiği ayrı bir gizli değer.CAPTCHA_SITE: tam URL değil, hedef ana makine adı.SOLVETHREE_PROXY: bu görev için kullanılan, yol, sorgu veya parça içermeyen HTTP veya HTTPS proxy URL'si.
Rotayı çağırmadan önce çalışma alanınızda hedef için etkin bir profil oluşturun. Örnek, eylemi login olarak sabitler; dolayısıyla profil ve amaçlanan hedef istek bu kullanımla eşleşmelidir. Ana makine adı sağlamak profil oluşturmaz; site profili kurulumuna bakın.
FastAPI rotalarını ekleyin ve çalıştırın
Bu örneği main.py olarak kaydedin. Her iki rota da X-Integration-Key gerektirir. Oluşturma rotası görevi tamamen sunucu yapılandırmasından oluşturur; çağıranlar istek gövdesinde site, eylem veya proxy sağlamaz.
# pip install "fastapi[standard]" and the official solvethree SDK wheel.
import hmac
import os
from fastapi import FastAPI, HTTPException, Request
from fastapi.concurrency import run_in_threadpool
from solvethree import Solvethree, SolvethreeError
app = FastAPI()
def authorize(request):
if not hmac.compare_digest(request.headers.get("x-integration-key", ""), os.environ["INTEGRATION_KEY"]):
raise HTTPException(status_code=401, detail="Unauthorized")
@app.post("/captcha/tasks")
async def create(request: Request):
authorize(request)
task = {"site": os.environ["CAPTCHA_SITE"], "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
if request.headers.get("x-request-id"):
task["requestId"] = request.headers["x-request-id"]
def submit():
return Solvethree(os.environ["SOLVETHREE_API_KEY"]).create_task(task, wait_ms=0, timeout=20)
try:
return await run_in_threadpool(submit)
except ValueError:
raise HTTPException(status_code=400, detail="Invalid task input")
except SolvethreeError as error:
raise HTTPException(status_code=502, detail={"requestId": error.request_id, "taskId": error.task_id})
@app.get("/captcha/tasks/{task_id}")
async def retrieve(task_id: str, request: Request):
authorize(request)
def fetch():
return Solvethree(os.environ["SOLVETHREE_API_KEY"]).get_task(task_id, wait_ms=15000, timeout=25)
try:
return await run_in_threadpool(fetch)
except ValueError:
raise HTTPException(status_code=400, detail="Invalid task ID")
except SolvethreeError as error:
raise HTTPException(status_code=502, detail={"requestId": error.request_id, "taskId": error.task_id})Görev varsayılan olarak reCAPTCHA Enterprise v3 kullanır. type veya url alanı olmadan site, action ve tek bir proxy gönderir.
Python SDK senkrondur. Doğrudan async def içinde çağrılması olay döngüsünü bloklayacağından her iki işleyici de run_in_threadpool kullanır. Oluşturma, 20 saniyelik SDK istek zaman aşımıyla wait_ms=0 kullanır; alma ise 25 saniyelik SDK istek zaman aşımıyla 15 saniyelik beklemeye izin verir. İşleyicilerin hiçbiri client.solve kullanarak tüm çözüm boyunca beklemez.
Yerel geliştirme için dosyanın bulunduğu dizinden fastapi dev main.py komutunu çalıştırın. Rotalar POST http://127.0.0.1:8000/captcha/tasks ve GET http://127.0.0.1:8000/captcha/tasks/{task_id} şeklindedir. FastAPI, app nesnesini bulur; kaydedilecek ayrı bir URLconf yoktur.
Görev oluşturun, görevi alın ve kesintiye uğrayan istekleri kurtarın
- 1.
Sabit bir istek kimliğiyle bir kez oluşturun
X-Integration-Key ve bu mantıksal görev için sakladığınız bir X-Request-ID ile POST /captcha/tasks isteği gönderin. İstek kimliği 1–64 ASCII harfi, rakam, alt çizgi veya kısa çizgi içermelidir. Rota bunu solvethree'ye requestId olarak iletir. Döndürülen görev kimliğini kaydedin.
- 2.
Görev durumunu okumadan önce HTTP durumunu kontrol edin
Sarmalayıcı, başarısız kimlik doğrulama için 401, ValueError girdi hataları için 400 ve yakalanan SolvethreeError istisnaları için 502 döndürür. 502 yanıtının ayrıntısı, SDK hatasındaki requestId ve taskId değerlerini içerir. Yanıtı görev olarak ele almadan önce bu HTTP hatasını işleyin.
- 3.
Mevcut görevi alın
X-Integration-Key ile GET /captcha/tasks/{task_id} çağrısı yapın. Her başarılı HTTP yanıtından sonra status değerini inceleyin. Alma işlemi, bekleme süresi bittikten sonra bile son duruma ulaşmamış bir görev döndürebilir; başka bir görev oluşturmak yerine aynı görevi tekrar alın.
- 4.
Sonucu belirsiz oluşturma isteğini kurtarın
Oluşturma zaman aşımına uğrarsa ve görev kimliğiniz varsa görevi alın. Aksi halde ilk X-Request-ID değeriniz ve değiştirilmemiş sunucu tarafı görev girdileriyle POST isteğini tekrarlayın. Bu kimliği aynı görevle yeniden kullanmak mevcut görevi döndürür; değiştirilen girdiler çakışmaya yol açar. İlk kimliği, hata yanıtındaki requestId ile değiştirmek yerine ayrı olarak saklayın.
| Görev durumu | Çağıranın yapacağı işlem |
|---|---|
| pending veya solving | Aynı görevi almaya devam edin. Henüz kullanılabilir bir çözüm yok. |
| hazır | solution değerini okuyun ve hedef isteği hazırlayın. |
| failed | Sorgulamayı durdurun. Yeni bir görevin anlamlı olup olmadığına karar vermeden önce errorCode ve error değerlerini inceleyin; başarısız çözümlerin ücreti iade edilir. |
Token'ı ilk proxy ve döndürülen kimlikle gönderin
Bu rotalar görev verilerini döndürür; hedef web sitesine hiçbir şey göndermez. Durum ready olduğunda hedef isteği yapan bileşen görev kimliğini değil, solution.token değerini kullanmalıdır.
Döndürülen solution.userAgent ve solution.secChUa tarayıcı kimliğiyle, görevi oluşturmak için kullanılan aynı proxy üzerinden gönderin. Mevcut ortamın hâlâ aynı proxy'yi içerdiğini varsaymak yerine ilk görev yapılandırmasını saklayın. SDK'nın successful_proxy(original_task, ready_result) yardımcısı, proxy'yi bu ilk görevden seçer.
Gönderimi amaçlanan hedef ve eylemle bağlı tutun. ready durumundaki bir görev, solvethree'nin çözüm ürettiği anlamına gelir; uygulama isteğinin kabul edilip edilmediğini yalnızca hedefin yanıtı gösterir.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.