Integrationen

aiohttp + CaptchaAI: Asynchrone CAPTCHA-Lösung

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)

Noch keine Kommentare.