Bilet platformları, otomatik kontrolleri ve satın alma işlemlerini önlemek için CAPTCHA'ları kullanır. Konserler, spor etkinlikleri, tiyatrolar gibi etkinlik biletlerinin kullanılabilirliğini izlerken kazıyıcınız reCAPTCHA zorlukları, Cloudflare korumaları ve hız sınırlamasıyla karşılaşacaktır. CaptchaAI, CAPTCHA çözme işlemini gerçekleştirerek monitörünüzün kullanılabilirliği güvenilir bir şekilde kontrol edebilmesini sağlar.
Bu kılavuz, entegre CAPTCHA çözümüyle bir bilet izleme iş akışı oluşturur.
İzleme iş akışı
Configure events → Check availability → CAPTCHA?
↓ Yes
Solve via CaptchaAI → Retry
↓ No
Parse availability → Changed?
↓ Yes
Send alert
İhtiyacınız olan şey
| Gereksinim | Ayrıntılar |
|---|---|
| CaptchaAI API anahtarı | captchaai.com |
| Python 3.8+ | requests ile |
| Vekil | Konut vekili önerilir |
pip install requests
CAPTCHA çözücü yardımcısı
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")
Bilet monitörü
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))
Beklenen çıktı:
[OK] Concert - Madison Square Garden - Aug 15: available
[OK] Basketball Finals - Game 7: sold out
Planlama
Kontrolleri düzenli aralıklarla çalıştırın:
# Check every 15 minutes
*/15 * * * * cd /path/to/project && python ticket_monitor.py >> /var/log/tickets.log 2>&1
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
| Her çekte sık CAPTCHA'lar | Aynı IP, oturum kalıcılığı yok | Çerezleri kullanın, konut vekillerini dönüşümlü kullanın |
| Birkaç kontrolden sonra engellendi | Hız sınırlaması | Kontrol aralıklarını artırın, proxy rotasyonunu kullanın |
| Yanlış kullanılabilirlik durumu | Sayfa yapısı değiştirildi | _parse_availability yöntemini güncelleyin |
| Yavaş CAPTCHA çözümü | Yüksek çözücü yükü | Geri alma ile yeniden deneme mantığını uygulayın |
SSS
Bilet müsaitliğini ne sıklıkla kontrol etmeliyim?
Genel izleme için her 10-30 dakikada bir. Yüksek talep içeren etkinlikler için her 2-5 dakikada bir - ancak daha yüksek frekanslarda daha fazla CAPTCHA bekleyebilirsiniz.
Bilet siteleri hangi CAPTCHA'ları kullanıyor?
En yaygın olarak reCAPTCHA v2, Cloudflare Turnstile ve Cloudflare doğrulama akışı sayfaları. Sanal bekleme odaları gibi kuyruk sistemleri özel zorluklar kullanabilir.
Birden fazla bilet platformunu izleyebilir miyim?
Evet. Ayrıştırıcıyı her platformun HTML yapısına göre özelleştirin ve farklı sitelerden etkinlikler ekleyin.
Konut vekillerine ihtiyacım var mı?
Evet. Bilet siteleri veri merkezi IP'lerini agresif bir şekilde engeller. Yerleşik proxy'ler CAPTCHA sıklığını azaltır.
Bekleme odalarını nasıl halledebilirim/queues?
Bekleme odaları CAPTCHA'lardan ayrıdır. Monitörünüz kuyruk sayfalarını algılamalı ve beklemeli veya yeniden denemelidir. CaptchaAI, kuyruktan sonra görünen CAPTCHA'yı çözer.
CaptchaAI API anahtarınızı alın
Bilet kullanılabilirliğini şu adresten izlemeye başlayın:captchaai.com. Etkinlik izleme iş akışınızda CAPTCHA'ları otomatik olarak işleyin.