Bir CI/CD ardışık düzeninde, uzak bir sunucuda ya da tek satırlık bir kabuk betiğinde CAPTCHA çözmeniz gerektiğinde ekstra bir kütüphane kurmanız gerekmez: curl ile doğrudan CaptchaAI REST API'sine bağlanabilirsiniz. İhtiyacınız olan tek şey API anahtarınız ve iki uç nokta — görev gönderdiğiniz in.php ile sonucu aldığınız res.php. Bu rehber, bakiye kontrolünden token'ı bir forma göndermeye kadar akışın tamamını terminalden gösterir.
cURL yaklaşımı özellikle Türkiye'deki serbest otomasyon geliştiricileri ve e-ticaret QA ekipleri için pratiktir: Python veya Node.js kurmadan, mevcut bir Bash betiğine ya da GitHub Actions iş akışına birkaç satırda entegrasyon yapabilirsiniz. Bağımlılık yönetmek yok, sürüm çakışması yok — sadece HTTP.
Bu yaklaşım özellikle şu durumlarda öne çıkar:
- SDK kuramadığınız minimal sunucu veya konteyner ortamları.
- CI/CD adımlarında hızlı bir doğrulama gerektiğinde.
- Farklı dillerdeki betiklerden ortak bir çözüm mantığını çağırmak istediğinizde.
Başlamadan önce: gereksinimler
| Gereksinim | Ayrıntılar |
|---|---|
| cURL | Herhangi bir modern sürüm |
| jq (isteğe bağlı) | Yanıtları JSON olarak ayrıştırmak için |
| CaptchaAI API anahtarı | Ücretsiz hesap açıp alın |
API anahtarınızı panelden alıp CAPTCHAAI_API_KEY ortam değişkenine atarsanız, aşağıdaki tüm komutları anahtarınızı düz metin olarak koda yazmadan çalıştırabilirsiniz.
Temel API çağrıları: in.php ve res.php
Tüm akış üç adıma indirgenir:
- Bakiyeyi kontrol ederek anahtarınızı doğrulayın.
- Görevi
in.php'ye gönderin ve görev kimliğini alın. - Token hazır olana kadar
res.php'yi sorgulayın.
Bakiyenizi kontrol edin
res.php uç noktası getbalance eylemiyle hesabınızdaki bakiyeyi USD cinsinden döndürür — betiğe başlamadan anahtarınızın geçerli olduğunu doğrulamanın en hızlı yolu:
curl -s "https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=getbalance"
Çıktı: 1.234
reCAPTCHA v2 görevi gönderin
Görev göndermek için in.php uç noktasına sitenin googlekey (sitekey) ve pageurl değerlerini iletirsiniz. Yanıt, sonucu sorgulamak için kullanacağınız görev kimliğini içerir:
curl -s "https://ocr.captchaai.com/in.php?key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkS...&pageurl=https://example.com"
Çıktı: OK|73548291
Sonucu sorgulayın
Görev kimliğini res.php'ye action=get ile gönderip token hazır olana kadar periyodik olarak sorgularsınız. Çözüm tamamlanmadıysa API CAPCHA_NOT_READY döndürür; birkaç saniye bekleyip tekrar deneyin:
curl -s "https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=73548291"
Çıktı: OK|03AGdBq24PBCbw... veya CAPCHA_NOT_READY
Yeniden kullanılabilir bir Bash çözüm betiği
Aynı curl komutlarını her seferinde elle yazmak yerine, gönderme ve sorgulama döngüsünü tek bir fonksiyonda toplayın. Aşağıdaki solve_captcha.sh betiği görevi gönderir, CAPCHA_NOT_READY yanıtı geldikçe beş saniyede bir tekrar sorgular ve zaman aşımına ulaşmadan token'ı stdout'a yazar — böylece başka betiklerden çağırabilirsiniz.
solve_captcha.sh'yi oluşturun:
#!/bin/bash
set -euo pipefail
API_KEY="${CAPTCHAAI_API_KEY:?Set CAPTCHAAI_API_KEY environment variable}"
BASE_URL="https://ocr.captchaai.com"
solve_recaptcha() {
local site_key="$1"
local page_url="$2"
local timeout="${3:-300}"
# Submit
local response
response=$(curl -s "${BASE_URL}/in.php?key=${API_KEY}&method=userrecaptcha&googlekey=${site_key}&pageurl=${page_url}")
if [[ ! "$response" == OK|* ]]; then
echo "ERROR: Submit failed: $response" >&2
return 1
fi
local task_id="${response#OK|}"
echo "Submitted task: $task_id" >&2
# Poll
local deadline=$((SECONDS + timeout))
while (( SECONDS < deadline )); do
sleep 5
local result
result=$(curl -s "${BASE_URL}/res.php?key=${API_KEY}&action=get&id=${task_id}")
if [[ "$result" == "CAPCHA_NOT_READY" ]]; then
echo "Waiting..." >&2
continue
fi
if [[ "$result" == OK|* ]]; then
echo "${result#OK|}"
return 0
fi
echo "ERROR: Solve failed: $result" >&2
return 1
done
echo "ERROR: Timeout after ${timeout}s" >&2
return 1
}
# Usage: ./solve_captcha.sh SITE_KEY PAGE_URL
if [[ $# -ge 2 ]]; then
solve_recaptcha "$1" "$2"
fi
Betiği çalıştırılabilir hale getirin:
chmod +x solve_captcha.sh
Anahtarınızı dışa aktarıp çağırın:
export CAPTCHAAI_API_KEY="your_key_here"
./solve_captcha.sh "6Le-wvkS..." "https://example.com"
İpucu: Betik durum mesajlarını stderr'e, yalnızca token'ı stdout'a yazar. Bu ayrım, çözülen token'ı temiz biçimde bir değişkene almanızı sağlar — bir sonraki bölümde bunu kullanacağız.
Cloudflare Turnstile'ı çözün
reCAPTCHA akışına göre yalnızca iki nokta değişir:
method=userrecaptchayerinemethod=turnstilekullanın.- Site anahtarını
googlekeyyerinesitekeyparametresiyle geçin.
Görevi gönderdikten sonra sonucu sorgulama adımı reCAPTCHA ile birebir aynıdır:
curl -s "https://ocr.captchaai.com/in.php?key=${CAPTCHAAI_API_KEY}&method=turnstile&sitekey=0x4AAAAA...&pageurl=https://example.com"
Resim (OCR) CAPTCHA'sını çözün
Klasik resim tabanlı CAPTCHA'lar için görüntüyü base64'e kodlayıp method=base64 ile gönderin:
# Encode image to base64
IMAGE_B64=$(base64 -w 0 captcha.png)
# Submit
curl -s "https://ocr.captchaai.com/in.php?key=${CAPTCHAAI_API_KEY}&method=base64&body=${IMAGE_B64}"
Base64 dizesinin çok uzadığı büyük görüntülerde URL uzunluğu sınırına takılmamak için dosyayı POST ile çok parçalı (multipart) gönderin:
curl -s -X POST "https://ocr.captchaai.com/in.php" \
-F "key=${CAPTCHAAI_API_KEY}" \
-F "method=post" \
-F "file=@captcha.png"
Token'ı çözüp tek adımda forma gönderin
Gerçek bir iş akışında token'ı çözmek yalnızca ilk adımdır; asıl amaç onu bir isteğe eklemektir. Aşağıdaki betik solve_captcha.sh'yi çağırıp dönen token'ı bir QA giriş formuna g-recaptcha-response alanı olarak gönderir. Hedef adresin bir üretim sitesi değil, kendi staging ortamınız olduğuna dikkat edin:
#!/bin/bash
# Solve CAPTCHA and submit form in one pipeline
API_KEY="${CAPTCHAAI_API_KEY}"
SITE_KEY="6Le-wvkS..."
TARGET_URL="https://staging.example.com/qa-login"
# Solve
TOKEN=$(./solve_captcha.sh "$SITE_KEY" "$TARGET_URL")
if [[ -z "$TOKEN" ]]; then
echo "Failed to solve CAPTCHA"
exit 1
fi
# Submit form with token
curl -s -X POST "$TARGET_URL" \
-d "username=user" \
-d "password=pass" \
-d "g-recaptcha-response=${TOKEN}"
Toplu işlem: dosyadan çoklu CAPTCHA çözme
Bir regresyon testi paketinde onlarca sayfayı sırayla doğrulamanız gerekebilir. Aşağıdaki döngü, her satırında bir URL bulunan bir dosyayı okur, her biri için token çözer ve sonuçları bir CSV'ye yazar:
#!/bin/bash
# Input file: urls.txt (one URL per line)
while IFS= read -r url; do
echo "Processing: $url"
TOKEN=$(./solve_captcha.sh "6Le-wvkS..." "$url")
if [[ -n "$TOKEN" ]]; then
echo "$url,$TOKEN" >> results.csv
echo " Solved ✓"
else
echo " Failed ✗"
fi
done < urls.txt
Bu betik görevleri sırayla işler. Daha yüksek hacimde paralel çözüm için planınızdaki thread sayısı belirleyicidir: CaptchaAI thread tabanlı faturalandırır ve her thread için sınırsız çözüm sunar, dolayısıyla aynı anda kaç görevin havada olduğunu thread kapasiteniz belirler.
PowerShell ile Windows'ta çözme
Bash yerine Windows üzerinde çalışıyorsanız aynı akışı Invoke-RestMethod ile kurabilirsiniz. Gönderme ve sorgulama mantığı birebir aynıdır:
$ApiKey = $env:CAPTCHAAI_API_KEY
$BaseUrl = "https://ocr.captchaai.com"
# Submit
$response = Invoke-RestMethod "${BaseUrl}/in.php?key=${ApiKey}&method=userrecaptcha&googlekey=6Le-wvkS...&pageurl=https://example.com"
if ($response -match '^OK\|(.+)$') {
$taskId = $Matches[1]
Write-Host "Task: $taskId"
} else {
Write-Error "Submit failed: $response"
exit 1
}
# Poll
do {
Start-Sleep -Seconds 5
$result = Invoke-RestMethod "${BaseUrl}/res.php?key=${ApiKey}&action=get&id=${taskId}"
} while ($result -eq 'CAPCHA_NOT_READY')
if ($result -match '^OK\|(.+)$') {
$token = $Matches[1]
Write-Host "Token: $token"
} else {
Write-Error "Solve failed: $result"
}
Sorun giderme
Terminalden çalışırken en sık karşılaşılan hatalar ve çözümleri:
| Hata | Sebep | Düzeltme |
|---|---|---|
curl: (6) Could not resolve host |
DNS sorunu | Ağ bağlantınızı kontrol edin |
ERROR_WRONG_USER_KEY |
Geçersiz API anahtarı | Anahtardaki boşluk/satır sonu karakterlerini temizleyin |
| Yanıt boş | Ağ zaman aşımı | Komuta --connect-timeout 30 ekleyin |
base64: invalid input |
İkili dosya sorunu | Satır sarmalamayı kapatmak için base64 -w 0 kullanın |
Not: KVKK kapsamında, kazınan ya da otomasyonla işlenen kişisel veriler yasal yükümlülük doğurur. cURL entegrasyonunuzu yalnızca yetkili olduğunuz QA ve veri toplama akışlarında kullanın.
Sık sorulan sorular
cURL ile hangi CAPTCHA türlerini çözebilirim?
method parametresini değiştirerek reCAPTCHA v2/v3 (Enterprise dahil), Cloudflare Turnstile ve Challenge, GeeTest v3, resim/OCR, grid ve BLS türlerini çözebilirsiniz. hCaptcha ve FunCaptcha desteklenmiyor; GeeTest v4 desteği çok yakında geliyor. CaptchaFox, Friendly Captcha ve Lemin ise beta aşamasındadır.
API anahtarımı CI/CD ortamında nasıl güvende tutarım?
Anahtarı asla depoya ya da betiğe düz metin olarak yazmayın. CAPTCHAAI_API_KEY'yi GitHub Actions, GitLab CI veya Jenkins'te şifreli bir ortam değişkeni (secret) olarak tanımlayın ve betiği bu değişkenle çağırın.
cURL çözümü için hangi plan yeterli?
Planlar thread tabanlıdır ve her thread için sınırsız çözüm içerir. Tek betikle sıralı çözümler için BASIC ($15/ay, 5 thread) çoğu durumda yeterlidir; paralel toplu işlemde daha fazla thread'e ihtiyacınız olur.
Yanıtı jq ile nasıl ayrıştırırım?
İsteğe json=1 parametresini ekleyip yanıtı JSON formatında alın, ardından curl -s "..." | jq -r '.request' ile token'ı çıkarın. jq, kabuk betiklerinde OK|... dizesini elle bölmekten daha güvenilirdir.
cURL, Python veya Node.js SDK'sından daha mı yavaş?
Hayır. HTTP ek yükü aynıdır; toplam süreyi CAPTCHA'nın çözüm süresi belirler, taşıma katmanı değil. cURL, HTTP istemcilerine kıyasla ölçülebilir bir gecikme eklemez.