EndCaptcha'dan CaptchaAI'ye geçiş göründüğünden daha küçük bir iştir: pratikte üç şeyi değiştirirsiniz — kullanıcı adı/şifre çiftini tek bir API anahtarıyla, SOAP/XML çağrılarını in.php/res.php uç noktalarıyla ve özel XML ayrıştırmayı basit bir JSON kontrolüyle. Çözüm mantığınızın geri kalanı (görevi gönderin, sonucu sorgulayın, token'ı kullanın) aynı kalır. Bu kılavuz her EndCaptcha çağrısını CaptchaAI karşılığıyla eşler; Python ve Node.js için önce/sonra örnekler içerir.
Neden CaptchaAI'ye geçmelisiniz?
EndCaptcha'dan ayrılırken kazandığınız şeyler yalnızca mekanik farklar değildir:
- Tek API anahtarı: kullanıcı adı/şifre çiftinin yerini alır; sır yönetimi tek bir değere iner.
- Düz REST: SOAP/WSDL yerine
in.php/res.php— neredeyse her HTTP istemcisiyle çalışır. - thread bazlı, USD sabit fiyatlandırma: TL kurundaki dalgalanmadan bağımsız, öngörülebilir aylık maliyet.
- 2Captcha uyumlu desen: alan adları tanıdık gelir, dolayısıyla taşıma büyük ölçüde mekanik kalır.
Mimari olarak ne değişiyor?
EndCaptcha WSDL üzerinden konuşan bir SOAP/XML servisidir; CaptchaAI iki uç noktalı düz bir REST API sunar:
| Boyut | EndCaptcha | CaptchaAI |
|---|---|---|
| Protokol | SOAP/XML veya HTTP POST | HTTP POST/GET (REST) |
| Görev gönderme | /Captcha/Upload veya WSDL |
https://ocr.captchaai.com/in.php |
| Sonuç alma | /Captcha/GetText veya WSDL |
https://ocr.captchaai.com/res.php |
| Kimlik doğrulama | Kullanıcı adı + şifre | Tek API anahtarı |
| Yanıt | XML/özel biçim | JSON (json=1) veya düz metin |
Parametre karşılıkları
İstek gövdenizdeki alan adlarını uyarlamak taşımanın en mekanik kısmıdır; tablo karşılıkları verir:
| EndCaptcha parametresi | CaptchaAI parametresi | Not |
|---|---|---|
username |
key |
CaptchaAI tek bir API anahtarı kullanır |
password |
— | Gerekmez; kimlik doğrulama API anahtarıyla yapılır |
captchaData (base64) |
body (base64) |
Aynı base64 görüntü verisi |
captchaType |
method |
Tür tanımlayıcıları farklıdır |
siteKey |
googlekey |
reCAPTCHA türleri için |
pageUrl |
pageurl |
Aynı kavram, farklı yazım |
captchaId |
id |
Sorgulama için görev kimliği |
Hangi CAPTCHA türleri hangi yönteme karşılık geliyor?
EndCaptcha'nın sayısal captchaType değerleri yerine CaptchaAI adlandırılmış method kullanır:
| EndCaptcha türü | CaptchaAI yöntemi | CaptchaAI parametreleri |
|---|---|---|
| Görüntü / OCR CAPTCHA | method=base64 |
body={base64_image} |
| reCAPTCHA v2 | method=userrecaptcha |
googlekey, pageurl |
| reCAPTCHA v3 | method=userrecaptcha |
googlekey, pageurl |
Önemli uyarı: CaptchaAI şu anda hCaptcha ve FunCaptcha (Arkose Labs) çözmez. EndCaptcha akışlarınız bu türlere dayanıyorsa, taşımadan önce onlar için ayrı bir çözüm planlayın.
Kodu taşıma
Değişen tek şey gönderim ve sorgulama katmanıdır; iş akışının şekli aynı kalır. Önce mevcut EndCaptcha kodunu, ardından CaptchaAI karşılığını görüyorsunuz.
Python — Önce (EndCaptcha)
Başlangıç noktası tipik bir EndCaptcha çözümüdür: kullanıcı adı/şifre gönderir ve captchaId ile sonucu sorgular.
import requests
USERNAME = "your_endcaptcha_user"
PASSWORD = "your_endcaptcha_pass"
def solve_image_endcaptcha(image_base64):
# EndCaptcha image solve
resp = requests.post("https://api.endcaptcha.com/Captcha/Upload", data={
"username": USERNAME,
"password": PASSWORD,
"captchaData": image_base64,
"captchaType": "1"
})
result = resp.json()
captcha_id = result.get("captchaId")
import time
for _ in range(30):
time.sleep(5)
poll = requests.post("https://api.endcaptcha.com/Captcha/GetText", data={
"username": USERNAME,
"password": PASSWORD,
"captchaId": captcha_id
})
poll_result = poll.json()
if poll_result.get("text"):
return {"solution": poll_result["text"]}
if poll_result.get("error"):
return {"error": poll_result["error"]}
return {"error": "TIMEOUT"}
Python — Sonra (CaptchaAI)
Aynı mantığı CaptchaAI'de kurarken yalnızca uç noktalar ve alan adları değişir; kimlik doğrulama tek bir key alanına iner.
import os
import time
import requests
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
def solve_image_captchaai(image_base64):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "base64",
"body": image_base64,
"json": 1
})
data = resp.json()
if data.get("status") != 1:
return {"error": data.get("request")}
captcha_id = data["request"]
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": captcha_id,
"json": 1
}).json()
if result.get("status") == 1:
return {"solution": result["request"]}
if result.get("request") != "CAPCHA_NOT_READY":
return {"error": result.get("request")}
return {"error": "TIMEOUT"}
Python — reCAPTCHA v2 (CaptchaAI)
Token tabanlı türlerde method=userrecaptcha kullanın, googlekey ile pageurl gönderin ve sorgulama döngüsünü daha uzun tutun.
def solve_recaptcha_v2(sitekey, pageurl):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1
})
data = resp.json()
if data.get("status") != 1:
return {"error": data.get("request")}
captcha_id = data["request"]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get",
"id": captcha_id, "json": 1
}).json()
if result.get("status") == 1:
return {"solution": result["request"]}
if result.get("request") != "CAPCHA_NOT_READY":
return {"error": result.get("request")}
return {"error": "TIMEOUT"}
JavaScript — Önce (EndCaptcha)
Node.js tarafında tablo değişmez: axios ile kullanıcı adı/şifre gönderen mevcut EndCaptcha kodu şöyle görünür.
const axios = require("axios");
const USERNAME = "your_endcaptcha_user";
const PASSWORD = "your_endcaptcha_pass";
async function solveImageEndCaptcha(imageBase64) {
const submit = await axios.post("https://api.endcaptcha.com/Captcha/Upload", {
username: USERNAME,
password: PASSWORD,
captchaData: imageBase64,
captchaType: "1",
});
const captchaId = submit.data.captchaId;
for (let i = 0; i < 30; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.post("https://api.endcaptcha.com/Captcha/GetText", {
username: USERNAME,
password: PASSWORD,
captchaId,
});
if (poll.data.text) return { solution: poll.data.text };
if (poll.data.error) return { error: poll.data.error };
}
return { error: "TIMEOUT" };
}
JavaScript — Sonra (CaptchaAI)
CaptchaAI karşılığında istek gövdesi yerine params kullanılır ve yanıt status ile request alanlarından okunur.
const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;
async function solveImageCaptchaAI(imageBase64) {
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: { key: API_KEY, method: "base64", body: imageBase64, json: 1 },
});
if (submit.data.status !== 1) return { error: submit.data.request };
const captchaId = submit.data.request;
for (let i = 0; i < 30; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: captchaId, json: 1 },
});
if (poll.data.status === 1) return { solution: poll.data.request };
if (poll.data.request !== "CAPCHA_NOT_READY") return { error: poll.data.request };
}
return { error: "TIMEOUT" };
}
Dikkat edilecek temel farklar
Alan adları eşleşse bile davranışı farklılaşan noktalar var; çoğu hata bu satırlarda gizli:
| Alan | EndCaptcha | CaptchaAI |
|---|---|---|
| Kimlik doğrulama | Kullanıcı adı + şifre çifti | Tek API anahtarı |
| Hata biçimi | error alanlı özel JSON |
Hata kodlu standart request alanı |
| Sorgulama | Ayrı bir uç noktaya POST | res.php'ye sorgu parametreleriyle GET |
| Bakiye kontrolü | Ayrı SOAP yöntemi | res.php?action=getbalance&key=KEY |
| Hatalı çözümü bildirme | Ayrı yöntem | res.php?action=reportbad&id=ID&key=KEY |
Geçiş kontrol listesi
Taşımayı riske atmadan ilerletmek için adımları sırayla işaretleyin:
| Adım | Durum |
|---|---|
| CaptchaAI hesabı oluşturun | ☐ |
| Tüm EndCaptcha çağrılarını CaptchaAI karşılıklarıyla eşleyin | ☐ |
| Kimlik doğrulamayı değiştirin (kullanıcı adı/şifre → API anahtarı) | ☐ |
Gönderme uç noktasını güncelleyin (/Captcha/Upload → /in.php) |
☐ |
Sorgulama uç noktasını güncelleyin (/Captcha/GetText → /res.php) |
☐ |
| Yanıt ayrıştırmayı güncelleyin | ☐ |
| Her iki sağlayıcıyla paralel test yapın | ☐ |
| Üretim trafiğini CaptchaAI'ye yönlendirin | ☐ |
| EndCaptcha kimlik bilgilerini kaldırın | ☐ |
Türkiye'deki otomasyon ekipleri için not: CaptchaAI thread bazlı, USD sabit fiyatlandırma kullanır; TL kurundaki dalgalanmadan bağımsız, öngörülebilir aylık maliyet gerçek bir avantajdır. Üretime almadan önce her iki sağlayıcıyı bir süre paralel çalıştırıp çözüm oranlarını karşılaştırın.
Sorun giderme
| Sorun | Sebep | Çözüm |
|---|---|---|
ERROR_KEY_DOES_NOT_EXIST |
API anahtarı yerine EndCaptcha kullanıcı adı kullanılmış | Panelden CaptchaAI API anahtarınızı kullanın |
| Yanıt ayrıştırma başarısız oluyor | Farklı JSON yapısı | status ve request alanlarını kontrol edecek şekilde güncelleyin |
method parametresi eksik |
EndCaptcha captchaType numaralandırması kullanır |
CaptchaAI yöntem adlarıyla eşleyin (base64, userrecaptcha vb.) |
| reCAPTCHA'da zaman aşımı | Farklı varsayılan zaman aşımları | token CAPTCHA'ları için sorgulamayı 60 yineleme × 5 saniyeye ayarlayın |
Sık sorulan sorular
EndCaptcha ve CaptchaAI'yi bir süre paralel çalıştırabilir miyim?
Evet, önerilen yol budur. Aynı görevi iki sağlayıcıya gönderip sonuçları karşılaştırın; çözüm oranı ve süresi beklentinizi karşıladığında üretim trafiğini CaptchaAI'ye kaydırın.
CaptchaAI hCaptcha'yı destekliyor mu?
Hayır. CaptchaAI şu anda hCaptcha ve FunCaptcha (Arkose Labs) çözmez. EndCaptcha akışlarınızın bir kısmı bu türlere dayanıyorsa, taşımadan önce bu akışlar için ayrı bir çözüm planlayın. CaptchaAI reCAPTCHA v2/v3, Cloudflare Turnstile ve Challenge, GeeTest v3, görüntü/OCR, grid ve BLS türlerini çözer.
Hangi CaptchaAI planıyla başlamalıyım?
Küçük taşıma testleri için BASIC ($15/ay, 5 thread) genellikle yeterlidir. Eşzamanlı çözüm ihtiyacınız arttıkça ADVANCE ($90/ay, 50 thread) gibi daha yüksek thread'li bir plana geçebilirsiniz. CaptchaAI thread başına ücretlendirir; thread başına çözüm sınırsızdır.
Sorgulama (polling) mantığımı değiştirmem gerekir mi?
Yapı aynı kalır: görevi gönderin, kimliği alın, res.php'yi periyodik sorgulayın. Yalnızca alan adlarını uyarlarsınız — CAPCHA_NOT_READY gelirken bekleyin, status: 1 geldiğinde request alanındaki token'ı okuyun.
İlgili makaleler
Sonraki adımlar
CAPTCHA çözümünüzü CaptchaAI'nin REST API'siyle sadeleştirin — API anahtarınızı alın ve taşımaya bugün başlayın.
İlgili kılavuzlar: