从 PowerShell 调用 CAPTCHA API
使用 PowerShell 7.5+ 和 Invoke-RestMethod 直接调用 solvethree。以下脚本创建一个 reCAPTCHA Enterprise 任务,并轮询同一任务 ID,直到任务结束或本地等待时间预算耗尽。
本页内容
设置凭据和目标输入
- 1.
让工作区可使用该站点
在控制台中为目标主机名设置启用的配置。发送主机名和操作不会创建配置。如果尚未完成此步骤,请参阅站点配置设置。
- 2.
提供环境变量
使用常规的密钥处理机制,在 PowerShell 进程的环境中设置
SOLVETHREE_API_KEY和SOLVETHREE_PROXY。运行前检查两者均已赋值。API 密钥用于 Bearer 请求头,不应放在任务 JSON 中。 - 3.
替换示例主机名和操作
将
accounts.example.com和login改为集成所需的主机名和操作。使用主机名,而不是完整 URL。请求默认为 Enterprise v3,因此既不需要type字段,也不需要url字段。
创建一次,然后按任务 ID 轮询
#requires -Version 7.5
$ErrorActionPreference = 'Stop'
$apiBase = 'https://api.solvethree.com/v1'
$headers = @{ Authorization = "Bearer $env:SOLVETHREE_API_KEY"; Accept = 'application/json' }
$taskInput = @{ site = 'accounts.example.com'; action = 'login'; proxy = $env:SOLVETHREE_PROXY; requestId = [guid]::NewGuid().ToString() }
$requestClock = [Diagnostics.Stopwatch]::StartNew()
function Call-TaskApi($Method, $Path, $Payload = $null) {
$remaining = 180 - $requestClock.Elapsed.TotalSeconds
if ($remaining -le 0) { throw 'Local deadline reached' }
$seconds = [int][Math]::Ceiling([Math]::Min(25, $remaining))
$options = @{ Method = $Method; Uri = "$apiBase$Path"; Headers = $headers;
ConnectionTimeoutSeconds = $seconds; OperationTimeoutSeconds = $seconds;
MaximumRetryCount = 0; MaximumRedirection = 0 }
if ($null -ne $Payload) { $options.Body = $Payload | ConvertTo-Json -Depth 6; $options.ContentType = 'application/json' }
Invoke-RestMethod @options
}
$taskId = $null
try {
$result = Call-TaskApi 'POST' '/tasks?waitMs=0' $taskInput
$taskId = $result.id
while ($result.status -in @('pending', 'solving')) {
$escapedId = [uri]::EscapeDataString($taskId)
$result = Call-TaskApi 'GET' "/tasks/$escapedId`?waitMs=15000"
if ($result.status -in @('pending', 'solving')) { Start-Sleep -Seconds 1 }
}
if ($result.status -ne 'ready') { throw "Task failed: $($result.errorCode)" }
Write-Host "Ready task: $taskId"
# Submit $result.solution.token with userAgent/secChUa and the original proxy.
} catch {
Write-Host "Recovery requestId=$($taskInput.requestId) taskId=$taskId"
throw
}脚本向 /v1/tasks?waitMs=0 发送一次 POST。后续请求使用返回的 ID 发送 GET,并设置 waitMs=15000。pending 和 solving 会让循环继续运行;其他状态会结束循环。
ConvertTo-Json 会序列化任务哈希表,无需依赖手动添加引号的 JSON 或 shell 命令。轮询前会对任务 ID 进行 URL 转义。调整示例时请保留这些部分。
Stopwatch 会在每次 API 调用前检查 180 秒的本地时间预算。每次调用的连接超时和操作超时均不超过 25 秒,并随剩余预算减少而缩短。非终态轮询后,脚本会休眠一秒。该预算可防止无限轮询,但并非精确的实际运行时间截止点。
MaximumRetryCount = 0 禁用自动 HTTP 重试,MaximumRedirection = 0 拒绝重定向。这里使用的超时参数要求 PowerShell 7.5+,并非任意 PowerShell 7 安装版本都支持。Microsoft 的 Invoke-RestMethod 参考文档介绍了这些参数。
使用令牌,而不是任务 ID
状态为 ready 时,应提交的 reCAPTCHA 值是 $result.solution.token。$taskId 仅用于标识 solvethree 任务。此示例会在向目标发送应用请求之前停止。
使用原始代理,连同返回结果中的 userAgent 和 secChUa 一起提交令牌。不要替换为无关的浏览器身份,也不要将其发送到其他目标。ready 表示 solvethree 已生成解决结果,并不代表目标已接受你的应用请求。
- Invoke-RestMethod 抛出 HTTP 或连接异常
API 请求在脚本能够处理成功响应之前失败。catch 块会输出用于恢复的 ID,并重新抛出原始异常。
试试这样做: 检查 HTTP 状态和响应详情(如果有)。应修正无效输入,而不是原样重试。如果无法确定任务是否创建成功,请按下文说明恢复。
- 任务返回 failed
同时检查
$result.errorCode和$result.error。脚本针对终态任务抛出的异常仅包含错误代码。试试这样做: 停止轮询该任务,并处理报告的问题。例如,
site-unreachable是任务错误,并不能证明 API 请求本身失败。参见 CAPTCHA API 错误。
恢复结果不确定的请求,避免另建任务
超时并不能证明创建请求失败。catch 块会输出 requestId,以及已收到的 taskId(如果有)。请保留这些值。
- 1.
如果已有任务 ID,则获取该任务
继续使用 GET
/v1/tasks/:id,而不是另建任务。达到脚本的本地截止时间并不能证明远程任务失败。 - 2.
如果创建时未返回任务 ID,请复用原始请求
使用相同的
requestId重新提交相同的任务输入,以恢复现有任务。复用该 ID 时更改输入会导致冲突。 - 3.
不要通过重新运行此脚本来恢复
重新运行会生成新的 GUID,因此也会产生新的逻辑请求。对于无人值守的使用场景,请在 POST 之前安全保存原始 requestId 和任务输入,并在收到任务 ID 后保存它。此示例会在失败时输出用于恢复的 ID,但不会持久保存这些值以应对进程丢失。
如果代理 URL 包含凭据,请勿将保存的输入写入常规日志。恢复需要的是原始输入,而不是 API 密钥的另一份副本。
运行您的第一个任务。
使用 $5 工作区额度开始体验。