从 Laravel 调用 CAPTCHA API

作者:solvethree阅读需 1 分钟

使用 Laravel 的 HTTP 客户端创建 solvethree 任务,然后按 ID 获取该任务。将 API 密钥和代理凭据保留在服务器上。HTTP 响应成功还不够:使用求解结果前,请先读取任务状态。

本页内容

配置站点和服务器凭据

  1. 1.

    启用站点配置文件

    在控制台中设置目标主机名,确保工作区中有已激活的 reCAPTCHA 配置。在任务中发送主机名不会创建配置。请参阅站点配置设置。

  2. 2.

    添加服务器配置

    将示例中的 solvethree 条目添加到 config/services.php 的现有数组中。在服务器环境中设置 SOLVETHREE_API_KEY、CAPTCHA_SITE 和 SOLVETHREE_PROXY。不要将这些值放入浏览器代码;CAPTCHA_SITE 是主机名,而不是完整 URL。

  3. 3.

    匹配目标操作

    示例发送 login。请将其改为预期目标请求所使用的操作。示例提供一个 proxy;不要同时发送 proxyCandidates。

创建服务,分别提供创建和获取方法

Laravel 服务 · 经过身份验证的 HTTP 创建与获取
<?php
// app/Services/CaptchaApi.php — configure services.solvethree in config/services.php.
namespace App\Services;

use Illuminate\Support\Facades\Http;
use InvalidArgumentException;

final class CaptchaApi
{
    private function client()
    {
        return Http::baseUrl('https://api.solvethree.com/v1')
            ->withToken(config('services.solvethree.key'))
            ->acceptJson()->asJson()->connectTimeout(10)->timeout(25);
    }

    public function create(string $requestId): array
    {
        if (!preg_match('/^[A-Za-z0-9_-]{1,64}$/', $requestId)) {
            throw new InvalidArgumentException('Invalid logical request ID');
        }
        // The caller keeps this requestId; do not generate another on a timeout.
        return $this->client()->post('/tasks?waitMs=0', [
            'site' => config('services.solvethree.site'),
            'action' => 'login',
            'proxy' => config('services.solvethree.proxy'),
            'requestId' => $requestId,
        ])->throw()->json();
    }

    public function retrieve(string $taskId): array
    {
        if (!preg_match('/^[A-Za-z0-9_-]{1,128}$/', $taskId)) {
            throw new InvalidArgumentException('Invalid task ID');
        }
        return $this->client()->get('/tasks/'.rawurlencode($taskId), ['waitMs' => 15000])
            ->throw()->json();
    }
}
// config/services.php entry:
// 'solvethree' => ['key' => env('SOLVETHREE_API_KEY'),
//   'site' => env('CAPTCHA_SITE'), 'proxy' => env('SOLVETHREE_PROXY')],
// Invoke from your authenticated controller/job. Poll retrieve only while pending
// or solving; ready contains the solution, failed is terminal. Never use retry()
// on create without preserving both this ID and the exact original inputs.

withToken 将工作区密钥作为 Bearer 身份验证凭据发送。POST 请求体采用扁平结构:site、action、proxy 和 requestId 都是顶层字段。不要为 reCAPTCHA 添加 type 或 url 字段。省略 recaptchaType 时,会使用文档中规定的默认值 enterprise-v3。

两个方法都在 json() 前调用 throw()。Laravel 的 HTTP 客户端默认不会因非成功 HTTP 响应而抛出异常,因此这样可以防止调用者将 HTTP 错误载荷当作成功的任务响应。该服务设置了连接和请求超时,并且有意不自动重试 POST。

保存任务 ID 并检查状态

  1. 1.

    每次逻辑求解只创建一次任务

    在经过身份验证的控制器或作业中,调用 create 前先保存由调用者生成的 requestId。它必须包含 1–64 个 ASCII 字母、数字、下划线或连字符。另行保存返回的任务 ID:逻辑请求 ID 用于恢复创建请求;retrieve 接受的是任务 ID。

  2. 2.

    查询现有任务

    使用已保存的任务 ID 调用 retrieve。如果状态为 pending 或 solving,请安排稍后再次获取,而不是在控制器中密集循环。为调用者设置总体等待截止时间;服务的 HTTP 超时限制的是每个请求,而不是求解的生命周期。达到该截止时间并不是创建新任务的理由。

  3. 3.

    处理终态结果

    对于 failed,停止获取并检查 errorCode 和 error;求解失败会退款。对于 ready,使用返回的求解令牌。提交时,使用返回的 userAgent 和 secChUa 身份信息,以及求解时使用的同一代理。就绪的求解结果仍需由目标接受。

区分 HTTP 错误与任务失败。非成功 HTTP 响应由 throw() 处理;包含 failed 的成功响应需要在任务层面处理。不要原样重试无效输入,也不要假定每次失败都意味着余额不足。请参阅 API 错误处理。

恢复超时的创建请求,无需再次付费求解

连接超时无法说明 solvethree 是否已创建任务。如果已有任务 ID,则获取该任务。否则,使用相同的 requestId 和完全相同的任务输入再次创建,以恢复现有任务。

运行您的第一个任务。

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

创建工作区
从 Laravel 调用 CAPTCHA API · solvethree