Огляд
Методи JSON
Задачі з токеном
- reCAPTCHA v2
- reCAPTCHA v2 Enterprise
- reCAPTCHA v3
- Cloudflare Turnstile
- GeeTest v3 / v4
- FunCaptcha (Arkose Labs)
- Amazon AWS WAF
- MTCaptcha
- Friendly Captcha
- Lemin Cropped Captcha
- DataDome
- KeyCaptcha
- Capy Puzzle
- Сторінка перевірки Cloudflare Challenge
- Cutcaptcha
- CyberSiARA
- atbCAPTCHA
- Tencent Captcha
- Prosopo Procaptcha
- CaptchaFox
- Altcha
- NetEase Yidun
- Yandex SmartCaptcha
- VK Captcha
- Binance Captcha
- Своя задача (Imperva, Temu та інші)
Документація UNLOCK API
Надішліть капчу як задачу, потім заберіть відповідь. API використовує ті самі назви методів, задач і коди помилок, що й інші API для розв'язання капчі, тому більшість наявного коду працює після заміни хоста й ключа.
Як працює запит
- 1
createTaskСтворіть задачу
POST /createTask з вашим ключем і об'єктом задачі. Ви отримуєте taskId. Ціна одразу списується з балансу.
- 2
getTaskResultПеревірте результат
Зачекайте близько 5 секунд, потім надсилайте POST /getTaskResult кожні 5 секунд, доки status не стане ready.
- 3
solutionВикористайте відповідь
Вставте токен або текст із solution у форму сторінки. Якщо задача не вдалася, кошти повертаються на баланс.
Основне
- Базовий URL
https://unlock-api.com- API-ключ
- 32 символи, на сторінці акаунта. Надсилайте його як clientKey (JSON) або key (in.php, res.php).
- Формат
- Методи JSON: POST з тілом JSON. in.php і res.php: поля форми GET або POST; додайте json=1 для відповідей у JSON.
- Ліміти
- 1200 запитів на хвилину на акаунт, включно з перевірками результату. Після створення задачі зачекайте близько 5 секунд, потім перевіряйте кожні 5 секунд.
- Ліміт часу
- Задача, не розв'язана протягом 5 хвилин, завершується з ERROR_CAPTCHA_UNSOLVABLE, а кошти повертаються на баланс.
- Оплата
- Ціна задачі списується під час її створення. Кошти за невдалі задачі повертаються автоматично.
Швидкий старт
Розв'яжіть reCAPTCHA v2 методами JSON. Замініть YOUR_API_KEY своїм ключем.
import time, requests
API = "https://unlock-api.com"
KEY = "YOUR_API_KEY"
task = requests.post(f"{API}/createTask", json={
"clientKey": KEY,
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo"
}
}).json()
if task["errorId"]:
raise SystemExit(task["errorCode"])
for _ in range(60): # 60 x 5 s = the 5 minute task limit
time.sleep(5)
r = requests.post(f"{API}/getTaskResult", json={"clientKey": KEY, "taskId": task["taskId"]}).json()
if r["errorId"]:
raise SystemExit(f"{r['errorCode']}: {r.get('errorDescription', '')}") # failed tasks are refunded
if r["status"] == "ready":
print(r["solution"]["gRecaptchaResponse"])
break
else:
raise SystemExit("timed out")const API = "https://unlock-api.com";
const KEY = "YOUR_API_KEY";
const post = (path, body) => fetch(API + path, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(body) }).then((r) => r.json());
const task = await post("/createTask", {
clientKey: KEY,
task: {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo"
},
});
if (task.errorId) throw new Error(task.errorCode);
let solution = null;
for (let n = 0; n < 60 && !solution; n++) { // 60 x 5 s = the 5 minute task limit
await new Promise((r) => setTimeout(r, 5000));
const r = await post("/getTaskResult", { clientKey: KEY, taskId: task.taskId });
if (r.errorId) throw new Error(r.errorCode + ": " + r.errorDescription); // failed tasks are refunded
if (r.status === "ready") solution = r.solution;
}
if (!solution) throw new Error("timed out");
console.log(solution.gRecaptchaResponse);<?php
$api = "https://unlock-api.com";
$key = "YOUR_API_KEY";
function post($url, $body) {
$c = curl_init($url);
curl_setopt_array($c, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"], CURLOPT_POSTFIELDS => json_encode($body)]);
return json_decode(curl_exec($c), true);
}
$task = post("$api/createTask", ["clientKey" => $key, "task" => json_decode('{"type":"RecaptchaV2TaskProxyless","websiteURL":"https://example.com/login","websiteKey":"6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo"}', true)]);
if ($task["errorId"]) exit($task["errorCode"]);
for ($n = 0; $n < 60; $n++) { // 60 x 5 s = the 5 minute task limit
sleep(5);
$r = post("$api/getTaskResult", ["clientKey" => $key, "taskId" => $task["taskId"]]);
if ($r["errorId"]) exit($r["errorCode"] . ": " . $r["errorDescription"]); // failed tasks are refunded
if ($r["status"] === "ready") break;
}
if ($r["status"] !== "ready") exit("timed out");
print_r($r["solution"]["gRecaptchaResponse"]);package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
)
const api = "https://unlock-api.com"
const key = "YOUR_API_KEY"
func post(method string, body map[string]any) map[string]any {
b, _ := json.Marshal(body)
res, err := http.Post(api+"/"+method, "application/json", bytes.NewReader(b))
if err != nil {
panic(err)
}
defer res.Body.Close()
var out map[string]any
json.NewDecoder(res.Body).Decode(&out)
return out
}
func main() {
task := post("createTask", map[string]any{
"clientKey": key,
"task": map[string]any{
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo",
},
})
if task["errorId"].(float64) != 0 {
panic(task["errorCode"])
}
for n := 0; n < 60; n++ { // 60 x 5 s = the 5 minute task limit
time.Sleep(5 * time.Second)
r := post("getTaskResult", map[string]any{"clientKey": key, "taskId": task["taskId"]})
if r["errorId"].(float64) != 0 {
panic(r["errorCode"]) // failed tasks are refunded
}
if r["status"] == "ready" {
fmt.Println(r["solution"])
return
}
}
panic("timed out")
}import java.net.URI;
import java.net.http.*;
import java.util.regex.*;
public class Solve {
static final String API = "https://unlock-api.com", KEY = "YOUR_API_KEY";
static final HttpClient HTTP = HttpClient.newHttpClient();
static String post(String method, String json) throws Exception {
var req = HttpRequest.newBuilder(URI.create(API + "/" + method))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json)).build();
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
}
public static void main(String[] args) throws Exception {
String task = "{\"type\":\"RecaptchaV2TaskProxyless\",\"websiteURL\":\"https://example.com/login\",\"websiteKey\":\"6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo\"}";
String created = post("createTask", "{\"clientKey\":\"" + KEY + "\",\"task\":" + task + "}");
Matcher id = Pattern.compile("\"taskId\":(\\d+)").matcher(created);
if (!id.find()) throw new RuntimeException(created);
for (int n = 0; n < 60; n++) { // 60 x 5 s = the 5 minute task limit
Thread.sleep(5000);
String r = post("getTaskResult", "{\"clientKey\":\"" + KEY + "\",\"taskId\":" + id.group(1) + "}");
if (r.contains("\"errorId\":1")) throw new RuntimeException(r); // failed tasks are refunded
if (r.contains("\"status\":\"ready\"")) { System.out.println(r); return; }
}
throw new RuntimeException("timed out");
}
}using System.Net.Http.Json;
using System.Text.Json;
const string Api = "https://unlock-api.com";
const string Key = "YOUR_API_KEY";
var http = new HttpClient();
async Task<JsonElement> Post(string method, object body) =>
await (await http.PostAsJsonAsync($"{Api}/{method}", body)).Content.ReadFromJsonAsync<JsonElement>();
var task = await Post("createTask", new {
clientKey = Key,
task = JsonSerializer.Deserialize<JsonElement>("""
{"type":"RecaptchaV2TaskProxyless","websiteURL":"https://example.com/login","websiteKey":"6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo"}
""")
});
if (task.GetProperty("errorId").GetInt32() != 0) throw new Exception(task.GetProperty("errorCode").GetString());
for (var n = 0; n < 60; n++) { // 60 x 5 s = the 5 minute task limit
await Task.Delay(5000);
var r = await Post("getTaskResult", new { clientKey = Key, taskId = task.GetProperty("taskId").GetInt64() });
if (r.GetProperty("errorId").GetInt32() != 0) throw new Exception(r.GetProperty("errorCode").GetString()); // failed tasks are refunded
if (r.GetProperty("status").GetString() == "ready") { Console.WriteLine(r.GetProperty("solution")); return; }
}
throw new Exception("timed out");curl -s https://unlock-api.com/createTask \
-H "Content-Type: application/json" \
-d '{"clientKey":"YOUR_API_KEY","task":{"type":"RecaptchaV2TaskProxyless","websiteURL":"https://example.com/login","websiteKey":"6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo"}}'
# {"errorId":0,"taskId":1001}
curl -s https://unlock-api.com/getTaskResult \
-H "Content-Type: application/json" \
-d '{"clientKey":"YOUR_API_KEY","taskId":1001}'
# {"errorId":0,"status":"processing"} then {"errorId":0,"status":"ready","solution":{...},"cost":"0.001"}Методи
createTaskСтворює задачу й повертає її id. Ціна типу задачі списується з балансу, коли задачу прийнято, і повертається, якщо задача не вдалася.getTaskResultПовертає стан задачі. Поки вона розв'язується, status дорівнює processing. Коли вона готова, status дорівнює ready, а solution містить відповідь. Невдала задача повертає errorId 1 з причиною, а кошти за неї вже повернуто на баланс.getBalanceПовертає баланс акаунта в доларах США.getTokenСтворює задачу й чекає на відповідь у тому самому запиті, до 50 секунд. Якщо на той час задача не готова, відповідь приходить зі status processing і taskId; далі перевіряйте її через getTaskResult. Callback з результатом для задач getToken не надсилається.getQueueStatsПовертає поточну чергу: задачі в очікуванні, задачі в розв'язанні та середній час розв'язання за останню годину. Цифри беруться з реальних задач, а не з оцінок.getSpendingStatsПовертає ваші витрати за одну добу за UTC, погодинно: кількість задач і витрачені кошти. Невдалі задачі та задачі з поверненням коштів не враховуються.reportCorrect, reportIncorrectПовідомити про правильну чи неправильну відповідь. Ці виклики приймаються, щоб наявні бібліотеки й далі працювали; повідомлення не змінює списання.testЕхо для налагодження. Повертає отримане тіло JSON без clientKey. Без перевірки ключа й без списання.
Посібники
- API-ключі та безпекаЯк надсилати ключ, використовувати кілька ключів і дозволити доступ лише своїм серверам.
- Ліміти, час і оплатаЛіміти запитів, як часто перевіряти результат, ліміт часу й коли списуються кошти.
- Коди помилокУсі коди помилок: що означають, що робити й чи списуються кошти.
- Робота через проксіКоли розв'язувати через власний проксі та як його передати.
- Callback з результатомОтримуйте результат на свій сервер замість перевірки.
- API форм: in.php і res.phpКласичні запити in.php і res.php для коду, написаного під старі API розв'язання капчі.
Типи задач
Кожен тип має власну сторінку з усіма параметрами, об'єктом solution і прикладами.
Задачі з токеном
- reCAPTCHA v2
RecaptchaV2TaskProxylessuserrecaptcha - reCAPTCHA v2 Enterprise
RecaptchaV2EnterpriseTaskProxylessuserrecaptcha, enterprise=1 - reCAPTCHA v3
RecaptchaV3TaskProxylessuserrecaptcha, version=v3 - Cloudflare Turnstile
TurnstileTaskProxylessturnstile - GeeTest v3 / v4
GeeTestTaskProxylessgeetest, geetest_v4 - FunCaptcha (Arkose Labs)
FunCaptchaTaskProxylessfuncaptcha - Amazon AWS WAF
AmazonTaskProxylessamazon_waf - MTCaptcha
MtCaptchaTaskProxylessmt_captcha - Friendly Captcha
FriendlyCaptchaTaskProxylessfriendly_captcha - Lemin Cropped Captcha
LeminTaskProxylesslemin - DataDome
DataDomeSliderTaskdatadome - KeyCaptcha
KeyCaptchaTaskProxylesskeycaptcha - Capy Puzzle
CapyTaskProxylesscapy - Сторінка перевірки Cloudflare Challenge
AntiCloudflareTaskcloudflare_challenge - Cutcaptcha
CutCaptchaTaskProxylesscutcaptcha - CyberSiARA
AntiCyberSiAraTaskProxylesscybersiara - atbCAPTCHA
AtbCaptchaTaskProxylessatb_captcha - Tencent Captcha
TencentTaskProxylesstencent - Prosopo Procaptcha
ProsopoTaskProxylessprosopo - CaptchaFox
CaptchaFoxTaskProxylesscaptchafox - Altcha
AltchaTaskProxylessaltcha - NetEase Yidun
YidunTaskProxylessyidun - Yandex SmartCaptcha
YandexSmartCaptchaTaskProxylessyandex - VK Captcha
VKCaptchaTaskProxylessvkcaptcha - Binance Captcha
BinanceTaskProxylessbinance - Своя задача (Imperva, Temu та інші)
CustomTaskincapsula, temuimage, hunt, tspd, basilisk
Задачі з картинками та аудіо
- Текст з картинки
ImageToTextTaskpost, base64 - Текстове запитання
TextCaptchaTasktextcaptcha - Сітка картинок
GridTaskpost, recaptcha=1 - Координати кліку
CoordinatesTaskpost, coordinatescaptcha=1 - Поворот
RotateTaskrotatecaptcha - Аудіо
AudioTaskaudio - Виділення рамкою
BoundingBoxTaskbounding_box - Обведення
DrawAroundTaskpost, canvas=1 - Перетягування
DragAndDropTask- - Складна задача з картинками
ComplexImageTask-