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,
instructionsalanı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;
codehangi 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:
- Sayfayı açın ve CAPTCHA'dan önceki form alanlarını doldurun.
sitekeydeğerini ve varsa talimat metnini sayfadan çıkarın.- Parametreleri CaptchaAI API'ye gönderin ve
res.php'den token'ı sorgulayın. - Dönen token'ı formdaki gizli input'a enjekte edin.
- 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.
sitekeyvepageurldeğerlerini her oturumda yeniden çıkarın — statik değerlere güvenmeyin.CAPCHA_NOT_READYdışındaki her yanıtı hata olarak ele alın ve loglayın.- Ağ hatalarında
res.phpsorguları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,sitekeyvepageurlher istekte zorunludur.instructionsvecodeyalnı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.