Bir otomasyon botu ilk CAPTCHA duvarına çarptığı anda durur — form gönderilemez, kayıt tamamlanmaz, veri akışı kesilir. Çözüm, CAPTCHA'yı botun kendi kodunun içinde çözmektir: CaptchaAI API'ye sitekey ve pageurl gönderirsiniz, geri dönen token'ı forma yerleştirirsiniz ve bot insan müdahalesi olmadan yoluna devam eder. Bu kılavuz, tek bir yeniden kullanılabilir bot çerçevesiyle reCAPTCHA, Cloudflare Turnstile ve resim CAPTCHA'larını aynı akışta nasıl çözeceğinizi Python ve Node.js örnekleriyle gösterir.
Hangi Otomasyon Akışlarında CAPTCHA Çıkar?
Botunuzun karşılaşacağı CAPTCHA türü, otomasyona aldığınız akışa göre değişir. Aşağıdaki tablo yaygın senaryoları ve her biri için çağıracağınız CaptchaAI yöntemini eşleştirir:
| Senaryo | Tipik CAPTCHA | CaptchaAI Yöntemi |
|---|---|---|
| Form gönderimi | reCAPTCHA v2 | method=userrecaptcha |
| Hesap kaydı | reCAPTCHA v2/v3 | method=userrecaptcha |
| Veri giriş portalları | Resim CAPTCHA'sı | method=base64 |
| Rezervasyon akışları | Cloudflare Turnstile | method=turnstile |
| API ağ geçidi erişimi | Cloudflare doğrulama akışı | method=cloudflare_challenge |
Türkiye'deki ekiplerin en sık otomasyona aldığı işler e-ticaret ve fintech tarafında yoğunlaşır: ödeme akışlarının QA testi, ürün kataloğu doğrulaması, form gönderimlerinin regresyon kontrolü. Bu akışların hemen hepsi bir noktada reCAPTCHA veya Turnstile ile korunur; bu yüzden botun CAPTCHA katmanını tek merkezden yönetmesi işi baştan sağlamlaştırır.
Yeniden Kullanılabilir Bot Çerçevesi
Her senaryo için ayrı kod yazmak yerine, tüm CAPTCHA türlerini tek bir solve() metoduyla çözen bir temel sınıf kurun. Bu sınıf görevi in.php uç noktasına gönderir, sonucu res.php üzerinden sorgular ve token döner:
import requests
import time
import logging
logger = logging.getLogger(__name__)
class CaptchaBot:
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 solve(self, method, **params):
"""Solve any CAPTCHA type."""
params["key"] = self.api_key
params["method"] = method
resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(f"Submit error: {resp.text}")
task_id = resp.text.split("|")[1]
logger.info(f"Task submitted: {task_id}")
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY": continue
if result.text.startswith("OK|"): return result.text.split("|")[1]
raise Exception(f"Error: {result.text}")
raise TimeoutError("CAPTCHA solve timed out")
def submit_form(self, url, form_data, captcha_field="g-recaptcha-response",
site_key=None, captcha_method="userrecaptcha"):
"""Submit a form with CAPTCHA solving."""
if site_key:
if captcha_method == "userrecaptcha":
token = self.solve(captcha_method, googlekey=site_key, pageurl=url)
elif captcha_method == "turnstile":
token = self.solve(captcha_method, sitekey=site_key, pageurl=url)
form_data[captcha_field] = token
return self.session.post(url, data=form_data)
Buradaki fikir, solve() metodunun türden bağımsız olmasıdır: reCAPTCHA için googlekey, Turnstile için sitekey geçirir, gerisini API halleder. submit_form() ise token'ı doğru form alanına yerleştirip gönderimi tamamlar. API anahtarınızı alıp ilk çağrıyı yapmadıysanız, önce hesabı kurup anahtarı panelden almanız yeterli.
Örnek: Form Gönderen Bot
En yalın senaryo, reCAPTCHA v2 ile korunan bir iletişim formudur. Bot sayfanın sitekey değerini bilir, token'ı çözer ve formu gönderir:
bot = CaptchaBot("YOUR_API_KEY")
# Submit a contact form protected by reCAPTCHA
result = bot.submit_form(
url="https://example.com/contact",
form_data={
"name": "John Doe",
"email": "john@example.com",
"message": "Inquiry about your service"
},
site_key="6Le-wvkS...",
captcha_method="userrecaptcha"
)
print(f"Form submitted: {result.status_code}")
Burada tek kritik değer sayfanın sitekey değeridir; onu sayfanın kaynağından çıkarır, submit_form() içine geçirirsiniz. Token forma otomatik yerleşir ve gönderim tamamlanır.
Örnek: Çok Adımlı İş Akışı Botu
Gerçek dünyadaki akışlar tek adımlı değildir. Bir rezervasyon akışının QA testinde bot önce sayfayı yükler, tarih/saat seçer, ardından CAPTCHA'lı onay adımını gönderir. Adım sırası korunur; her adım bir öncekinin durumuna dayanır:
def appointment_booking_bot(date, time_slot, user_info):
bot = CaptchaBot("YOUR_API_KEY")
# Step 1: Load booking page
page = bot.session.get("https://example.com/book")
# Step 2: Select date and time
resp = bot.session.post("https://example.com/book/select", data={
"date": date,
"time": time_slot
})
# Step 3: Fill personal info with CAPTCHA
result = bot.submit_form(
url="https://example.com/book/confirm",
form_data={
"name": user_info["name"],
"email": user_info["email"],
"phone": user_info["phone"],
"date": date,
"time": time_slot
},
site_key="6Le-wvkS...",
captcha_method="userrecaptcha"
)
return result.status_code == 200
# Run
success = appointment_booking_bot(
date="2025-02-15",
time_slot="10:00",
user_info={"name": "John Doe", "email": "john@example.com", "phone": "555-0100"}
)
CAPTCHA yalnızca son adımda çözülür; ilk iki adım oturum durumunu hazırlar. Bu yüzden CaptchaBot içindeki session nesnesini tüm adımlarda paylaşmak önemlidir — çerez ve oturum sürekliliği bu şekilde korunur.
Örnek: Resim CAPTCHA'lı Veri Giriş Botu
Eski veri giriş portalları genellikle klasik resim CAPTCHA'sı kullanır. Burada base64 yöntemiyle görüntüyü doğrudan API'ye gönderir, dönen metni forma yazarsınız:
import base64
def data_entry_bot(entries, captcha_image_url):
bot = CaptchaBot("YOUR_API_KEY")
for entry in entries:
# Load the form page
page = bot.session.get("https://portal.example.com/entry")
# Download and solve image CAPTCHA
img = bot.session.get(captcha_image_url)
img_b64 = base64.b64encode(img.content).decode()
captcha_text = bot.solve("base64", body=img_b64)
# Submit entry
resp = bot.session.post("https://portal.example.com/entry", data={
**entry,
"captcha": captcha_text
})
logger.info(f"Entry submitted: {resp.status_code}")
time.sleep(random.uniform(2, 5))
Toplu veri girişi yaparken işlediğiniz kayıtlar kişisel veri içeriyorsa KVKK kapsamına girdiğini unutmayın: yalnızca yetkiniz olan verilerle, izinli QA veya veri toplama akışları içinde çalışın. Botun her kayıt arasına rastgele bir gecikme koyması hem portalı yormaz hem de akışı daha gerçekçi kılar.
Node.js Bot Çerçevesi
Aynı yapıyı Node.js tarafında da kurabilirsiniz. axios ile görevi gönderir, sonucu sorgular ve token'ı forma yerleştirirsiniz:
const axios = require("axios");
class CaptchaBot {
constructor(apiKey) {
this.apiKey = apiKey;
}
async solve(method, params) {
params.key = this.apiKey;
params.method = method;
const submit = await axios.get("https://ocr.captchaai.com/in.php", {
params,
});
const taskId = submit.data.split("|")[1];
while (true) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: this.apiKey, action: "get", id: taskId },
});
if (result.data === "CAPCHA_NOT_READY") continue;
if (result.data.startsWith("OK|")) return result.data.split("|")[1];
throw new Error(result.data);
}
}
async submitForm(url, formData, siteKey, method = "userrecaptcha") {
const token = await this.solve(method, {
googlekey: siteKey,
pageurl: url,
});
formData["g-recaptcha-response"] = token;
return axios.post(url, new URLSearchParams(formData));
}
}
// Usage
const bot = new CaptchaBot("YOUR_API_KEY");
const result = await bot.submitForm(
"https://example.com/submit",
{ name: "John", email: "john@example.com" },
"6Le-wvkS..."
);
Turnstile ile korunan sayfalarda method değerini turnstile yapmanız ve sitekey parametresini geçirmeniz yeterlidir; token'ın forma yerleşimi reCAPTCHA ile aynıdır. Böylece tek bir çerçeve iki farklı CAPTCHA türünü aynı kod yoluyla çözer.
Bot Filonuz İçin Plan ve Thread Seçimi
CaptchaAI, çözüm başına değil eşzamanlı thread başına ücretlendirir; her plan o ay boyunca thread başına sınırsız çözüm içerir. Botunuzun kaç isteği aynı anda uçurduğu, ihtiyacınız olan thread sayısını belirler:
- BASIC ($15/ay, 5 thread) — tek bir zamanlanmış bot veya küçük QA akışı için yeterlidir.
- ADVANCE ($90/ay, 50 thread) — paralel çalışan birden çok worker'a rahat nefes aldırır.
- PREMIUM ($170/ay, 100 thread) — kesintisiz çalışan büyük bot filoları için.
Fatura thread başına olduğundan, günlük hacim arttığında ek çözüm ücreti değil yalnızca daha fazla thread gerekir. TL kurundaki oynaklığa karşı fiyatların USD ve aylık sabit olması, bütçe planlamasını öngörülebilir kılar.
Sorun Giderme
| Sorun | Düzeltme |
|---|---|
| CAPTCHA token'ı reddedildi | Token'ı çözdükten sonraki 120 saniye içinde kullanın |
| Geçerli token'a rağmen bot tespit edildi | Gerçekçi HTTP başlıkları ekleyin ve istekler arasına gecikme koyun |
| Form ek alanlar gerektiriyor | Form kaynağında gizli alanlar (CSRF token'ları) olup olmadığını inceleyin |
| Tekrarlanan gönderimlerde istek sınırına takılıyor | İstekler arasına gecikme ekleyin ve istek hızını düşürün |
Sık Sorulan Sorular
Çözülen token ne kadar süre geçerli kalır?
Token'ı çözdükten sonra 120 saniye içinde göndermeniz gerekir. Bu süre dolarsa hedef site token'ı reddeder ve yeniden çözüm istemeniz gerekir; bu yüzden çözme ile gönderme adımlarını arka arkaya tutun.
Bot filom için hangi CaptchaAI planını seçmeliyim?
Aynı anda kaç görev çözdüğünüze bakın. Tek bir bot için BASIC ($15/ay, 5 thread), paralel worker'lar için ADVANCE ($90/ay, 50 thread) iyi başlangıç noktalarıdır. Fatura thread başına olduğundan, günlük hacim arttıkça ek ücret değil yalnızca daha fazla thread gerekir.
Geçerli bir token gönderdiğim halde bot neden engelleniyor?
Token doğruysa sorun genellikle CAPTCHA katmanında değil, istek profilindedir. Gerçekçi HTTP başlıkları ekleyin, istekler arasına gecikme koyun ve gönderim hızını insani bir tempoya çekin. CaptchaAI CAPTCHA'yı çözer; isteğin geri kalanının doğal görünmesi sizin akışınızın sorumluluğundadır.
CaptchaAI hangi CAPTCHA türlerini çözüyor?
reCAPTCHA v2/v3 (görünmez ve Enterprise dahil), Cloudflare Turnstile ve Cloudflare doğrulama akışı, GeeTest v3, resim/OCR, grid ve BLS CAPTCHA'ları desteklenir. CaptchaFox, Friendly Captcha ve Lemin ise beta aşamasındadır. hCaptcha ve FunCaptcha ise henüz desteklenmiyor; GeeTest v4 için destek çok yakında.
Veri kazıyan botlarda KVKK'ya dikkat etmeli miyim?
Evet. Topladığınız veriler kişisel veri içeriyorsa KVKK kapsamındadır. Yalnızca yetkiniz olan ve sahibi olduğunuz veri üzerinde, izinli QA ve veri toplama akışları içinde çalışın.