الدروس التطبيقية

GeeTest v3 استخراج معلمة شريط التمرير وحلها

تتطلب اختبارات CAPTCHA المنزلقة GeeTest v3 معلمتين لحلها: gt (معرف موقع ثابت) وchallenge (رمز جلسة ديناميكي). يوضح هذا الدليل كيفية استخراج كليهما من أي صفحة وإرسالهما إلى CaptchaAI.


وأوضح المعلمات GeeTest v3

المعلمة الوصف Static/Dynamic مثال
gt معرف الموقع (ست عشري 32 حرفًا) ثابت لكل موقع 019924a82c70bb123aae90d483b6a0ed
challenge رمز الجلسة (ست عشري 32 حرفًا) ديناميكية لكل تحميل للصفحة a3f5c8d2e1b04a6789012345678abcdf
api_server النطاق الفرعي لـ GeeTest API (اختياري) ثابت لكل موقع api-na.geetest.com

تظل قيمة gt كما هي عبر الطلبات. تتغير قيمة challenge في كل مرة يتم فيها تحميل اختبار CAPTCHA - ويجب عليك استخراج قيمة جديدة لكل محاولة حل.


الأسلوب 1: اعتراض استدعاء API التسجيل

تجلب معظم تطبيقات GeeTest v3 التحدي من نقطة نهاية التسجيل. يبدو الرد كالتالي:

{
  "success": 1,
  "challenge": "a3f5c8d2e1b04a6789012345678abcdf",
  "gt": "019924a82c70bb123aae90d483b6a0ed",
  "new_captcha": true
}

بايثون (الطلبات)

import requests
import re

session = requests.Session()
html = session.get("https://example.com/login").text

# Find the register endpoint
register_url = re.search(
    r'(https?://[^"\']+(?:register|captcha|geetest)[^"\']*)',
    html
)

if register_url:
    resp = session.get(register_url.group(1)).json()
    gt = resp["gt"]
    challenge = resp["challenge"]
    print(f"gt: {gt}")
    print(f"challenge: {challenge}")

JavaScript (اعتراض شبكة Puppeteer)

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch();
const page = await browser.newPage();

let geetestParams = {};

page.on('response', async (response) => {
  const url = response.url();
  if (url.includes('register') || url.includes('captcha')) {
    try {
      const json = await response.json();
      if (json.gt && json.challenge) {
        geetestParams = {
          gt: json.gt,
          challenge: json.challenge,
        };
        console.log('Captured GeeTest params:', geetestParams);
      }
    } catch (e) {}
  }
});

await page.goto('https://example.com/login', { waitUntil: 'networkidle2' });
console.log('Final params:', geetestParams);

الطريقة الثانية: الاستخراج من مصدر الصفحة

تقوم بعض المواقع بتضمين المعلمات مباشرة في HTML أو البرامج النصية المضمنة:

import re

# From data attributes
gt_match = re.search(r'data-gt=["\']([a-f0-9]{32})', html)
challenge_match = re.search(r'data-challenge=["\']([a-f0-9]{32})', html)

# From JavaScript variables
if not gt_match:
    gt_match = re.search(r'gt\s*[=:]\s*["\']([a-f0-9]{32})', html)
if not challenge_match:
    challenge_match = re.search(r'challenge\s*[=:]\s*["\']([a-f0-9]{32})', html)

gt = gt_match.group(1) if gt_match else None
challenge = challenge_match.group(1) if challenge_match else None
print(f"gt={gt}, challenge={challenge}")

الطريقة الثالثة: ربط initGeetest

تتم تهيئة GeeTest v3 عبر initGeetest(). اعترضها قبل تشغيل البرامج النصية للصفحة:

// Puppeteer: inject before page scripts
await page.evaluateOnNewDocument(() => {
  window.__geetestConfig = null;
  const origInit = window.initGeetest;

  Object.defineProperty(window, 'initGeetest', {
    set(fn) {
      this._initGeetest = function(config, callback) {
        window.__geetestConfig = config;
        console.log('GeeTest config:', JSON.stringify(config));
        return fn(config, callback);
      };
    },
    get() { return this._initGeetest; }
  });
});

await page.goto('https://example.com/login', { waitUntil: 'networkidle2' });

const config = await page.evaluate(() => window.__geetestConfig);
// config = { gt: "019924a...", challenge: "a3f5c8d...", product: "bind", ... }

حل GeeTest v3 مع CaptchaAI

بايثون

import requests
import time

API_KEY = "YOUR_API_KEY"

# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "geetest",
    "gt": gt,
    "challenge": challenge,
    "pageurl": "https://example.com/login",
    "json": "1",
}).json()

if resp["status"] != 1:
    raise Exception(f"Submit error: {resp['request']}")

task_id = resp["request"]

# Poll
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["status"] == 1:
        solution = result["request"]
        print(f"Solution: {solution}")
        break
    if result["request"] != "CAPCHA_NOT_READY":
        raise Exception(f"Error: {result['request']}")

JavaScript

const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
  params: {
    key: 'YOUR_API_KEY',
    method: 'geetest',
    gt: geetestParams.gt,
    challenge: geetestParams.challenge,
    pageurl: 'https://example.com/login',
    json: 1,
  }
});
const taskId = submit.data.request;

let solution = null;
for (let i = 0; i < 30; i++) {
  await new Promise(r => setTimeout(r, 5000));
  const poll = await axios.get('https://ocr.captchaai.com/res.php', {
    params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
  });
  if (poll.data.status === 1) {
    solution = poll.data.request;
    break;
  }
}
console.log('Solution:', solution);

حقن محلول GeeTest

تتضمن استجابة CaptchaAI لـ GeeTest v3 challenge وvalidate وseccode:

# solution is a pipe-delimited string or JSON object
# Parse and inject into the form
import json

sol = json.loads(solution) if isinstance(solution, str) else solution

driver.execute_script("""
    const form = document.querySelector('form');
    function addHidden(name, value) {
        let input = form.querySelector(`input[name="${name}"]`);
        if (!input) {
            input = document.createElement('input');
            input.type = 'hidden';
            input.name = name;
            form.appendChild(input);
        }
        input.value = value;
    }
    addHidden('geetest_challenge', arguments[0]);
    addHidden('geetest_validate', arguments[1]);
    addHidden('geetest_seccode', arguments[2]);
""", sol["challenge"], sol["validate"], sol["seccode"])

استكشاف الأخطاء وإصلاحها

مشكلة السبب إصلاح
ERROR_BAD_PARAMETERS gt أو challenge مفقود كلاهما مطلوب؛ استخراج القيم الطازجة
التحدي الذي لا معنى له انتهت صلاحية رمز التحدي قم باستخراج تحدي جديد مباشرة قبل التقديم
قيمة gt خاطئة منقول من موقع مختلف gt خاص بالموقع؛ إعادة الاستخراج من الهدف
الحل مرفوض من قبل الموقع انتهت صلاحية التحدي أثناء الحل تقليل الوقت بين الاستخراج والتقديم

الأسئلة الشائعة

ما هي مدة صلاحية تحدي GeeTest؟

عادة 60-120 ثانية. استخرج التحدي وأرسله إلى CaptchaAI على الفور.

ما الفرق بين GeeTest v3 وv4؟

يستخدم GeeTest v3 معلمات gt/challenge وشريط التمرير. يستخدم GeeTest v4 captcha_id ولديه أنواع متعددة من التحديات (انقر، تطابق، شريحة).


حل اختبارات CAPTCHA GeeTest v3 باستخدام CaptchaAI

احصل على مفتاح API الخاص بك علىcaptchaai.com.


أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.