Devlet portallarını otomatikleştirirken önünüze çıkan tek gerçek engel çoğu zaman CAPTCHA'dır. Vize randevu sistemleri, mahkeme kayıtları, DMV yenilemeleri ve izin başvuruları birbirinden farklı CAPTCHA aileleri kullanır — ama hepsini tek bir API ile çözebilirsiniz. Bu rehber, bir QA mühendisi olarak yetkili iş akışlarınızda BLS, reCAPTCHA v2 ve resim CAPTCHA'larını CaptchaAI ile nasıl ele alacağınızı, her senaryo için çalışan Python koduyla gösterir.
Türkiye'den bir not: Kişisel veri içeren kayıtları topluyorsanız bu veriler KVKK kapsamına girer. Otomasyonu yalnızca erişim yetkiniz olan portallarda ve yetkili QA/veri toplama akışlarında çalıştırın; randevu kapma ya da slot avı için değil.
Devlet sitelerindeki CAPTCHA türleri (kategori kategori)
Hangi portalın hangi CAPTCHA'yı kullandığını bilmek, doğru method parametresini seçmenizi sağlar. Devlet siteleri genelde CAPTCHA teknolojisinde bir adım geriden gelir, bu yüzden karşınıza çıkanların büyük çoğunluğu reCAPTCHA v2 ve klasik resim CAPTCHA'sıdır:
| Portal Kategorisi | Ortak CAPTCHA | Örnek Siteler | Kullanım Örneği |
|---|---|---|---|
| Vize / göçmenlik | BLS, reCAPTCHA v2 | BLS portalları, USCIS | Randevu rezervasyonu |
| DMV / motorlu taşıtlar | reCAPTCHA v2, resim | Eyalet DMV siteleri | Kayıt yenileme |
| Mahkeme kayıtları | reCAPTCHA v2 | PACER, eyalet mahkemeleri | Vaka arama |
| İzinler / lisanslar | Resim CAPTCHA'sı | Şehir izin portalları | Başvuru dosyalama |
| Vergi portalları | reCAPTCHA v2 | IRS, eyalet vergi siteleri | Dosyalama durumu kontrolleri |
| Kamu kayıtları | Resim CAPTCHA, reCAPTCHA | İlçe kayıtları | Tapu/kayıt araması |
Oturum yönetimi ve zaman aşımı
Devlet portallarında en sinsi sorun genelde CAPTCHA değil, kısa oturum zaman aşımlarıdır: siz CAPTCHA'yı çözerken oturumunuzun süresi dolabilir. Koda başlamadan önce şu üç kuralı benimseyin, sonra portal türüne göre zaman aşımı sürelerine göz atın:
- CAPTCHA'yı forma göndermeden hemen önce çözün, önceden değil.
- Tüm form akışı boyunca aynı oturumu ve aynı IP'yi koruyun.
- Uzun akışlarda oturum çerezini yarıda bir kez yenileyin.
| Portal Türü | Oturum Zaman Aşımı | Tavsiye |
|---|---|---|
| Vize portalları | 5-10 dakika | Akışı hızla tamamlayın |
| DMV siteleri | 15 dakika | Oturum çerezini yarıda yenileyin |
| Mahkeme kayıtları | 20-30 dakika | Aramaları gruplar hâlinde yapın |
| Vergi portalları | 10-15 dakika | Kalıcı QA oturumu, aynı IP |
| İzin başvuruları | 30 dakika | Her adımda ilerlemeyi kaydedin |
BLS vize portalı CAPTCHA'sını çözme
BLS portalları kendilerine özgü bir CAPTCHA sistemi kullanır ve Türkiye'de Schengen randevu akışlarıyla uğraşan geliştiriciler için tanıdık bir başlıktır. CaptchaAI, BLS CAPTCHA'larını bls yöntemiyle veya görüntü tabanlı çözüm için method=base64 ile yüksek başarı oranıyla destekler.
Akışın üç adımı
Aşağıdaki BLSAppointmentBooker sınıfı, yetkili bir test hesabında şu adımları izler:
- Portala giriş yapar ve giriş formundaki CAPTCHA'yı çözer.
- Uygun randevu slotlarını sorgular.
- Slot seçimini, gerekirse yeni bir CAPTCHA çözerek gönderir.
import requests
import time
import base64
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
def solve_bls_captcha(captcha_image_url, session):
"""Solve BLS-specific CAPTCHA."""
# Download CAPTCHA image
img_resp = session.get(captcha_image_url)
img_b64 = base64.b64encode(img_resp.content).decode()
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "base64",
"body": img_b64,
"json": 1,
})
task_id = resp.json()["request"]
for _ in range(30):
time.sleep(3)
result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY, "action": "get",
"id": task_id, "json": 1,
})
data = result.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("BLS CAPTCHA timeout")
class BLSAppointmentBooker:
def __init__(self):
self.session = requests.Session()
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
})
def login(self, portal_url, email, password):
"""Login to BLS portal with CAPTCHA."""
resp = self.session.get(portal_url)
# Extract CAPTCHA image URL from page
import re
match = re.search(r'src="(/captcha[^"]+)"', resp.text)
if match:
captcha_url = portal_url.rstrip("/") + match.group(1)
captcha_text = solve_bls_captcha(captcha_url, self.session)
else:
captcha_text = ""
login_resp = self.session.post(portal_url, data={
"email": email,
"password": password,
"captcha": captcha_text,
})
return login_resp.status_code == 200
def check_appointment_slots(self, slots_url):
"""Check available appointment slots."""
resp = self.session.get(slots_url)
if resp.status_code == 200:
return resp.json().get("available_slots", [])
return []
def book_slot(self, booking_url, slot_id, applicant_data):
"""Book an appointment slot, handling any CAPTCHA."""
resp = self.session.get(booking_url)
# Check for CAPTCHA on booking page
import re
match = re.search(r'src="(/captcha[^"]+)"', resp.text)
if match:
captcha_url = booking_url.rstrip("/") + match.group(1)
captcha_text = solve_bls_captcha(captcha_url, self.session)
else:
captcha_text = ""
resp = self.session.post(booking_url, data={
"slot_id": slot_id,
"captcha": captcha_text,
**applicant_data,
})
return {
"success": resp.status_code == 200,
"confirmation": resp.json().get("confirmation_number"),
}
Mahkeme kayıtlarında reCAPTCHA v2 çözme
Mahkeme ve dava arama portalları neredeyse her zaman reCAPTCHA v2 kullanır. Akış üç adımdır: arama sayfasını yükleyin, sitekey ve pageurl ile token'ı alın, ardından token'ı g-recaptcha-response alanında forma gönderin:
def solve_recaptcha(sitekey, pageurl):
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY, "action": "get",
"id": task_id, "json": 1,
})
data = result.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("Timeout")
class CourtRecordSearcher:
def __init__(self, proxy=None):
self.session = requests.Session()
if proxy:
self.session.proxies = {"http": proxy, "https": proxy}
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
})
def search_cases(self, court_url, search_params, sitekey):
"""Search court records with reCAPTCHA handling."""
# Load search page
self.session.get(court_url)
# Solve CAPTCHA
token = solve_recaptcha(sitekey, court_url)
# Submit search with token
resp = self.session.post(court_url, data={
**search_params,
"g-recaptcha-response": token,
})
if resp.status_code == 200:
return self._parse_results(resp.text)
return []
def _parse_results(self, html):
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
cases = []
for row in soup.select("table.results tr")[1:]:
cols = row.select("td")
if len(cols) >= 4:
cases.append({
"case_number": cols[0].get_text(strip=True),
"parties": cols[1].get_text(strip=True),
"date": cols[2].get_text(strip=True),
"status": cols[3].get_text(strip=True),
})
return cases
Sonuçları ayrıştırma
_parse_results yardımcı metodu dönen HTML'i ayrıştırır ve her satırdan dava numarası, taraflar, tarih ve durum alanlarını çıkarır. Portalın tablo yapısı değişirse yalnızca bu metodu güncellemeniz yeterlidir; token alma mantığına dokunmanız gerekmez.
İzin portallarındaki resim CAPTCHA'sını çözme
Birçok belediye ve ilçe izin portalı, reCAPTCHA yerine basit resim (OCR) CAPTCHA'ları kullanmaya devam eder. Bunları görüntüyü base64'e çevirip in.php uç noktasına göndererek çözersiniz; kod hemen hemen BLS örneğiyle aynıdır, yalnızca daha kısa bir zaman aşımı yeterlidir:
def solve_image_captcha(image_url, session):
"""Solve image-based CAPTCHA common on local government sites."""
img = session.get(image_url)
img_b64 = base64.b64encode(img.content).decode()
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "base64",
"body": img_b64,
"json": 1,
})
task_id = resp.json()["request"]
for _ in range(20):
time.sleep(3)
result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY, "action": "get",
"id": task_id, "json": 1,
})
data = result.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("Image CAPTCHA timeout")
Kamu kayıtlarında toplu CAPTCHA çözme
Tapu ve mülk kayıtlarında yüzlerce adres sorgularken her istek için ayrı CAPTCHA çözmek gereksizdir. Aşağıdaki toplu işlem üç işi birden yapar:
- Token'ı her beşinci istekte bir yeniler, gereksiz çözüm maliyetini düşürür.
- Sonuçları doğrudan bir CSV dosyasına yazar.
- İstekler arasına gecikme koyarak portalın hız sınırına takılmayı önler.
import csv
def batch_property_lookup(addresses, portal_url, sitekey, output_file):
"""Look up multiple property records, solving CAPTCHA per batch."""
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
})
results = []
for i, address in enumerate(addresses):
try:
# Solve CAPTCHA every 5th request (or when required)
if i % 5 == 0:
token = solve_recaptcha(sitekey, portal_url)
resp = session.post(portal_url, data={
"address": address,
"g-recaptcha-response": token,
})
if resp.status_code == 200:
results.append({
"address": address,
"data": resp.json(),
})
time.sleep(3) # Be respectful
except Exception as e:
results.append({"address": address, "error": str(e)})
# Save results
with open(output_file, "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["address", "data", "error"])
writer.writeheader()
writer.writerows(results)
return results
Küçük bir uyarı: gerçek bir üretim akışında try/except bloğunu genişletin ve başarısız adresleri ayrı bir kuyruğa alarak yeniden deneyin — tek bir hatalı yanıt tüm toplu işlemi durdurmasın.
Sorun giderme
Otomasyon akışları en çok aşağıdaki beş noktada takılır. Belirti, olası sebep ve hızlı çözümü:
| Sorun | Sebep | Düzeltme |
|---|---|---|
| CAPTCHA resmi yüklenmiyor | Oturum çerezinin süresi doldu | Yeni oturum başlat |
| Form sırasında "Oturumun süresi doldu" | Çözülmesi çok uzun sürdü | Ön QA testi yapın veya daha hızlı çözüm kullanın |
| Yanlış CAPTCHA yanıtı | Bozuk görüntü | Kötü görüntüyü API aracılığıyla bildirin |
| Portal otomasyonu engelliyor | IP/UA tespiti | Kendi sunucu altyapınızı ve gerçek bir User-Agent kullanın |
| CAPTCHA'dan sonra form doğrulama hatası | Sunucu tarafı belirtecinin süresi doldu | CAPTCHA'yı göndermeden hemen önce çözün |
Yayına almadan önce kontrol listesi
- Doğru
methodparametresini seçtiniz mi? reCAPTCHA v2 içinuserrecaptcha, resim CAPTCHA içinbase64, BLS içinbls. - Token'ı formu göndermeden hemen önce mi çözüyorsunuz?
- Çok adımlı akış boyunca aynı oturum ve aynı IP korunuyor mu?
- Yalnızca erişim yetkiniz olan portallarda mı çalışıyorsunuz (KVKK)?
- Hata durumları için yeniden deneme ve zaman aşımı mantığınız hazır mı?
SSS
Devlet portalı otomasyonuyla ilgili en sık gelen sorular ve kısa yanıtları:
Devlet portalı otomasyonu için hangi CaptchaAI planı yeterli?
Tek bir portal akışını test ediyorsanız BASIC ($15/ay, 5 thread) genelde yeterlidir. Toplu sorgulama gibi paralel iş yükleri için STANDARD ($30/ay, 15 thread) daha rahat çalışır. Fiyatlar thread başınadır; her planda çözüm sayısı sınırsızdır.
CaptchaAI BLS CAPTCHA'larını çözebilir mi?
Evet. CaptchaAI, BLS CAPTCHA'larını bls yöntemiyle veya görüntü tabanlı çözüm için method=base64 ile yüksek başarı oranıyla destekler. Yalnızca erişim yetkiniz olan portallarda ve yetkili test akışlarında kullanın.
CAPTCHA'yı çözerken oturumun süresi dolarsa ne yapmalıyım?
CAPTCHA'yı forma göndermeden hemen önce çözün — sunucu tarafındaki token'ın da bir ömrü vardır. Vize portalları gibi kısa zaman aşımı olan sitelerde akışı hızlandırın; gerekiyorsa oturum çerezini yarıda yenileyin ve tüm form boyunca aynı IP'yi koruyun.
Devlet sitesinde hCaptcha çıkarsa CaptchaAI çözer mi?
Hayır. CaptchaAI şu anda hCaptcha ve FunCaptcha (Arkose Labs) çözmez. Devlet portallarında bu türler nadirdir; karşılaştığınızın büyük olasılıkla reCAPTCHA v2 veya resim CAPTCHA olduğunu unutmayın.