API 文档

关于可用端点、请求格式、参数以及示例响应的参考,帮助你将 API 集成到自己的应用中。

本文档面向希望将 CapSkip 直接集成到自己脚本、应用或自动化系统中的开发者。使用第三方软件的用户请参阅“教程”部分获取设置说明。

CapSkip 模拟广泛使用的验证码识别服务的 API,使其无需任何改动即可连接到兼容的第三方软件。集成通常只需运行 CapSkip。

本文档说明如何提交请求并获取结果。CapSkip 支持多个 API 家族,包括 2Captcha 风格的 API(in.php / res.php)、AntiCaptcha、CapMonster 和 CapSolver 使用的 JSON createTask / getTaskResult API,以及 DeathByCaptcha REST API。同一家族内的服务共享相同的端点、请求和响应格式,每个服务只有基础 URL(主机和端口)不同。

API 家族服务
2captcha 风格2captcha.com, rucaptcha.com, solvecaptcha.com, captchas.io
JSON(createTask / getTaskResult)anti-captcha.com, capmonster.cloud, capsolver.com
DeathByCaptchadeathbycaptcha.com

图片验证码

普通验证码是一张包含扭曲但人类可读文字的图片。要识别它,用户必须输入图片中显示的文字。

要识别普通验证码,请通过 HTTP POST 请求将图片提交到 API 端点。使用配置好的本地地址和端口,将请求直接发送到你的 CapSkip 实例,例如: http://127.0.0.1:PORT/in.php

CapSkip 接受 multipart/form-data 或 Base64 编码格式的图片。

Multipart 示例表单

<form method="post" action="http://127.0.0.1:PORT/in.php" enctype="multipart/form-data">
<input type="hidden" name="method" value="post">
Your key:
<input type="text" name="key" value="YOUR_APIKEY">
The CAPTCHA file:
<input type="file" name="file">
<input type="submit" value="Upload and get the ID">
</form>

YOUR_APIKEY 表示你的 API 密钥(如果在 CapSkip 中启用了 API 密钥校验)。如果禁用了 API 密钥校验,任何字符串值都会被接受。

Base64 示例表单

<form method="post" action="http://127.0.0.1:PORT/in.php">
<input type="hidden" name="method" value="base64">
Your key:
<input type="text" name="key" value="YOUR_APIKEY">
The CAPTCHA file body in base64 format:
<textarea name="body">BASE64_FILE</textarea>
<input type="submit" value="Upload and get the ID">
</form>

YOUR_APIKEY 表示你的 API 密钥(如果在 CapSkip 中启用了 API 密钥校验)。如果禁用了 API 密钥校验,任何字符串值都会被接受。

BASE64_FILE 是 Base64 编码的图片数据。

POST 请求参数列表
POST 参数类型是否必填说明
key字符串 你的 CapSkip API 密钥。
method字符串 post – submit the image using multipart/form-data
base64 – 以 Base64 编码字符串提交图片
file文件是* 验证码图片文件。
* 当 method=post 时必填。
body字符串是* Base64 编码的验证码图片数据。
* 当 method=base64 时必填。
json整数
默认:0
0 – 以纯文本返回响应
1 – 以 JSON 格式返回响应

提交验证码(multipart 文件上传):

curl -X POST -F "key=YOUR_API_KEY" -F "method=post" -F "[email protected]" http://127.0.0.1:8080/in.php

提交验证码(base64 编码):

curl -X POST -d "key=YOUR_API_KEY&method=base64&body=BASE64_IMAGE_DATA" http://127.0.0.1:8080/in.php

提交请求后,如果一切正确,CapSkip 会以纯文本返回验证码 ID: OK|12345

如果使用了 json=1 参数,响应将以 JSON 格式返回:

{
"status":1,
"request":"12345"
}

等待 1 秒,然后向结果端点(/res.php)发送带有返回的验证码 ID 的 HTTP GET 请求。

如果验证码已被识别,CapSkip 会以纯文本返回结果: OK|TEXT

如果指定了 json=1 ,响应将是:

{
"status":1,
"request":"TEXT"
}

如果验证码尚未识别完成,CapSkip 会返回: CAPCHA_NOT_READY

这种情况下,等待 1 秒并重复请求,直到收到最终结果。如果 CapSkip 返回空的响应体,说明结果已被读取或该 ID 不存在。每个结果只能读取一次。

GET 请求参数列表
GET 参数类型是否必填说明
key字符串 你的 CapSkip API 密钥。
action字符串 get – 获取所提交验证码的答案。
id整数 由以下方法返回的验证码 ID 由以下端点返回的验证码 ID:.
json整数
默认:0
0 – 以纯文本返回响应
1 – 以 JSON 格式返回响应
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

recaptcha v2 solver  reCAPTCHA V2

reCAPTCHA v2,也称为“我不是机器人”reCAPTCHA,是一种广泛使用的验证码类型,显示如下:
recaptcha v2

要识别 reCAPTCHA v2,请发送 googlekeypageurl 参数,连同 method=userrecaptcha 以及你的 CapSkip API 密钥。

你可以获取 googlekey 使用以下方法之一:

右键点击 reCAPTCHA 小组件并选择 检查。找到一个以如下开头的 URL:

www.google.com/recaptcha/api2/anchor

复制该 URL 中 k 参数的值。或者,在页面源代码中找到 data-sitekey 属性并复制其值。

CapSkip sitekey

获得 site key 后,向以下地址提交 HTTP GET 或 POST 请求: http://127.0.0.1:PORT/in.php

POST 请求参数列表
参数类型是否必填说明
key字符串 你的 CapSkip API 密钥。
method字符串 userrecaptcha – 指定一个 reCAPTCHA v2 请求。
googlekey字符串 在目标页面上找到的 kdata-sitekey 参数的值。
pageurl字符串 reCAPTCHA 所在页面的完整 URL。
enterprise整数
默认:0
1 – 表示 reCAPTCHA Enterprise v2。
0 – 标准 reCAPTCHA v2。
invisible整数
默认:0
1 – 表示隐形 reCAPTCHA。
0 – 标准复选框 reCAPTCHA。
data-s字符串 在页面上找到的 data-s 参数的值。适用于 Google 搜索和某些 Google 服务。
json整数
默认:0
0 – 以纯文本返回响应。
1 – 以 JSON 格式返回响应。
proxy字符串代理地址。IP 认证格式: IP:PORT (示例: 123.123.123.123:3128)。登录/密码认证格式: login:password@IP:PORT
proxytype字符串代理类型。支持的值: HTTP, HTTPS, SOCKS5, SOCKS5H。默认: HTTP 当提供了 proxy 但省略了 proxytype 时。

提交 reCAPTCHA v2(标准):

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com" http://127.0.0.1:8080/in.php

提交 reCAPTCHA v2(隐形):

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&invisible=1" http://127.0.0.1:8080/in.php

提交 Enterprise reCAPTCHA v2:

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1" http://127.0.0.1:8080/in.php

提交 Enterprise reCAPTCHA v2(隐形):

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1&invisible=1" http://127.0.0.1:8080/in.php

如果请求成功,CapSkip 会以纯文本返回验证码 ID: OK|12345

如果使用了 json=1 参数,响应将以 JSON 格式返回:

{
"status":1,
"request":"12345"
}

如果请求失败,CapSkip 会返回一个错误代码。

等待 15 到 20 秒,然后向结果端点发送 HTTP GET 请求以获取答案: http://127.0.0.1:PORT/res.php

GET 请求参数列表
GET 参数类型是否必填说明
key字符串 你的 CapSkip API 密钥。
action字符串 get – 获取所提交验证码的答案。
id整数 由以下方法返回的验证码 ID 由以下端点返回的验证码 ID:.
json整数
默认:0
0 – 以纯文本返回响应
1 – 以 JSON 格式返回响应
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

如果验证码已被识别,CapSkip 会以纯文本或 JSON 响应并返回答案 token。token 看起来类似如下:

03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB-50GQHPEBJUHNnhJyDzwRoRAkVzrf7UkV8wKCdTwrrWqiYDgbrzURfHc2ESsp020MicJTasSiXmNRgryt-gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3-egcplD1uLGh79wC34RF49Ui3eHwua4S9XHpH6YBe7gXzz6_mv-o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q

如果验证码尚未识别完成,CapSkip 会返回 CAPCHA_NOT_READY。这种情况下,等待 5 秒并重复请求。如果 CapSkip 返回空的响应体,说明结果已被读取或该 ID 不存在。每个结果只能读取一次。

找到 ID 为 g-recaptcha-response 的元素,并通过移除 display: none 样式使其可见。

g recaptcha response CapSkip

请注意: 在某些情况下,页面内容是动态生成的,而 g-recaptcha-response element may not appear in the static HTML source. In such situations, inspect the page structure using your browser’s developer tools to locate the dynamically generated element.


作为替代,你可以使用 JavaScript 直接设置 g-recaptcha-response 字段的值:

document.getElementById("g-recaptcha-response").innerHTML="TOKEN";

页面上会出现一个输入框。将答案 token 粘贴到该字段并提交表单。

recaptcha v2 solver  reCAPTCHA V2 回调

在某些情况下,页面没有提交按钮,而是使用回调函数。当 reCAPTCHA 被识别后,该回调函数会自动执行。

POST 和 GET 请求参数列表见此处: reCAPTCHA V2 POST 与 GET 请求参数

回调函数通常定义在 data-callback reCAPTCHA 小组件的属性,例如:

data-callback="myCallbackFunction"

在其他情况下,回调函数被定义为 callbackgrecaptcha.render() 函数的参数,例如:

grecaptcha.render('example', {
'sitekey' : 'someSitekey',
'callback' : myCallbackFunction,
'theme' : 'dark'
});

Another way to locate the callback function is to open the browser’s JavaScript console and inspect the reCAPTCHA configuration object:

___grecaptcha_cfg.clients[0].aa.l.callback

请注意, aa.l 属性可能会有所不同,页面上也可能存在多个 reCAPTCHA 客户端。在这种情况下,你还应检查 clients[1], clients[2],以及其他条目,以定位正确的配置对象。

或者,你可以使用以下脚本自动提取 reCAPTCHA 参数:

function findRecaptchaClients() {
if (typeof (___grecaptcha_cfg) !== 'undefined') {
return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => {
const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' };
const objects = Object.entries(client).filter(([_, value]) => value && typeof value === 'object');objects.forEach(([toplevelKey, toplevel]) => {
const found = Object.entries(toplevel).find(([_, value]) => (
value && typeof value === 'object' && 'sitekey' in value && 'size' in value
));
if (typeof toplevel === 'object' && toplevel instanceof HTMLElement && toplevel['tagName'] === 'DIV'){
data.pageurl = toplevel.baseURI;
}
if (found) {
const [sublevelKey, sublevel] = found;data.sitekey = sublevel.sitekey;
const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback';
const callback = sublevel[callbackKey];
if (!callback) {
data.callback = null;
data.function = null;
} else {
data.function = callback;
const keys = [cid, toplevelKey, sublevelKey, callbackKey].map((key) => `['${key}']`).join('');
data.callback = `___grecaptcha_cfg.clients${keys}`;
}
}
});
return data;
});
}
return [];
}

最后,调用回调函数:

myCallbackFunction();

或者:

___grecaptcha_cfg.clients[0].aa.l.callback();

在某些情况下,回调函数需要一个参数。大多数情况下,你应该将识别得到的 token 作为该参数传入。例如:

myCallbackFunction('TOKEN');

recaptcha v2 solver  reCAPTCHA V2 隐形版

reCAPTCHA v2 还有一种隐形模式。你可以在此查看示例:

https://www.google.com/recaptcha/api2/demo?invisible=true

隐形 reCAPTCHA 不显示“我不是机器人”复选框。相反,它通常附加在按钮上,或在页面加载或用户交互(例如点击按钮或提交表单)时自动触发。

在内部,隐形 reCAPTCHA 小组件被渲染在一个隐藏的 <div> 定位到视口可见区域之外的元素,使其对用户不可见。

根据用户的 Cookie 和风险评分,reCAPTCHA 可能会自动通过而不显示挑战。否则,会出现标准的图片挑战。

大多数情况下,挑战完成后会执行一个回调函数。更多详情请参阅上文的回调部分。

POST 和 GET 请求参数列表见此处: reCAPTCHA V2 POST 与 GET 请求参数

如何判断 reCAPTCHA 是否为隐形版?

你可以通过以下指标之一来识别隐形 reCAPTCHA:

  • “我不是机器人”复选框不可见,但在用户交互后会出现挑战。

  • reCAPTCHA iframe 的 URL 中包含参数 size=invisible.

  • reCAPTCHA 配置对象包含一个 size 属性,其值设置为 invisible,例如:
    ___grecaptcha_cfg.clients[0].aa.l.size === "invisible"

通过 API 识别隐形 reCAPTCHA 时,请包含参数: invisible=1

如何在浏览器中处理隐形 reCAPTCHA?
方法 1:使用 JavaScript

g-recaptcha-response 字段的值设置为 CapSkip 返回的 token:

document.getElementById("g-recaptcha-response").innerHTML="TOKEN";

设置 token 后,执行验证成功后通常会发生的操作。

在大多数情况下,这意味着提交表单。你需要通过其 id, name或其他属性来识别正确的表单,然后触发提交。以下是几个示例:

document.getElementById("recaptcha-demo-form").submit(); //by id "recaptcha-demo-form"
document.getElementsByName("myFormName")[0].submit(); //by element name "myFormName"
document.getElementsByClassName("example").submit(); //by class name "example"

在某些情况下,当 reCAPTCHA 被识别后会自动执行一个回调函数。

回调函数通常定义在 data-callback reCAPTCHA 小组件的属性,例如:

data-callback="myCallbackFunction"

在其他情况下,回调函数被定义为 callbackgrecaptcha.render() 函数的参数,例如:

grecaptcha.render('example', {
'sitekey' : 'someSitekey',
'callback' : myCallbackFunction,
'theme' : 'dark'
});

你只需调用该函数:

myCallbackFunction();
方法 2:修改 HTML

移除包含 reCAPTCHA 小组件的 <div> 元素。

<div style="visibility: hidden; position: absolute; width:100%; top: -10000px; left: 0px; right: 0px; transition: visibility 0s linear 0.3s, opacity 0.3s linear; opacity: 0;">
<div style="width: 100%; height: 100%; position: fixed; top: 0px; left: 0px; z-index: 2000000000; background-color: #fff; opacity: 0.5;  filter: alpha(opacity=50)"></div>
<div style="margin: 0 auto; top: 0px; left: 0px; right: 0px; position: absolute; border: 1px solid #ccc; z-index: 2000000000; background-color: #fff; overflow: hidden;">
<iframe src="https://www.google.com/recaptcha/api2/bframe?hl=en&v=r20170213115309&k=6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs#zglq3yifgkmj"
title="reCAPTCHA 挑战"
style="width: 100%; height: 100%;"
scrolling="no"
name="zglq3yifgkmj"
frameborder="0"></iframe>
</div>
</div>

从页面中移除整个 reCAPTCHA 区块。

<div class="">
<!-- BEGIN: ReCAPTCHA implementation example. -->
<div
id="recaptcha-demo"
class="g-recaptcha"
data-sitekey="6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs"
data-callback="onSuccess"
data-bind="recaptcha-demo-submit"
>
<div
class="grecaptcha-badge"
style="width: 256px; height: 60px; transition: right 0.3s ease 0s; position: fixed; bottom: 14px; right: -186px; box-shadow: 0px 0px 5px gray;"
>
<div class="grecaptcha-logo">
<iframe
src="https://www.google.com/recaptcha/api2/anchor?k=6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs&co=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbTo0NDM.&hl=en&v=r20170213115309&size=invisible&cb=uror1hlow5a"
title="reCAPTCHA 小组件"
scrolling="no"
name="undefined"
width="256"
height="60"
frameborder="0"
></iframe>
</div>
<div class="grecaptcha-error"></div>
<textarea
id="g-recaptcha-response"
name="g-recaptcha-response"
class="g-recaptcha-response"
style="width: 250px; height: 40px; border: 1px solid #c1c1c1; margin: 10px 25px; padding: 0px; resize: none;  display: none; "
></textarea>
</div>
</div>
<script>
var onSuccess = function (response) {
var errorDivs = document.getElementsByClassName('recaptcha-error');
if (errorDivs.length) {
errorDivs[0].className = '';
}
var errorMsgs = document.getElementsByClassName('recaptcha-error-message');
if (errorMsgs.length) {
errorMsgs[0].parentNode.removeChild(errorMsgs[0]);
}
document.getElementById('recaptcha-demo-form').submit();
};
</script>
<!-- Optional noscript fallback. --><!-- END: ReCAPTCHA implementation example. -->
</div>

在被移除的区块位置插入以下代码:

<input type="submit" /> <textarea name="g-recaptcha-response">%g-recaptcha-response%</textarea>

%g-recaptcha-response% 表示从 CapSkip 收到的答案 token。

替换区块后,页面上会出现一个“提交查询”按钮。点击该按钮,将 g-recaptcha-response 值以及所有其他必需的表单数据一起提交到网站。

recaptcha v2 solver  reCAPTCHA V3

reCAPTCHA v3 是 Google 开发的一种现代验证码机制。它不显示可见的挑战,也不需要用户交互,而是根据交互为人类的可能性给出一个分数。

从技术上讲,reCAPTCHA v3 与 reCAPTCHA v2 类似。网站从 reCAPTCHA API 获得一个 token,然后在 POST 请求中发送到目标服务器,并通过 reCAPTCHA API 验证。

关键区别在于 reCAPTCHA v3 不显示可见的挑战。相反,它返回一个评估用户是人类还是机器人的评分。该评分称为 score ,取值范围为 0.0 到 1.0。评分会发送到网站,网站再据此决定如何处理请求。

还有一个名为 action的附加参数,它让网站能够区分不同的用户交互。验证 token 后,reCAPTCHA API 会返回与该请求关联的 action 名称。

如何使用 CapSkip 识别 reCAPTCHA v3?

首先,确认目标网站正在使用 reCAPTCHA v3。

reCAPTCHA v3 的特征包括:

  • 没有可见的验证码或图片挑战

  • 加载的 api.js 脚本带有一个 render=SITEKEY 参数,例如:
    https://www.google.com/recaptcha/api.js?render=SITEKEY

  • 加载的 ___grecaptcha_cfg.clients 数组中包含一个具有较高数字索引的条目,例如 clients[100000]

要识别 reCAPTCHA v3,请确定以下参数:

  1. sitekey
    可在 renderapi.js 脚本 URL 中找到。它也可能出现在 iframe 的 URL 中、调用 grecaptcha.execute()的 JavaScript 代码中,或 ___grecaptcha_cfg 配置对象内部。
  2. action
    通过检查 JavaScript 代码中对以下内容的调用来定位它: grecaptcha.execute(),例如:
    grecaptcha.execute('SITEKEY', {action: 'do_something'})
    在某些情况下,查找 action 需要检查页面加载的多个 JavaScript 文件。如果无法确定 action 值,你可以使用默认值 "verify".
  3. pageurl
理解评分

可接受的评分阈值因网站而异,只能通过测试确定。评分范围为:

  • 0.0 → 很可能是机器人

  • 1.0 → 很可能是人类

大多数网站使用 0.3 到 0.7 之间的阈值,因为即使是正常用户也可能获得较低的评分。

你可以使用以下参数传入你想要的阈值 min_score 参数,但最终评分始终由 Google 在验证时决定,识别工具无法保证。

POST 请求参数列表
参数类型是否必填说明
key字符串 你的 CapSkip API 密钥。
method字符串 userrecaptcha – 指定一个 reCAPTCHA 请求。
version字符串 v3 – 表示该请求用于 reCAPTCHA v3。
googlekey字符串 在目标页面上找到的 data-sitekey 参数的值。
pageurl字符串 reCAPTCHA 所在页面的完整 URL。
enterprise整数
默认:0
1 – 表示 reCAPTCHA Enterprise v3。
0 – 标准 reCAPTCHA v3。
action字符串
默认:verify
在目标页面上找到的 action 在页面上定义的参数的值。
min_score浮点数 请求的 token 最低评分。当你的服务器验证 token 时,Google 会给出最终评分,因此此值只是一个提示,并不保证。无论 Google 之后给出的评分如何,CapSkip 都会返回它获得的 token。
json整数
默认:0
0 – 以纯文本返回响应。
1 – 以 JSON 格式返回响应。
proxy字符串代理地址。IP 认证格式: IP:PORT (示例: 123.123.123.123:3128)。登录/密码认证格式: login:password@IP:PORT
proxytype字符串代理类型。支持的值: HTTP, HTTPS, SOCKS5, SOCKS5H。默认: HTTP 当提供了 proxy 但省略了 proxytype 时。

提交 reCAPTCHA v3:

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&version=v3&action=submit&min_score=0.7&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com" http://127.0.0.1:8080/in.php

提交 Enterprise reCAPTCHA v3:

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&version=v3&action=submit&min_score=0.7&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1" http://127.0.0.1:8080/in.php

如果请求成功,CapSkip 会以纯文本返回验证码 ID: OK|12345

如果使用了 json=1 参数,响应将以 JSON 格式返回:

{
"status":1,
"request":"12345"
}

如果发生错误,CapSkip 会返回一个错误代码。

等待 10 到 15 秒,然后向结果端点发送 HTTP GET 请求: http://127.0.0.1:PORT/res.php

在请求中提供返回的验证码 ID。下表列出了全部可用参数。

如果验证码识别成功,CapSkip 会以纯文本或 JSON 格式返回结果。返回值是一个类似如下的验证 token:

03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB--gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3--o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q

如果验证码尚未识别完成,CapSkip 会返回 CAPCHA_NOT_READY。等待 5 秒并重复请求。如果 CapSkip 返回空的响应体,说明结果已被读取或该 ID 不存在。每个结果只能读取一次。

GET 请求参数列表
GET 参数类型是否必填说明
key字符串 你的 CapSkip API 密钥。
action字符串 get – 获取所提交验证码的答案。
id整数 由以下方法返回的验证码 ID 由以下端点返回的验证码 ID:.
json整数
默认:0
0 – 以纯文本返回响应
1 – 以 JSON 格式返回响应
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

从 CapSkip 收到 token 后,你必须将它正确提交到目标网站。理解其工作方式的最佳方法是观察作为正常用户完成验证时发送的请求。大多数浏览器都提供开发者工具,其中的 Network 标签可让你检查发出的请求。

在大多数情况下,token 通过 POST 请求发送。参数名可能是 g-recaptcha-response,与 reCAPTCHA v2 类似,或类似于 g-recaptcha-response-100000。在某些实现中,可能使用不同的参数名。

你应检查网络请求,确定 token 的传输方式,然后据此构造你的请求。

recaptcha v2 solver  reCAPTCHA Enterprise

reCAPTCHA Enterprise 是 Google reCAPTCHA 系统的高级版本。它可以在 v2 和 v3 两种模式下运行,为网站管理员提供额外的控制,包括评估并报告某次交互是人类还是自动化的能力。

如何识别 reCAPTCHA Enterprise?

第一步是确定该网站是否使用 Enterprise 版本的 reCAPTCHA。

reCAPTCHA Enterprise 的关键特征包括:

  • 页面加载 enterprise.js 而不是 api.js,例如:

    <script src="https://recaptcha.net/recaptcha/enterprise.js" async defer></script>

  • 网站的 JavaScript 代码调用 grecaptcha.enterprise.METHOD 而不是 grecaptcha.METHOD

接下来,确定使用的是哪种实现:v2、隐形 v2 还是 v3。通常可以通过分析小组件的渲染方式及其在页面上的行为来判断。

按照下面的流程图确定正确的实现。它适用于绝大多数情况。

recaptcha enterprise

按照针对 reCAPTCHA v2 或 v3 所述的相同方式确定验证码参数。

对于 v2 Enterprise 实现,可能有额外的可选数据。在大多数情况下,这是在 sdata-s 参数。如果存在,请通过以下方式将该值包含在你的请求中 data-s 参数中定义的自定义字符串。

POST 和 GET 请求参数列表见此处: reCAPTCHA V2 POST 与 GET 请求参数

对于 v3 Enterprise 实现,你可能还需要 action 值。要找到它,请检查网站的 JavaScript 代码并定位 grecaptcha.enterprise.execute() 调用。 action 参数通常在该函数中传递。请记住, action 是可选的,在某些情况下可能未定义。

POST 和 GET 请求参数列表见此处: reCAPTCHA V3 POST 与 GET 请求参数

/in.php 端点提交请求时,请包含附加参数: enterprise=1

之后,以与识别 reCAPTCHA v2 或 v3 相同的方式与 CapSkip API 交互。返回 token 后,根据目标网站的实现将其提交。

Cloudflare turnstile solving Cloudflare Turnstile

Cloudflare Turnstile 是 Cloudflare 开发的一种现代验证码替代方案。它无需依赖传统的视觉挑战即可验证访客是否为人类。Turnstile 可以作为独立小组件出现,也可以作为挑战页面的一部分,并且在极少或无需用户交互的情况下运行。

有两种常见的 Turnstile 实现:

1. 独立 Turnstile 小组件

独立的 Turnstile 小组件直接嵌入在网站页面中,通常用于保护表单免受自动提交。在这种情况下:

  • 从页面中提取 sitekey

  • 将它连同完整的 pageurl.

  • 一起发送到 CapSkip API。 cf-turnstile-response 字段中。

  • 在某些实现中,token 可能还需要放入 g-recaptcha-response 字段中。

  • 如果在 turnstile.render() 配置中定义了回调,请用返回的 token 执行它。

然后照常提交表单。

2. Cloudflare 挑战页面上的 Turnstile

当网站通过 Cloudflare 代理,并在授予访问权限前显示 Turnstile 挑战页面时会出现这种情况。在这种情况下,你必须提取以下参数:

  • cData

  • chlPageData

  • action

这些值必须包含在你的 API 请求中。此外,提交 token 时,你必须使用 CapSkip API 返回的 User-Agent 值。

如何提取所需参数?

要提取所需参数,你可以重写 turnstile.render 方法并拦截调用时传入的参数。例如,将以下 JavaScript 代码注入页面。该脚本必须在 Turnstile 小组件加载之前执行,才能成功捕获参数。

const i = setInterval(()=>{
if (window.turnstile) {
clearInterval(i)
window.turnstile.render = (a,b) => {
let p = {
method: "turnstile",
key: "YOUR_API_KEY",
sitekey: b.sitekey,
pageurl: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent,
json: 1
}
console.log(JSON.stringify(p))
window.tsCallback = b.callback
return 'foo'
}
}
},50)
POST 请求参数列表
参数类型是否必填说明
key字符串 你的 CapSkip API 密钥。
method字符串 turnstile – 指定一个 Cloudflare Turnstile 请求。
sitekey字符串 在目标页面上找到的 data-sitekey 参数的值。
pageurl字符串 Turnstile 挑战所在页面的完整 URL。
action字符串data-action 属性中定义或传给 turnstile.render().
data字符串 的可选 action 值。 cData 传给 turnstile.render() 或在 data-cdata 属性中定义的值。
pagedata字符串 的可选 action 值。 chlPageData 传给 turnstile.render().
json整数
默认:0
0 – 以纯文本返回响应。
1 – 以 JSON 格式返回响应。
proxy字符串代理地址。IP 认证格式: IP:PORT (示例: 123.123.123.123:3128)。登录/密码认证格式: login:password@IP:PORT
proxytype字符串代理类型。支持的值: HTTP, HTTPS, SOCKS5, SOCKS5H。默认: HTTP 当提供了 proxy 但省略了 proxytype 时。

提交 Turnstile(独立):

curl -X POST -d "key=YOUR_API_KEY&method=turnstile&sitekey=0x4AAAAAAABUYP0XeMJF0xoy&pageurl=https://example.com" http://127.0.0.1:8080/in.php

提交 Turnstile(挑战——可选 action、data、pagedata):

curl -X POST -d "key=YOUR_API_KEY&method=turnstile&sitekey=0x4AAAAAAABUYP0XeMJF0xoy&pageurl=https://example.com&action=managed&data=...&pagedata=..." http://127.0.0.1:8080/in.php

如果请求成功,CapSkip 会以纯文本返回验证码 ID: OK|12345

如果使用了 json=1 参数,响应将以 JSON 格式返回:

{
"status":1,
"request":"12345"
}

如果发生错误,CapSkip 会返回一个错误代码。

使用返回的 ID 从 API 的 /res.php 端点获取结果。

GET 请求参数列表
GET 参数类型是否必填说明
key字符串 你的 CapSkip API 密钥。
action字符串 get – 获取所提交验证码的答案。
id整数 由以下方法返回的验证码 ID 由以下端点返回的验证码 ID:.
json整数
默认:0
0 - 以纯文本返回响应。
1 - 以 JSON 格式返回响应,包含 userAgent 值。

对于 Cloudflare Turnstile,识别工具会使用特定的浏览器 User-Agent,你在提交 token 时必须发送相同的 User-Agent。使用 json=1 时,响应中包含一个 userAgent 字段。在纯文本模式下,从 X-Turnstile-User-Agent 响应头读取相同的值。

curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

geetest v3 极验 v3

极验 v3 滑块是极验开发的一种交互式验证码。它通过滑块挑战来验证用户,在区分人类与机器人的同时,提供快速无缝的验证体验。

要用 CapSkip 识别极验 v3 验证码,你必须先从目标网站获取所需的验证码参数。所需参数为:

  • gt:网站公钥(静态)
  • challenge:动态挑战值
  • api_server:极验 API 服务器域名(可选)

这些值通常在网站初始化极验时可获得。

重要: 每次识别请求都必须获取一个新的 challenge 值。验证码在页面上加载后,之前的值就会失效。你应检查网站的网络请求,找到生成新 challenge 值的请求,并在每次向 CapSkip 提交识别请求前执行该请求。 challenge 值。

POST 请求参数列表
参数类型是否必填说明
key字符串是*你的 CapSkip API 密钥。仅当启用了 API 密钥校验 时才需要。
method字符串必须为 geetest。指定你提交的是极验 v3 验证码。
gt字符串加载的 gt 从目标网站获取的值。
challenge字符串加载的 challenge 从目标网站获取的值。每次识别请求都必须获取一个新值。
pageurl字符串包含极验验证码的页面的完整 URL。
api_server字符串目标网站使用的极验 API 服务器域名(例如 api.geetest.comapi-na.geetest.com).
json整数
默认:0
0 以纯文本返回响应。 1 以 JSON 返回响应。
proxy字符串代理地址。IP 认证格式: IP:PORT (示例: 123.123.123.123:3128)。登录/密码认证格式: login:password@IP:PORT.
proxytype字符串代理类型。支持的值: HTTP, HTTPS, SOCKS5, SOCKS5H。默认: HTTP 当提供了 proxy 但省略了 proxytype 时。

向你的 CapSkip API 端点(/in.php)提交 HTTP GET 或 POST 请求,method 为 method=geetest。包含上一步获取的所需极验参数,以及包含验证码的页面的完整 URL。

curl -X POST \
-d "key=YOUR_API_KEY" \
-d "method=geetest" \
-d "gt=f1ab2cdefa3456789012345b6c78d90e" \
-d "challenge=12345678abc90123d45678ef90123a456b" \
-d "pageurl=https://www.example.com/" \
-d "api_server=api-na.geetest.com" \
http://127.0.0.1:8080/in.php

如果一切成功,CapSkip 会以纯文本返回验证码 ID:OK|212

如果使用了 json=1 参数,响应将以 JSON 格式返回:

{
"status": 1,
"request": "212"
}

否则,CapSkip 会返回相应的错误代码。

等待大约 5 秒,然后向 res.php 端点提交 HTTP GET 请求以获取结果。

GET 请求参数列表
参数类型是否必填说明
key字符串是*你的 CapSkip API 密钥。仅当启用了 API 密钥校验 时才需要。
action字符串指定 get 以获取验证码答案。
id整数由以下请求返回的验证码 ID: 由以下端点返回的验证码 ID: 请求。
json整数
默认:0
0 以纯文本返回响应。 1 以 JSON 返回响应。
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=212&json=1"

如果验证码识别成功,CapSkip 会以 JSON 格式返回答案:

{
"status": 1,
"request": "{\"geetest_challenge\":\"1a2b3456cd67890e12345fab678901c2de\",\"geetest_validate\":\"09fe8d7c6ba54f32e1dcb0a9fedc8765\",\"geetest_seccode\":\"12fe3d4c56789ba01f2e345d6789c012|jordan\"}"
}

如果验证码尚未识别完成,CapSkip 会返回: CAPCHA_NOT_READY

等待 5 秒后重复请求。如果发生错误,CapSkip 会返回相应的错误代码。在向目标网站提交请求时,请使用 CapSkip 返回的值,填入以下字段:

  • geetest_challenge
  • geetest_validate
  • geetest_seccode

使用代理

对于 reCAPTCHA v2、v3、Invisible、Enterprise 和 Cloudflare,你可以随每个任务发送一个代理。CapSkip 将通过该代理识别验证码,而不使用 CapSkip 应用中配置的代理池。

当目标网站检查验证码 token 是否与你自己的请求来自同一 IP 地址时(例如 Cloudflare 后面的站点、严格的 reCAPTCHA 评分或地理限制页面),这很有用。

POST 请求参数列表
参数类型是否必填说明
proxy字符串代理地址。IP 认证格式: IP:PORT (示例: 123.123.123.123:3128)。登录/密码认证格式: login:password@IP:PORT
proxytype字符串代理类型。支持的值: HTTP, HTTPS, SOCKS5, SOCKS5H。默认: HTTP 当提供了 proxy 但省略了 proxytype 时。

错误代码

代码含义
ERROR_KEY_DOES_NOT_EXIST无效的 API 密钥。
ERROR_WRONG_USER_KEYAPI 密钥缺失或为空。
ERROR_WRONG_METHOD无效的 HTTP 方法或 action 参数中定义的自定义字符串。
ERROR_WRONG_ID_FORMAT验证码 ID 格式无效。
ERROR_BAD_PARAMETERS缺少或无效的必需参数。
ERROR_UPLOAD未提供图片数据或上传失败。
ERROR_INVALID_IMAGE图片格式无效或图片数据损坏。
ERROR_INVALID_BASE64无效的 base64 编码。
ERROR_TOO_BIG_CAPTCHA_FILESIZE图片大小超过 600 kB 或尺寸超过 1000px。
ERROR_CAPTCHA_UNSOLVABLE识别验证码失败。请提交新任务并重试。
ERROR_GOOGLEKEY无效的 googlekey 参数中定义的自定义字符串。
ERROR_PAGEURL无效的 pageurl 参数中定义的自定义字符串。
CAPCHA_NOT_READY验证码仍在处理中。请继续轮询。
(空响应)结果已被读取,或该 ID 不存在。