Explainers

CaptchaAI JSON API ve Form API Karşılaştırması: Hangi Format Kullanılmalı

Kısa yanıt: CaptchaAI'ye isteğinizi ister form-encoded ister JSON gönderin, sonuç değişmez. API her iki gövdeyi de aynı motorla işler ve size aynı task_id'yi, ardından aynı token'ı döndürür. O yüzden asıl soru "hangisi daha iyi" değil, "projenizin geri kalanı hangi formatı zaten konuşuyor" sorusudur.

Tek istisna resim (image) CAPTCHA gönderimidir: orada dosyayı nasıl taşıdığınız — multipart yükleme mi, base64 gövde mi — pratik bir fark yaratır. Aşağıda önce hızlı kararı, sonra iki formatın yan yana halini ve her dilde çalışan kodu bulacaksınız.

Hızlı Karar: Hangi Senaryoda Hangi Format

İki formatın işlevi aynı olduğu için seçimi teknik bir üstünlük değil, mevcut yığınınız belirler. Aşağıdaki tablo yaygın durumlar için pratik öneriyi özetler:

Senaryo Önerilen Neden
Basit script'ler form-encoded Daha az bağımlılık, daha az kod
REST API entegrasyonu JSON Tipik API kalıplarıyla eşleşir
Dosya yüklemeleri Multipart form Doğrudan ikili (binary) yükleme
Büyük base64 görseller form-encoded Büyük yükleri daha sağlam taşır
TypeScript / modern JS JSON Yerel nesne desteği
Eski (legacy) sistem entegrasyonu form-encoded Evrensel uyumluluk
2Captcha'dan geçiş form-encoded 2Captcha ile birebir aynı format

Kural olarak: kod tabanınız zaten JSON konuşuyorsa JSON gönderin, aksi hâlde form-encoded en az sürtünmeli varsayılandır.

İki Formatı Yan Yana Görün

Aynı reCAPTCHA v2 görevini iki farklı gövdeyle göndermek şöyle görünür. Fark yalnızca gövde biçimi ve Content-Type başlığıdır.

form-encoded (varsayılan)

import requests

resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "SITE_KEY",
    "pageurl": "https://example.com",
    "json": 1,
})

Content-Type: application/x-www-form-urlencoded

JSON

import requests

resp = requests.post("https://ocr.captchaai.com/in.php", json={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "SITE_KEY",
    "pageurl": "https://example.com",
    "json": 1,
})

Content-Type: application/json

Python'da tek değişen anahtar kelime data= yerine json= olması; kütüphane doğru Content-Type başlığını sizin için ekler.

Temel Farklar: form-encoded ile JSON

İki format arasındaki gerçek ayrımlar biçim ve okunabilirlik düzeyindedir, sonuç düzeyinde değil:

Faktör form-encoded JSON
Content-Type application/x-www-form-urlencoded application/json
Veri yapısı Düz anahtar/değer çiftleri İç içe nesneler mümkün
İkili veri Dosya yükleme için multipart kullanın Gövde alanında base64 kodlama
Dizi desteği Sınırlı Yerel
Python parametresi data={} json={}
Node.js URLSearchParams JSON.stringify()
Okunabilirlik Düz parametrelerde basit Karmaşık veride daha iyi
Uyumluluk Her yerde çalışır Her yerde çalışır

Bu API'nin parametreleri düz olduğu için (key, method, googlekey, pageurl) çoğu iş yükünde iki format da eşit derecede rahattır. JSON'ın avantajı ancak iç içe veri veya diziler gönderdiğinizde belirginleşir.

Yanıtı JSON Olarak Alma (json=1)

İstek formatından bağımsız olarak, yanıtı ayrıştırması kolay JSON biçiminde almak için gövdeye json=1 ekleyin:

# Without json=1 — plain text response
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "SITE_KEY",
    "pageurl": "https://example.com",
})
# Response: "OK|12345678"

# With json=1 — JSON response
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "SITE_KEY",
    "pageurl": "https://example.com",
    "json": 1,
})
# Response: {"status": 1, "request": "12345678"}

json=1 olmadan API OK|12345678 gibi bir düz metin döndürür ve bunu elle bölmeniz gerekir. Daha temiz kod için her istekte json=1 kullanın.

Python ile Görev Gönderme ve Sorgulama

Akış her iki formatta aynıdır: in.php'ye POST ile görevi gönderir, dönen task_id ile res.php'yi sorgularsınız. Dikkat edilecek nokta, sorgulamanın (polling) her zaman GET ve sorgu parametreleriyle yapılmasıdır — gövde formatı burada rol oynamaz.

form-encoded gövde

import requests

# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "SITE_KEY",
    "pageurl": "https://example.com",
    "json": 1,
})
task_id = resp.json()["request"]

# Poll (always GET with query params)
resp = requests.get("https://ocr.captchaai.com/res.php", params={
    "key": "YOUR_API_KEY",
    "action": "get",
    "id": task_id,
    "json": 1,
})

JSON gövde

import requests

# Submit with JSON
resp = requests.post("https://ocr.captchaai.com/in.php", json={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "SITE_KEY",
    "pageurl": "https://example.com",
    "json": 1,
})
task_id = resp.json()["request"]

# Poll (same as form-encoded — GET with params)
resp = requests.get("https://ocr.captchaai.com/res.php", params={
    "key": "YOUR_API_KEY",
    "action": "get",
    "id": task_id,
    "json": 1,
})

İki örnekte de sorgulama satırı birebir aynıdır. Yani gönderim formatını değiştirseniz bile sorgulama kodunuzu yeniden yazmanız gerekmez.

Node.js ile Aynı Akış

Node.js tarafında da mantık değişmez; yalnızca gövdeyi hazırlama biçimi farklıdır. form-encoded için querystring ile serileştirir, JSON için nesneyi doğrudan axios'a verirsiniz.

form-encoded gövde

const axios = require('axios');
const qs = require('querystring');

// Submit
const resp = await axios.post(
  'https://ocr.captchaai.com/in.php',
  qs.stringify({
    key: 'YOUR_API_KEY',
    method: 'userrecaptcha',
    googlekey: 'SITE_KEY',
    pageurl: 'https://example.com',
    json: 1,
  })
);
const taskId = resp.data.request;

JSON gövde

const axios = require('axios');

// Submit with JSON
const resp = await axios.post(
  'https://ocr.captchaai.com/in.php',
  {
    key: 'YOUR_API_KEY',
    method: 'userrecaptcha',
    googlekey: 'SITE_KEY',
    pageurl: 'https://example.com',
    json: 1,
  }
);
const taskId = resp.data.request;

TypeScript veya modern bir JS projesindeyseniz JSON gövde genellikle daha doğal durur; nesneleri elle serileştirmeden axios'a verirsiniz.

Resim CAPTCHA'larında Format Neden Önemli

Format seçiminin gerçekten fark yarattığı tek yer resim (image) CAPTCHA gönderimidir. Burada üç yol vardır: dosyayı doğrudan multipart yüklemek, base64 dizesini JSON gövdesine koymak veya base64 dizesini form alanına koymak.

Dosya yüklemeli form (multipart)

# File upload — form-encoded with multipart
resp = requests.post("https://ocr.captchaai.com/in.php",
    data={
        "key": "YOUR_API_KEY",
        "method": "post",
        "json": 1,
    },
    files={
        "file": open("captcha.png", "rb"),
    },
)

JSON içinde base64

import base64

# Base64 in JSON body
with open("captcha.png", "rb") as f:
    body = base64.b64encode(f.read()).decode()

resp = requests.post("https://ocr.captchaai.com/in.php", json={
    "key": "YOUR_API_KEY",
    "method": "base64",
    "body": body,
    "json": 1,
})

form içinde base64

# Base64 in form data
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": "YOUR_API_KEY",
    "method": "base64",
    "body": body,
    "json": 1,
})

Pratik kural: elinizde dosya varsa multipart yükleme en temizidir. Görseli zaten base64 dizesi olarak tutuyorsanız, çok büyük yüklerde form-encoded gövde genelde daha sağlam taşır.

Türkiye'den Bir Senaryo

Diyelim ki İstanbul'da bir e-ticaret ekibindesiniz ve ödeme adımındaki (checkout) reCAPTCHA'yı otomatik QA testlerinizde çözmeniz gerekiyor. Node.js tabanlı test paketiniz zaten her yere JSON gönderiyorsa, CAPTCHA isteğini de JSON gövdesiyle göndermek kod tabanınızla tutarlı kalır ve tek bir istek istemcisi kullanırsınız.

Ama aynı ekip 2Captcha'dan CaptchaAI'ye geçiş yapıyorsa hikâye değişir: mevcut form-encoded çağrılarınız hiçbir değişiklik olmadan çalışacağı için önce onları olduğu gibi bırakmak en az sürtünmeli yoldur; JSON'a projeyi yeniden yazmak zorunda kalmadan sonradan geçebilirsiniz. İki yolda da çözüm oranı aynıdır — seçim tamamen mevcut yığınınıza bağlıdır. USD bazlı, thread tabanlı planlar sayesinde format seçiminiz ne olursa olsun aylık maliyetiniz öngörülebilir kalır.

Sık Yapılan Hatalar

Hata Sorun Çözüm
json={} kullanıp veride json: 1 koymamak Yanıt düz metin döner Gövdeye "json": 1 ekleyin
Python'da data= ile json='yi karıştırmak İstek bozuk oluşur Yalnızca birini kullanın
Content-Type başlığını elle set edip gövdeyle uyumsuz bırakmak Sunucu gövdeyi ayrıştıramaz HTTP kütüphanenizin başlığı otomatik ayarlamasına izin verin
Sorgulama uç noktasına JSON gövdesi göndermek Sorgulama GET parametreleri kullanır /res.php için her zaman GET + sorgu parametresi kullanın

Sık Sorulan Sorular

Format çözüm hızını veya doğruluğunu değiştirir mi?

Hayır. Sunucu her iki gövdeyi de aynı şekilde işler; çözüm süresi ve başarı oranı formattan bağımsızdır. Seçiminizi yalnızca kod tarafındaki rahatlığa göre yapın.

Yanıtı düz metin yerine JSON olarak almak için ne gerekiyor?

İstek gövdesine json=1 ekleyin. Bu olmadan API OK|12345678 gibi düz metin döner; json=1 ile {"status": 1, "request": "12345678"} biçiminde ayrıştırması kolay bir yanıt alırsınız.

Büyük base64 görseller için hangi format daha iyi?

Çok büyük base64 yükleri form-encoded gövdeyle daha sağlam taşınır. Dosyayı doğrudan yüklüyorsanız multipart form; base64 dizesini gövdeye koyuyorsanız hem JSON hem form-encoded çalışır.

2Captcha'dan geçerken hangi formatı kullanmalıyım?

form-encoded'da kalın. Orijinal 2Captcha API'si form-encoded kullanır ve CaptchaAI bununla uyumludur; mevcut çağrılarınızı değiştirmeden çalıştırabilir, JSON'a sonradan geçebilirsiniz.

Content-Type başlığını elle ayarlamam gerekir mi?

Genellikle hayır. requests veya axios gibi kütüphaneler data= / json= seçiminize göre doğru Content-Type'ı otomatik ekler. Başlığı elle set edip gövdeyle uyumsuz bırakmak en sık görülen hatadır.

İlgili Kılavuzlar

Yığınınıza uyan formatı seçin — CaptchaAI API'yi bugün deneyin.

Bu makale için yorumlar devre dışı bırakılmıştır.