Cas d'Usage

Surveillance des tickets d'événement avec gestion CAPTCHA

Les plateformes de billetterie utilisent des CAPTCHA pour empêcher les contrôles et les achats automatisés. Lors de la surveillance de la disponibilité des billets pour des événements (concerts, sports, théâtre), votre scraper sera confronté aux défis reCAPTCHA, aux protections Cloudflare et à la limitation de débit. CaptchaAI gère la résolution CAPTCHA afin que votre moniteur puisse vérifier la disponibilité de manière fiable.

Ce guide crée un flux de travail de surveillance des tickets avec résolution CAPTCHA intégrée.


Le flux de travail de surveillance

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

Ce dont vous avez besoin

Exigence Détails
Clé API CaptchaAI captchaai.com
Python 3.8+ Avec requests
Procuration Proxy résidentiel recommandé
pip install requests

Aide au solveur CAPTCHA

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")

Moniteur de billets

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))

Résultat attendu :

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

Planification

Effectuez des contrôles à intervalles réguliers :

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

Dépannage

Problème Parce que Corriger
CAPTCHA fréquents sur chaque chèque Même IP, pas de persistance de session Utiliser des cookies, alterner les proxys résidentiels
Bloqué après quelques vérifications Limitation du débit Augmentez les intervalles de vérification, utilisez la rotation des proxys
Mauvais état de disponibilité La structure des pages a été modifiée Mettre à jour la méthode _parse_availability
Résolution lente des CAPTCHA Charge de solveur élevée Implémenter une logique de nouvelle tentative avec interruption

FAQ

À quelle fréquence dois-je vérifier la disponibilité des billets ?

Toutes les 10 à 30 minutes pour la surveillance générale. Pour les événements à forte demande, toutes les 2 à 5 minutes – mais attendez-vous à davantage de CAPTCHA à des fréquences plus élevées.

Quels CAPTCHA les sites de billetterie utilisent-ils ?

Le plus souvent, les pages reCAPTCHA v2, Cloudflare Turnstile et Cloudflare Challenge. Les systèmes de file d'attente comme les salles d'attente virtuelles peuvent utiliser des défis personnalisés.

Puis-je surveiller plusieurs plateformes de billetterie ?

Oui. Personnalisez l'analyseur pour la structure HTML de chaque plateforme et ajoutez des événements provenant de différents sites.

Ai-je besoin de procurations résidentielles ?

Oui. Les sites de tickets bloquent de manière agressive les adresses IP des centres de données. Les proxys résidentiels réduisent la fréquence des CAPTCHA.

Comment gérer les salles d'attente/queues ?

Les salles d’attente sont séparées des CAPTCHA. Votre moniteur doit détecter les pages de file d'attente et attendre ou réessayer. CaptchaAI résout le CAPTCHA qui apparaît après la file d'attente.


Obtenez votre clé API CaptchaAI

Commencez à surveiller la disponibilité des billets àcaptchaai.com. Gérez automatiquement les CAPTCHA dans votre flux de travail de surveillance des événements.


Guides associés

Les commentaires sont désactivés pour cet article.