CAPTCHA çözümünü iş akışınıza eklemek için sıfırdan bir istemci yazmanıza gerek yok. Aşağıdaki altı script kopyala-yapıştır olarak çalışır; her biri CaptchaAI API'sini kullanır ve döngünün tamamını — görevi gönderme, sonucu sorgulama ve token'ı döndürme — tek fonksiyonda yönetir. reCAPTCHA v2, Cloudflare Turnstile ve resim CAPTCHA'sından toplu çözüme kadar en sık ihtiyaç duyulan senaryoları kapsar.
CaptchaAI thread bazlı ücretlendirir: her plan, ay boyunca thread başına sınırsız çözüm içerir (BASIC $15/ay, 5 thread … ENTERPRISE $300/ay, 200 thread). Türkiye'den USD ile ödeyen ekipler için bu, çözüm başına faturayla değil, öngörülebilir aylık maliyetle çalışmak demektir — özellikle çözüm hacminiz dalgalanıyorsa.
İhtiyacınıza en yakın scripti aşağıdaki tablodan seçip doğrudan geçebilirsiniz:
| Script | Kullanım senaryosu | method parametresi |
|---|---|---|
| Script 1 | reCAPTCHA v2 | userrecaptcha |
| Script 2 | Cloudflare Turnstile | turnstile |
| Script 3 | Resim / OCR CAPTCHA'sı | base64 |
| Script 4 | Toplu / paralel çözüm | userrecaptcha |
| Script 5 | Node.js evrensel çözücü | değişken |
Script 1: reCAPTCHA v2 çözme
En yaygın senaryo. googlekey (sayfadaki sitekey) ve pageurl alır, token'ı stdout'a yazdırır. Sonuç hazır olana kadar her 5 saniyede bir sorgular.
#!/usr/bin/env python3
"""Solve reCAPTCHA v2 and print the token."""
import requests
import time
import sys
API_KEY = "YOUR_API_KEY"
def solve_recaptcha_v2(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url
})
if not resp.text.startswith("OK|"):
print(f"Error: {resp.text}", file=sys.stderr)
sys.exit(1)
task_id = resp.text.split("|")[1]
print(f"Task ID: {task_id}")
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY":
print(".", end="", flush=True)
continue
if result.text.startswith("OK|"):
print()
return result.text.split("|")[1]
print(f"\nError: {result.text}", file=sys.stderr)
sys.exit(1)
print("\nTimeout", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
if len(sys.argv) != 3:
print(f"Usage: {sys.argv[0]} <site_key> <page_url>")
sys.exit(1)
token = solve_recaptcha_v2(sys.argv[1], sys.argv[2])
print(token)
Kullanımı:
python solve_recaptcha.py "6Le-wvkS..." "https://example.com/form"
Script 2: Cloudflare Turnstile çözme
Aynı iskelet, farklı method ve parametre adı: Turnstile'ı sitekey ile gönderirsiniz. Dönen cf-turnstile-response token'ını formunuza yerleştirir veya isteğinize eklersiniz.
#!/usr/bin/env python3
"""Solve Cloudflare Turnstile and print the token."""
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_turnstile(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "turnstile",
"sitekey": site_key,
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": 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(result.text)
raise TimeoutError()
token = solve_turnstile("0x4AAAAA...", "https://example.com")
print(token)
Script 3: Resim (OCR) CAPTCHA çözme
Klasik metin tabanlı resim CAPTCHA'ları için. Görüntüyü dosyadan ya da URL'den okur, base64'e çevirir ve çözülen metni döndürür.
#!/usr/bin/env python3
"""Solve an image CAPTCHA from a file or URL."""
import requests
import base64
import time
import sys
API_KEY = "YOUR_API_KEY"
def solve_image(image_source):
# Load image
if image_source.startswith("http"):
img_data = requests.get(image_source).content
else:
with open(image_source, "rb") as f:
img_data = f.read()
img_b64 = base64.b64encode(img_data).decode()
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "base64",
"body": img_b64
})
task_id = resp.text.split("|")[1]
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": 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(result.text)
raise TimeoutError()
if __name__ == "__main__":
text = solve_image(sys.argv[1])
print(text)
Kullanımı:
python solve_image.py captcha.png
python solve_image.py "https://example.com/captcha.jpg"
Script 4: Toplu (paralel) CAPTCHA çözücü
Çok sayıda görevi aynı anda çözmeniz gerektiğinde bu script devreye girer. ThreadPoolExecutor ile görevleri paralel gönderir; max_workers değerini planınızın thread sayısına göre ayarlayın — 5 thread'lik BASIC planda max_workers=5 mantıklı bir başlangıçtır. Her görev için başarı/başarısızlık durumu ayrı ayrı raporlanır, böylece tek bir hata tüm partiyi düşürmez.
#!/usr/bin/env python3
"""Solve multiple CAPTCHAs concurrently."""
import requests
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
API_KEY = "YOUR_API_KEY"
def solve_one(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": site_key, "pageurl": page_url
})
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": 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(result.text)
raise TimeoutError()
def solve_batch(tasks, max_workers=5):
"""
tasks: list of (site_key, page_url) tuples
Returns: list of tokens
"""
results = []
with ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = {
executor.submit(solve_one, sk, url): (sk, url)
for sk, url in tasks
}
for future in as_completed(futures):
sk, url = futures[future]
try:
token = future.result()
results.append({"url": url, "token": token, "status": "ok"})
except Exception as e:
results.append({"url": url, "error": str(e), "status": "failed"})
return results
# Example
tasks = [
("6Le-wvkS...", "https://example.com/page1"),
("6Le-wvkS...", "https://example.com/page2"),
("6Le-wvkS...", "https://example.com/page3"),
]
results = solve_batch(tasks)
for r in results:
print(f"{r['url']}: {r['status']}")
Script 5: Node.js ile evrensel çözücü
Tek bir solve() fonksiyonu, params içindeki method değerine göre her türü çözer. Node.js ağırlıklı bir kod tabanınız varsa reCAPTCHA ve Turnstile için ayrı istemci yazmak yerine bunu içe aktarın.
#!/usr/bin/env node
// Solve any CAPTCHA type from the command line
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
async function solve(params) {
params.key = API_KEY;
const submit = await axios.get("https://ocr.captchaai.com/in.php", {
params,
});
if (!submit.data.startsWith("OK|")) throw new Error(submit.data);
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: API_KEY, 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);
}
}
// Usage examples:
// Solve reCAPTCHA v2
// solve({ method: "userrecaptcha", googlekey: "SITE_KEY", pageurl: "URL" })
// Solve Turnstile
// solve({ method: "turnstile", sitekey: "SITE_KEY", pageurl: "URL" })
module.exports = { solve };
Bakiye kontrol scripti
Otomasyonu zamanlamadan önce bakiyenizi programatik olarak kontrol edin; kalan çözüm bütçenizi izlemenin en pratik yolu budur.
#!/usr/bin/env python3
"""Check CaptchaAI account balance."""
import requests
API_KEY = "YOUR_API_KEY"
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "getbalance"
})
print(f"Balance: ${resp.text}")
Scriptleri üretime taşırken
Yukarıdaki örnekler bilinçli olarak sade tutuldu — mantığı görmeniz için. Gerçek bir serviste kullanmadan önce dört noktayı ekleyin:
- API anahtarını koddan çıkarın.
API_KEY = "YOUR_API_KEY"satırını bir ortam değişkeniyle değiştirin (os.environ["CAPTCHAAI_KEY"]). Anahtarı depoya commit'lemeyin; sızması bakiyenizin başkası tarafından harcanması demektir. - Yeniden deneme ve üstel geri çekilme (exponential backoff) ekleyin. Ağ hatası veya geçici bir sunucu yanıtı, tek seferlik bir başarısızlık olmak zorunda değil. Görevi birkaç kez, artan bekleme süresiyle yeniden gönderin; her denemede sabit 5 saniye beklemek yerine aralığı kademeli büyütmek istek sınırlama (rate limiting) durumlarında daha güvenli davranır.
- Günlüğe kaydedin. Toplu çözücünün döndürdüğü
status: failedkayıtlarını hata kodu vepageurlile birlikte loglayın; sorun giderme sırasında hangi görevin neden düştüğünü ancak böyle görebilirsiniz. - Zaman aşımını iş yükünüze göre ayarlayın. Döngülerdeki
range(60)üst sınırı, 5 saniyelik aralıkla yaklaşık 5 dakikalık bir tavan demektir. reCAPTCHA gibi daha yavaş türlerde bu makul; hızlı çözülen türlerde daha düşük bir tavan, düşen görevleri daha erken yakalar.
Bu dört ekleme, örnekleri "çalışan bir demo"dan "üretimde güvenle bırakabileceğiniz bir modül"e dönüştürür. Çözme fonksiyonlarını ayrı bir dosyada toplayıp import etmeniz, hem bağımsız komut satırı aracı hem de içe aktarılabilir kütüphane olarak kullanmanızı sağlar.
Yerel senaryo: e-ticaret checkout QA'i
Türkiye'deki ekiplerin en sık karşılaştığı durum, ödeme adımını Cloudflare Turnstile ile koruyan bir e-ticaret formunun otomatik testidir. Staging ortamınızda checkout akışını her deploy sonrası doğrulamak istediğinizde, Script 2 ile token üretip test isteğinize ekleyebilir; regresyon paketiniz büyüdükçe Script 4'ün toplu çözücüsüyle testleri paralel çalıştırabilirsiniz. Kazıma senaryolarında ise topladığınız kişisel veriler KVKK kapsamına girer — scriptleri yalnızca yetkiniz olan, izinli QA ve veri toplama iş akışlarında kullanın.
SSS
Bu scriptler hangi CAPTCHA türlerini çözer, hangilerini çözmez?
reCAPTCHA v2/v3, Cloudflare Turnstile, GeeTest v3, resim/OCR ve BLS gibi desteklenen türler için çalışır — yalnızca method parametresini değiştirirsiniz. hCaptcha ve FunCaptcha (Arkose Labs) CaptchaAI tarafından desteklenmez; bu türler için token beklemeyin. GeeTest v4 için destek "çok yakında" olarak duyuruldu, henüz kullanılamaz.
Toplu çözücüde kaç thread kullanmalıyım?
max_workers değerini planınızın thread sayısını aşmayacak şekilde ayarlayın. BASIC 5, ENTERPRISE 200 eşzamanlı thread sunar; thread sayısının üzerine çıkmak istekleri kuyruğa alır, hız kazandırmaz. Sınır thread sayısıdır, çözüm sayısı değil — her plan thread başına sınırsız çözüm içerir.
Script sürekli CAPCHA_NOT_READY dönüp zaman aşımına uğruyor, ne yapmalıyım?
Bu normal bir ara durumdur: sonuç henüz hazır değil demektir; script zaten 5 saniyelik aralıklarla yeniden sorgular. Kalıcı zaman aşımında önce sitekey ve pageurl değerlerinin sayfadakiyle birebir aynı olduğunu doğrulayın, sonra bakiyenizin tükenmediğini kontrol edin. OK| yerine başka bir hata dönerse, gövdedeki mesaj sorunun kaynağını verir.
Bu scriptleri çalıştırmak ne kadar tutar?
Maliyet çözüm başına değil, thread başınadır: BASIC ($15/ay, 5 thread) ile başlayıp ENTERPRISE ($300/ay, 200 thread)'a kadar ölçeklenir ve her planda thread başına sınırsız çözüm vardır. Güncel bakiyenizi yukarıdaki bakiye kontrol scriptiyle görebilirsiniz.
Çözme fonksiyonlarını mevcut projeme nasıl entegre ederim?
Örnekler hem bağımsız araç hem de içe aktarılabilir kütüphane olacak şekilde tasarlandı. solve_recaptcha_v2, solve_turnstile gibi fonksiyonları ayrı bir modüle taşıyıp projenizden import edin; API anahtarını ortam değişkeninden okuyacak biçimde düzenlerseniz aynı fonksiyonu birden çok serviste güvenle paylaşabilirsiniz. Node.js tarafında module.exports = { solve } satırı bu entegrasyonu doğrudan mümkün kılar.