如何识别 hCaptcha
上方的方框是一个实时的 hCaptcha 复选框。本页面展示两种方式来识别 hCaptcha 并获取有效的 h-captcha-response token:通过在你自己的代码中调用 CapSkip HTTP API,或将你的工具已经调用的验证码服务重新路由到 CapSkip。CapSkip 是一款无限量的 hCaptcha 识别工具,在你的设备上本地运行,因此没有按次费用,也没有任何数据离开你的机器。
方式一:使用 CapSkip HTTP API 识别 hCaptcha
在构建自动化、爬虫或机器人?只需一个请求,把本页面的 site key 和 URL 发送给 CapSkip 应用,轮询结果,CapSkip 就会返回一个全新的 hCaptcha token,你可以像真实 token 一样提交它。该 API 使用标准的 in.php / res.php 端点,因此可以在 Python, Node.js, PHP, C# 或任何能发起 HTTP 调用的其他语言中使用。
10000000-ffff-ffff-ffff-000000000001
https://capskip.com/zh/captcha-demo/hcaptcha/
开始之前
CapSkip 在本地识别。下载并运行 CapSkip 桌面应用 并让它在后台保持打开。你的代码通过 127.0.0.1:8080与它通信,因此没有云端调用,也没有按次费用。
将 hCaptcha 发送到 CapSkip
提交本页面的 sitekey 和 pageurl 设置为 in.php 连同 method=hcaptcha。CapSkip 会立即返回一个任务 ID。
import time
import requests
API = "http://127.0.0.1:8080" # the CapSkip app on your machine
KEY = "YOUR_API_KEY"
# 1. Submit the hCaptcha shown on this page
task = requests.post(f"{API}/in.php", data={
"key": KEY,
"method": "hcaptcha",
"sitekey": "10000000-ffff-ffff-ffff-000000000001",
"pageurl": "https://capskip.com/zh/captcha-demo/hcaptcha/",
"json": 1,
}).json()["request"]
# 2. Poll until the token is ready
while True:
time.sleep(5)
res = requests.get(f"{API}/res.php", params={
"key": KEY, "action": "get", "id": task, "json": 1,
}).json()
if res["request"] != "CAPCHA_NOT_READY":
break
token = res["request"] # the h-captcha-response token
print(token)const API = 'http://127.0.0.1:8080'; // the CapSkip app on your machine
const KEY = 'YOUR_API_KEY';
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
(async () => {
// 1. Submit the hCaptcha shown on this page
const submit = await fetch(`${API}/in.php`, {
method: 'POST',
body: new URLSearchParams({
key: KEY,
method: 'hcaptcha',
sitekey: '10000000-ffff-ffff-ffff-000000000001',
pageurl: 'https://capskip.com/zh/captcha-demo/hcaptcha/',
json: '1',
}),
}).then((r) => r.json());
// 2. Poll until the token is ready
let res;
do {
await sleep(5000);
res = await fetch(`${API}/res.php?key=${KEY}&action=get&id=${submit.request}&json=1`)
.then((r) => r.json());
} while (res.request === 'CAPCHA_NOT_READY');
const token = res.request; // the h-captcha-response token
console.log(token);
})();<?php
$api = 'http://127.0.0.1:8080'; // the CapSkip app on your machine
$key = 'YOUR_API_KEY';
// 1. Submit the hCaptcha shown on this page
$ch = curl_init("$api/in.php");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => http_build_query([
'key' => $key,
'method' => 'hcaptcha',
'sitekey' => '10000000-ffff-ffff-ffff-000000000001',
'pageurl' => 'https://capskip.com/zh/captcha-demo/hcaptcha/',
'json' => 1,
]),
]);
$task = json_decode(curl_exec($ch), true)['request'];
// 2. Poll until the token is ready
do {
sleep(5);
$res = json_decode(file_get_contents(
"$api/res.php?key=$key&action=get&id=$task&json=1"
), true);
} while ($res['request'] === 'CAPCHA_NOT_READY');
$token = $res['request']; // the h-captcha-response token
echo $token;using System.Text.Json;
const string Api = "http://127.0.0.1:8080"; // the CapSkip app on your machine
const string Key = "YOUR_API_KEY";
var http = new HttpClient();
// 1. Submit the hCaptcha shown on this page
var submit = await http.PostAsync($"{Api}/in.php", new FormUrlEncodedContent(new Dictionary<string, string>
{
["key"] = Key,
["method"] = "hcaptcha",
["sitekey"] = "10000000-ffff-ffff-ffff-000000000001",
["pageurl"] = "https://capskip.com/zh/captcha-demo/hcaptcha/",
["json"] = "1",
}));
string task = JsonDocument.Parse(await submit.Content.ReadAsStringAsync())
.RootElement.GetProperty("request").GetString()!;
// 2. Poll until the token is ready
string token;
do
{
await Task.Delay(5000);
var res = JsonDocument.Parse(await http.GetStringAsync(
$"{Api}/res.php?key={Key}&action=get&id={task}&json=1"));
token = res.RootElement.GetProperty("request").GetString()!;
} while (token == "CAPCHA_NOT_READY");
Console.WriteLine(token); // the h-captcha-response token你会得到一个很长的 token,通常以下列前缀开头: P1_,它对该 site key 有效,可直接提交。同一响应中还带有 respKey 和 useragent (即完成识别的浏览器的用户代理)。
使用 token
将 token 放入小组件隐藏的 h-captcha-response 文本框中。hCaptcha 还会填充一个 g-recaptcha-response 文本框,供读取该字段的站点使用,因此两者都要设置。如果小组件在渲染时带有 data-callback,则用该 token 运行该函数。然后提交表单,你的服务器会通过 hCaptcha siteverify 进行验证。请注意,本演示通过小组件自身的回调进行验证,因此它检查的是小组件生成的 token,而不是你放入字段中的 token。
// 1. Drop the solved token into both response fields
document.querySelector('[name="h-captcha-response"]').value = token;
document.querySelector('[name="g-recaptcha-response"]').value = token;
// 2. If the widget has a data-callback, run it with the token
const cb = document.querySelector('.h-captcha')?.dataset.callback;
if (cb && window[cb]) window[cb](token);
// 3. ...then submit your form.隐形 hCaptcha 与 hCaptcha Enterprise
隐形小组件没有复选框,只有在站点调用 hcaptcha.execute()时才会弹出;请在请求中添加 invisible=1 。Enterprise 站点通常会向小组件传递一个 rqdata 值;请将其作为 data发送。当站点会检查浏览器时,请用 CapSkip 返回的完全相同的 useragent 提交 token。
POST http://127.0.0.1:8080/in.php
key=YOUR_API_KEY
method=hcaptcha
sitekey=SITEKEY_FROM_THE_PAGE
pageurl=https://the-protected-site.com/login
invisible=1
data=RQDATA_FROM_THE_PAGE
json=1
GET http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1
{"status":1,"request":"P1_eyJ0eXAiOiJKV1Qi…","respKey":"E0_eyJ0eXAi…","useragent":"Mozilla/5.0 …"}该 API 还接受 proxy 和 proxytype,这在站点检查 token 是否从你自己的 IP 生成时很有用。Anti-Captcha 风格的客户端可以通过 createTask 发送同一任务,类型为 HCaptchaTaskProxyless, HCaptchaTask 或 HCaptchaEnterpriseTask.
完整的请求参数、响应字段和错误代码列表见 CapSkip API 文档.
方式二:将你现有的识别服务代码发送到 CapSkip
已经在用 hCaptcha 时通过按次付费的验证码服务(例如 2Captcha, Anti-Captcha 或 CapSolver)识别验证码?你无需重写一行代码。CapSkip 应用包含一个 服务模拟器 ,它在本地模拟这些服务自己的 API:选择你使用的服务,点击 添加到 hosts 文件,你的机器人、爬虫或现成工具已经发送给它的每个请求,都会由 CapSkip 在你自己的机器上响应,采用统一价格而非按次账单。
选择你的服务
打开 CapSkip 应用,选择你的代码已经在对接的服务:2Captcha、RuCaptcha、Anti-Captcha、CapMonster Cloud、CapSolver、DeathByCaptcha、SolveCaptcha、NextCaptcha、EzCaptcha 或 Captchas.io。
添加到 hosts 文件
在应用中一键将该服务的域名指向 CapSkip,于是你的工具发出的调用会在你自己的机器上得到响应,而不是发往付费 API。
原样运行你的工具
相同的 API key、相同的请求、相同的轮询循环。CapSkip 以该服务自身的格式回复,你的代码会得到一个有效的 h-captcha-response token。
切换后,下面的内容不会有任何变化。这与你的代码今天发出的调用完全相同,只不过现在 hCaptcha 在本地识别,并且一个有效的 h-captcha-response token 会从 CapSkip 返回:
POST https://2captcha.com/in.php
key=YOUR_EXISTING_API_KEY
method=hcaptcha
sitekey=10000000-ffff-ffff-ffff-000000000001
pageurl=https://capskip.com/zh/captcha-demo/hcaptcha/
GET https://2captcha.com/res.php?key=YOUR_EXISTING_API_KEY&action=get&id=2122988149
OK|P1_eyJ0eXAi… the h-captcha-response token, solved by CapSkip客户端库同样如此:Anti-Captcha 风格的 createTask / getTaskResult 配对,或任何基于这些服务构建的封装,在模拟器开启后都能继续工作。完整的请求和响应参考见 CapSkip API 文档.
关于识别 hCaptcha 的更多内容
针对人们通常与此演示搭配使用的工具和语言的指南。
关于本 hCaptcha 演示
本页是一个实时的 hCaptcha 演示 ,在这里你可以测试 hCaptcha 的工作原理,并实时观看它被识别的过程。hCaptcha 是一款注重隐私的验证码,许多网站用它来替代 reCAPTCHA:它会显示一个“我是人类”复选框,并在无法确定访问者身份时弹出图片挑战,例如在网格中选出匹配的图片。用它来探索 hCaptcha token 的生成、 h-captcha-response 值,以及网站用来保护表单、登录和注册免受垃圾信息、滥用和机器人侵害的验证流程。
开发者、测试人员和自动化工程师可以使用这个 hCaptcha 测试页面来检查集成、验证配置,并对 CapSkip 识别 hCaptcha 的速度进行基准测试。无论你需要识别一次 hCaptcha 还是自动化数千次识别,CapSkip 都有两种工作方式:可从任何语言调用的普通 HTTP API,以及对你今天可能按次付费的验证码服务的即插即用模拟,两者都以统一价格无限量识别。两者都由同一个桌面 AI 验证码识别工具驱动,安装一次即可在你自己的机器上运行,因此没有任何内容在远程服务器排队,也没有任何按次计费。
