PHP SDK

PHP 验证码识别:适用于 Laravel、Symfony 和原生 cURL

一个 Composer 包,就能把 reCAPTCHA、Turnstile 和极验(GeeTest)验证,或验证码图片中的文字,转换成你的 cURL、Guzzle 或 Laravel 代码可以直接提交的值。识别由 CapSkip 在你掌控的硬件上完成。

Windows x64·本地运行,验证码不会离开你的电脑
  • PHP 8.0 及更高版本
  • 只需 curl 和 json
  • 队列 worker 不计量
每月验证码数量40,000
40.0k250.0k
别家按次收费,每 1,000 次约 $1.40$56.00
CapSkip Bronze,统一定价$35.00
$21.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
<?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

  1. 准备好识别机器

    选一台你的 PHP 主机能访问到的 Windows 桌面电脑或 VPS,在上面安装 CapSkip。之后它就为你指向它的每台服务器、每个容器和每个 cron 任务完成识别。 下载安装程序

  2. 用试用或套餐登录

    使用试用账户(500 次识别,3 天有效,无需绑卡)或月度套餐的登录信息。每个档位解锁的验证码类型都相同。 获取免费试用

  3. 引入包,开始识别

    运行 composer require capskip/capskip,用识别机器的地址创建一个客户端,然后在 CLI 脚本或队列任务中调用对应验证挑战的方法。 浏览 API 文档

本地 PHP 识别工具与 2Captcha、CapSolver 对比

CapSkip Composer 客户端与许多 PHP 项目起步时使用的按次计费服务相比如何。

功能CapSkip2Captcha / CapSolver
你为什么付费一份月费,35 美元起,从不统计识别次数按次收费,以每 1,000 次计价
验证挑战在哪里识别在 CapSkip 应用内,在你运行的硬件上远程 API 服务器或人工打码平台
队列增长时的账单保持不变,无论任务数量多少每个遇到验证码的任务都会推高费用
谁能看到挑战只有你自己的机器第三方服务会收到它
并行 PHP worker不限线程,速度由你的服务器决定更高吞吐量意味着为更多识别付费
接入 PHP 的方式composer require capskip/capskip,或保留 2Captcha 客户端服务商自己的客户端库
图片验证码返回时间约 0.1 秒,就地识别一次网络往返,外加排队时间

价格

不再按次付费

选择你的授权

黄金授权

$75/ 月

订阅黄金授权

授权即时激活

按月计费,可随时在账户中取消。

功能相同,机器越多,吞吐量越大。

每台机器的识别速度都受限于它自己的 CPU 和内存。机器越多,同时运行的线程就越多:白银可同时识别两倍数量的验证码,黄金则是三倍。

  • 无限解决,无每日上限
  • 无限线程,速度随硬件提升
  • 90% 至 100% 的识别准确率
  • 可直接替代主流打码服务的 API
  • 几乎兼容任何工具,无需编写代码
  • REST API、SDK 和浏览器扩展
  • 出现新的验证码类型时免费训练
  • 在你自己的机器上运行,数据不外传

上面展示的每一种验证码类型,每个授权都支持。 查看支持范围

想先试用一下?

开始 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 包?
运行 composer require capskip/capskip。该包采用 MIT 许可,免费使用,需要 PHP 8.0 或更高版本以及 curl 和 json 扩展,不带任何其他运行时依赖。它只是你的代码和 CapSkip 应用之间的信使,所以识别本身需要 CapSkip 授权,可以从 3 天免费试用开始。
在 PHP 代码中调用 reCAPTCHA 是什么样子?
从获取到的页面中读取 data-sitekey,用该 key 和页面 URL 调用 recaptcha(),然后把 $result['code'] 作为 g-recaptcha-response 提交。同一个方法还能通过 invisible 选项处理隐形 reCAPTCHA,把 version 选项设为 v3 并加上页面的 action 名称后即可处理 v3,Enterprise 网站也同样支持。
Turnstile 方法也能处理 Cloudflare 整页检查吗?
可以。turnstile() 方法会识别嵌入式小组件,它返回的 token 填入表单的 Turnstile 响应字段。对于 Cloudflare 在网站加载前显示的过渡页,还要收集它的 data 和 pagedata 值,然后带上结果中的 userAgent 值,通过识别时使用的同一个代理重新发送请求。
为什么 CapSkip 识别期间我的 Web 请求会超时?
因为调用会阻塞整个 PHP 进程,而像 reCAPTCHA 这样基于浏览器的识别默认最多可轮询 300 秒,远远超过常见的 max_execution_time。请把识别移到 artisan 命令、cron 脚本或队列 worker 中,那里的进程允许等待答案返回。
如何在 PHP 中同时运行大量识别?
多开进程。一个 PHP 进程同一时间只处理一个识别,所以请启动多个队列 worker 或 CLI 脚本,全部指向同一个 CapSkip 应用。每个套餐的线程都不限量;上限只取决于识别机器的处理器和内存能承受多少,价格纹丝不动。
极验 v3 调用会给 PHP 返回什么?
在识别前从网站获取新的 gt 值和 challenge,因为每个只能使用一次。geetest() 方法通常需要 7 到 12 秒,返回 $result['challenge']、$result['validate'] 和 $result['seccode'],你再按网站自身前端使用的格式回传它们。
我能保留为 2Captcha API 编写的 PHP 类吗?
可以。在运行 CapSkip 的 Windows 机器上开启 2Captcha 模拟,并点击 Add to hosts file 按钮;之后你现有的类就会在本地获得答案。如果这段 PHP 代码部署在另一台服务器上,通常可以改为把这个类指向 CapSkip 机器的 8080 端口。
CapSkip 能识别 cURL 下载的图片验证码吗?
可以。normal() 方法接受已保存的文件、远程图片链接或 base64 数据,字符会返回在 $result['code'] 中,通常约 0.1 秒。请在与表单相同的 cURL 会话中获取图片(包括 cookie),这样答案才与你的会话匹配。图片识别不需要代理。

为你的 PHP 队列提供不计量的验证码识别

安装应用,添加一个 Composer 包,让你的 worker 按任务需要随时识别。无论队列里有十个任务还是一万个,你的账单都固定不变。