PHP 验证码识别:适用于 Laravel、Symfony 和原生 cURL
一个 Composer 包,就能把 reCAPTCHA、Turnstile 和极验(GeeTest)验证,或验证码图片中的文字,转换成你的 cURL、Guzzle 或 Laravel 代码可以直接提交的值。识别由 CapSkip 在你掌控的硬件上完成。
- PHP 8.0 及更高版本
- 只需 curl 和 json
- 队列 worker 不计量
$solver = new CapSkip();
$token = $solver->recaptcha([
'sitekey' => '6Le-wvkS…',
'url' => 'example.com/signup',
]);03AGdBq27…0.12 秒 · $0.00每一款 PHP 验证码识别工具,都是为了那个尴尬的时刻而存在:你的 cURL 句柄或 Guzzle 客户端请求一个页面,拿回来的却是一个验证挑战,而不是它要解析的 HTML。用 Composer 安装 capskip/capskip,这个挑战就会交给 CapSkip 桌面应用,它运行在你自有或租用的 Windows 硬件上,返回 reCAPTCHA 或 Turnstile token、极验 v3 答案或图片中的文字,供你下一次 POST 直接使用。
这个客户端让你的 vendor 目录保持精简:它只要求 PHP 8.0 或更高版本以及 curl 和 json 扩展,不安装任何其他东西。每一类验证挑战都有自己的方法:recaptcha() 处理 v2、v3 和 Enterprise,turnstile() 同时覆盖嵌入式小组件和 Cloudflare 整页检查,geetest() 处理 v3 滑块,normal() 约 0.1 秒读出扭曲的文字,altcha()、capy()、captchafox() 和 friendlyCaptcha() 补齐其余类型。
你的 PHP 代码可以继续在原来的地方运行。把客户端的 host 选项设为安装了 CapSkip 的机器,所有能访问它的服务器、容器或 cron 主机都通过同一份统一授权识别,每月 35 美元起。账单上没有任何一项取决于你提交了多少表单。
让验证码工作远离请求周期。 每次识别都会占住它的 PHP 进程,直到答案返回,所以请把它派发到队列任务或 cron 脚本中,让你的页面以正常速度响应。识别机器能支撑多少 worker 就启动多少:套餐是统一价格的,多开进程不会让账单增加分毫。 阅读 Laravel 队列指南
为 Composer 项目和 PHP worker 打造
两个 PHP 扩展,别无其他
该包需要 PHP 8.0 或更高版本,并启用 curl 和 json。它不添加任何其他运行时依赖,因此绝不会与你的框架在 composer.lock 中锁定的版本冲突。
所有队列 worker 共用一份授权
Artisan 命令、cron 任务和常驻 worker 都使用同一个不计量的套餐。进程越多,吞吐量越高,直到机器的承载上限,而月费始终不变。
在 Laravel 和 Symfony 中得心应手
在 Laravel 服务提供者中把一个 CapSkip 实例注册为单例,或注册为 Symfony 服务即可。它不绑定任何框架,纯 PHP 脚本用起来同样轻松。
为 Guzzle 和 cURL 量身定制的返回值
取出 $result['code'],放进 Guzzle 的 form_params 或你的 CURLOPT_POSTFIELDS 数组,键名用目标表单提交的字段名,通常是 g-recaptcha-response。
可搭配 Panther 和 php-webdriver
当网站要求真实浏览器时,用 Symfony Panther 或 php-webdriver 驱动它,让 CapSkip 识别验证挑战,然后在点击提交之前把返回的 token 注入表单。
阻塞式调用,上限 300 秒
每次调用都是同步的,reCAPTCHA 识别默认最多可轮询 300 秒。这非常适合 CLI 进程和队列任务,而不适合时限很短的 Web 请求。
从 PHP 项目接入 CapSkip 的三种途径
<?php
// composer require capskip/capskip
require 'vendor/autoload.php';
use CapSkip\CapSkip;
$solver = new CapSkip(['host' => '127.0.0.1', 'port' => 8080]);
$result = $solver->recaptcha(
'YOUR_SITEKEY',
'https://example.com/page-with-recaptcha'
);
echo $result['code']; // g-recaptcha-response token把 YOUR_SITEKEY 和示例 URL 换成你的目标,从命令行运行这个文件,它就会打印出可用于表单提交的 reCAPTCHA token。
手动会话用浏览器扩展
当你亲自在网站上点击操作时,比如测试你自己的注册表单,Chrome 或 Firefox 扩展会让正在运行的 CapSkip 应用通过每个验证挑战,无需任何 PHP 代码。
为你的代码准备的 Composer SDK
引入 capskip/capskip,然后在脚本、命令和 worker 中按验证挑战选择对应的方法。如果其他服务需要,还有 Python、Node.js 和 .NET 的姊妹客户端。
为遗留 2Captcha 代码提供本地 API
围绕 2Captcha 或 Anti-Captcha API 编写的 PHP 类照常发送请求,无需改动:CapSkip 应用能理解这些格式,并从你自己的机器上作答。
用真实的 reCAPTCHA 试试 PHP 客户端
我们的 reCAPTCHA v2 演示页加载的是真实的小组件。把上面的代码片段对准它,在终端运行,就会打印出一个可用的 token,远早于你把它用到生产网站上。
从 composer require 到第一个 token
本地 PHP 识别工具与 2Captcha、CapSolver 对比
CapSkip Composer 客户端与许多 PHP 项目起步时使用的按次计费服务相比如何。
| 功能 | CapSkip | 2Captcha / CapSolver |
|---|---|---|
| 你为什么付费 | 一份月费,35 美元起,从不统计识别次数 | 按次收费,以每 1,000 次计价 |
| 验证挑战在哪里识别 | 在 CapSkip 应用内,在你运行的硬件上 | 远程 API 服务器或人工打码平台 |
| 队列增长时的账单 | 保持不变,无论任务数量多少 | 每个遇到验证码的任务都会推高费用 |
| 谁能看到挑战 | 只有你自己的机器 | 第三方服务会收到它 |
| 并行 PHP worker | 不限线程,速度由你的服务器决定 | 更高吞吐量意味着为更多识别付费 |
| 接入 PHP 的方式 | composer require capskip/capskip,或保留 2Captcha 客户端 | 服务商自己的客户端库 |
| 图片验证码返回时间 | 约 0.1 秒,就地识别 | 一次网络往返,外加排队时间 |
想先试用一下?
开始 3 天免费试用,在你自己的目标上识别 500 个任意类型的验证码。
相关验证码识别工具与指南
用 PHP 识别验证码:cURL 与 Guzzle 工作流程
大多数 PHP 代码都是在脚本化提交表单的途中遇到验证码:cURL 句柄或 Guzzle 客户端获取页面,发现一个验证挑战,必须先拿到有效答案,POST 才能发出。下面的流程能让会话从获取到提交始终保持完整。
首先,从你已经下载的 HTML 中收集输入参数。reCAPTCHA 和 Turnstile 需要 data-sitekey 值和页面 URL。极验 v3 需要一对新签发的 gt 和 challenge,因为每个 challenge 只能用一次,约一分钟后就会失效。图片验证码需要图片本身,并且要用与表单相同的 cookie jar 获取,确保它属于你的会话。如果小组件其实是 hCaptcha,就到此为止,因为 CapSkip 不识别它。
接着,在客户端上调用对应的方法。对于隐形 reCAPTCHA,给 recaptcha() 传入 invisible 选项;对于 v3,把 version 设为 v3,并提供页面自身的 action 标签。遇到完整的 Cloudflare 挑战页时,turnstile() 方法还接受 data 和 pagedata 值。调用会一直阻塞到答案返回,所以请在 CLI 进程或队列任务中运行。
最后,把答案放到网站读取的位置。把 $result['code'] 加入你的 POST 字段,字段名用表单使用的 response 字段名;对于极验,按网站自身前端的方式回传 challenge、validate 和 seccode 值;通过 Cloudflare 挑战页之后,用 CapSkip 返回的 userAgent 重新发送请求。请尽快提交,因为 token 几分钟内就会过期;如果你是通过代理识别的,也要通过同一个代理发送 POST。
相关指南: Laravel 队列验证码任务 · 用 PHP 识别 reCAPTCHA v2 · 用 PHP 识别 Cloudflare Turnstile
识别验证码应该安装哪个 Composer 包?
在 PHP 代码中调用 reCAPTCHA 是什么样子?
Turnstile 方法也能处理 Cloudflare 整页检查吗?
为什么 CapSkip 识别期间我的 Web 请求会超时?
如何在 PHP 中同时运行大量识别?
极验 v3 调用会给 PHP 返回什么?
我能保留为 2Captcha API 编写的 PHP 类吗?
CapSkip 能识别 cURL 下载的图片验证码吗?
为你的 PHP 队列提供不计量的验证码识别
安装应用,添加一个 Composer 包,让你的 worker 按任务需要随时识别。无论队列里有十个任务还是一万个,你的账单都固定不变。
