CaptchaOCR.

CaptchaOCR là một micro-service FastAPI nhỏ gọn làm đúng một việc: nhận ảnh captcha 4 chữ số dưới dạng base64, trả về số nguyên. Model ddddocr pretrained được load một lần khi khởi động, mọi request sau đó chỉ là inference thuần — latency vài chục ms, đủ nhanh để nhúng vào bất kỳ luồng automation nào mà không tạo bottleneck. Deploy bằng PM2 với auto-restart và RAM cap cứng, chạy nền ổn định mà không cần để ý.

Year2025
RoleSolo · python
Timeline1 tuần
Status● Live · self-hosted

01.Overview

Tổng quan

CaptchaOCR ra đời trong quá trình xây các project automation cho khách hàng — hầu hết các trang cần tự động đăng nhập hoặc đăng ký tài khoản đều có một bước không thể bỏ qua: nhập captcha. tesseract cho accuracy ~70% và lệ thuộc vào việc cài đúng version binary trên server; viết CNN tự train thì dữ liệu đủ lớn là một dự án riêng. Tôi cần thứ đơn giản hơn, dùng được ngay: một endpoint HTTP, nhận base64, trả số nguyên.

Giải pháp cuối cùng: FastAPI nhận POST với base64, ddddocr pretrained chạy trên ONNX runtime làm classification, regex lấy 4 chữ số đầu tiên, trả về int. Model load một lần lúc khởi động, mọi request sau đó chỉ là inference thuần. Service deploy bằng PM2 với max_memory_restart 1G. Accuracy đo trên 1.000 captcha thật: ~96%.

02.Features

Tính năng
  • 01
    POST /ocrbase64 in · int out · 422 on fail

    Service chỉ có một endpoint duy nhất: POST /ocr nhận body { image_base64 | text }, chạy OCR và trả về { number: int } khi đọc được đủ 4 chữ số. Nếu base64 hỏng hoặc OCR không tìm đủ ký tự, service trả về 422 kèm detail cụ thể — không im lặng, không trả về kết quả sai. Health check tại GET / để monitor biết service còn sống.

  • 02
    Pretrained ddddocrNo training · model loads once

    ddddocr 1.5.6 là model CNN pretrained chạy trên ONNX runtime, được thiết kế chuyên biệt cho captcha chữ và số. Engine được khởi tạo ở module level — load đúng một lần khi process start, không load lại theo từng request. Mọi lần gọi sau đó chỉ tốn chi phí inference thuần, giữ latency ổn định dù traffic tăng.

  • 03
    Parsing chịu lỗidata-url or raw · regex extract digits

    _decode_data_url xử lý cả hai dạng đầu vào — data:image/png;base64,… lẫn base64 thô — validate trước khi decode để bắt lỗi sớm thay vì để crash sâu bên trong. _extract_4_digit_captcha chạy regex \d trên output OCR rồi cắt lấy đúng 4 chữ số đầu tiên — cách này chịu được nhiễu ký tự đặc biệt mà model đôi khi trả về lẫn vào kết quả.

  • 04
    PM2 deployautorestart · max_memory_restart 1G

    PM2 được cấu hình trong eco.config.js để chạy service bằng Python từ virtualenv, một instance duy nhất với autorestart: true phòng trường hợp crash bất ngờ. max_memory_restart: "1G" đặt làm ngưỡng cứng để phòng memory leak từ ONNX runtime tích luỹ dần theo thời gian — thay vì để service phình RAM vô thời hạn, PM2 tự restart và lấy lại bộ nhớ. Biến môi trường ORT_LOGGING_LEVEL=3 giữ log ở mức error only, tránh ONNX runtime làm nhiễu output bằng các dòng verbose không cần thiết.

  • 05
    Schema gõ chặtPydantic · auto OpenAPI · Swagger UI

    Request và response được định nghĩa bằng Pydantic v2 — FastAPI tự sinh OpenAPI docs tại /docs/redoc mà không cần viết tay. Field image_base64 hỗ trợ thêm alias text để các client cũ gửi payload theo tên cũ vẫn hoạt động bình thường mà không cần đổi code phía client.

03.Tech stack

Công nghệ sử dụng
APIFastAPI 0.115 · Uvicorn 0.30 · Pydantic v2
OCRddddocr 1.5.6 (CNN pretrained · ONNX Runtime backend) · không training, không GPU
RuntimePython 3.13 · venv · single process · model loaded once at module import
DeployPM2 (eco.config.js) · autorestart · max_memory_restart 1G · ORT_LOGGING_LEVEL=3 · cổng 8000
I/OBase64 (data URL hoặc raw) → bytes → OCR → regex \d → int 4 chữ số
Footprint3 dependencies · 67 dòng Python · ~150MB RAM ổn định · ~30ms / request

04.How it works

Kiến trúc tổng thể

Service đứng giữa hai thứ rất khác nhau: một thư viện ML pretrained (ddddocr, gói lại ONNX Runtime) và một client HTTP đơn giản. Việc của FastAPI ở đây gói gọn đúng ba chuyện: lifecycle (model load một lần ở module level), validation (Pydantic + try/except cho base64), và contract (số nguyên 4 chữ số). Mọi thứ khác — batching, queue, async — chưa cần thiết ở quy mô này.

Một request đi qua đúng 4 bước: (1) _decode_data_url bóc prefix data:image/png;base64, nếu có và validate bằng b64decode(..., validate=True); (2) bytes ảnh đi vào ocr_engine.classification(...) — ddddocr chạy inference khoảng ~25ms trên CPU; (3) regex \d gom toàn bộ chữ số trong output, raise nếu không đủ 4; (4) cắt 4 chữ số đầu và ép kiểu int(...). Lỗi ở bất kỳ bước nào đều biến thành HTTP 422 kèm message rõ ràng — không có lỗi nào bị nuốt im lặng.

Design decision

"CaptchaOCR giải quyết được đúng một trường hợp: captcha thuần số. Với captcha vừa chữ vừa số, ddddocr accuracy giảm đáng kể và tôi vẫn đang tìm hướng xử lý phù hợp hơn. Hiện tại khi endpoint trả về 422 hoặc kết quả sai, luồng automation fallback sang gọi AI để đọc ảnh — chậm hơn và tốn hơn, nhưng đủ để không làm gián đoạn toàn bộ pipeline trong lúc chờ giải pháp tốt hơn."

05.Bình luận

Ý kiến của bạn

Chưa có bình luận nào.

Xem tiep
zoom-bot preview
Z
Zoom Bot

ZoomBot là một pool các bot Chrome tự động tham gia Zoom meeting và chờ lệnh điều khiển từ xa qua HTTP API. Mỗi bot chạy trên một instance Chrome riêng biệt, có lock riêng, hoàn toàn thread-safe — các bot không can thiệp lẫn nhau dù chạy song song. Từ một API call duy nhất, có thể điều khiển từng bot gửi chat, bật/tắt mic, bật/tắt video, rời phòng hoặc rejoin. Khi bot crash, hệ thống tự phát hiện và khởi động lại mà không cần can thiệp tay. Toàn bộ được viết bằng Python, Selenium và Flask — đủ gọn để chạy trên một máy chủ thông thường mà không cần hạ tầng phức tạp.

chatgpt-auto-login preview
G
GPT Login

API NestJS tự đăng nhập ChatGPT bằng puppeteer-real-browser (bypass Cloudflare anti-bot), hỗ trợ OTP qua email, lưu session để dùng lại cho route /ask để promt, và cron job mỗi giờ kiểm tra session — gửi cảnh báo qua Telegram khi hết hạn. Điều này giúp tôi promt và nhận câu trả lời trực tiếp từ api mà không cần mở trình duyệt.

bank-notify-bridge preview
B
Bank Notify

BankNotify biến một chiếc điện thoại Android cũ thành cổng thanh toán DIY cho merchant nhỏ. App Flutter + Kotlin chạy nền trên điện thoại, đọc thông báo biến động số dư từ app ngân hàng và forward ngay về backend qua HTTP. Backend nhận thông báo, match với đơn hàng đang pending, rồi gọi callback để hoàn thành thanh toán — tất cả xảy ra trong vài giây, không cần tích hợp cổng thanh toán chính thức, không cần phí hàng tháng.

random-tools preview
R
Random Tools

RandomKit là bộ công cụ ngẫu nhiên chạy hoàn toàn trên client — không server, không gửi dữ liệu đi đâu. Gồm các công cụ thường dùng: vòng quay tuỳ chỉnh với xác suất công bằng và hiển thị minh bạch từng phần trăm, đua vịt, bốc thăm, tung xu, xúc xắc, sinh số ngẫu nhiên, tạo mật khẩu, và chọn vị trí ngẫu nhiên trên bản đồ. Giao diện hỗ trợ song ngữ vi/en, cấu trúc SEO chuẩn để tìm kiếm được từng công cụ riêng lẻ.