Kullanım Senaryoları

CAPTCHA İşleme ile Etkinlik Bileti İzleme

Bilet platformları, otomatik kontrolleri ve satın alma işlemlerini önlemek için CAPTCHA'ları kullanır. Konserler, spor etkinlikleri, tiyatrolar gibi etkinlik biletlerinin kullanılabilirliğini izlerken kazıyıcınız reCAPTCHA zorlukları, Cloudflare korumaları ve hız sınırlamasıyla karşılaşacaktır. CaptchaAI, CAPTCHA çözme işlemini gerçekleştirerek monitörünüzün kullanılabilirliği güvenilir bir şekilde kontrol edebilmesini sağlar.

Bu kılavuz, entegre CAPTCHA çözümüyle bir bilet izleme iş akışı oluşturur.


İzleme iş akışı

Configure events → Check availability → CAPTCHA?
                                           ↓ Yes
                                      Solve via CaptchaAI → Retry
                                           ↓ No
                                      Parse availability → Changed?
                                                             ↓ Yes
                                                         Send alert

İhtiyacınız olan şey

Gereksinim Ayrıntılar
CaptchaAI API anahtarı captchaai.com
Python 3.8+ requests ile
Vekil Konut vekili önerilir
pip install requests

CAPTCHA çözücü yardımcısı

import requests
import time

API_KEY = "YOUR_API_KEY"


def solve_captcha(method, params):
    """Generic CaptchaAI solver for any supported method."""
    params["key"] = API_KEY
    params["json"] = 1

    submit = requests.post("https://ocr.captchaai.com/in.php", data=params).json()

    if submit.get("status") != 1:
        raise RuntimeError(f"Submit error: {submit.get('request')}")

    task_id = submit["request"]
    initial_wait = 10 if method == "turnstile" else 20
    time.sleep(initial_wait)

    for _ in range(30):
        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:
            return result["request"]
        if result.get("request") != "CAPCHA_NOT_READY":
            raise RuntimeError(f"Solve error: {result['request']}")
        time.sleep(5)
    raise TimeoutError("Solve timed out")

Bilet monitörü

from datetime import datetime
import json


class TicketMonitor:
    def __init__(self, proxy=None):
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        })
        if proxy:
            self.session.proxies = {
                "http": f"http://{proxy}",
                "https": f"http://{proxy}"
            }
        self.last_status = {}

    def check_event(self, event):
        """Check ticket availability for an event, solving CAPTCHAs if needed."""
        url = event["url"]
        response = self.session.get(url)

        # Handle CAPTCHA if detected
        if "g-recaptcha" in response.text or "recaptcha" in response.text:
            sitekey = self._extract_sitekey(response.text)
            if sitekey:
                token = solve_captcha("userrecaptcha", {
                    "method": "userrecaptcha",
                    "googlekey": sitekey,
                    "pageurl": url
                })
                response = self.session.post(url, data={
                    "g-recaptcha-response": token
                })

        elif "cf-turnstile" in response.text:
            sitekey = self._extract_turnstile_key(response.text)
            if sitekey:
                token = solve_captcha("turnstile", {
                    "method": "turnstile",
                    "sitekey": sitekey,
                    "pageurl": url
                })
                response = self.session.post(url, data={
                    "cf-turnstile-response": token
                })

        # Parse availability
        availability = self._parse_availability(response.text, event)

        # Check for changes
        event_key = event["name"]
        if event_key in self.last_status:
            if availability != self.last_status[event_key]:
                self._send_alert(event, availability)

        self.last_status[event_key] = availability
        return availability

    def _extract_sitekey(self, html):
        if 'data-sitekey="' in html:
            start = html.index('data-sitekey="') + 14
            end = html.index('"', start)
            return html[start:end]
        return None

    def _extract_turnstile_key(self, html):
        if 'data-sitekey="' in html:
            start = html.index('data-sitekey="') + 14
            end = html.index('"', start)
            return html[start:end]
        return None

    def _parse_availability(self, html, event):
        """Parse ticket availability. Customize per ticketing site."""
        available = "sold out" not in html.lower()
        return {
            "event": event["name"],
            "available": available,
            "checked_at": datetime.now().isoformat()
        }

    def _send_alert(self, event, availability):
        """Send availability change notification."""
        status = "AVAILABLE" if availability["available"] else "SOLD OUT"
        print(f"[ALERT] {event['name']}: {status}")

    def monitor_all(self, events):
        """Check all events and return results."""
        results = []
        for event in events:
            try:
                result = self.check_event(event)
                results.append(result)
                print(f"[OK] {event['name']}: {'available' if result['available'] else 'sold out'}")
            except Exception as e:
                print(f"[ERROR] {event['name']}: {e}")
        return results


# Usage
events = [
    {
        "name": "Concert - Madison Square Garden - Aug 15",
        "url": "https://example-tickets.com/event/12345"
    },
    {
        "name": "Basketball Finals - Game 7",
        "url": "https://example-tickets.com/event/67890"
    }
]

monitor = TicketMonitor(proxy="user:pass@proxy.example.com:8080")
results = monitor.monitor_all(events)

for r in results:
    print(json.dumps(r, indent=2))

Beklenen çıktı:

[OK] Concert - Madison Square Garden - Aug 15: available
[OK] Basketball Finals - Game 7: sold out

Planlama

Kontrolleri düzenli aralıklarla çalıştırın:

# Check every 15 minutes
*/15 * * * * cd /path/to/project && python ticket_monitor.py >> /var/log/tickets.log 2>&1

Sorun giderme

Sorun Sebep Düzeltme
Her çekte sık CAPTCHA'lar Aynı IP, oturum kalıcılığı yok Çerezleri kullanın, konut vekillerini dönüşümlü kullanın
Birkaç kontrolden sonra engellendi Hız sınırlaması Kontrol aralıklarını artırın, proxy rotasyonunu kullanın
Yanlış kullanılabilirlik durumu Sayfa yapısı değiştirildi _parse_availability yöntemini güncelleyin
Yavaş CAPTCHA çözümü Yüksek çözücü yükü Geri alma ile yeniden deneme mantığını uygulayın

SSS

Bilet müsaitliğini ne sıklıkla kontrol etmeliyim?

Genel izleme için her 10-30 dakikada bir. Yüksek talep içeren etkinlikler için her 2-5 dakikada bir - ancak daha yüksek frekanslarda daha fazla CAPTCHA bekleyebilirsiniz.

Bilet siteleri hangi CAPTCHA'ları kullanıyor?

En yaygın olarak reCAPTCHA v2, Cloudflare Turnstile ve Cloudflare doğrulama akışı sayfaları. Sanal bekleme odaları gibi kuyruk sistemleri özel zorluklar kullanabilir.

Birden fazla bilet platformunu izleyebilir miyim?

Evet. Ayrıştırıcıyı her platformun HTML yapısına göre özelleştirin ve farklı sitelerden etkinlikler ekleyin.

Konut vekillerine ihtiyacım var mı?

Evet. Bilet siteleri veri merkezi IP'lerini agresif bir şekilde engeller. Yerleşik proxy'ler CAPTCHA sıklığını azaltır.

Bekleme odalarını nasıl halledebilirim/queues?

Bekleme odaları CAPTCHA'lardan ayrıdır. Monitörünüz kuyruk sayfalarını algılamalı ve beklemeli veya yeniden denemelidir. CaptchaAI, kuyruktan sonra görünen CAPTCHA'yı çözer.


CaptchaAI API anahtarınızı alın

Bilet kullanılabilirliğini şu adresten izlemeye başlayın:captchaai.com. Etkinlik izleme iş akışınızda CAPTCHA'ları otomatik olarak işleyin.


İlgili kılavuzlar

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