Metadata-Version: 2.4
Name: captcha-solver-sdk
Version: 1.1.0
Summary: Python SDK for captcha-solver API — reCAPTCHA, Turnstile, hCaptcha, GeeTest, Tencent, and more
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Security
Classifier: Topic :: Internet :: WWW/HTTP
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: requires-python
Dynamic: summary

# captcha-solver-sdk

Python SDK for the captcha-solver API. Zero dependencies, supports reCAPTCHA, Turnstile, hCaptcha, GeeTest, Tencent, and more.

## Install

```bash
pip install captcha-solver-sdk
```

Or from source:
```bash
pip install git+https://github.com/your-org/captcha-solver-sdk.git
```

## Quick Start

```python
from captcha_solver_sdk import CaptchaSolver

solver = CaptchaSolver(
    api_key="sk_your_key_here",
    base_url="https://api.your-domain.com"  # or http://127.0.0.1:8900 for local
)

# reCAPTCHA v3
token = solver.recaptcha_v3(
    website_url="https://example.com/login",
    website_key="6LdyC2cUAAAAACGuDKpXeDorzUDWXmdqeg-xy696",
    page_action="login"
)

# reCAPTCHA v2
token = solver.recaptcha_v2(
    website_url="https://example.com",
    website_key="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
)

# Cloudflare Turnstile
token = solver.turnstile(
    website_url="https://example.com",
    website_key="0x4AAAAAAADnPIDROrmt1Wwj"
)

# hCaptcha
token = solver.hcaptcha(
    website_url="https://example.com",
    website_key="10000000-ffff-ffff-ffff-000000000001"
)

# GeeTest v4
result = solver.geetest_v4(
    website_url="https://gt4.geetest.com/",
    captcha_id="e392e1d7fd421dc63325744d5a2b9c73"
)
# result: {"captcha_id", "lot_number", "pass_token", "gen_time", "captcha_output"}

# Cloudflare Five-second Shield
result = solver.cloudflare_challenge("https://protected-site.com")
cookie = result["clearance_cookie"]
ua = result["user_agent"]

# Image OCR
import base64
with open("captcha.png", "rb") as f:
    text = solver.image_to_text(base64.b64encode(f.read()).decode())

# Tencent TCaptcha (Chinese)
result = solver.tencent(
    website_url="https://example.com",
    app_id="2043136173"
)
ticket = result["ticket"]

# Check balance
balance = solver.get_balance()
print(f"Balance: ${balance:.2f}")
```

## Selenium Integration

```python
from selenium import webdriver
from captcha_solver_sdk import CaptchaSolver

solver = CaptchaSolver(api_key="sk_...", base_url="https://api.example.com")
driver = webdriver.Chrome()
driver.get("https://example.com/login")

# Get sitekey from page
sitekey = driver.find_element("css selector", ".g-recaptcha").get_attribute("data-sitekey")
token = solver.recaptcha_v2(website_url=driver.current_url, website_key=sitekey)

# Inject token
driver.execute_script(f'document.getElementById("g-recaptcha-response").value = "{token}";')
driver.find_element("id", "submit").click()
```

## Playwright Integration

```python
from playwright.sync_api import sync_playwright
from captcha_solver_sdk import CaptchaSolver

solver = CaptchaSolver(api_key="sk_...", base_url="https://api.example.com")

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto("https://example.com/login")

    sitekey = page.get_attribute(".g-recaptcha", "data-sitekey")
    token = solver.recaptcha_v2(website_url=page.url, website_key=sitekey)

    page.evaluate(f'document.getElementById("g-recaptcha-response").value = "{token}"')
    page.click("#submit")
```

## Async Support

```python
import asyncio
from captcha_solver_sdk import CaptchaSolver

async def main():
    solver = CaptchaSolver(api_key="sk_...", base_url="https://api.example.com")
    # Use asyncio.to_thread for non-blocking calls
    token = await asyncio.to_thread(
        solver.recaptcha_v3,
        website_url="https://example.com",
        website_key="6Lf...",
        page_action="submit"
    )
    print(token)

asyncio.run(main())
```

## Supported Types

| Method | Task Type | Returns |
|---|---|---|
| `recaptcha_v2()` | ReCaptchaV2TaskProxyLess | token string |
| `recaptcha_v3()` | ReCaptchaV3TaskProxyLess | token string |
| `turnstile()` | AntiTurnstileTaskProxyLess | token string |
| `cloudflare_challenge()` | CloudflareChallengeTask | {clearance_cookie, user_agent, cookies} |
| `hcaptcha()` | HCaptchaTaskProxyLess | token string |
| `geetest_v4()` | GeeTestTask (v4) | {lot_number, pass_token, ...} |
| `geetest_v3()` | GeeTestTask (v3) | {challenge, validate, seccode} |
| `image_to_text()` | ImageToTextTask | text string |
| `slider_gap()` | SliderTask | {x, trajectory} |
| `rotate()` | RotateCaptchaTask | {angle, confidence} |
| `tencent()` | TencentCaptchaTask | {ticket, randstr} |
| `netease()` | NetEaseCaptchaTask | {NECaptchaValidate} |
| `aws_waf()` | AntiAwsWafTask | {token, cookie} |
| `datadome()` | DataDomeTask | {token, cookie} |
| `solve()` | any | dict |
