Llama a la API de CAPTCHA desde PowerShell
Usa PowerShell 7.5+ e Invoke-RestMethod para llamar directamente a solvethree. El siguiente script crea una sola tarea de reCAPTCHA Enterprise y consulta el mismo ID de tarea hasta que finaliza o se agota el tiempo de espera local.
En esta página
Define las credenciales y los datos de entrada del destino
- 1.
Habilita el sitio para tu espacio de trabajo
Configura un perfil activo para el nombre de host de destino en la consola. Enviar un nombre de host y una acción no crea un perfil. Consulta la configuración del perfil del sitio si aún no se ha hecho.
- 2.
Proporciona las variables de entorno
Define
SOLVETHREE_API_KEYySOLVETHREE_PROXYen el entorno del proceso de PowerShell mediante tu mecanismo habitual de gestión de secretos. Comprueba que ambas tengan un valor antes de ejecutar. La clave de API se envía en una cabecera Bearer; no debe incluirse en el JSON de la tarea. - 3.
Sustituye el nombre de host y la acción del ejemplo
Cambia
accounts.example.comyloginpor el nombre de host y la acción que requiere tu integración. Usa un nombre de host, no una URL completa. La solicitud usa Enterprise v3 de forma predeterminada, por lo que no necesita ni el campotypeni el campourl.
Crea la tarea una vez y luego consulta su 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
}El script envía una solicitud POST a /v1/tasks?waitMs=0. Las solicitudes posteriores son GET para el ID devuelto y usan waitMs=15000. pending y solving mantienen el bucle en ejecución; cualquier otro estado lo finaliza.
ConvertTo-Json serializa la tabla hash de la tarea en lugar de depender de JSON con comillas introducidas manualmente o de un comando de shell. Al ID de la tarea se le aplica escape de URL antes de consultar su estado. Conserva estas partes al adaptar el ejemplo.
Stopwatch comprueba un límite de tiempo local de 180 segundos antes de cada llamada a la API. Cada llamada tiene tiempos de espera de conexión y de operación de un máximo de 25 segundos, que se reducen a medida que se agota el tiempo disponible. Tras una consulta con un estado no terminal, el script espera un segundo. Este límite evita consultas indefinidas; no es un corte exacto según el tiempo real transcurrido.
MaximumRetryCount = 0 desactiva los reintentos HTTP automáticos y MaximumRedirection = 0 rechaza las redirecciones. Los parámetros de tiempo de espera usados aquí requieren PowerShell 7.5+, no cualquier instalación de PowerShell 7. La referencia de Invoke-RestMethod de Microsoft documenta estos parámetros.
Usa el token, no el ID de la tarea
Cuando el estado es ready, el valor de reCAPTCHA que debes enviar es $result.solution.token. $taskId solo identifica la tarea de solvethree. El ejemplo se detiene antes de realizar la solicitud de la aplicación al destino.
Envía el token con los valores userAgent y secChUa de la solución devuelta, usando el proxy original. No los sustituyas por una identidad de navegador ajena ni lo envíes a otro destino. ready significa que solvethree ha generado una solución; no confirma que el destino haya aceptado la solicitud de tu aplicación.
- Invoke-RestMethod lanza una excepción HTTP o de conexión
La solicitud a la API falló antes de que el script pudiera procesar una respuesta satisfactoria. El bloque catch muestra los ID de recuperación y vuelve a lanzar la excepción original.
Prueba esto: Revisa el estado HTTP y los detalles de la respuesta, si están disponibles. Corrige los datos de entrada no válidos en lugar de reintentarlo sin modificarlos. Si no está claro si la tarea se creó, recupérala como se describe a continuación.
- La tarea devuelve failed
Revisa tanto
$result.errorCodecomo$result.error. La excepción del script para una tarea en estado terminal solo incluye el código de error.Prueba esto: Deja de consultar esa tarea y soluciona la causa indicada. Por ejemplo,
site-unreachablees un error de la tarea, no una prueba de que la propia solicitud a la API haya fallado. Consulta Errores de la API de CAPTCHA.
Recupera una solicitud de resultado incierto sin crear otra tarea
Un tiempo de espera agotado no demuestra que la solicitud de creación haya fallado. El bloque catch muestra requestId y, si se recibió, taskId. Conserva esos valores.
- 1.
Si tienes un ID de tarea, recupera esa tarea
Continúa con GET
/v1/tasks/:iden lugar de crear otra tarea. Que se alcance el límite de tiempo local del script no confirma que la tarea remota haya fallado. - 2.
Si la creación no devolvió un ID de tarea, reutiliza la solicitud original
Vuelve a enviar los mismos datos de entrada de la tarea con el mismo
requestIdpara recuperar la tarea existente. Cambiar los datos de entrada y reutilizar ese ID provoca un conflicto. - 3.
No reinicies este script como procedimiento de recuperación
Una nueva ejecución genera un GUID nuevo y, por tanto, una nueva solicitud lógica. Para un uso desatendido, guarda de forma segura el requestId original y los datos de entrada de la tarea antes del POST; después, guarda el ID de la tarea cuando llegue. El ejemplo muestra los ID de recuperación si se produce un fallo, pero no los conserva si se pierde el proceso.
No incluyas los datos de entrada guardados en los registros habituales si la URL del proxy contiene credenciales. Para la recuperación necesitas los datos de entrada originales, no otra copia de la clave de API.
Fuentes y referencia de la API
Ejecuta tu primera tarea.
Empieza con $5 de crédito en tu espacio de trabajo.