使用 Python HTTPX 提交 reCAPTCHA 令牌

作者:solvethree阅读需 1 分钟

向目标发送 POST 请求时,使用 solution.token、解题成功时使用的代理以及返回的浏览器身份。将应用的 Cookie 保留在同一个 HTTPX 客户端中;有效令牌不能取代应用对会话或 CSRF 的要求。

本页内容

通过成功使用的代理发送已就绪的令牌

通过 pip install httpx 安装 HTTPX。此示例还使用了官方 Python SDK;如果尚未安装,请参阅 Python SDK 设置。

示例包含解题调用,以说明结果的来源。如果你已有状态为 ready 的 SDK 结果,请将其作为 result,与原始 request 一起复用。不要仅为提交令牌而再创建一个任务。

  • 将 SOLVETHREE_API_KEY 设为工作区 API 密钥,将 SOLVETHREE_PROXY 设为代理 URL。请将 API 密钥保留在服务器端。
  • 将 accounts.example.com、login 操作和提交 URL 替换为预期目标所用的值。该主机名需要在工作区中有有效的站点配置;请参阅站点配置设置。
  • 根据应用的实际请求调整表单字段。示例只发送 CAPTCHA 字段,并非完整的登录表单。
HTTPX · 复用代理和返回的浏览器身份信息
# pip install httpx and the official solvethree SDK wheel.
import os
import httpx
from solvethree import Solvethree, successful_proxy

request = {"site": "accounts.example.com", "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
result = Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve(request, timeout=180)
solution = result["solution"]
proxy = successful_proxy(request, result)
if proxy is None:
    raise RuntimeError("No valid successful proxy")
with httpx.Client(proxy=proxy, timeout=30, follow_redirects=False, trust_env=False) as target:
    # Use this client's cookie jar for any required application session first.
    response = target.post("https://accounts.example.com/login",
        data={"g-recaptcha-response": solution["token"]},
        headers={"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]})
    print("Application HTTP status:", response.status_code)
    # Check the application's actual response and required CSRF/session fields.

successful_proxy(request, result) 选择提交时要复用的代理。请保留相应检查,以便在未返回有效代理时停止提交。使用 HTTPX 当前的单数形式参数 proxy=,而不是 proxies=。设置 trust_env=False 可防止环境代理设置更改显式选择的路由。

配套保留 Cookie、浏览器身份和表单字段

如果应用要求先请求页面以建立会话或获取 CSRF 值,请在发送 POST 之前,在同一个 HTTPX 客户端中发出该请求。客户端的 Cookie 容器会在请求之间保留 Cookie。单独的客户端不会自动拥有该会话。

这些前置请求也应使用返回的 userAgent 和 secChUa,而不是无关的浏览器身份。示例在 POST 请求中将它们作为 User-Agent 和 sec-ch-ua 提供。向预期目标提交解题结果时,请保持这些请求头和成功使用的代理一致。

data= 用于发送表单数据。此处,g-recaptcha-response 接收 solution.token;不能传入任务 ID 或整个解题结果字典。字段名应与目标的实际请求一致,并在同一次提交中包含所需的凭据、隐藏字段和 CSRF 值。

确认提交成功之前,先检查重定向

follow_redirects=False 让你可以查看应用的首次响应。如果响应发生重定向,请先检查其状态和目标地址,再使用同一个客户端显式执行应用预期的下一步操作。不要自动将令牌重新发送到其他 URL。

打印出的 HTTP 状态只是判断的起点。请检查响应正文、重定向目标地址或最终的应用状态,以确定目标是否接受了请求。200 响应或重定向既可能表示成功,也可能属于错误流程;solvethree 的 ready 状态表示已生成解题结果,并不表示目标已接受该结果。

运行您的第一个任务。

使用 $5 工作区额度开始体验。

创建工作区
使用 Python HTTPX 提交 reCAPTCHA 令牌 · solvethree