aiohttp ermöglicht nicht blockierende HTTP-Anfragen in Python. Kombinieren Sie es mit CaptchaAI, um mehrere CAPTCHAs gleichzeitig zu lösen, ohne Ihre Ereignisschleife zu blockieren.
Anforderungen
| Anforderung | Einzelheiten |
|---|---|
| Python | 3.8+ |
| aiohttp | 3,8+ |
| CaptchaAI API-Schlüssel | Holen Sie sich hier eins |
pip install aiohttp
Asynchroner CaptchaAI-Client
import aiohttp
import asyncio
class AsyncCaptchaAI:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://ocr.captchaai.com"
async def submit(self, session, params):
"""Submit a CAPTCHA task and return the task ID."""
params["key"] = self.api_key
async with session.get(
f"{self.base_url}/in.php", params=params
) as resp:
text = await resp.text()
if not text.startswith("OK|"):
raise Exception(f"Submit failed: {text}")
return text.split("|")[1]
async def poll(self, session, task_id, timeout=300):
"""Poll for the result with a timeout."""
params = {
"key": self.api_key,
"action": "get",
"id": task_id,
}
deadline = asyncio.get_event_loop().time() + timeout
while asyncio.get_event_loop().time() < deadline:
await asyncio.sleep(5)
async with session.get(
f"{self.base_url}/res.php", params=params
) as resp:
text = await resp.text()
if text == "CAPCHA_NOT_READY":
continue
if text.startswith("OK|"):
return text.split("|", 1)[1]
raise Exception(f"Solve failed: {text}")
raise TimeoutError(f"Task {task_id} timed out after {timeout}s")
async def solve(self, session, params, timeout=300):
"""Submit and poll in one call."""
task_id = await self.submit(session, params)
return await self.poll(session, task_id, timeout)
async def get_balance(self, session):
"""Check account balance."""
params = {"key": self.api_key, "action": "getbalance"}
async with session.get(
f"{self.base_url}/res.php", params=params
) as resp:
return float(await resp.text())
Lösen Sie ein einzelnes CAPTCHA
import asyncio
import os
async def main():
solver = AsyncCaptchaAI(os.environ["CAPTCHAAI_API_KEY"])
async with aiohttp.ClientSession() as session:
# Check balance
balance = await solver.get_balance(session)
print(f"Balance: ${balance:.2f}")
# Solve reCAPTCHA v2
token = await solver.solve(session, {
"method": "userrecaptcha",
"googlekey": "6Le-wvkS...",
"pageurl": "https://example.com",
})
print(f"Token: {token[:50]}...")
asyncio.run(main())
Lösen Sie mehrere CAPTCHAs gleichzeitig
async def solve_batch(urls, site_key):
solver = AsyncCaptchaAI(os.environ["CAPTCHAAI_API_KEY"])
async with aiohttp.ClientSession() as session:
tasks = [
solver.solve(session, {
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": url,
})
for url in urls
]
results = await asyncio.gather(*tasks, return_exceptions=True)
for url, result in zip(urls, results):
if isinstance(result, Exception):
print(f"FAILED {url}: {result}")
else:
print(f"SOLVED {url}: {len(result)} chars")
return results
urls = [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3",
"https://example.com/page4",
"https://example.com/page5",
]
asyncio.run(solve_batch(urls, "6Le-wvkS..."))
Scraping mit CAPTCHA-Handhabung
async def scrape_with_captcha(url, site_key):
solver = AsyncCaptchaAI(os.environ["CAPTCHAAI_API_KEY"])
async with aiohttp.ClientSession() as session:
# Fetch the page
async with session.get(url) as resp:
html = await resp.text()
# Check if page has a CAPTCHA
if "g-recaptcha" not in html:
return html # No CAPTCHA, return content
# Solve the CAPTCHA
token = await solver.solve(session, {
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": url,
})
# Submit with solved token
async with session.post(url, data={
"g-recaptcha-response": token,
}) as resp:
return await resp.text()
Semaphor zur Geschwindigkeitskontrolle
Begrenzen Sie gleichzeitige Lösungen, um eine Überlastung der API zu vermeiden:
async def solve_with_limit(urls, site_key, max_concurrent=10):
solver = AsyncCaptchaAI(os.environ["CAPTCHAAI_API_KEY"])
semaphore = asyncio.Semaphore(max_concurrent)
async def solve_one(session, url):
async with semaphore:
return await solver.solve(session, {
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": url,
})
async with aiohttp.ClientSession() as session:
tasks = [solve_one(session, url) for url in urls]
results = await asyncio.gather(*tasks, return_exceptions=True)
solved = sum(1 for r in results if not isinstance(r, Exception))
print(f"Solved {solved}/{len(urls)} CAPTCHAs")
return results
Turnstile-Beispiel
async def solve_turnstile(url, sitekey):
solver = AsyncCaptchaAI(os.environ["CAPTCHAAI_API_KEY"])
async with aiohttp.ClientSession() as session:
token = await solver.solve(session, {
"method": "turnstile",
"sitekey": sitekey,
"pageurl": url,
})
return token
Fehlerbehebung
| Fehler | Ursache | Beheben |
|---|---|---|
ClientConnectorError |
Netzwerkproblem | Konnektivität prüfen |
Submit failed: ERROR_ZERO_BALANCE |
Keine Mittel | Konto aufladen |
TimeoutError |
Langsames Lösen | Erhöhen Sie den Timeout-Parameter |
RuntimeError: Event loop is closed |
Verwendung von asyncio.run in Jupyter |
Verwenden Sie nest_asyncio |
FAQ
Warum aiohttp statt httpx?
aiohttp ist die ausgereifteste asynchrone HTTP-Bibliothek in Python mit der besten Leistung für Workloads mit hoher Parallelität. httpx funktioniert auch – siehe unsereLeitfaden zur httpx-Integration.
Wie viele Lösungen kann ich gleichzeitig ausführen?
CaptchaAI verarbeitet mehr als 100 gleichzeitige Anfragen. Verwenden Sie eine Semaphore, um Ihre Parallelität entsprechend Ihrer Parallelität und Ihrem Kontostand zu steuern.
Kann ich die Sitzung für mehrere Lösungen wiederverwenden?
Ja, und das sollten Sie auch. aiohttp-Sitzungen verwalten Verbindungspools und beschleunigen so nachfolgende Anfragen.
Verwandte Leitfäden
- HTTPX + CaptchaAI-Integration
- Parallele vs. sequenzielle CAPTCHA-Performance
- Scrapy + CaptchaAI-Integration
Diskussionen (0)
Beteiligen Sie sich an der Unterhaltung
Melden Sie sich an, um Ihre Meinung zu teilen.
AnmeldenNoch keine Kommentare.