Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Bypass Cloudflare protection by routing requests through FlareSolverr’s browser API, handling challenges and returning page content, cookies, and headers.
Bypass Cloudflare protection by routing requests through FlareSolverr’s browser API, handling challenges and returning page content, cookies, and headers.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Use FlareSolverr to bypass Cloudflare protection when direct curl requests fail with 403 or Cloudflare challenge pages.
Run FlareSolverr (Docker recommended): docker run -d --name flaresolverr -p 8191:8191 ghcr.io/flaresolverr/flaresolverr:latest Set the environment variable: export FLARESOLVERR_URL="http://localhost:8191" Verify: curl -s "$FLARESOLVERR_URL/health" | jq '.' # Expected: {"status":"ok","version":"3.x.x"}
Direct curl fails with 403 Forbidden Cloudflare challenge page appears (JS challenge, captcha, "Checking your browser") Bot detection blocks automated requests Rate limiting or anti-scraping measures
Try direct curl first (it's faster and simpler) If blocked: Use FlareSolverr to get cookies/user-agent Reuse session for subsequent requests (optional, for performance)
curl -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "request.get", "url": "https://example.com/protected-page", "maxTimeout": 60000 }' | jq '.'
{ "status": "ok", "message": "Challenge solved!", "solution": { "url": "https://example.com/protected-page", "status": 200, "headers": {}, "response": "<html>...</html>", "cookies": [ { "name": "cf_clearance", "value": "...", "domain": ".example.com" } ], "userAgent": "Mozilla/5.0 ..." }, "startTimestamp": 1234567890, "endTimestamp": 1234567895, "version": "3.3.2" }
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "request.get", "url": "https://example.com/protected-page" }' | jq -r '.solution.response'
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "request.get", "url": "https://example.com" }' | jq -r '.solution.cookies[] | "\(.name)=\(.value)"'
Sessions allow reusing browser context (cookies, user-agent) for multiple requests, improving performance.
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{"cmd": "sessions.create"}' | jq -r '.session'
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "request.get", "url": "https://example.com/page1", "session": "SESSION_ID" }' | jq -r '.solution.response'
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{"cmd": "sessions.list"}' | jq '.sessions'
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "sessions.destroy", "session": "SESSION_ID" }'
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "request.post", "url": "https://example.com/api/endpoint", "postData": "key1=value1&key2=value2", "maxTimeout": 60000 }' | jq '.' For JSON POST data: curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "request.post", "url": "https://example.com/api/endpoint", "postData": "{\"key\":\"value\"}", "headers": { "Content-Type": "application/json" } }' | jq '.'
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "request.get", "url": "https://example.com", "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" }' | jq '.'
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "request.get", "url": "https://example.com", "headers": { "Accept-Language": "en-US,en;q=0.9", "Referer": "https://google.com" } }' | jq '.'
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "request.get", "url": "https://example.com", "proxy": { "url": "http://proxy.example.com:8080" } }' | jq '.'
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "request.get", "url": "https://example.com/file.pdf", "download": true }' | jq -r '.solution.response' | base64 -d > file.pdf
"status": "error": Request failed (check message field) "status": "timeout": maxTimeout exceeded (increase timeout) "status": "captcha": Manual captcha required (rare, usually auto-solved)
curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{"cmd": "request.get", "url": "https://example.com"}' | \ jq -r '.status'
# Step 1: Fetch page through FlareSolverr RESPONSE=$(curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{ "cmd": "request.get", "url": "https://example.com/protected-page" }') # Step 2: Check if successful STATUS=$(echo "$RESPONSE" | jq -r '.status') if [ "$STATUS" != "ok" ]; then echo "Failed: $(echo "$RESPONSE" | jq -r '.message')" exit 1 fi # Step 3: Extract and parse HTML echo "$RESPONSE" | jq -r '.solution.response'
# Create session SESSION=$(curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d '{"cmd": "sessions.create"}' | jq -r '.session') # Page 1 curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d "{\"cmd\": \"request.get\", \"url\": \"https://example.com/page1\", \"session\": \"$SESSION\"}" | \ jq -r '.solution.response' # Page 2 (reuses cookies from page 1) curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d "{\"cmd\": \"request.get\", \"url\": \"https://example.com/page2\", \"session\": \"$SESSION\"}" | \ jq -r '.solution.response' # Cleanup curl -s -X POST "$FLARESOLVERR_URL/v1" \ -H "Content-Type: application/json" \ -d "{\"cmd\": \"sessions.destroy\", \"session\": \"$SESSION\"}"
curl -s "$FLARESOLVERR_URL/health" | jq '.'
Use sessions for multiple requests to same domain (reuses cookies/context) Increase maxTimeout for slow sites (default: 60000ms) Fallback to direct curl when possible (FlareSolverr is slower due to browser overhead) Destroy sessions when done to free resources
Slower than direct curl (launches headless browser) Resource intensive (limit concurrent requests) May not solve all captchas (most Cloudflare challenges work) HTML only in response (no client-side JS execution after fetch)
Always try direct curl first Use sessions for multi-page workflows Set appropriate maxTimeout (default 60s, increase for slow sites) Clean up sessions when done Handle errors gracefully (check status field) Rate limit your requests (don't overwhelm FlareSolverr or target site)
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.