Kamu kayıt portallarında toplu sorgu yapan bir otomasyonu ölçeklemenin önündeki tek gerçek engel çoğu zaman formdaki görüntü CAPTCHA'sıdır. Mahkeme sistemleri, tapu ve ilçe kayıtları, ticaret sicili ve nüfus veritabanları büyük ölçüde eski görüntü ve OCR CAPTCHA'larına dayanır; bunları çözmenin yolu, resmi CaptchaAI'nin OCR uç noktasına base64 olarak gönderip dönen metni arama formuna yerleştirmektir. Aşağıda her kayıt türü için çalışan kod ve devreye alırken işinize yarayacak pratik ayarlar var.
Somut bir senaryo düşünün: bir müşteri için durum tespiti (due diligence) yapan bir otomasyon geliştiricisisiniz ve onlarca ayrı ticaret sicili ile mahkeme portalından şirket dosyalarını derliyorsunuz. Her portal farklı bir CAPTCHA türü çıkarır; elle çözmek dakikaları yer, otomasyonu kırar. Burada anahtar nokta, tek bir çözüm çağrısını farklı portal düzenlerine yeniden kullanabilir hâle getirmektir. Kişisel veri içeren kayıtları işlerken KVKK kapsamında yalnızca yetkili olduğunuz veri toplama akışları içinde kaldığınızdan emin olun — CAPTCHA çözümü, izinli bir iş akışını hızlandıran bir araçtır.
Portal türüne göre karşılaşacağınız CAPTCHA türleri
Kayıt türü değiştikçe portalın kullandığı CAPTCHA da değişir. İlk adım, hangi türle uğraştığınızı tanımaktır:
| Portal kategorisi | Tipik CAPTCHA | Zorluk örnekleri |
|---|---|---|
| Mahkeme davası arama | Özel metin CAPTCHA | Bozuk 5-6 karakter alfanümerik |
| İlçe mülk kayıtları | Matematik CAPTCHA'sı | "4+7 nedir?" |
| İşletme varlığı araması | Resim metni CAPTCHA | Satır gürültüsüyle çarpık harfler |
| Hayati kayıtlar | reCAPTCHA v2 | Görüntü ızgarası seçimi |
| İnşaat izinleri | Basit metin CAPTCHA | 4 haneli sayısal kod |
| UCC başvuruları | Özel OCR CAPTCHA | Arka planda gürültü olan karışık büyük harfler |
Çoğu kamu portalı bir görüntü ya da OCR CAPTCHA'sı çıkardığından, tek bir OCR çözüm akışı vakaların büyük bölümünü kapsar; reCAPTCHA v2 çıkaran portallar için ayrı bir akış gerekir. Bu yazıdaki örnekler görüntü/OCR tarafına odaklanır.
Görüntü CAPTCHA çözümüyle kayıt sorgulama
Temel desen şudur: arama sayfasını yükleyin, sayfadaki CAPTCHA görselini bulun, base64 olarak in.php uç noktasına gönderin, sonucu res.php üzerinden sorgulayın ve dönen metni arama isteğine ekleyin. Aşağıdaki sınıf tam olarak bunu yapar ve oturum çerezlerini koruyarak mahkeme kayıtlarını sorgular:
import requests
import base64
import time
from urllib.parse import urljoin
class PublicRecordsSearcher:
def __init__(self, api_key):
self.api_key = api_key
self.session = requests.Session()
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
def search_court_records(self, portal_url, case_number):
"""Search court records, solving image CAPTCHAs as needed."""
# Load the search page
page = self.session.get(f"{portal_url}/search")
# Extract CAPTCHA image
captcha_img_url = self._extract_captcha_url(page.text, portal_url)
if not captcha_img_url:
# No CAPTCHA on this page
return self._submit_search(portal_url, case_number)
# Download and solve CAPTCHA
img_response = self.session.get(captcha_img_url)
captcha_text = self._solve_image_captcha(img_response.content)
# Submit search with solved CAPTCHA
return self._submit_search(portal_url, case_number, captcha_text)
def _extract_captcha_url(self, html, base_url):
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
# Look for common CAPTCHA image patterns
captcha_img = (
soup.find("img", {"id": "captchaImage"}) or
soup.find("img", {"class": "captcha"}) or
soup.find("img", attrs={"src": lambda s: s and "captcha" in s.lower()})
)
if captcha_img and captcha_img.get("src"):
return urljoin(base_url, captcha_img["src"])
return None
def _solve_image_captcha(self, image_bytes):
img_base64 = base64.b64encode(image_bytes).decode("utf-8")
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": self.api_key,
"method": "base64",
"body": img_base64,
"json": 1
})
task_id = resp.json()["request"]
for _ in range(30):
time.sleep(3)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key,
"action": "get",
"id": task_id,
"json": 1
})
data = result.json()
if data["status"] == 1:
return data["request"]
raise TimeoutError("CAPTCHA solve timed out")
def _submit_search(self, portal_url, case_number, captcha_text=None):
form_data = {"caseNumber": case_number}
if captcha_text:
form_data["captcha"] = captcha_text
response = self.session.post(
f"{portal_url}/search/results",
data=form_data
)
return response.text
# Usage
searcher = PublicRecordsSearcher("YOUR_API_KEY")
results = searcher.search_court_records(
"https://courts.example.gov",
"2024-CV-12345"
)
Dikkat edilmesi gereken iki nokta: CAPTCHA görselini indirmeden önce arama sayfasını yükleyin (görsel çoğu zaman oturum çerezine bağlıdır) ve tüm istekleri aynı Session üzerinden yapın; aksi hâlde çözüm doğru olsa bile sunucu isteği reddeder.
Matematik CAPTCHA'larını çözme
Bazı devlet portalları "4 + 7 = ?" gibi basit matematik CAPTCHA'ları çıkarır. CaptchaAI bunları da metin tanıma olarak ele alır; farkı, çözücüye ne yapması gerektiğini söyleyen textinstructions parametresidir:
def solve_math_captcha(self, image_bytes):
"""Solve math CAPTCHAs like '4 + 7 = ?'"""
img_base64 = base64.b64encode(image_bytes).decode("utf-8")
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": self.api_key,
"method": "base64",
"body": img_base64,
"textinstructions": "solve the math equation and return only the number",
"json": 1
})
task_id = resp.json()["request"]
# Poll for result
for _ in range(30):
time.sleep(3)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key,
"action": "get",
"id": task_id,
"json": 1
})
data = result.json()
if data["status"] == 1:
return data["request"]
raise TimeoutError("Math CAPTCHA solve timed out")
textinstructions alanına yazdığınız yönerge ne kadar netse (örneğin "yalnızca sonucun sayısını döndür"), dönen yanıt o kadar temiz olur — bu, çıktıyı doğrudan forma yazacağınız için önemlidir.
Birden fazla portalda paralel arama
Durum tespiti veya toplu araştırma işlerinde tek bir sorguyu birçok portalda çalıştırmanız gerekir. Aşağıdaki JavaScript toplayıcısı, her portalı sırayla gezer, CAPTCHA varsa çözer ve sonuçları tek bir listede birleştirir; bir portalın hata vermesi diğerlerini durdurmaz:
class RecordsAggregator {
constructor(apiKey) {
this.apiKey = apiKey;
}
async searchAcrossPortals(query, portals) {
const results = [];
for (const portal of portals) {
try {
const data = await this.searchPortal(portal, query);
results.push({ portal: portal.name, records: data });
} catch (error) {
results.push({ portal: portal.name, error: error.message });
}
}
return results;
}
async searchPortal(portal, query) {
const pageResponse = await fetch(portal.searchUrl);
const html = await pageResponse.text();
// Check for image CAPTCHA
const captchaMatch = html.match(/captcha[^"]*\.(?:png|jpg|gif)/i);
let captchaAnswer = null;
if (captchaMatch) {
const imgUrl = new URL(captchaMatch[0], portal.searchUrl).href;
const imgData = await fetch(imgUrl);
const buffer = await imgData.arrayBuffer();
const base64 = Buffer.from(buffer).toString('base64');
captchaAnswer = await this.solveImageCaptcha(base64);
}
// Submit search
const formData = new URLSearchParams({ q: query });
if (captchaAnswer) formData.append('captcha', captchaAnswer);
const response = await fetch(portal.searchUrl, {
method: 'POST',
body: formData
});
return response.text();
}
async solveImageCaptcha(base64Image) {
const submitResp = await fetch('https://ocr.captchaai.com/in.php', {
method: 'POST',
body: new URLSearchParams({
key: this.apiKey,
method: 'base64',
body: base64Image,
json: '1'
})
});
const { request: taskId } = await submitResp.json();
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 3000));
const result = await fetch(
`https://ocr.captchaai.com/res.php?key=${this.apiKey}&action=get&id=${taskId}&json=1`
);
const data = await result.json();
if (data.status === 1) return data.request;
}
throw new Error('CAPTCHA solve timed out');
}
}
// Usage
const aggregator = new RecordsAggregator('YOUR_API_KEY');
const results = await aggregator.searchAcrossPortals('Smith LLC', [
{ name: 'State Business Registry', searchUrl: 'https://sos.example.gov/search' },
{ name: 'County Court Records', searchUrl: 'https://courts.example.gov/search' }
]);
Aynı anda kaç portalı sorgulayabileceğiniz thread sayınıza bağlıdır. CaptchaAI thread bazında ücretlendirir: her thread eş zamanlı bir çözüm demektir ve çözüm başına ek ücret yoktur. Düzenli portal taramaları için BASIC ($15/ay, 5 thread) çoğu zaman yeterlidir; USD üzerinden sabit aylık ücret, TL dalgalanmasına karşı öngörülebilir bir maliyet sağlar. Hacim arttıkça STANDARD ($30/ay, 15 thread) veya ADVANCE ($90/ay, 50 thread) planlarına geçebilirsiniz.
Devlet portalları için CAPTCHA parametreleri
CaptchaAI'ye gönderdiğiniz parametreler doğruluğu belirgin biçimde etkiler. Portalın CAPTCHA biçimini önceden biliyorsanız, çözücüye ipucu verin:
| Parametre | Değer | Ne zaman kullanılmalı |
|---|---|---|
method |
base64 |
Resim bayt olarak indirildi |
method |
post |
Resim dosyasını doğrudan gönderin |
language |
0 |
Latin karakterli metin CAPTCHA'lar |
numeric |
1 |
Yalnızca rakamlardan oluşan CAPTCHA'lar |
min_len / max_len |
Değişir | Karakter sayısı tahmin edilebilir olduğunda |
textinstructions |
Özel istem | Matematik CAPTCHA'ları veya belirli formatlar |
Örneğin bir inşaat izni portalı yalnızca 4 haneli sayısal kod kullanıyorsa, numeric=1 ile min_len=4 ve max_len=4 göndermek yanlış tanımaları azaltır.
Sık karşılaşılan sorunlar ve çözümleri
| Sorun | Sebep | Düzeltme |
|---|---|---|
| CAPTCHA görüntüsü 403 değerini döndürür | Oturum çerezi eksik | Önce arama sayfasını yükleyin, ardından görseli getirin |
| Yanlış CAPTCHA yanıtı | Düşük görüntü kalitesi | Görüntüyü ön işleyin (kontrastı artırın, gürültüyü kaldırın) |
| CAPTCHA gönderildiğinde yenileniyor | Form token'ının süresi doldu | CAPTCHA ile birlikte gizli form alanlarını da çıkarın |
| CAPTCHA'dan sonra arama boş dönüyor | POST yönlendirmesi çerezleri kaybetti | allow_redirects=True kullanın ve oturuma devam edin |
Bu dört durum, kamu portallarında en çok karşılaşacağınız hatalardır; çoğu, oturum yönetimini doğru kurmakla çözülür.
Sık sorulan sorular
Kamu kayıtlarını otomatik toplamak KVKK açısından uygun mu?
CAPTCHA çözümü teknik bir adımdır; asıl belirleyici, topladığınız verinin niteliğidir. Kişisel veri içeren kayıtları işliyorsanız bu veriler KVKK kapsamına girer. Yalnızca yetkili olduğunuz, meşru amaca dayanan ve saklama süresi tanımlı veri toplama akışları içinde kalın; portalın kullanım şartlarını da gözden geçirin.
Hangi CaptchaAI planı portal otomasyonu için yeterli?
Kaç portalı eş zamanlı sorguladığınıza bağlıdır. Sıralı, tek seferlik aramalar için BASIC ($15/ay, 5 thread) genelde yeterlidir; onlarca portalı paralel tarayan toplu işler için STANDARD ($30/ay, 15 thread) ya da ADVANCE ($90/ay, 50 thread) daha rahat çalışır. Tüm planlarda çözüm başına ek ücret yoktur.
CAPTCHA görsellerini göndermeden önce ön işlemeli miyim?
Çok düşük kaliteli görüntülerde ön işleme (gri tonlama, kontrast artırma, gürültü giderme) doğruluğu belirgin biçimde yükseltebilir. Temiz görsellerde ise gerekmez. Teknikler için görüntü ön işleme rehberine bakın.
Portal reCAPTCHA v2 ya da Turnstile'a geçerse ne yapmalıyım?
Bu durumda görüntü/OCR akışı yeterli olmaz; ilgili çözüm yöntemine geçmeniz gerekir. CaptchaAI reCAPTCHA v2/v3'ü, Cloudflare Turnstile'ı ve GeeTest v3'ü destekler; sayfa alt kısmındaki bağlantılardan her biri için ayrı rehbere ulaşabilirsiniz.
Sonraki adımlar
Kamu kayıtlarındaki aramaları CaptchaAI ile tekrarlanabilir bir iş akışına dönüştürün: ücretsiz API anahtarınızı alın ve devlet portalı CAPTCHA'larını tek bir akıştan yönetin.