Troubleshooting

ERROR_PAGEURL:URL 不匹配故障排除指南

先说结论:ERROR_PAGEURL 九成情况下不是网络抖动或服务端故障,而是你传给求解器的 pageurl 和验证码真正所在的页面地址对不上。求解器会拿这个参数校验 token 的来源域名,只要值不精确匹配浏览器地址栏显示的那个地址,请求就会被打回来。排查思路很简单:先把地址栏里的完整 URL 抄下来,再逐项比对协议、域名、路径是否一致。


ERROR_PAGEURL 的常见触发原因

原因 例子
缺少协议 example.com 代替 https://example.com
错误的域名 www.example.comexample.com
重定向更改后的 URL /login 的表格重定向至 /auth/login
SPA 路线不匹配 JS 路由 /app/login 与服务器 URL 不匹配
URL 编码问题 未编码的空格或特殊字符
来自不同域的 iframe 从子域加载验证码

正确获取 pageurl 的方法

规则:使用浏览器地址栏中验证码可见的 URL。

# WRONG — incomplete URL
pageurl = "staging.example.com/qa-login"

# WRONG — wrong protocol
pageurl = "http://staging.example.com/qa-login"

# CORRECT — full URL with protocol
pageurl = "https://staging.example.com/qa-login"

# CORRECT — with www if that's what the page uses
pageurl = "https://www.staging.example.com/qa-login"

直接从开发者工具复制地址栏当前值,比凭记忆拼 URL 更可靠。


用脚本自动校验 pageurl

提交前加一层校验,能挡掉大部分低级错误:

from urllib.parse import urlparse


def validate_pageurl(url):
    """Validate pageurl before API submission."""
    parsed = urlparse(url)

    if not parsed.scheme:
        raise ValueError(f"Missing protocol: {url}. Use https://")

    if parsed.scheme not in ("http", "https"):
        raise ValueError(f"Invalid protocol: {parsed.scheme}")

    if not parsed.netloc:
        raise ValueError(f"Missing domain: {url}")

    # Remove fragment (hash) — not sent to server
    clean = f"{parsed.scheme}://{parsed.netloc}{parsed.path}"
    if parsed.query:
        clean += f"?{parsed.query}"

    return clean


# Usage
url = validate_pageurl("https://staging.example.com/qa-login#section")
# Returns: "https://staging.example.com/qa-login"

函数会顺手去掉 # 后面的锚点——锚点不会发送给服务器,留着只会增加比对失败的概率。


处理跳转与重定向导致的 URL 变化

很多登录页会跳转一次。如果代码里硬编码了跳转前的旧地址,pageurl 自然对不上:

import requests


def get_final_url(url):
    """Follow redirects to get the actual page URL."""
    resp = requests.get(url, allow_redirects=True, timeout=15)
    return resp.url


# If the login page redirects
original = "https://staging.example.com/qa-login"
final = get_final_url(original)
print(f"Final URL: {final}")
# Use final URL as pageurl

用返回的 final 而不是 original 提交,能解决一大批"本地正常、脚本报错"的情况。


SPA(单页应用)里 pageurl 怎么填

SPA 靠 JavaScript 改地址栏,不刷新整页,容易被误以为要填接口地址:

# For SPAs, use the domain root + the route shown in the address bar
# NOT the API endpoint that the form submits to

# WRONG — API endpoint
pageurl = "https://api.example.com/v1/auth/login"

# CORRECT — the page URL shown in browser
pageurl = "https://staging.example.com/qa-login"

标准只有一个:验证码渲染在哪个域名下,pageurl 就填那个地址栏 URL,不是后端接口地址。


iframe 加载的验证码要用哪个 URL

验证码从不同域加载到 iframe 内时,始终以宿主页面为准:

# If the CAPTCHA is on the MAIN page
pageurl = "https://example.com/register"  # Main page URL

# If the CAPTCHA is in an IFRAME with a different domain
# Still use the main page URL, not the iframe src
pageurl = "https://example.com/register"
# NOT: "https://captcha-frame.example.com/challenge"

哪怕 src 指向完全不同的子域,pageurl 也要填主页面地址,绝不能用 iframe 自己的地址替代。


国内团队常见场景:反向代理和 CDN 导致的域名不一致

国内做自动化测试时,测试环境常挂在 Nginx 反向代理或 CDN 节点(如阿里云、腾讯云接入层)后面,内部服务地址和外部真实域名并不是一回事。脚本若从内网直接请求源站,抓到的 pageurl 就会和真实用户看到的域名不一致,验证码渲染正常也照样报 ERROR_PAGEURL


ERROR_PAGEURL 排查对照表

问题 原因 处理方式
尽管 URL 看起来正确但仍出错 www 与非 www 不匹配 准确检查地址栏
URL 有时有效,有时则失败 页面具有 A/B 测试 URL 在求解时捕获 URL
令牌已解决但被网站拒绝 pageurl 域名不匹配 令牌域必须与站点域匹配
在浏览器中工作但在代码中失败 未遵循重定向 使用 get_final_url()
URL 有查询参数 可能需要参数 包含必要的查询参数

提交请求时的完整示例

把校验函数和实际提交串起来,是排查这类问题时最推荐的写法:

import requests

# Validate URL first
pageurl = validate_pageurl("https://staging.example.com/qa-login")

resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "SITE_KEY",
    "pageurl": pageurl,
    "json": 1,
})
result = resp.json()

if result.get("status") == 1:
    print(f"Task ID: {result['request']}")
else:
    print(f"Error: {result.get('request')}")

常见问题

pageurl 只填域名行不行,还是要写完整路径?

域名是校验的关键,但建议始终提供完整路径——部分网站会连路径一起校验,只写域名并不稳定。

URL 里的 utm_source 这类跟踪参数需要保留吗?

本来就是地址栏 URL 一部分的就原样保留;不影响页面内容的可以去掉,拿不准时保留更安全。

反向代理或 CDN 环境下,pageurl 应该填内网地址还是外网域名?

一律填最终用户浏览器地址栏看到的外网域名,内网服务地址、代理转发前的源站地址都不能用。

token 已经识别成功,为什么提交到网站后还是被拒绝?

这种情况几乎总是 pageurl 域名和目标站点域名不一致——token 按域名签发,域名对不上,站点侧校验就会失败,需要重新核对提交时用的 pageurl


相关阅读


获取正确的 URL —— 用 CaptchaAI 解决

该文章已禁用评论。