API Tutorials

BLS CAPTCHA Talimatları ve Kod Parametresi Derinlemesine İnceleme

BLS vize portallarındaki CAPTCHA, standart bir reCAPTCHA gibi davranmaz: gönderim isteği instructions ve code adında iki ek alan taşır. Kısa yanıt şu — method=bls, sitekey ve pageurl zorunludur; instructions ile code ise isteğe bağlıdır ama belirsiz görsel bulmacalarda doğruluğu artırır. Aşağıda bu iki parametreyi çıkarmayı, CaptchaAI'ye göndermeyi ve token'ı forma enjekte etmeyi Python örnekleriyle görürsünüz.

BLS CAPTCHA, Türkiye'de Schengen ve vize randevu portallarında sık görülür; buradaki çerçeve yalnızca doğrulamayı API ile çözmektir ve kişisel veri içeren akışlarda KVKK yükümlülüklerini gözetin.


BLS CAPTCHA parametreleri: hızlı referans

Parametre Gerekli Tür Açıklama
method Evet Dize bls olmalı
sitekey Evet Dize Sitenin BLS CAPTCHA anahtarı
pageurl Evet Dize CAPTCHA'yı gösteren sayfanın URL'si
instructions Hayır Dize CAPTCHA görselindeki metin talimatları
code Hayır Dize BLS CAPTCHA kodu / tür tanımlayıcısı
json Hayır Tamsayı JSON yanıtları için 1 olarak ayarlayın

instructions ve code'u ne zaman göndermelisiniz

sitekey ve pageurl her istekte zorunludur; instructions ile code ise yalnızca belirli durumlarda fark yaratır. Aşağıdaki koşullardan biri geçerliyse bu iki alanı eklemek çözüm oranınızı yükseltir:

  • Talimat metni görselin dışında, ayrı bir HTML öğesinde duruyorsa — CaptchaAI onu görselden okuyamaz, instructions alanıyla iletmeniz gerekir.
  • Portal, sıralama veya eşleştirme gibi belirsiz bir görev istiyorsa (ör. "resimleri doğru sırayla seçin").
  • Aynı portalda birden fazla BLS varyantı varsa; code hangi türle karşılaştığınızı ayırt eder ve beklenen yanıt biçimini üretir.
  • Düşük çözüm oranı gözlemliyor ve nedenini daraltmak istiyorsanız.

Tek görselli, net bir bulmacada ikisini de boş bırakabilirsiniz; CaptchaAI çoğu durumda yalnızca sitekey ve pageurl ile çözer.


Parametreleri sayfadan çıkarma

Aşağıdaki fonksiyon CAPTCHA öğesini bulur, talimat metnini alır ve code değerini sayfa kaynağından yakalar. Vize portalları alanları çoğu zaman dinamik yüklediği için seçicileri gevşek tutmak ve öğe oluşana kadar beklemek işi sağlamlaştırır.

# extract_bls.py
import re
from selenium import webdriver
from selenium.webdriver.common.by import By


def extract_bls_params(url):
    """Extract BLS CAPTCHA parameters from a page."""
    driver = webdriver.Chrome()
    driver.get(url)

    params = {"pageurl": url}

    # Extract sitekey
    captcha_el = driver.find_element(By.CSS_SELECTOR, "[data-sitekey], .bls-captcha")
    sitekey = captcha_el.get_attribute("data-sitekey")
    if sitekey:
        params["sitekey"] = sitekey

    # Extract instructions if visible
    try:
        instructions_el = driver.find_element(
            By.CSS_SELECTOR, ".captcha-instructions, .captcha-text"
        )
        params["instructions"] = instructions_el.text.strip()
    except Exception:
        pass

    # Extract code from hidden input or script
    page_source = driver.page_source
    code_match = re.search(r'captcha_code["\']?\s*[:=]\s*["\']([^"\']+)', page_source)
    if code_match:
        params["code"] = code_match.group(1)

    driver.quit()
    return params


# Usage
params = extract_bls_params("https://bls-example.com/appointment")
print(params)

BLS CAPTCHA'yı CaptchaAI API'ye gönderme

Temel gönderim

Görev in.php'ye gider, sonuç res.php'den sorgulanır. CAPCHA_NOT_READY geldiği sürece bekleyin; başka bir mesaj gelirse onu hata olarak ele alın.

# solve_bls_basic.py
import requests
import time
import os


def solve_bls(sitekey, pageurl, instructions=None, code=None):
    """Solve BLS CAPTCHA via CaptchaAI API."""
    api_key = os.environ["CAPTCHAAI_API_KEY"]

    payload = {
        "key": api_key,
        "method": "bls",
        "sitekey": sitekey,
        "pageurl": pageurl,
        "json": 1,
    }

    # Add optional parameters for higher accuracy
    if instructions:
        payload["instructions"] = instructions
    if code:
        payload["code"] = code

    resp = requests.post(
        "https://ocr.captchaai.com/in.php",
        data=payload,
        timeout=30,
    )
    result = resp.json()

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

    task_id = result["request"]

    # Poll for result
    time.sleep(10)
    for _ in range(30):
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": api_key,
            "action": "get",
            "id": task_id,
            "json": 1,
        }, timeout=15)
        data = resp.json()

        if data.get("status") == 1:
            return data["request"]
        if data["request"] != "CAPCHA_NOT_READY":
            raise RuntimeError(data["request"])
        time.sleep(5)

    raise TimeoutError("BLS solve timeout")


# Usage
solution = solve_bls(
    sitekey="your-bls-sitekey",
    pageurl="https://bls-example.com/appointment",
    instructions="Select images in the correct order",
)
print(f"Solution: {solution}")

instructions parametresi ne işe yarar

instructions parametresi, CAPTCHA'nın ne istediğini CaptchaAI'ye açıkça bildirir. Talimat metni görselin içine gömülü olmadığında bu alanı iletmek, belirsiz zorluklarda doğruluğu artırır.

# Common BLS instruction patterns:
instructions_examples = [
    "Select images in the correct order",
    "Click the images in order from left to right",
    "Arrange the images by number",
    "Select the matching image",
    "Click in the order shown",
]

# Extract instructions from the CAPTCHA image area
def get_instructions_from_page(driver):
    """Try multiple selectors to find instruction text."""
    selectors = [
        ".captcha-instructions",
        ".bls-captcha-text",
        "#captcha-prompt",
        ".challenge-text",
    ]

    for sel in selectors:
        try:
            el = driver.find_element(By.CSS_SELECTOR, sel)
            text = el.text.strip()
            if text:
                return text
        except Exception:
            continue

    return None

code parametresi ve BLS varyantları

code parametresi, hangi BLS CAPTCHA türüyle karşılaştığınızı belirtir. Bazı BLS uygulamaları bir kodla ayrılan farklı zorluk türleri kullanır; doğru kodu iletmek beklenen yanıt biçimini üretir. Kod, oturuma veya bölgeye göre değişebildiğinden değeri sabit kabul etmeyin, her çalıştırmada yeniden çıkarın.

# Detect BLS CAPTCHA code from page
def detect_bls_code(page_source):
    """Detect which BLS CAPTCHA code/type is being used."""
    patterns = [
        (r'captchaType["\']?\s*[:=]\s*["\'](\w+)', "captchaType"),
        (r'data-captcha-code["\']?\s*=\s*["\'](\w+)', "data attribute"),
        (r'bls_code["\']?\s*[:=]\s*["\'](\w+)', "bls_code"),
    ]

    for pattern, source in patterns:
        match = re.search(pattern, page_source)
        if match:
            return match.group(1)

    return None

BLS görev türleri ve doğru yaklaşım

Portalın istediği görev türü, hangi alanları göndereceğinizi belirler. Aşağıdaki eşleme, sık karşılaşılan bulmacalar için pratik bir başlangıç noktasıdır:

Görev türü Tipik talimat Önerilen alanlar
Sıralı seçim "resimleri doğru sırayla seçin" instructions + code
Eşleştirme "eşleşen görseli seçin" instructions
Numara sıralama "görselleri numaraya göre dizin" instructions + code
Tek görsel gömülü metin yok yalnızca sitekey + pageurl

Emin değilseniz önce yalnızca zorunlu alanlarla deneyin; çözüm oranı düşükse instructions ve ardından code ekleyerek daralttığınız yaklaşımı ölçün.


Selenium ile uçtan uca BLS akışı

Aşağıdaki fonksiyon tüm adımları tek akışta toplar. Akış şu sırayı izler:

  1. Sayfayı açın ve CAPTCHA'dan önceki form alanlarını doldurun.
  2. sitekey değerini ve varsa talimat metnini sayfadan çıkarın.
  3. Parametreleri CaptchaAI API'ye gönderin ve res.php'den token'ı sorgulayın.
  4. Dönen token'ı formdaki gizli input'a enjekte edin.
  5. Formu gönderin ve URL değişimini bekleyerek başarıyı doğrulayın.
# full_bls_flow.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os
import re


def solve_bls_with_selenium(url, form_data=None):
    """Complete BLS CAPTCHA flow using Selenium."""
    driver = webdriver.Chrome()
    driver.get(url)

    wait = WebDriverWait(driver, 15)

    # Fill any form fields before CAPTCHA
    if form_data:
        for field_id, value in form_data.items():
            el = wait.until(EC.presence_of_element_located((By.ID, field_id)))
            el.clear()
            el.send_keys(value)

    # Extract CAPTCHA parameters
    captcha_container = wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "[data-sitekey], .bls-captcha"))
    )
    sitekey = captcha_container.get_attribute("data-sitekey")

    # Get instructions
    instructions = None
    try:
        inst_el = driver.find_element(By.CSS_SELECTOR, ".captcha-instructions")
        instructions = inst_el.text.strip()
    except Exception:
        pass

    # Solve via API
    solution = solve_bls(
        sitekey=sitekey,
        pageurl=driver.current_url,
        instructions=instructions,
    )

    # Inject solution
    driver.execute_script("""
        var input = document.querySelector('input[name="captcha-response"], #captcha-response');
        if (input) {
            input.value = arguments[0];
        } else {
            var hidden = document.createElement('input');
            hidden.type = 'hidden';
            hidden.name = 'captcha-response';
            hidden.value = arguments[0];
            document.forms[0].appendChild(hidden);
        }
    """, solution)

    # Submit form
    submit_btn = driver.find_element(By.CSS_SELECTOR, "button[type='submit'], #submit")
    submit_btn.click()

    # Wait for confirmation
    wait.until(EC.url_changes(url))
    result_url = driver.current_url
    driver.quit()

    return result_url

Üretimde kararlı sonuç için kontrol listesi

Tek seferlik bir betikten sürekli çalışan bir iş akışına geçerken şu noktalar çözüm oranınızı korur:

  • Token'ı aldıktan sonra 60 saniye içinde gönderin; gecikirse yeniden çözün.
  • sitekey ve pageurl değerlerini her oturumda yeniden çıkarın — statik değerlere güvenmeyin.
  • CAPCHA_NOT_READY dışındaki her yanıtı hata olarak ele alın ve loglayın.
  • Ağ hatalarında res.php sorgularına üstel geri çekilme (exponential backoff) uygulayın.
  • Kişisel veri işleyen randevu akışlarında KVKK kapsamındaki rıza ve saklama kurallarına uyun.

Sorun giderme

Hataların çoğu, alanların yanlış çıkarılmasından ya da token'ın süresi dolduktan sonra gönderilmesinden kaynaklanır:

Sorun Sebep Düzeltme
ERROR_BAD_PARAMETERS sitekey veya pageurl eksik Her ikisinin de doğru çıkarıldığını doğrulayın
Çözüm reddedildi Talimatlar iletilmedi Belirsiz zorluklar için instructions parametresini ekleyin
Yanlış CAPTCHA türü Aslında BLS CAPTCHA değil Gerçekten reCAPTCHA mı yoksa özel bir tür mü olduğunu kontrol edin
sitekey bulunamadı Dinamik yükleme Çıkarmadan önce CAPTCHA öğesinin oluşturulmasını bekleyin

Sık sorulan sorular

BLS CAPTCHA hangi CaptchaAI planıyla çözülür?

Tüm planlar BLS CAPTCHA'yı çözer; fark thread sayısındadır. CaptchaAI çözüm başına değil, thread başına ücretlendirir ve her planda thread başına sınırsız çözüm vardır. Düşük hacimli testler için BASIC ($15/ay, 5 thread) yeterlidir.

instructions ve code alanlarını boş bırakırsam ne olur?

Sorun olmaz — bunlar isteğe bağlıdır. CaptchaAI çoğu BLS CAPTCHA'yı yalnızca sitekey ve pageurl ile çözer; iki alanı yalnızca belirsiz bulmacalarda doğruluğu artırmak için ekleyin.

Token'ı enjekte ettim ama form yine reddediyor, neden?

En olası neden token'ın süresini aşmanızdır. Token'ı aldıktan sonra ideal olarak 60 saniye içinde gönderin ve doğru input adını (captcha-response) hedeflediğinizi doğrulayın.

BLS CAPTCHA çözümü ne kadar sürer?

Genellikle 10–20 saniye sürer; süre CAPTCHA türüne, ağ gecikmesine ve yüke göre değişir.

Karşılaştığım CAPTCHA'nın gerçekten BLS olduğunu nasıl anlarım?

Sayfa kaynağında data-sitekey taşıyan bir .bls-captcha konteyneri ya da captchaType / bls_code gibi alanlar görüyorsanız BLS ile karşı karşıyasınız. Standart bir reCAPTCHA widget'ı yükleniyorsa bu BLS değildir; o durumda method=bls yerine reCAPTCHA akışını kullanmanız gerekir.


Kısa özet

  • method=bls, sitekey ve pageurl her istekte zorunludur.
  • instructions ve code yalnızca belirsiz veya çok varyantlı bulmacalarda çözüm oranını artırır.
  • Token'ı 60 saniye içinde doğru input adına (captcha-response) enjekte edin.
  • Alanları her oturumda yeniden çıkarın ve kişisel veri içeren akışlarda KVKK yükümlülüklerini gözetin.

İlgili kılavuzlar


BLS CAPTCHA parametrelerini bugün çözüme dönüştürün — CaptchaAI ile başlayın.

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