🔍 CapSnap
A pure-Python CAPTCHA solver & OCR engine — built from scratch, zero dependencies
No Tesseract. No OpenCV. No NumPy. No Pillow. Just Python.
🤔 What is CapSnap?
CapSnap is a production-quality CAPTCHA solver and OCR engine written entirely in the Python standard library with zero external dependencies. It implements every component from scratch:
- 📦 Custom PNG decoder
- 🖼️ Grayscale conversion & Otsu's binarization
- 🔗 Connected-component labeling for character isolation
- 🧠 Multi-Layer Perceptron (MLP) neural network — trained on real CAPTCHA images
- ✂️ 5-way forced vertical slicing for noisy CAPTCHAs
It ships with a pre-trained model specifically tuned for noisy, handwritten-style CAPTCHA characters used by real-world websites — and it can be retrained on any new CAPTCHA style in minutes.
✨ Key Features
| Feature | Details |
|---|---|
| 🚫 Zero dependencies | Pure Python standard library only — nothing to pip install |
| 🔓 CAPTCHA solver | Built-in mode for 4–5 character noisy CAPTCHAs |
| 🧠 Neural network OCR | Custom MLP with ReLU hidden layer and softmax output |
| 📸 Universal input | File path, pathlib.Path, raw bytes, or base64 data-URL |
| 🏋️ Self-trainable | Retrain on any CAPTCHA dataset — answers extracted from API tokens automatically |
| 🖥️ CLI included | capsnap captcha.png works out of the box |
| ⚡ Lightweight | < 2 MB installed, starts instantly, no warmup |
| 🔒 Privacy-first | Runs 100% locally — no API calls, no cloud, no data leaks |
📦 Installation
pip install capsnap
No extra dependencies. No system libraries. Works on Python 3.11+.
🚀 Quick Start — CAPTCHA Solving
from capsnap import OCR
# Initialize in CAPTCHA mode
ocr = OCR(mode="captcha")
# Solve from a file path
result = ocr.read("captcha.png")
print(result.text) # e.g. "RF3rH"
print(result.confidence) # e.g. 0.923
Feed it anything
# From a URL / API response (base64 data-URL)
result = ocr.read("data:image/png;base64,iVBORw0KGgo...")
# From raw bytes (e.g. requests response)
import urllib.request
with urllib.request.urlopen("https://example.com/captcha") as r:
result = ocr.read(r.read())
# From a pathlib.Path
from pathlib import Path
result = ocr.read(Path("captcha.png"))
Full example — solve a live CAPTCHA from an API
import json
import urllib.request
import base64
from capsnap import OCR
url = "https://example.com/api/captcha"
req = urllib.request.Request(url, headers={"accept": "application/json"})
with urllib.request.urlopen(req) as response:
data = json.loads(response.read().decode())
# Pass the base64 image directly to CapSnap
ocr = OCR(mode="captcha")
result = ocr.read(data["image"]) # data:image/png;base64,...
print(result.text)
🖥️ CLI Usage
# Solve a CAPTCHA image
capsnap --mode captcha captcha.png
# Standard document OCR
capsnap document.png
🔄 All Input Methods
from capsnap import OCR
ocr = OCR(mode="captcha")
ocr.read("captcha.png") # file path string
ocr.read(Path("captcha.png")) # pathlib.Path
ocr.read(open("captcha.png", "rb").read()) # raw bytes
ocr.read("data:image/png;base64,...") # base64 data-URL
# Explicit methods still available
ocr.read_path("captcha.png")
ocr.read_bytes(raw_bytes)
ocr.read_base64(b64_string)
🏗️ Architecture
Input (path / bytes / base64)
│
▼
┌─────────────┐
│ PNG Decoder │ ← pure Python, no Pillow
└──────┬──────┘
│
▼
┌─────────────┐
│ Grayscale │ ← luminance-weighted conversion
└──────┬──────┘
│
▼
┌─────────────┐
│ Otsu │ ← auto threshold binarization
└──────┬──────┘
│
┌────┴─────────────────────┐
│ CAPTCHA mode │ Document mode
│ 5-way vertical slicing │ Connected-component labeling
└────────────┬─────────────┘
│
▼
┌──────────────┐
│ Feature Ext. │ ← normalized 20×20 patch
└──────┬───────┘
│
▼
┌──────────────┐
│ MLP Network │ ← ReLU hidden → Softmax output
└──────┬───────┘
│
▼
OCRResult
(text, confidence)
🎯 Retraining on Any CAPTCHA
CapSnap can retrain its neural network on any CAPTCHA style automatically if the API exposes the answer in the response token. No manual labeling needed:
# Fetch 1000 real CAPTCHAs and retrain the model
PYTHONPATH=. python tools/train_from_tokens.py
The training script:
- Fetches live CAPTCHAs from the target API
- Decodes the correct answer from the API's JWT/token
- Extracts and normalizes character patches
- Trains the MLP for 100 epochs
- Saves the updated
capsnap/model.capsnapautomatically
📁 Project Structure
capsnap/
├── capsnap/ ← installable package
│ ├── api.py ← OCR class (universal entry point)
│ ├── model.py ← MLP neural network (pure Python)
│ ├── model.capsnap ← pre-trained weights (bundled)
│ ├── recognize.py ← character recognition
│ ├── decoder/ ← pure-Python PNG decoder
│ ├── components.py ← connected-component labeling
│ ├── features.py ← patch extraction + resize
│ ├── grayscale.py ← RGB → grayscale
│ ├── threshold.py ← Otsu's binarization
│ ├── morphology.py ← noise removal
│ ├── segmentation.py ← line/word grouping
│ └── cli.py ← CLI entry point
├── tests/ ← offline unit tests
├── examples/ ← usage examples
├── assets/ ← images & donation QR codes
└── .github/workflows/ ← CI + auto-publish to PyPI
🧪 Testing
pip install -e ".[dev]"
pytest tests/ -v
All 8 tests run offline — no network, no API calls required.
💖 Support & Donations
CapSnap is free and open-source. If it saved you time, helped bypass a pesky CAPTCHA, or powered your project, consider buying me a coffee! ☕
🇧🇩 bKash / Nagad / Rocket (Bangladesh)
💎 Telegram Stars / TON (Gram)
🪙 Litecoin (LTC)
💵 USDT (BEP20)
Every contribution — big or small — keeps this project alive. Thank you! 🙏
📄 License
MIT License — see LICENSE for details.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file capsnap-1.0.0.tar.gz.
File metadata
- Download URL: capsnap-1.0.0.tar.gz
- Upload date:
- Size: 534.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
479e4c6b2ea16edd16259d0678a0e70be01288cd3f0c4e428eaa2b3665254702
|
|
| MD5 |
3c53952072792faf0ebd3123584d21ab
|
|
| BLAKE2b-256 |
ddf814b630076cdf22fe5abb1efb711128378e2792b79c7217f9e428dc0fec87
|
File details
Details for the file capsnap-1.0.0-py3-none-any.whl.
File metadata
- Download URL: capsnap-1.0.0-py3-none-any.whl
- Upload date:
- Size: 534.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38a8bdabed937a10c15c308617335042dfb5f3e1b5a9e38c5646b1015156f178
|
|
| MD5 |
586edc63b7d4517ec5c71c7297f80537
|
|
| BLAKE2b-256 |
8969e99e37aa75c90f3e01352814c3e39bab7a841acb0b993c01f292d3a3c879
|