حالات الاستخدام

مراقبة تذاكر الأحداث من خلال التعامل مع اختبار 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 = "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))

الناتج المتوقع:

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

الجدولة

قم بإجراء عمليات التحقق على فترات منتظمة:

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

استكشاف الأخطاء وإصلاحها

المشكلة السبب الإجراء
اختبارات CAPTCHA المتكررة عند كل شيك نفس IP، لا يوجد استمرار للجلسة استخدم ملفات تعريف الارتباط، وقم بتدوير الوكلاء السكنيين
تم حظره بعد عدة عمليات فحص الحد من المعدل زيادة فترات التحقق، استخدم دوران الوكيل
حالة توفر خاطئة تم تغيير بنية الصفحة قم بتحديث طريقة _parse_availability
حل اختبار CAPTCHA بطيء حمولة حلال عالية تنفيذ منطق إعادة المحاولة مع التراجع

الأسئلة الشائعة

كم مرة يجب أن أتحقق من توفر التذاكر؟

كل 10 إلى 30 دقيقة للمراقبة العامة. بالنسبة للأحداث ذات الطلب المرتفع، كل 2 إلى 5 دقائق - ولكن توقع المزيد من اختبارات CAPTCHA بترددات أعلى.

ما هي اختبارات CAPTCHA التي تستخدمها مواقع التذاكر؟

صفحات reCAPTCHA v2 وCloudflare Turnstile وCloudflare Challenge الأكثر شيوعًا. قد تستخدم أنظمة الانتظار مثل غرف الانتظار الافتراضية تحديات مخصصة.

هل يمكنني مراقبة منصات التذاكر المتعددة؟

نعم. قم بتخصيص المحلل اللغوي لبنية HTML لكل نظام أساسي وأضف أحداثًا من مواقع مختلفة.

هل أحتاج إلى وكلاء سكنيين؟

نعم. تقوم مواقع التذاكر بحظر عناوين IP لمراكز البيانات بشكل صارم. تعمل الوكلاء السكنيون على تقليل تكرار اختبار CAPTCHA.

كيف أتعامل مع غرف الانتظار/queues؟

غرف الانتظار منفصلة عن اختبارات CAPTCHA. يجب أن تكتشف شاشتك صفحات قائمة الانتظار وتنتظر أو تعيد المحاولة. CaptchaAI يحل اختبار CAPTCHA الذي يظهر بعد قائمة الانتظار.


احصل على مفتاح CaptchaAI API الخاص بك

ابدأ بمراقبة توفر التذاكر علىcaptchaai.com. تعامل مع اختبارات CAPTCHA تلقائيًا في سير عمل مراقبة الأحداث.


أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.