aiohttp ile reCAPTCHA çözün ve gönderin
aiohttp ile doğrudan REST API'sini kullanın: tek bir görev oluşturun, hazır olana kadar sorgulayın, ardından solution.token değerini hedefe gönderin. Çalışma alanınızın Bearer token'ının hedefe asla ulaşmaması için API ve hedef isteklerini ayrı oturumlarda tutun.
Örnek Python 3.11+ gerektirir ve oluşturma, sorgulama ve hedefe gönderme işlemlerinin tamamını 180 saniyelik tek bir süre sınırına dahil eder. Bu, uygulama zaman aşımıdır; taahhüt edilen bir çözüm süresi değildir.
Bu sayfada
Siteyi, proxy'yi ve hedef isteğini ayarlayın
- SOLVETHREE_API_KEY değerini çalışma alanınızın API anahtarına ayarlayın. Anahtarı sunucuda tutun.
- SOLVETHREE_PROXY değerini, hizmetin çözüm için kullanacağı proxy URL'sine ayarlayın. Hedefe gönderimde de aynı proxy kullanılır.
- accounts.example.com ve login eylemini, entegrasyonunuzun kullandığı ana makine adı ve eylemle değiştirin. Sitenin çalışma alanınızda kullanılabilen etkin bir profili olmalıdır; görev oluşturmadan önce profili ayarlayın.
- Hedef giriş URL'sini ve form verilerini gerçek uygulama isteğiyle değiştirin. Örnek yalnızca g-recaptcha-response gönderir; hedefinizin gerektirdiği diğer alanları ekleyin ve beklediği token alanını kullanın.
Görev site, action ve tek bir proxy gönderir. Varsayılan olarak reCAPTCHA Enterprise v3 kullanılır; type veya url alanları eklemeyin. Hedef akış önceki bir istekten gelen çerezlere ihtiyaç duyuyorsa bu istekleri hedef oturumu üzerinden yapın; örnek yeni bir oturumla başlar.
Bir kez oluşturun, sorgulayın, ardından gönderin
# pip install aiohttp
import asyncio
import os
import uuid
from urllib.parse import urlsplit, unquote
import aiohttp
async def main():
api = "https://api.solvethree.com/v1"
proxy = os.environ["SOLVETHREE_PROXY"]
task = {"site": "accounts.example.com", "action": "login", "proxy": proxy, "requestId": str(uuid.uuid4())}
task_id = None
try:
async with asyncio.timeout(180):
async with aiohttp.ClientSession(headers={"Authorization": "Bearer " + os.environ["SOLVETHREE_API_KEY"]}) as client:
async with client.post(api + "/tasks", params={"waitMs": 0}, json=task, allow_redirects=False) as response:
response.raise_for_status()
if response.status >= 300: raise RuntimeError("Unexpected API redirect")
result = await response.json()
task_id = result["id"]
while result["status"] in ("pending", "solving"):
async with client.get(api + "/tasks/" + task_id, params={"waitMs": 15000}, allow_redirects=False) as response:
response.raise_for_status()
if response.status >= 300: raise RuntimeError("Unexpected API redirect")
result = await response.json()
if result["status"] in ("pending", "solving"): await asyncio.sleep(1)
if result["status"] != "ready":
raise RuntimeError("Task failed: " + str(result.get("errorCode", "unknown")))
solution = result["solution"]
# A separate session prevents the API Bearer header reaching the target.
proxy_url = urlsplit(proxy)
netloc = proxy_url.netloc.rsplit("@", 1)[-1]
server = f"{proxy_url.scheme}://{netloc}"
auth = aiohttp.BasicAuth(unquote(proxy_url.username), unquote(proxy_url.password or "")) if proxy_url.username else None
async with aiohttp.ClientSession() as target:
async with target.post("https://accounts.example.com/login", proxy=server, proxy_auth=auth,
headers={"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]},
data={"g-recaptcha-response": solution["token"]}, allow_redirects=False) as response:
print("Application HTTP status:", response.status)
except TimeoutError:
print("Timed out; recover requestId", task["requestId"], "taskId", task_id)
raise
asyncio.run(main())Bu, resmi Python SDK'sındaki asenkron bir metot değil, doğrudan asenkron REST kullanımıdır. /v1/tasks adresine tek bir oluşturma POST isteği gönderir, döndürülen id değerini kaydeder ve bu görevi sorgulamak için GET isteklerini kullanır. pending ve solving döngüyü sürdürür; ready gönderime izin verir; failed durumundaki bir görev döngüyü durdurur.
Görev gövdesindeki proxy, solvethree'ye hangi proxy'yi kullanacağını bildirir. aiohttp proxy ve proxy_auth argümanları yalnızca hedef HTTP çağrısında yer alır; API çağrılarında kullanılmaz. Örnek, proxy kimlik bilgilerini proxy sunucusu URL'sinden ayırır ve token'ı döndürülen userAgent ve secChUa ile gönderir.
Oturumlar bilinçli olarak ayrılmıştır: Authorization üst bilgisi yalnızca API oturumunda bulunur. Yönlendirmeler devre dışıdır ve API yönlendirmeleri izlenmek yerine hata olarak ele alınır.
- Bir API isteği HTTP hatası döndürür.
Örnek, başarı yanıtının gövdesini okumadan önce HTTP durumunu kontrol eder.
Şunu deneyin: HTTP hatasını görev başarısızlığından ayrı ele alın. Yeniden denemeden önce geçersiz girdileri veya yetkilendirme sorunlarını düzeltin.
- Görev failed durumuna geçer.
Görev yanıtındaki errorCode ve error alanlarını inceleyin. Örnek yalnızca errorCode ile istisna fırlatır.
Şunu deneyin: Bu görevi sorgulamayı durdurun ve bildirilen nedeni giderin. Yeniden denemeden önce bildirilen nedeni düzeltin.
- Görev ready durumundadır ancak uygulama isteği reddeder.
Gönderilen token alanını, hedef URL'yi, döndürülen tarayıcı kimliğini ve proxy'yi, ayrıca gerekli form alanlarını veya çerezleri inceleyin.
Şunu deneyin: solution.token değerini döndürülen kimlikle aynı proxy üzerinden gönderin. Uygulama yanıtını hedefin başarı ölçütlerine göre değerlendirin; yalnızca yazdırılan HTTP durumu, isteğin kabul edildiğini göstermez.
Yeni bir çözüm satın almadan zaman aşımı sonrası devam edin
Oluşturma işleminin zaman aşımına uğraması, oluşturmanın başarısız olduğunu kanıtlamaz. Örnek, özgün girdileri task içinde tutar ve süre dolduğunda requestId ile task_id değerlerini yazdırır. Bu değişkenler yalnızca süreç çalışırken korunur; yazdırılan kimlikler eksiksiz bir kurtarma kaydı değildir.
- 1.
Oluşturmadan önce özgün isteği kaydedin
Yeniden başlatmalar sonrasında kurtarma için requestId ve proxy dahil görev gövdesinin tamamını güvenli biçimde saklayın. Örnek her çalıştırmada yeni bir UUID üretir; dolayısıyla yalnızca yeniden çalıştırmak yeni bir mantıksal istek oluşturur.
- 2.
Mevcut göreve devam edin
Elinizde task_id varsa o görevi alın. Oluşturma işlemi siz kimlik alamadan zaman aşımına uğradıysa kaydedilmiş, değiştirilmemiş görev gövdesi ve requestId ile oluşturma işlemini tekrarlayın. API mevcut görevi döndürür; aynı kimliği yeniden kullanırken girdileri değiştirmek çakışmaya yol açar.
- 3.
Gönderimin zaten yapılıp yapılmadığını kontrol edin
Süre sınırı hedef POST isteğini de kapsar. Bu istek zaman aşımına uğradıysa yeniden göndermeden önce uygulamadaki sonucu inceleyin: istemciniz yanıt almamış olsa bile uygulama isteği almış olabilir. solvethree görevinin kurtarılması, hedefte ne olduğunu belirlemez.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.