Reklam doğrulama, reklam yerleşimini, marka güvenliğini ve uyumluluğunu kontrol etmek için binlerce web sayfasını ziyaret etmeyi gerektirir. Birçok yayıncı sitesi, otomatik kontrolleri engelleyen CAPTCHA'lar kullanır. CaptchaAI, doğrulama işlem hattınızın çalışır durumda kalmasını sağlar.
Reklam Doğrulama Hangi Kontrolleri Yapar?
| Kontrol et | Açıklama | CAPTCHA'lar Neden Engelliyor? |
|---|---|---|
| Reklam yerleşimi | Reklam ekranın üst kısmında mı gösteriliyor? | Otomatik sayfa ziyaretleri bot tespitini tetikler |
| Marka güvenliği | Zararlı içeriğin yanında reklam yok | Toplu URL kontrolü kazımaya benzer |
| Görüntülenebilirlik | Reklam gerçekten görünür müydü? | Cloudflare tarafından işaretlenen headless tarayıcılar |
| Coğrafi hedefleme | Doğru bölgede doğru reklam | Proxy trafiği CAPTCHA'ları tetikler |
| Rakip izleme | Rakipler hangi reklamları gösteriyor? | Yüksek hacimli reklam aramaları |
Uygulama
import requests
import time
import re
import json
import os
from datetime import datetime
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
def solve_captcha(method, params):
params["key"] = API_KEY
params["method"] = method
resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(resp.text)
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)[1]
raise Exception(result.text)
raise TimeoutError()
def verify_ad_placement(url, session):
"""Verify ad placement on a publisher page."""
resp = session.get(url)
# Solve CAPTCHA if present
match = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)["\']', resp.text)
if match:
token = solve_captcha("userrecaptcha", {
"googlekey": match.group(1),
"pageurl": url,
})
resp = session.post(url, data={"g-recaptcha-response": token})
html = resp.text
# Check for ad elements
result = {
"url": url,
"timestamp": datetime.utcnow().isoformat(),
"ads_found": [],
"brand_safety": True,
"captcha_solved": match is not None,
}
# Detect ad tags
ad_patterns = [
(r'googletag\.pubads', "Google Ad Manager"),
(r'doubleclick\.net', "DFP/DoubleClick"),
(r'ad\.doubleclick', "DoubleClick"),
(r'amazon-adsystem', "Amazon Ads"),
(r'criteo\.com/.*\.js', "Criteo"),
]
for pattern, name in ad_patterns:
if re.search(pattern, html):
result["ads_found"].append(name)
# Brand safety check — flag problematic content
safety_keywords = [
"violence", "hate speech", "explicit",
"gambling", "illegal",
]
page_text = re.sub(r'<[^>]+>', '', html).lower()
for keyword in safety_keywords:
if keyword in page_text:
result["brand_safety"] = False
break
return result
def run_verification(urls, output_file="verification_report.json"):
"""Run ad verification across multiple publisher URLs."""
session = requests.Session()
session.headers["User-Agent"] = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0"
)
results = []
for i, url in enumerate(urls):
try:
result = verify_ad_placement(url, session)
results.append(result)
ads = ", ".join(result["ads_found"]) or "None"
safe = "SAFE" if result["brand_safety"] else "UNSAFE"
print(f" [{i+1}/{len(urls)}] {url}: {ads} [{safe}]")
except Exception as e:
results.append({
"url": url,
"error": str(e),
"timestamp": datetime.utcnow().isoformat(),
})
print(f" [{i+1}/{len(urls)}] {url}: ERROR - {e}")
time.sleep(2)
with open(output_file, "w") as f:
json.dump(results, f, indent=2)
# Summary
total = len(results)
safe = sum(1 for r in results if r.get("brand_safety"))
captchas = sum(1 for r in results if r.get("captcha_solved"))
errors = sum(1 for r in results if "error" in r)
print(f"\n Total: {total} | Safe: {safe} | CAPTCHAs solved: {captchas} | Errors: {errors}")
return results
# Publisher URLs to verify
publisher_urls = [
"https://publisher1.com/article/tech-news",
"https://publisher2.com/sports/latest",
"https://publisher3.com/finance/markets",
]
run_verification(publisher_urls)
Cloudflare Korumalı Yayıncılarla Ölçeklendirme
Birçok premium yayıncı Cloudflare kullanıyor. Hem Turnstile hem de tüm zorlukların üstesinden gelin:
def handle_cloudflare(url, session):
"""Handle Cloudflare-protected publisher pages."""
resp = session.get(url)
if "cf-turnstile" in resp.text:
match = re.search(r'data-sitekey=["\']([^"\']+)', resp.text)
if match:
token = solve_captcha("turnstile", {
"sitekey": match.group(1),
"pageurl": url,
})
return session.post(url, data={
"cf-turnstile-response": token,
})
if resp.status_code == 403 and "cf-browser-verification" in resp.text:
data = solve_captcha("cloudflare_challenge", {
"pageurl": url,
"proxy": "user:pass@proxy:port",
"proxytype": "HTTP",
})
# Parse qa_session_cookie and use same proxy
return data
return resp
SSS
Saatte kaç sayfayı doğrulayabilirim?
CaptchaAI ile CAPTCHA sıklığına ve çözüm sürelerine bağlı olarak saatte 200-500 sayfa doğrulayabilirsiniz.
Bu, video reklam doğrulaması için işe yarar mı?
Bu yaklaşım görüntülü reklamlar ve yerel reklamlar için işe yarar. Video reklam doğrulaması genellikle tarayıcının Selenium veya Playwright ile oluşturulmasını gerektirir.
Farklı bölgeleri nasıl halledebilirim?
Hedef coğrafyalardaki proxy'leri kullanın. CaptchaAI proxy parametrelerini destekler, böylece çözüm bağlamı coğrafi hedeflemenizle eşleşir.