Skills captcha-relay
Human-in-the-loop CAPTCHA solving with two modes: screenshot (default, zero infrastructure) and token relay (requires network access). Screenshot mode captures the page with a grid overlay, sends it to the human, and injects clicks based on their reply. Token relay mode detects CAPTCHA type + sitekey, serves the real widget on a relay page for native solving, and injects the token via CDP.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/0xclanky/captcha-relay" ~/.claude/skills/openclaw-skills-captcha-relay && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/0xclanky/captcha-relay" ~/.openclaw/skills/openclaw-skills-captcha-relay && rm -rf "$T"
manifest:
skills/0xclanky/captcha-relay/SKILL.mdsource content
CAPTCHA Relay v2
Solve CAPTCHAs by relaying them to a human. Two modes available.
Modes
Screenshot Mode (default) — No infrastructure needed
Grid overlay screenshot → send image to human via Telegram → human replies with cell numbers → inject clicks.
- Zero setup beyond the skill itself. No Tailscale, no tunnels, no relay server.
- Works for any CAPTCHA type (reCAPTCHA, hCaptcha, sliders, text, etc.)
- Uses
for image processing + CDP for screenshots and click injection.sharp
node index.js # screenshot mode (default) node index.js --mode screenshot # explicit node index.js --screenshot # legacy alias
const { solveCaptchaScreenshot } = require('./index'); const capture = await solveCaptchaScreenshot({ cdpPort: 18800 }); // capture.imagePath — annotated screenshot to send to human // capture.prompt — text prompt for the human
Token Relay Mode — Requires network access
Detects CAPTCHA type + sitekey → serves real widget on relay page → human solves natively → token injected via CDP.
- Requires Tailscale or a tunnel (localtunnel/cloudflared) so the human's device can reach the relay server.
- Produces a proper CAPTCHA token — more reliable for reCAPTCHA v2, hCaptcha, Turnstile.
- Best when you have Tailscale already set up.
node index.js --mode relay # with localtunnel node index.js --mode relay --no-tunnel # with Tailscale/LAN
const { solveCaptcha } = require('./index'); const result = await solveCaptcha({ cdpPort: 18800, useTunnel: false }); // result.relayUrl — URL to send to human // result.token — solved CAPTCHA token
When to Use Each
| Scenario | Mode |
|---|---|
| Quick & easy, no setup | |
| Any CAPTCHA type (sliders, text, etc.) | |
| Known CAPTCHA with sitekey (reCAPTCHA, hCaptcha, Turnstile) | |
| Tailscale already configured | |
| No network access to host | |
CLI Flags
| Flag | Default | Description |
|---|---|---|
| | Select solving mode |
| — | Alias for |
| inject | Return token without injecting into browser |
| tunnel | Skip tunnel, use local/Tailscale IP (relay mode) |
| 120 | Timeout in seconds |
| 18800 | Chrome DevTools Protocol port |
Agent Workflow
Screenshot mode (simplest)
- Call
solveCaptchaScreenshot({ cdpPort }) - Send
to human viacapture.imagePath
tool withmessagecapture.prompt - Human replies with cell numbers (e.g. "1,3,5,7")
- Call
to click those cellsinjectGridClicks(cdpPort, capture, selectedCells)
Relay mode
- Call
(Tailscale) orsolveCaptcha({ useTunnel: false })
(tunnel)solveCaptcha() - Send
to human viaresult.relayUrl
toolmessage - Wait — resolves when human completes the CAPTCHA
- Token is auto-injected; continue automation
Requirements
- Chrome/Chromium with
--remote-debugging-port=18800 - Node.js 18+ and
(deps: ws, sharp)npm install - Relay mode only: Tailscale or internet for tunnel