Skip to content

Commit 39fb011

Browse files
committed
Optimize README and package metadata for search
Reworks the README around the terms people actually search for: a supported-captcha table keyed by how each type gets searched, a section on why solving locally beats a per-solve cloud API, a 2captcha alternative section, worked Selenium and Playwright snippets, and an FAQ aimed at question searches. Adds a PyPI badge and internal links to the other CapSkip clients. Expands PyPI keywords from 8 to 30 and rewrites the package description, since PyPI search weights both heavily. Adds the 3.13, OS Independent, Browsers and Utilities classifiers. No behaviour change: 90 tests still passing.
1 parent 34b73c5 commit 39fb011

2 files changed

Lines changed: 155 additions & 22 deletions

File tree

README.md

Lines changed: 129 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,51 @@
1-
# CapSkip Python SDK
1+
# CapSkip Python SDK — Captcha Solver for Python
22

3+
[![PyPI](https://img.shields.io/pypi/v/capskip.svg)](https://pypi.org/project/capskip/)
34
[![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
45
[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
56
[![Tests](https://github.com/capskip/capskip-python/actions/workflows/ci.yml/badge.svg)](https://github.com/capskip/capskip-python/actions/workflows/ci.yml)
67

7-
Official Python client for the [CapSkip](https://capskip.com) **local** captcha solver.
8+
**Solve reCAPTCHA v2, reCAPTCHA v3, Cloudflare Turnstile, GeeTest and image captchas from Python.**
89

9-
CapSkip runs on your machine and exposes a standard captcha-solver HTTP API (the familiar `in.php` / `res.php` endpoints). This SDK wraps that API with clean, familiar method names, so you can solve captchas locally — no per-solve API fees beyond your CapSkip license.
10+
Official Python client for [CapSkip](https://capskip.com), a **local captcha solver** that runs on your own machine. Licensed once, not billed per solve.
11+
12+
```bash
13+
pip install capskip
14+
```
15+
16+
---
17+
18+
## How it works
19+
20+
CapSkip is a desktop app. It does the solving on your machine and exposes the standard captcha-solver HTTP API — the same `in.php` / `res.php` endpoints every 2captcha-compatible client already speaks — on `127.0.0.1:8080`.
21+
22+
This SDK is a thin wrapper over that API, with the method names you would expect: `normal()`, `recaptcha()`, `turnstile()`, `geetest()`. Nothing leaves your network, and there is no credit balance to keep an eye on.
23+
24+
## Supported captcha types
25+
26+
| Captcha | Method |
27+
|---|---|
28+
| **Image captcha solver** (distorted text / OCR) | `solver.normal(file)` |
29+
| **reCAPTCHA v2 solver** (checkbox) | `solver.recaptcha(sitekey, url)` |
30+
| **reCAPTCHA v2 invisible solver** | `solver.recaptcha(..., invisible=1)` |
31+
| **reCAPTCHA Enterprise solver** | `solver.recaptcha(..., enterprise=1)` |
32+
| **reCAPTCHA v3 solver** | `solver.recaptcha(..., version="v3", action="submit")` |
33+
| reCAPTCHA v3 Enterprise | `solver.recaptcha(..., version="v3", enterprise=1)` |
34+
| **Cloudflare Turnstile solver** (widget) | `solver.turnstile(sitekey, url)` |
35+
| Cloudflare Turnstile (challenge page) | `solver.turnstile(..., data=..., pagedata=...)` |
36+
| **GeeTest v3 solver** (slide puzzle) | `solver.geetest(gt, challenge, url)` |
37+
38+
**hCaptcha and FunCaptcha/Arkose are not supported.** hCaptcha is the one people misidentify most often, since it also puts a `data-sitekey` on the widget — check for `class="h-captcha"` or a `js.hcaptcha.com` script before reaching for `recaptcha()`.
39+
40+
Point the SDK at the [live captcha demo pages](https://capskip.com/captcha-demo/) to sanity-check your setup against real widgets.
1041

1142
---
1243

1344
## Quick start (5 minutes)
1445

15-
### 1. Install CapSkip
46+
### 1. Install the CapSkip captcha solver
1647

17-
Download and run the CapSkip desktop app from [capskip.com](https://capskip.com). Leave it running in the background.
48+
Download and run the CapSkip desktop app from [capskip.com](https://capskip.com/download/). Leave it running in the background.
1849

1950
In CapSkip settings, note:
2051

@@ -54,19 +85,20 @@ print(result["code"]) # g-recaptcha-response token
5485
5586
---
5687

57-
## Supported captcha types
88+
## Why solve captchas locally
5889

59-
| Type | SDK method |
60-
|---|---|
61-
| Image CAPTCHA (distorted text) | `solver.normal(file)` |
62-
| reCAPTCHA v2 (checkbox) | `solver.recaptcha(sitekey, url)` |
63-
| reCAPTCHA v2 Invisible | `solver.recaptcha(..., invisible=1)` |
64-
| reCAPTCHA v2 Enterprise | `solver.recaptcha(..., enterprise=1)` |
65-
| reCAPTCHA v3 | `solver.recaptcha(..., version="v3")` |
66-
| reCAPTCHA v3 Enterprise | `solver.recaptcha(..., version="v3", enterprise=1)` |
67-
| Cloudflare Turnstile (widget) | `solver.turnstile(sitekey, url)` |
68-
| Cloudflare Turnstile (challenge page) | `solver.turnstile(..., data=..., pagedata=...)` |
69-
| GeeTest v3 (slide) | `solver.geetest(gt, challenge, url)` |
90+
Cloud captcha APIs charge per solve, which turns a retry loop into an expense and routes every page URL and sitekey you touch through someone else's queue.
91+
92+
CapSkip flips that around:
93+
94+
- **Unlimited solving** — one license, no per-captcha charge, no balance to top up
95+
- **Runs on `127.0.0.1`** — the SDK never talks to a third-party server
96+
- **No per-key rate limit** — throughput is whatever your machine can manage
97+
- **Fast** — image captchas come back in well under a second; a typical reCAPTCHA v2 lands in 30–45 seconds
98+
99+
### Coming from 2captcha or Anti-Captcha
100+
101+
CapSkip answers on the same `in.php` / `res.php` endpoints, so it works as a **2captcha API alternative**: an existing integration usually needs nothing more than its host pointed at `127.0.0.1:8080`. The [migration notes](https://capskip.com/2captcha-api-alternative/) cover the details, if you would rather keep your current client library than switch to this one.
70102

71103
---
72104

@@ -217,6 +249,44 @@ More examples: [`examples/`](examples/)
217249

218250
---
219251

252+
## Selenium, Playwright and Scrapy
253+
254+
The SDK hands back a token; your existing browser tooling does the driving. The shape is the same whichever you use:
255+
256+
1. Read the sitekey off the page (`data-sitekey`, or the widget's config object).
257+
2. Call the matching solve method with that sitekey and the page URL.
258+
3. Write the token into the response field and submit.
259+
260+
### Selenium
261+
262+
```python
263+
sitekey = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-sitekey")
264+
token = solver.recaptcha(sitekey=sitekey, url=driver.current_url)["code"]
265+
266+
driver.execute_script(
267+
"document.getElementById('g-recaptcha-response').value = arguments[0];", token
268+
)
269+
driver.find_element(By.CSS_SELECTOR, "form").submit()
270+
```
271+
272+
### Playwright
273+
274+
```python
275+
from capskip import AsyncCapSkip
276+
277+
solver = AsyncCapSkip()
278+
sitekey = await page.get_attribute("[data-sitekey]", "data-sitekey")
279+
result = await solver.recaptcha(sitekey=sitekey, url=page.url)
280+
281+
await page.evaluate(
282+
"t => document.getElementById('g-recaptcha-response').value = t", result["code"]
283+
)
284+
```
285+
286+
Scrapy and plain `requests` work the same way — solve first, then send the token as whatever form field the site expects. Longer walkthroughs: [Selenium](https://capskip.com/selenium-captcha-solver/) and [Playwright](https://capskip.com/playwright-captcha-solver/).
287+
288+
---
289+
220290
## Return value
221291

222292
Every solve method returns:
@@ -253,6 +323,42 @@ except TimeoutException:
253323

254324
---
255325

326+
## FAQ
327+
328+
### How do I solve a captcha in Python?
329+
330+
Install the CapSkip desktop app, `pip install capskip`, then call the method that matches the widget — `recaptcha()`, `turnstile()`, `geetest()` or `normal()`. Each one polls until CapSkip has an answer, then returns a token, or the recognized text in the case of an image captcha.
331+
332+
### Is this a free captcha solver?
333+
334+
The SDK itself is MIT-licensed and free. Solving needs the CapSkip app, which is bought once rather than metered per captcha, so your cost stops scaling with volume.
335+
336+
### Which captchas can it solve?
337+
338+
reCAPTCHA v2 (checkbox and invisible), reCAPTCHA v3, reCAPTCHA Enterprise, Cloudflare Turnstile, GeeTest v3, and image/text captchas. Not hCaptcha, and not FunCaptcha/Arkose.
339+
340+
### Does it work with Selenium and Playwright?
341+
342+
Yes — see [above](#selenium-playwright-and-scrapy). The SDK never touches a browser itself, so it drops into whatever stack you already have, Scrapy and plain `requests` included.
343+
344+
### Why is my reCAPTCHA v3 score low?
345+
346+
Google derives v3 scores from IP reputation, cookies and browsing history. A solver returns a valid token, but it cannot change how Google grades that token — `score=` is forwarded as the target you want, not a guarantee. If a site enforces a high threshold, solve through a cleaner IP using the `proxy` argument.
347+
348+
### Can I use it as a 2captcha alternative?
349+
350+
Yes. CapSkip serves the same endpoints, so you can either move to this SDK or repoint an existing 2captcha client at `127.0.0.1:8080`.
351+
352+
### Does the captcha have to be on a public page?
353+
354+
For widget captchas, yes — CapSkip loads the URL you pass it. Image captchas only need the image, and that can be a local file.
355+
356+
### Is asyncio supported?
357+
358+
`AsyncCapSkip` is a full async client. Use it with `asyncio.gather` to run several solves at once.
359+
360+
---
361+
256362
## Development
257363

258364
```bash
@@ -276,10 +382,12 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for the full development workflow.
276382

277383
## Links
278384

279-
- [CapSkip website](https://capskip.com)
280-
- [CapSkip API docs](https://capskip.com/api-docs/)
281-
- [Report an issue](https://github.com/capskip/capskip-python/issues)
282-
- [PyPI package](https://pypi.org/project/capskip/)
385+
- [CapSkip — local captcha solver](https://capskip.com) · [download](https://capskip.com/download/)
386+
- [Captcha demo pages](https://capskip.com/captcha-demo/) — live reCAPTCHA, Turnstile, GeeTest and image widgets
387+
- [Python captcha solver guide](https://capskip.com/python-captcha-solver/)
388+
- [HTTP API docs](https://capskip.com/api-docs/)
389+
- Other clients: [Node.js](https://github.com/capskip/capskip-node) · [PHP](https://github.com/capskip/capskip-php) · [.NET](https://github.com/capskip/capskip-dotnet) · [MCP server for AI agents](https://github.com/capskip/capskip-mcp)
390+
- [PyPI package](https://pypi.org/project/capskip/) · [report an issue](https://github.com/capskip/capskip-python/issues)
283391

284392
---
285393

pyproject.toml

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,38 @@ build-backend = "setuptools.build_meta"
55
[project]
66
name = "capskip"
77
version = "1.1.0"
8-
description = "Python SDK for the CapSkip local captcha solver"
8+
description = "Captcha solver for Python: solve reCAPTCHA v2/v3, Cloudflare Turnstile, GeeTest and image captchas with CapSkip, a local unlimited captcha solver with no per-solve fees."
99
readme = "README.md"
1010
license = { text = "MIT" }
1111
authors = [{ name = "CapSkip", email = "support@capskip.com" }]
1212
keywords = [
1313
"captcha",
1414
"captcha-solver",
15+
"captcha-solving",
16+
"captcha-bypass",
17+
"unlimited-captcha-solver",
18+
"local-captcha-solver",
19+
"free-captcha-solver",
1520
"recaptcha",
21+
"recaptcha-solver",
22+
"recaptcha-v2",
23+
"recaptcha-v3",
24+
"recaptcha-enterprise",
1625
"cloudflare",
1726
"turnstile",
27+
"turnstile-solver",
28+
"cloudflare-turnstile",
1829
"geetest",
30+
"geetest-solver",
31+
"image-captcha",
32+
"ocr",
33+
"2captcha-alternative",
34+
"anti-captcha-alternative",
35+
"selenium",
36+
"playwright",
37+
"scrapy",
38+
"browser-automation",
39+
"web-scraping",
1940
"capskip",
2041
"automation",
2142
]
@@ -27,8 +48,12 @@ classifiers = [
2748
"Programming Language :: Python :: 3.10",
2849
"Programming Language :: Python :: 3.11",
2950
"Programming Language :: Python :: 3.12",
51+
"Programming Language :: Python :: 3.13",
52+
"Operating System :: OS Independent",
3053
"Topic :: Software Development :: Libraries :: Python Modules",
3154
"Topic :: Internet :: WWW/HTTP",
55+
"Topic :: Internet :: WWW/HTTP :: Browsers",
56+
"Topic :: Utilities",
3257
]
3358
requires-python = ">=3.10"
3459
dependencies = [

0 commit comments

Comments
 (0)