GeeTest v3 / v4
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チャレンジページ
- Cutcaptcha
- CyberSiARA
- atbCAPTCHA
- Tencent Captcha
- Prosopo Procaptcha
- CaptchaFox
- Altcha
- NetEase Yidun
- Yandex SmartCaptcha
- VK Captcha
- Binance Captcha
- カスタムタスク(Imperva、Temuなど)
GeeTest v3 / v4
createTaskまたはin.phpでUNLOCK APIにGeeTest v3 / v4タスクを送信する方法です。タスクの種類名、すべてのパラメータ、solutionオブジェクト、プロキシフィールド、7言語のコードサンプルを掲載しています。
- 料金
- $0.70 1タスク $0.0007
- 送信するもの
- ページURLとgtおよびchallenge(v3)、またはcaptcha_id(v4)
- 受け取るもの
- GeeTestフォームが送信する値
タスクの種類名
プロキシなしで解決するには1つ目の名前を使います。ご自身のプロキシ経由で解決するには2つ目の名前を使い、プロキシフィールドを追加します。料金は同じです。
GeeTestTaskProxylessプロキシなしGeeTestTask自分のプロキシを使用taskオブジェクト
typeString必須
タスクの種類名です。大文字と小文字は区別しません。
GeeTestTaskProxyless | GeeTestTaskwebsiteURLString必須
CAPTCHAが表示されるページの完全なアドレスです。http://またはhttps://で始まります。
gtString任意
GeeTest v3: ページにあるgtの値です。
challengeString任意
GeeTest v3: 新しいchallengeの値です。タスクごとに新しく取得してください。
geetestApiServerSubdomainString任意
ページが独自のGeeTest APIサーバーを使う場合、そのサーバーです。
versionInteger任意
GeeTest v4の場合は4です。デフォルトは3です。
initParametersObject任意
GeeTest v4: captcha_idを含むオブジェクトです。
userAgentString任意
解決時に使うブラウザのUser-Agentです。答えを送信するときも同じものを使ってください。
ここにないフィールドは、送信されたままソルバーに渡されます。
プロキシフィールド
プロキシ用の種類名の場合のみ使います。個別のフィールドか、1つのproxy文字列のどちらかで送信してください。
proxyTypeString必須
http、https、socks4、socks5のいずれかです。
proxyAddressString必須
プロキシのIPアドレスまたはホスト名です。
proxyPortInteger必須
プロキシのポートです。
proxyLoginString任意
プロキシのユーザー名です(プロキシで必要な場合)。
proxyPasswordString任意
プロキシのパスワードです(プロキシで必要な場合)。
proxyString
すべてのプロキシフィールドを1つの文字列にしたものです。例: http://user:pass@1.2.3.4:8080。
リクエスト
POST /createTask
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "GeeTestTaskProxyless",
"websiteURL": "https://example.com/login",
"gt": "81388ea1fc187e0c335c0a8907ff2625",
"challenge": "2e2f0f65240058b683cb6ea21c303eea"
}
}solutionオブジェクト
statusがreadyのとき、solutionに入って返されます。
challengeString
送信するGeeTest v3のchallengeです。
validateString
GeeTest v3のvalidateの値です。
seccodeString
GeeTest v3のseccodeの値です。
captcha_idString
GeeTest v4のcaptcha_idです。
lot_numberString
GeeTest v4のlot_numberです。
pass_tokenString
GeeTest v4のpass_tokenです。
gen_timeString
GeeTest v4のgen_timeです。
captcha_outputString
GeeTest v4のcaptcha_outputです。
POST /getTaskResult
{
"errorId": 0,
"taskId": 1001,
"status": "ready",
"solution": {
"challenge": "1ad03db8aff920037fb8117827eab171gu",
"validate": "0e0ab9f2fdbf7b8e2c3c1a2d4f2c9b07",
"seccode": "0e0ab9f2fdbf7b8e2c3c1a2d4f2c9b07|jordan",
"captcha_id": "(v4) e392e1d7fd421dc63325744d5a2b9c73",
"lot_number": "(v4) e6c3bed2854f41f880662c48afff5dcb",
"pass_token": "(v4) fad5eb52fc83bf7617f4...",
"gen_time": "(v4) 1693924478",
"captcha_output": "(v4) fN36ufW6cQN2SQ-I..."
},
"cost": "0.0007",
"createTime": 1791640000,
"endTime": 1791640014,
"solveCount": 1
}コードサンプル
import time, requests
API = "https://unlock-api.com"
KEY = "YOUR_API_KEY"
task = requests.post(f"{API}/createTask", json={
"clientKey": KEY,
"task": {
"type": "GeeTestTaskProxyless",
"websiteURL": "https://example.com/login",
"gt": "81388ea1fc187e0c335c0a8907ff2625",
"challenge": "2e2f0f65240058b683cb6ea21c303eea"
}
}).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"])
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": "GeeTestTaskProxyless",
"websiteURL": "https://example.com/login",
"gt": "81388ea1fc187e0c335c0a8907ff2625",
"challenge": "2e2f0f65240058b683cb6ea21c303eea"
},
});
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);<?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":"GeeTestTaskProxyless","websiteURL":"https://example.com/login","gt":"81388ea1fc187e0c335c0a8907ff2625","challenge":"2e2f0f65240058b683cb6ea21c303eea"}', 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"]);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": "GeeTestTaskProxyless",
"websiteURL": "https://example.com/login",
"gt": "81388ea1fc187e0c335c0a8907ff2625",
"challenge": "2e2f0f65240058b683cb6ea21c303eea",
},
})
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\":\"GeeTestTaskProxyless\",\"websiteURL\":\"https://example.com/login\",\"gt\":\"81388ea1fc187e0c335c0a8907ff2625\",\"challenge\":\"2e2f0f65240058b683cb6ea21c303eea\"}";
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":"GeeTestTaskProxyless","websiteURL":"https://example.com/login","gt":"81388ea1fc187e0c335c0a8907ff2625","challenge":"2e2f0f65240058b683cb6ea21c303eea"}
""")
});
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":"GeeTestTaskProxyless","websiteURL":"https://example.com/login","gt":"81388ea1fc187e0c335c0a8907ff2625","challenge":"2e2f0f65240058b683cb6ea21c303eea"}}'
# {"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"}in.phpフォームメソッド
同じタスクを従来のフォームリクエストで送る方法です。res.phpが答えをテキストで返します。
in.php, res.php
curl -s "https://unlock-api.com/in.php" -d "key=YOUR_API_KEY&method=geetest>=GT&challenge=CHALLENGE&pageurl=https://example.com/login&json=1"
# {"status":1,"request":"1001"}
curl -s "https://unlock-api.com/res.php?key=YOUR_API_KEY&action=get&id=1001&json=1"
# {"status":0,"request":"CAPCHA_NOT_READY"} then {"status":1,"request":"ANSWER"}