GeeTest v3 menghadirkan challenge interaktif — slide puzzle, pemilihan ikon, atau pencocokan kata. Tidak seperti reCAPTCHA, GeeTest menggunakan alur verifikasi khusus dengan tiga parameter (gt, challenge, api_server) yang harus Anda ekstrak dari halaman sebelum solve.
Panduan ini menjelaskan proses lengkap mengekstrak parameter GeeTest dan solve challenge dengan API CaptchaAI.
Prasyarat
| Item | Nilai |
|---|---|
| API key CaptchaAI | Dari captchaai.com |
Nilai GeeTest gt |
Identifier statis per situs |
GeeTest challenge |
Nilai dinamis per sesi |
| URL halaman | URL tempat GeeTest muncul |
| Bahasa | Python 3.7+ atau Node.js 14+ |
Langkah 1: Ekstrak parameter GeeTest
GeeTest memerlukan tiga parameter. gt bersifat statis (sama untuk setiap permintaan), sedangkan challenge berubah per sesi.
Metode 1: Tab jaringan
- Buka tab DevTools → Jaringan
- Filter berdasarkan
register-slideataugettype.phpatauget.php - Picu captcha dan cari permintaan inisialisasi
- Responsnya berisi
gt,challenge, dan terkadangapi_server
{
"success": 1,
"gt": "019924a82c70bb123aae90d483087f94",
"challenge": "12345678abc90def12345678abc90def",
"new_captcha": true
}
Metode 2: Sumber halaman
// Search page source for initGeetest or gt value
document.querySelectorAll('script').forEach(s => {
if (s.textContent.includes('initGeetest')) {
console.log(s.textContent);
}
});
Metode 3: Endpoint API
Banyak situs mengambil parameter GeeTest dari endpoint API mereka sendiri:
# The site's registration endpoint
params_response = requests.get("https://example.com/api/captcha/register")
data = params_response.json()
gt = data["gt"]
challenge = data["challenge"]
Langkah 2: Submit Task ke CaptchaAI
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "geetest",
"gt": "019924a82c70bb123aae90d483087f94",
"challenge": "12345678abc90def12345678abc90def",
"api_server": "api.geetest.com", # Optional, use if site specifies
"pageurl": "https://staging.example.com/qa-login",
"json": 1
})
data = response.json()
if data.get("status") != 1:
raise Exception(f"Submit error: {data.get('request')}")
task_id = data["request"]
print(f"Task submitted: {task_id}")
Node.js
const axios = require('axios');
const API_KEY = 'YOUR_API_KEY';
async function submitGeeTest(gt, challenge, pageurl) {
const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: API_KEY,
method: 'geetest',
gt,
challenge,
api_server: 'api.geetest.com',
pageurl,
json: 1
}
});
if (data.status !== 1) throw new Error(`Submit error: ${data.request}`);
return data.request;
}
Langkah 3: Poll Solusi
Solusi GeeTest mengembalikan tiga nilai: challenge, validate, dan seccode.
Python
def get_geetest_solution(task_id):
for attempt in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result.get('request')}")
raise Exception("Timeout")
solution = get_geetest_solution(task_id)
# solution = {
# "geetest_challenge": "12345678abc90def12345678abc90def1a",
# "geetest_validate": "abcdef1234567890abcdef1234567890",
# "geetest_seccode": "abcdef1234567890abcdef1234567890|jordan"
# }
Node.js
async function getGeeTestSolution(taskId) {
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const { data } = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: taskId, json: 1 }
});
if (data.status === 1) return data.request;
if (data.request !== 'CAPCHA_NOT_READY') throw new Error(data.request);
}
throw new Error('Timeout');
}
Langkah 4: Submit Solusi ke Situs Target
Kirim ketiga nilai ke endpoint verifikasi situs:
# Submit the GeeTest solution with the form data
verify_response = requests.post("https://example.com/api/login", data={
"username": "user@example.com",
"password": "password123",
"geetest_challenge": solution["geetest_challenge"],
"geetest_validate": solution["geetest_validate"],
"geetest_seccode": solution["geetest_seccode"]
})
print(f"Login status: {verify_response.status_code}")
Contoh Python lengkap
import requests
import time
API_KEY = "YOUR_API_KEY"
SITE_URL = "https://staging.example.com/qa-login"
# 1. Get GeeTest parameters from the site
params = requests.get("https://example.com/api/captcha/register").json()
# 2. Submit to CaptchaAI
submit = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "geetest",
"gt": params["gt"],
"challenge": params["challenge"],
"pageurl": SITE_URL,
"json": 1
}).json()
task_id = submit["request"]
# 3. Poll for solution
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
solution = result["request"]
break
# 4. Submit to site
login = requests.post(SITE_URL, data={
"username": "user@example.com",
"password": "pass",
"geetest_challenge": solution["geetest_challenge"],
"geetest_validate": solution["geetest_validate"],
"geetest_seccode": solution["geetest_seccode"]
})
print(f"Result: {login.status_code}")
Pemecahan Masalah
| Error | Penyebab | Solusi |
|---|---|---|
ERROR_BAD_PARAMETERS |
GT atau challenge tidak ada | Keduanya diperlukan — ekstrak dari halaman |
ERROR_CAPTCHA_UNSOLVABLE |
Challenge sudah kedaluwarsa atau tidak valid | Ambil challenge baru dari situs |
| Solusi ditolak oleh situs | Nilai challenge basi | Challenge sekali pakai; ambil yang baru untuk setiap percobaan |
geetest_validate kosong |
Penyelesaian gagal secara internal | Coba lagi dengan challenge baru |
Contoh lengkap yang dapat dijalankan
Butuh proyek kerja lengkap dengan pengaturan lingkungan, polling, percobaan ulang, dan penanganan kesalahan?
Lihat contoh lengkap yang dapat dijalankan di GitHub →
Pertanyaan Umum
Mengapa harus mengambil challenge baru setiap saat?
Nilai challenge hanya sekali pakai. Setelah digunakan (baik karena solve berhasil atau kedaluwarsa), backend situs akan menolaknya. Selalu ambil challenge baru sebelum setiap solve.
Apa parameter api_server?
Ini menentukan server GeeTest mana yang menangani verifikasi. Nilai umum adalah api.geetest.com dan api-na.geetest.com. Jika situs menggunakan server khusus, sertakan dalam request Anda.
Berapa lama solve GeeTest?
Biasanya 15–30 detik. Slide puzzle dan challenge ikon membutuhkan waktu yang sama.
Bisakah saya solve GeeTest v4 dengan metode ini?
Tidak. GeeTest v4 menggunakan protokol yang berbeda. Periksa apakah CaptchaAI mendukung versi GeeTest tertentu di situs.
Apa perbedaan antara GeeTest slide dan click challenge?
GeeTest v3 memiliki beberapa tipe challenge (slide, klik ikon, pencocokan kata), tetapi parameter dan alur API identik. CaptchaAI menangani semua tipe v3 secara transparan.
Panduan Terkait
- Error dan Perbaikan GeeTest v3 Umum
- GeeTest vs reCAPTCHA