{"record":{"id":"df7e47cb6314fdc3","repo":"Panniantong/Agent-Reach","slug":"jina-reader","errorCode":null,"errorMessage":"Jina Reader 返回了反爬验证页，未获取到目标内容；请改用站点专用工具或浏览器读取","messagePattern":"Jina Reader 返回了反爬验证页，未获取到目标内容；请改用站点专用工具或浏览器读取","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"warning","filePath":"agent_reach/channels/web.py","lineNumber":63,"sourceCode":"        self.active_backend = self.backends[0]\n        return \"ok\", \"通过 Jina Reader 读取任意网页（curl https://r.jina.ai/URL）\"\n\n    def read(self, url: str) -> str:\n        \"\"\"通过 Jina Reader 读取网页，返回 Markdown 全文。\"\"\"\n        url = normalize_public_http_url(url)\n        jina_url = f\"https://r.jina.ai/{url}\"\n        req = urllib.request.Request(\n            jina_url,\n            headers={\"User-Agent\": _UA, \"Accept\": \"text/plain\"},\n        )\n        with urllib.request.urlopen(req, timeout=30) as resp:\n            body = resp.read(_MAX_RESPONSE_BYTES + 1)\n        if len(body) > _MAX_RESPONSE_BYTES:\n            raise ValueError(\n                f\"Jina Reader response exceeds {_MAX_RESPONSE_BYTES} byte limit\"\n            )\n        if _is_antibot_page(body):\n            raise RuntimeError(\n                \"Jina Reader 返回了反爬验证页，未获取到目标内容；\"\n                \"请改用站点专用工具或浏览器读取\"\n            )\n        return body.decode(\"utf-8\")\n","sourceCodeStart":45,"sourceCodeEnd":68,"githubUrl":"https://github.com/Panniantong/Agent-Reach/blob/93ae1d18c37b707dec053c7c4f9d91cd8ef8943d/agent_reach/channels/web.py#L45-L68","documentation":"WebChannel.read (agent_reach/channels/web.py:63) detects that Jina Reader returned a Cloudflare/Jina anti-bot challenge page instead of real content (via _is_antibot_page, which matches 'requiring captcha' warnings, 'Just a moment...', and Cloudflare 'Attention Required!' structures in the first 4 KiB). The RuntimeError tells you the target site blocked automated access and suggests site-specific tools or a browser.","triggerScenarios":"web_channel.read(url) on Cloudflare-protected sites with bot-fight mode enabled, or when Jina itself throttles the caller and returns a 'warning: requiring captcha' interstitial. Only the first 4096 bytes are scanned, so the marker must appear at the top of the Markdown.","commonSituations":"Agents scraping e-commerce, ticketing, or news sites behind aggressive Cloudflare settings; heavy use of r.jina.ai from one IP causing Jina-side captcha challenges.","solutions":["Switch to the site's official API or an existing agent-reach channel for that platform","Reduce request frequency to r.jina.ai; add spacing between reads","Read the page in a real browser (manual or browser automation) and pass the content to the agent","Try again later — Cloudflare challenges are often intermittent for low-reputation clients"],"exampleFix":"# before\nfrom agent_reach.channels.web import WebChannel\ntext = WebChannel().read(\"https://cloudflare-protected.example.com/article\")\n\n# after: branch on the antibot signal and fall back\nfrom agent_reach.channels.web import WebChannel\n\ntry:\n    text = WebChannel().read(url)\nexcept RuntimeError as exc:\n    if \"反爬\" in str(exc) or \"captcha\" in str(exc):\n        text = None  # signal caller to use a browser / site-specific tool\n    else:\n        raise","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    text = WebChannel().read(url)\nexcept RuntimeError as exc:\n    if \"反爬\" in str(exc):\n        text = read_via_site_specific_channel_or_browser(url)  # planned fallback\n    else:\n        raise","preventionTips":["Prefer platform-specific channels (reddit, youtube, ...) over the generic web channel for known sites","Rate-limit your use of r.jina.ai; Jina itself issues captcha challenges to heavy callers","Have a documented fallback path (browser read or official API) before you hit antibot walls"],"tags":["web","jina-reader","antibot","cloudflare","scraping"],"backgroundTag":null,"analyzedSha":"93ae1d18c37b707dec053c7c4f9d91cd8ef8943d","analyzedAt":"2026-08-14T22:54:06.735Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}