Explainers

Solve Media CAPTCHA nedir?

Solve Media, kullanıcıdan rastgele karakterler yerine bir marka sloganı yazmasını isteyen, reklam tabanlı bir CAPTCHA türüdür. Ekranda "aX3kP" değil, "Taste The Rainbow" gibi okunabilir bir ifade belirir; kullanıcı ifadeyi kutuya yazar, reklamveren de görüntülenme başına ödeme yapar. Yani doğrulama katmanı aynı zamanda bir reklam envanteridir — CAPTCHA dünyasında oldukça sıra dışı bir iş modeli.

Otomasyon tarafındaki pratik sonuç şu: Solve Media güvenlik için değil okunabilirlik için tasarlandığından, görüntü OCR açısından klasik metin CAPTCHA'larına göre belirgin biçimde kolaydır. Ayrı bir yöntem, ayrı bir entegrasyon veya özel bir method değeri gerekmez; standart görüntü OCR akışı yeterlidir.

Marka bugün Permit.io / Radius Networks çatısı altında ve yeni kurulumlar nadir. Buna karşılık 2013–2018 arasında yayına alınıp o günden beri elden geçirilmemiş formlar — eski forum yazılımları, kayıt sayfaları, kupon ve bülten formları — hâlâ bu widget'ı taşıyabiliyor. Eski bir siteyi devralan ya da yıllardır çalışan bir formu regresyon testine sokan bir ekip, karşısında pekâlâ Solve Media bulabilir.


Kullanıcı ne görüyor?

Widget yüklendiğinde ekrandaki doğrulama kutusu kabaca şuna benzer — bozuk karakterler değil, okunur bir reklam ifadesi ve tek bir metin alanı:

┌─────────────────────────────────┐
│                                 │
│   "Taste The Rainbow"           │
│                                 │
├─────────────────────────────────┤
│ Type the phrase: [____________] │
│                     [Verify]    │
└─────────────────────────────────┘

Bu sadeliğin bir bedeli var: widget'ın sayfadaki izleri de aynı ölçüde belirgin.


Sayfada Solve Media nasıl tanınır?

Teşhis, çözümden önce gelir. Sayfa kaynağında şu işaretler varsa karşınızdaki widget Solve Media'dır:

<!-- Solve Media script -->
<script src="https://api.solvemedia.com/papi/challenge.script"></script>

<!-- Widget container -->
<div id="adcopy-outer"></div>

<!-- Hidden response fields -->
<input type="hidden" name="adcopy_challenge" />
<input type="hidden" name="adcopy_response" />

Pratik kural: id veya name değeri adcopy- ya da solvemedia ile başlayan her öğe bu widget'a aittir. Yanıt iki gizli alanda taşınır — adcopy_challenge sunucudan gelen kimliği, adcopy_response ise kullanıcının yazdığı ifadeyi tutar.


Akış: dört adımda ne oluyor?

  1. Widget, reklam mesajını bir görüntü olarak yükleyip ekrana getirir
  2. Kullanıcı marka ifadesini okur ve giriş kutusuna yazar
  3. Yanıt, Solve Media sunucularında doğrulanır
  4. Doğruysa form gönderimi kaldığı yerden devam eder

Kritik nokta üçüncü adımda: doğrulama sunucu tarafında yapılır, dolayısıyla gönderdiğiniz metnin görüntüdeki ifadeyle birebir eşleşmesi gerekir. İfade çok kelimeli olduğu için boşluklar anlamlıdır — OCR isteğinizi buna göre yapılandırmalısınız.


Solve Media ile standart metin CAPTCHA'sı arasındaki fark

Özellik Solve Media Standart metin CAPTCHA
Metin içeriği Marka ifadeleri, gerçek kelimeler Rastgele karakterler
Okunabilirlik Yüksek (okunması istenir) Düşük (zorlaştırılmıştır)
Bozulma Az Yoğun
Gelir modeli Reklam Yok
OCR açısından zorluk Kolay (temiz metin) Zor (bozuk karakterler)
Kullanıcı deneyimi Daha iyi (tanıdık kelimeler) Daha kötü (okunması güç)

Tablodaki asıl mesaj şu: Solve Media'nın tasarım hedefiyle bir anti-bot ürününün tasarım hedefi birbirinin tersidir. Reklam mesajının okunabilir olması ticari bir zorunluluktu; bu da metni OCR için temiz bir girdi hâline getiriyor. CaptchaAI tarafında görüntü CAPTCHA'ları için yayımlanan hız tavanı <0,5 s, başarı ise desteklenen türlerde yüksek olarak tanımlanır — sayısal bir oran vaadi yoktur.


Yerel senaryo: eski bir formu devralmak

Somut bir örnek: İstanbul'daki bir ajans, 2015'te yayına alınmış bir e-ticaret sitesinin bülten ve destek formlarının bakımını devralıyor. Uçtan uca test paketi yazılırken kayıt formunun bir Solve Media widget'ı içerdiği görülüyor; formu üreten eklenti yıllar önce bakımsız kalmış, ama form hâlâ üretimde çalışıyor.

Bu noktada iki seçenek var: widget'ı sökmek (ürün ekibinin onayına ve bir sürüm planına bağlı) veya QA ortamında doğrulamayı programatik olarak çözüp regresyon testlerini akıtmaya devam etmek. İkincisi tipik olarak daha hızlıdır ve testlerin yeşile dönmesini bir refactor'a bağlamaz. Europe/Istanbul saat diliminde gece çalışan bir CI işi için phrase=1 ile yapılan tek bir OCR isteği, testin önündeki tek engeli kaldırmaya yeter.

Bir not: bu formlar üzerinden toplanan e-posta ve iletişim verileri KVKK kapsamındadır. Test verisi olarak gerçek müşteri kayıtları yerine +90 biçiminde sahte numaralar ve tr-TR yerel ayarıyla üretilmiş kukla kayıtlar kullanın.


CaptchaAI ile Solve Media çözme

Solve Media metni bir görüntü içinde sunduğu için standart görüntü OCR yöntemi (method=base64 veya method=post) doğrudan işe yarar. Görüntüyü widget'tan alın, in.php uç noktasına gönderin, res.php üzerinden sonucu sorgulayın ve dönen ifadeyi adcopy_response alanına yazın.

Python

import requests
import time
import base64

API_KEY = "YOUR_API_KEY"

# Capture the CAPTCHA image
# Method 1: Screenshot the widget
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com/page-with-solvemedia")

captcha_img = driver.find_element(By.CSS_SELECTOR, "#adcopy-puzzle-image img")
captcha_img.screenshot("solvemedia.png")

# Submit to CaptchaAI
with open("solvemedia.png", "rb") as f:
    img_b64 = base64.b64encode(f.read()).decode()

response = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "base64",
    "body": img_b64,
    "phrase": 1,      # Contains spaces (multi-word phrase)
    "json": 1
})

task_id = response.json()["request"]

# Poll for solution
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, "json": 1
    }).json()
    if result.get("status") == 1:
        text = result["request"]
        print(f"Phrase: {text}")
        break

# Type the phrase
driver.find_element(By.CSS_SELECTOR, "#adcopy_response").send_keys(text)
driver.find_element(By.CSS_SELECTOR, "form").submit()

Node.js

const axios = require('axios');
const fs = require('fs');

async function solveSolveMedia(imagePath) {
  const imageB64 = fs.readFileSync(imagePath).toString('base64');

  const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
    params: {
      key: 'YOUR_API_KEY',
      method: 'base64',
      body: imageB64,
      phrase: 1,
      json: 1
    }
  });

  const taskId = submit.data.request;

  for (let i = 0; i < 30; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const res = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
    });
    if (res.data.status === 1) return res.data.request;
  }
  throw new Error('Timeout');
}

İki örnekte de kalıp aynıdır: gönderin, sorgulayın, yanıtı forma yazın. Sorgulama aralığını 5 saniyede tutmak yeterlidir; görüntü CAPTCHA'ları hızlı döndüğü için çoğu istek ilk birkaç sorgulamada sonuçlanır. Aynı gönderme/sorgulama kalıbı, CaptchaAI'nin diğer görüntü tabanlı türlerinde de birebir geçerlidir.


Parametre ayarları: dört küçük karar

Ayar Neden
phrase=1 verin Solve Media ifadeleri boşluk içerir
numeric=2 verin İfadeler genellikle yalnızca harflerden oluşur
min_len / max_len vermeyin İfade uzunluğu sabit değildir
Büyük/küçük harfi olduğu gibi bırakın Bazı kurulumlar harf duyarsızdır

Bu dört ayarın üçü phrase=1 etrafında dönüyor. En sık görülen hata, boşluk beklemeyen bir yapılandırmayla çok kelimeli bir ifadeyi göndermek ve tek kelimelik bir yanıt almaktır — sonuç sunucu tarafında reddedilir, hata da haksız yere OCR'ye yıkılır. Yanıt geldiğinde metni kırpmadan, birleştirmeden ve büyük/küçük harfine dokunmadan alana yazın.


Diğer CAPTCHA türlerine göre nerede duruyor?

Solve Media, modern doğrulama akışlarının yanında hafif kalır. reCAPTCHA v2 davranış sinyalleriyle ve sitekey/pageurl çiftiyle çalışır, ayrı bir yöntem ister. Cloudflare Turnstile bir cf-turnstile-response token'ı döndürür ve bu token'ın forma yerleştirilmesi gerekir. GeeTest v3 ise kaydırmalı bir akış kullanır. Bunların üçü de görüntüden metin okumaktan farklı bir entegrasyon şekli ister.

Solve Media'da bunların hiçbiri yok: token yok, sitekey yok, tarayıcı bağlamı şart değil. Elinizde yalnızca bir görüntü ve bir metin alanı var — bu yüzden entegrasyonu, tarayıcısız bir HTTP istemcisiyle bile tamamlanabilecek en basit türlerden biridir.


SSS

Solve Media widget'ı hâlâ yeni sitelerde kullanılıyor mu?

Pratikte hayır. Marka satın alındı ve yeniden konumlandırıldı; yeni kurulumlar nadir. Karşılaşacağınız örnekler neredeyse tamamen yıllardır güncellenmemiş eski sayfalardır.

İfadeyi görüntüyü hiç işlemeden alabilir miyim?

Bazı kurulumlarda ifade metni sayfa kaynağında veya API yanıtında açıkta kalır. Önce adcopy_challenge gizli alanına ve widget'ın döndürdüğü yanıta bakın; metin oradaysa OCR adımına hiç gerek kalmaz.

CaptchaAI'nin Solve Media'ya özel bir method değeri var mı?

Hayır ve gerekmiyor. Standart görüntü OCR yöntemini (method=base64 veya method=post) phrase=1 ile kullanın — bu tür, görüntü CAPTCHA ailesinin bir parçası olarak ele alınıyor.

Çözüm geldi ama form yine de reddediyor; hata nerede?

Sırasıyla üç şeyi kontrol edin: yanıtı doğru alana mı yazdınız (adcopy_response, adcopy_challenge değil), boşlukları koruyup korumadığınızı (phrase=1 ayarlı mı) ve adcopy_challenge değerinin hâlâ geçerli olup olmadığını. Widget yeniden yüklendiyse eski kimlik geçersizdir; yeni görüntüyle baştan başlayın.

Bu iş yükü için hangi plan yeterli?

Solve Media tekil ve seyrek karşılaşılan bir türdür; eşzamanlılık ihtiyacı genellikle düşüktür. Tek bir QA test paketi için BASIC ($15/ay, 5 thread) rahatlıkla yeter; paralel çalışan birden fazla test işiniz varsa STANDARD ($30/ay, 15 thread) daha uygun olur. Faturalama çözüm başına değil eşzamanlı thread başınadır, yani plan içinde çözüm sayısı sınırsızdır.


İlgili kılavuzlar

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