Сценарии использования

Мониторинг билетов на события с обработкой CAPTCHA

Билетные платформы используют CAPTCHA для предотвращения автоматических проверок и покупок. При отслеживании доступности билетов на мероприятия — концерты, спортивные состязания, театр — ваш парсер столкнется с проблемами reCAPTCHA, защитой Cloudflare и ограничением скорости. CaptchaAI занимается решением CAPTCHA, поэтому ваш монитор может надежно проверять доступность.

В этом руководстве описан рабочий процесс мониторинга заявок со встроенным решением CAPTCHA.


Рабочий процесс мониторинга

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

Что вам нужно

Требование Подробности
CaptchaAI API-ключ captchaai.com
Питон 3.8+ С requests
Прокси Рекомендуется авторизованный сетевой выход
pip install requests

Помощник по решению 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")

Монитор билетов

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 = "temporarily unavailable" 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 "temporarily unavailable"
        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 'temporarily unavailable'}")
            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))

Ожидаемый результат:

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

Планирование

Запускайте проверки через регулярные промежутки времени:

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

Поиск неисправностей

Проблема Причина Исправить
Частые CAPTCHA при каждой проверке Тот же IP, без сохранения сеанса Используйте файлы cookie, чередуйте авторизованный сетевой выход
Заблокировано после нескольких проверок Ограничение скорости Увеличьте интервалы проверки, используйте ротацию прокси
Неправильный статус доступности Структура страницы изменена Обновите метод _parse_availability.
Медленное решение CAPTCHA Высокая загрузка решателя Реализовать логику повтора с отсрочкой

Часто задаваемые вопросы

Как часто мне следует проверять наличие билетов?

Каждые 10–30 минут для общего мониторинга. Для событий с высоким спросом каждые 2–5 минут, но ожидайте большего количества CAPTCHA с более высокой частотой.

Какие CAPTCHA используют сайты продажи билетов?

Чаще всего это страницы reCAPTCHA v2, Cloudflare Turnstile и страница Cloudflare-защиты в staging. Системы очередей, такие как виртуальные залы ожидания, могут использовать специальные задачи.

Могу ли я контролировать несколько билетных платформ?

Да. Настройте парсер для HTML-структуры каждой платформы и добавляйте события с разных сайтов.

Нужны ли мне авторизованный сетевой выход?

Да. Билетные сайты агрессивно блокируют IP-адреса центров обработки данных. авторизованный сетевой выход снижают частоту CAPTCHA.

Как мне работать с залами ожидания/queues?

Залы ожидания отделены от CAPTCHA. Ваш монитор должен обнаружить страницы очереди и либо подождать, либо повторить попытку. CaptchaAI решает CAPTCHA, которая появляется после очереди.


Получите API-ключ CaptchaAI

Начните отслеживать наличие билетов наcaptchaai.com. Автоматически обрабатывайте CAPTCHA в рабочем процессе мониторинга событий.


Связанные руководства

  • Как решить reCAPTCHA v2 с помощью API
  • Как решить Cloudflare Turnstile с помощью API
  • QA-проверка ticketing workflow с помощью решения CAPTCHA
  • Реализация логики повтора с помощью CaptchaAI
Комментарии для этой статьи отключены.