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
- Cách giải reCAPTCHA v2 bằng API
- Cách giải Cloudflare Turnstile bằng API
- Tự động hóa việc mua vé với tính năng giải CAPTCHA
- Triển khai logic thử lại với CaptchaAI