Use Cases

CaptchaAI ile Çin Web Sitelerindeki CAPTCHA'ları Çözme

Çin platformlarından veri toplarken karşınıza çıkan doğrulamalar Batı sitelerindekilerden farklıdır: Çince karakterli resim CAPTCHA'ları, Mandarin aritmetik soruları ve GeeTest v3 kaydırma bulmacaları. Kısa yanıt şu — CaptchaAI'nin Image/OCR, GeeTest v3 ve reCAPTCHA v2 çözücüleri bu bölgeye özgü doğrulamaları tek bir API üzerinden çözer; kodunuzu Çince'ye göre yeniden yazmanıza gerek kalmaz. Aşağıda hangi türle nerede karşılaşacağınızı ve her birini çalışan kodla nasıl çözeceğinizi bulacaksınız.

Çin sitelerinde hangi CAPTCHA türleriyle karşılaşırsınız

CAPTCHA türü Nerede görülür CaptchaAI çözücü
Çince karakterli resim Devlet portalları, akademik veritabanları Image/OCR (language=2)
Çince aritmetik Kayıt formları Image/OCR
GeeTest v3 kaydırma bulmacası Baidu, Bilibili ve birçok büyük platform GeeTest v3
Karaktere sırayla tıklama "Çince karakterlere sırayla tıklayın" Image/OCR (koordinat modu)
reCAPTCHA v2 Uluslararası Çin siteleri reCAPTCHA v2

Dürüst bir not: GeeTest v4 çözümü henüz kullanılamıyor (çok yakında) ve Tencent CAPTCHA gibi özel sağlayıcılar da desteklenen türler arasında değildir. İyi haber şu ki bu sitelerin çoğunda giriş noktasına göre desteklenen bir alternatif (GeeTest v3, reCAPTCHA v2 veya Image/OCR) bulunur.

Türkiye'den tipik bir senaryo

Türk e-ticaret ekiplerinin çoğu, ürün ve fiyat verisini Çinli tedarikçi portallarından takip eder. Bu portallarda oturum açarken ya da genel katalog sayfalarını gezerken Çince karakterli resim CAPTCHA'ları ve GeeTest v3 sık sık devreye girer. Yetkili ve halka açık veriyle çalışan bir veri toplama işinde, CAPTCHA çözümünü aşağıdaki Image/OCR akışına bağlamak, botunuzun her doğrulamada durmasını engeller.

Bir uyarı: Topladığınız veri kişisel bilgi (isim, iletişim bilgisi vb.) içeriyorsa, Türkiye'de bu veri KVKK kapsamına girer. CaptchaAI'yi yalnızca erişim yetkiniz olan ve KVKK ile uyumlu iş akışlarında kullanın.

Akışın genel mantığı

Tür ne olursa olsun, adımlar aynıdır:

  1. Görüntüyü veya GeeTest parametrelerini (gt, challenge) sayfadan çıkarın.
  2. Görevi in.php'ye gönderin ve dönen görev kimliğini saklayın.
  3. Sonuç hazır olana kadar res.php'yi birkaç saniyede bir sorgulayın.
  4. Dönen token'ı ilk isteğinizle aynı oturumda forma ekleyin.

Aşağıdaki Python ve Node.js örnekleri bu dört adımı olduğu gibi uygular.

Python: Çince karakterli resim CAPTCHA'sı

Çince resim CAPTCHA'ları genellikle 请输入验证码 ("lütfen doğrulama kodunu girin") gibi karakterler gösterir ve Çince metnin OCR ile tanınmasını gerektirir. Aşağıdaki fonksiyon görüntüyü base64 olarak gönderir, language=2 ile Çince karakter tanımayı açar ve token'ı res.php üzerinden sorgular. Aynı dosyada Baidu ve Bilibili'de sık görülen GeeTest v3 için de bir çözüm fonksiyonu yer alır.

import requests
import base64
import time

API_KEY = "YOUR_API_KEY"
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"


def solve_chinese_image_captcha(image_path: str) -> str:
    """Solve a Chinese character image CAPTCHA."""
    with open(image_path, "rb") as f:
        image_b64 = base64.b64encode(f.read()).decode()

    resp = requests.post(SUBMIT_URL, data={
        "key": API_KEY,
        "method": "base64",
        "body": image_b64,
        "language": 2,          # 2 = Chinese characters supported
        "json": 1,
    }, timeout=30).json()

    if resp.get("status") != 1:
        raise RuntimeError(f"Submit failed: {resp.get('request')}")

    task_id = resp["request"]
    start = time.monotonic()

    while time.monotonic() - start < 120:
        time.sleep(5)
        poll = requests.get(RESULT_URL, params={
            "key": API_KEY, "action": "get",
            "id": task_id, "json": 1,
        }, timeout=15).json()

        if poll.get("request") == "CAPCHA_NOT_READY":
            continue
        if poll.get("status") == 1:
            return poll["request"]
        raise RuntimeError(f"Solve failed: {poll.get('request')}")

    raise RuntimeError("Timeout")


def solve_chinese_captcha_from_url(captcha_url: str, cookies: dict = None) -> str:
    """Download and solve a Chinese CAPTCHA from a URL."""
    session = requests.Session()
    if cookies:
        session.cookies.update(cookies)

    resp = session.get(captcha_url, timeout=15)
    image_b64 = base64.b64encode(resp.content).decode()

    submit = requests.post(SUBMIT_URL, data={
        "key": API_KEY,
        "method": "base64",
        "body": image_b64,
        "language": 2,
        "json": 1,
    }, timeout=30).json()

    if submit.get("status") != 1:
        raise RuntimeError(f"Submit: {submit.get('request')}")

    task_id = submit["request"]
    for _ in range(24):
        time.sleep(5)
        poll = requests.get(RESULT_URL, params={
            "key": API_KEY, "action": "get", "id": task_id, "json": 1,
        }, timeout=15).json()

        if poll.get("request") == "CAPCHA_NOT_READY":
            continue
        if poll.get("status") == 1:
            return poll["request"]
        raise RuntimeError(f"Solve: {poll.get('request')}")

    raise RuntimeError("Timeout")


# --- GeeTest on Chinese platforms ---

def solve_geetest_chinese(gt: str, challenge: str, pageurl: str) -> dict:
    """Solve GeeTest v3 commonly found on Baidu, Bilibili, etc."""
    resp = requests.post(SUBMIT_URL, data={
        "key": API_KEY,
        "method": "geetest",
        "gt": gt,
        "challenge": challenge,
        "pageurl": pageurl,
        "json": 1,
    }, timeout=30).json()

    if resp.get("status") != 1:
        raise RuntimeError(f"Submit: {resp.get('request')}")

    task_id = resp["request"]
    for _ in range(36):
        time.sleep(5)
        poll = requests.get(RESULT_URL, params={
            "key": API_KEY, "action": "get", "id": task_id, "json": 1,
        }, timeout=15).json()

        if poll.get("request") == "CAPCHA_NOT_READY":
            continue
        if poll.get("status") == 1:
            # GeeTest returns challenge, validate, seccode
            return poll["request"]
        raise RuntimeError(f"Solve: {poll.get('request')}")

    raise RuntimeError("Timeout")


# Usage — Chinese government portal
text = solve_chinese_image_captcha("chinese_captcha.png")
print(f"Chinese CAPTCHA text: {text}")

# GeeTest on a Chinese platform
geetest_result = solve_geetest_chinese(
    gt="b46d1900d0a894591f1561f8c35670a7",
    challenge="dynamic_challenge_string",
    pageurl="https://www.example.cn/login",
)

JavaScript: Çin sitesi CAPTCHA akışı

Node.js tarafında akış aynıdır: görüntüyü okuyun, in.php'ye gönderin ve token hazır olana kadar res.php'yi 5 saniyede bir sorgulayın. GeeTest için gt ve challenge değerlerini sayfadan çıkarıp aynı biçimde gönderirsiniz.

const API_KEY = "YOUR_API_KEY";
const SUBMIT_URL = "https://ocr.captchaai.com/in.php";
const RESULT_URL = "https://ocr.captchaai.com/res.php";
const fs = require("fs");

async function solveChineseImageCaptcha(imagePath) {
  const imageB64 = fs.readFileSync(imagePath, "base64");

  const body = new URLSearchParams({
    key: API_KEY,
    method: "base64",
    body: imageB64,
    language: "2",
    json: "1",
  });

  const resp = await (await fetch(SUBMIT_URL, { method: "POST", body })).json();
  if (resp.status !== 1) throw new Error(`Submit: ${resp.request}`);

  const taskId = resp.request;
  for (let i = 0; i < 24; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const url = `${RESULT_URL}?key=${API_KEY}&action=get&id=${taskId}&json=1`;
    const poll = await (await fetch(url)).json();
    if (poll.request === "CAPCHA_NOT_READY") continue;
    if (poll.status === 1) return poll.request;
    throw new Error(`Solve: ${poll.request}`);
  }
  throw new Error("Timeout");
}

async function solveGeeTest(gt, challenge, pageurl) {
  const body = new URLSearchParams({
    key: API_KEY,
    method: "geetest",
    gt,
    challenge,
    pageurl,
    json: "1",
  });

  const resp = await (await fetch(SUBMIT_URL, { method: "POST", body })).json();
  if (resp.status !== 1) throw new Error(`Submit: ${resp.request}`);

  const taskId = resp.request;
  for (let i = 0; i < 36; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const url = `${RESULT_URL}?key=${API_KEY}&action=get&id=${taskId}&json=1`;
    const poll = await (await fetch(url)).json();
    if (poll.request === "CAPCHA_NOT_READY") continue;
    if (poll.status === 1) return poll.request;
    throw new Error(`Solve: ${poll.request}`);
  }
  throw new Error("Timeout");
}

// Usage
const text = await solveChineseImageCaptcha("chinese_captcha.png");
console.log(`Chinese text: ${text}`);

Çin sitelerini kazırken pratik ipuçları

Kod çalışsa bile üretimde tökezleten ayrıntılar genelde şunlardır:

  • UTF-8 baştan sona: Karakterler bozuk görünüyorsa, istek ve yanıtlarda UTF-8 kodlamasını her katmanda sağlayın.
  • Tek oturum: CAPTCHA görüntüsünü, formu göndereceğiniz oturumla aynı oturumda indirin; çerezler bu yüzden korunmalı.
  • GeeTest parametreleri: gt ve challenge değerlerini sayfa betiklerinden veya API çağrılarından çıkarın.
  • İstek dağıtımı: Çin CDN'lerinde hız sınırına takılmamak için istekleri Çin bölgesindeki IP'lere sahip proxy'ler arasında dağıtın.
  • Yeniden yükleme yok: CAPTCHA her yüklemede yenilendiği için görüntüyü bir kez indirin, çözün ve gönderin; sayfayı tazelemeyin.

Sorun giderme

Çince CAPTCHA'larda en sık görülen hatalar kodlama ve oturum yönetiminden kaynaklanır. Aşağıdaki tablo belirti, sebep ve çözümü bir arada verir:

Sorun Sebep Çözüm
Sonuçta bozuk Çince karakterler Kodlama uyuşmazlığı Yanıtı UTF-8 olarak çözdüğünüzden emin olun
GeeTest challenge'ın süresi doldu challenge'ın TTL'si kısadır Sayfayı yükledikten birkaç saniye içinde çıkarıp gönderin
Resim CAPTCHA yanlış metin döndürüyor Çince ve Latin karakter karışımı Çince karakter tanıma için language=2 ayarlayın
Çözümden sonra oturum reddediliyor Çerezler korunmuyor CAPTCHA alımı ve form gönderimi için aynı oturumu kullanın
Devlet sitelerinde çözüm oranı düşük Karmaşık karakter render'ı Daha yüksek çözünürlüklü CAPTCHA görüntüleri doğruluğu artırır

Maliyet: thread başına, sabit USD

CaptchaAI çözüm başına değil, eşzamanlı thread başına ücretlendirir ve her planda thread başına sınırsız çözüm sunar. Tek bir bot veya küçük bir kazıma işi için BASIC ($15/ay, 5 thread) başlangıçta yeterlidir; paralel oturum sayınız arttıkça ADVANCE ($90/ay, 50 thread) gibi daha fazla thread'li bir plana geçebilirsiniz. TL'nin dalgalı olduğu bir ortamda fiyatların USD ve aylık sabit olması bütçeyi öngörülebilir kılar; Çince CAPTCHA'lar için ek bir tür ücreti yoktur.

Sık sorulan sorular

Çince karakterli resim CAPTCHA'sını çözmek ne kadar sürer?

Image/OCR çözümleri genellikle birkaç saniye içinde döner; kesin süre görüntü karmaşıklığına ve o anki yüke göre değişir. Örnek kodda sonucu res.php üzerinden 5 saniyede bir sorguluyoruz ve token hazır olduğunda döndürüyoruz.

GeeTest v4 kullanan Çin siteleri için ne yapmalıyım?

GeeTest v4 çözümü henüz kullanılamıyor (çok yakında). Bir sitede v4 ile karşılaşırsanız, aynı sitenin desteklenen bir doğrulama türü (GeeTest v3, reCAPTCHA v2 veya Image/OCR) sunan bir giriş yolu olup olmadığını kontrol edin; çoğu platformda desteklenen bir alternatif bulunur.

Sonuçta Çince karakterler neden bozuk çıkıyor?

Neredeyse her zaman kodlama uyuşmazlığından kaynaklanır. İstemcinizin yanıtı UTF-8 olarak çözdüğünden ve görüntüyü indirdiğiniz oturumla formu gönderdiğiniz oturumun aynı olduğundan emin olun. language=2 ayarı da Çince karakter tanımayı açar.

Çin siteleri için hangi CaptchaAI planı yeterli?

Bu, eşzamanlı iş yükünüze bağlıdır. Tek bir bot veya küçük bir kazıma işi için BASIC ($15/ay, 5 thread) genellikle yeterlidir; paralel çok sayıda oturum çalıştırıyorsanız ADVANCE ($90/ay, 50 thread) gibi daha fazla thread'li bir plana geçin. Tüm planlarda thread başına çözüm sınırsızdır.

İlgili makaleler

Sonraki adımlar

Çin sitelerindeki CAPTCHA'ları çözmeye başlayın — CaptchaAI API anahtarınızı alın ve yukarıdaki Image/OCR ve GeeTest v3 akışlarını iş akışınıza ekleyin.

İlgili kılavuzlar:

Bu makale için yorumlar devre dışı bırakılmıştır.