Kasus Penggunaan

Verifikasi Iklan dengan Penanganan CAPTCHA

Verifikasi iklan memerlukan kunjungan ribuan halaman web untuk memeriksa penempatan iklan, keamanan merek, dan kepatuhan. Banyak situs penerbit menggunakan CAPTCHA yang memblokir pemeriksaan otomatis. CaptchaAI menjaga jalur verifikasi Anda tetap berjalan.

Verifikasi Iklan Apa yang Diperiksa

Periksa Deskripsi Mengapa CAPTCHA Memblokirnya
Penempatan iklan Apakah iklan ditampilkan di paro atas? Kunjungan halaman otomatis memicu deteksi bot
Keamanan merek Tidak ada iklan di samping konten berbahaya Pemeriksaan URL massal menyerupai scraping
Keterlihatan Apakah iklan tersebut benar-benar terlihat? Browser tanpa kepala ditandai oleh Cloudflare
Penargetan geografis Iklan yang tepat di wilayah yang tepat Lalu lintas proxy memicu CAPTCHA
Pemantauan pesaing Iklan apa yang ditampilkan pesaing? Pencarian iklan bervolume tinggi

Implementasi

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)

Penskalaan dengan Penerbit yang Dilindungi Cloudflare

Banyak penerbit premium menggunakan Cloudflare. Tangani Turnstile dan tantangan penuh:

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_validation_cookie and use same proxy
        return data

    return resp

Pertanyaan Umum

Berapa banyak halaman yang dapat saya verifikasi per jam?

Dengan CaptchaAI, Anda dapat memverifikasi 200-500 halaman per jam tergantung pada frekuensi CAPTCHA dan waktu penyelesaian.

Apakah ini berfungsi untuk verifikasi iklan video?

Pendekatan ini berfungsi untuk iklan bergambar dan iklan bawaan. Verifikasi iklan video biasanya memerlukan rendering browser dengan Selenium atau Playwright.

Bagaimana cara menangani wilayah yang berbeda?

Gunakan proxy dari geografi target. CaptchaAI mendukung parameter proxy sehingga konteks penyelesaiannya sesuai dengan penargetan geografis Anda.

Panduan Terkait

Komentar dinonaktifkan untuk artikel ini.