Trường Hợp Sử Dụng

Giám sát vé sự kiện bằng cách xử lý CAPTCHA

Nền tảng bán vé sử dụng CAPTCHA để ngăn việc kiểm tra và mua hàng tự động. Khi theo dõi tình trạng sẵn có của vé sự kiện - buổi hòa nhạc, thể thao, rạp hát - công cụ quét của bạn sẽ gặp phải các thách thức reCAPTCHA, các biện pháp bảo vệ của Cloudflare và giới hạn tỷ lệ. CaptchaAI xử lý việc giải CAPTCHA để màn hình của bạn có thể kiểm tra tính khả dụng một cách đáng tin cậy.

Hướng dẫn này xây dựng quy trình giám sát yêu cầu bằng tính năng giải CAPTCHA tích hợp.


Quy trình làm việc giám sát

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

Những gì bạn cần

Yêu cầu Chi tiết
Khóa API CaptchaAI captchaai.com
Python 3.8+ Với requests
Ủy quyền đa dạng nguồn yêu cầu được đề xuất
pip install requests

Trình trợ giúp giải 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")

Giám sát vé

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

Sản lượng dự kiến:

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

Lên lịch

Chạy kiểm tra định kỳ:

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

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
CAPTCHA thường xuyên trên mỗi lần kiểm tra Cùng một IP, không tồn tại phiên Sử dụng cookie, xoay đa dạng nguồn yêu cầu
Bị chặn sau một vài lần kiểm tra Giới hạn tỷ lệ Tăng khoảng thời gian kiểm tra, sử dụng luân chuyển proxy
Tình trạng sẵn có sai Cấu trúc trang đã thay đổi Cập nhật phương thức _parse_availability
Giải CAPTCHA chậm Tải giải cao Triển khai logic thử lại với thời gian chờ

Câu hỏi thường gặp

Tôi nên kiểm tra tình trạng vé còn trống bao lâu một lần?

Cứ 10–30 phút một lần để theo dõi chung. Đối với các sự kiện có nhu cầu cao, cứ 2–5 phút một lần — nhưng sẽ có nhiều CAPTCHA hơn ở tần suất cao hơn.

Các trang web bán vé sử dụng CAPTCHA nào?

Phổ biến nhất là các trang reCAPTCHA v2, Cloudflare Turnstile và Cloudflare Challenge. Các hệ thống xếp hàng như phòng chờ ảo có thể sử dụng các thử thách tùy chỉnh.

Tôi có thể giám sát nhiều nền tảng bán vé không?

Vâng. Tùy chỉnh trình phân tích cú pháp cho cấu trúc HTML của từng nền tảng và thêm sự kiện từ các trang web khác nhau.

Tôi có cần đa dạng nguồn yêu cầu không?

Vâng. Các trang web bán vé tích cực chặn IP của trung tâm dữ liệu. đa dạng nguồn yêu cầu làm giảm tần suất CAPTCHA.

Làm cách nào để xử lý phòng chờ/queues?

Phòng chờ tách biệt với CAPTCHA. Màn hình của bạn sẽ phát hiện các trang xếp hàng và chờ hoặc thử lại. CaptchaAI giải CAPTCHA xuất hiện sau hàng đợi.


Nhận khóa API CaptchaAI của bạn

Bắt đầu theo dõi tình trạng sẵn có của vé tạicaptchaai.com. Tự động xử lý CAPTCHA trong quy trình giám sát sự kiện của bạn.


Hướng dẫn liên quan

Os comentários estão desativados para este artigo.