
Ticket Availability
Check event/ticket availability programmatically.
Install
npx skills add https://github.com/nomadamas/k-skill --skill ticket-availabilityWhat is this skill?
- Ticket availability
- Availability check
- Integration
Adoption & trust: 704 installs on skills.sh; 5.4k GitHub stars; 3/3 security scanners passed (skills.sh audits).
Recommended Skills
Agent Browservercel-labs/agent-browser
Lark Imlarksuite/cli
Lark Calendarlarksuite/cli
Lark Sheetslarksuite/cli
Lark Vclarksuite/cli
Lark Contactlarksuite/cli
Journey fit
Common Questions / FAQ
Is Ticket Availability safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Ticket Availability
#!/usr/bin/env python3 """ticket-availability — YES24 / 인터파크 공연 일정 + 잔여석 조회 CLI. 조회 전용. 예매·결제·로그인 자동화 없음. 공연법 §4조의2 (매크로 입장권 부정구매·판매 금지) 비적용. Usage: ticket-availability schedule <url> ticket-availability seats <url> [--all-dates] ticket-availability health Supported URLs: YES24: https://ticket.yes24.com/Perf/<perf_id> https://ticket.yes24.com/New/Perf/Detail/View/<perf_id> yes24:<perf_id> 인터파크: https://tickets.interpark.com/goods/<goods_code> interpark:<goods_code> """ from __future__ import annotations import argparse import json import re import sys import time from datetime import datetime from typing import Any try: import httpx except ModuleNotFoundError: # pragma: no cover - depends on user environment httpx = None class MissingHttpxError(RuntimeError): """Raised when the optional httpx runtime dependency is unavailable.""" def _require_httpx(): if httpx is None: raise MissingHttpxError( "Python package 'httpx' is required. Install it with: python3 -m pip install httpx" ) return httpx HTTPX_HTTP_ERROR = ( getattr(httpx, "HTTPError", MissingHttpxError) if httpx else MissingHttpxError ) # ── URL Parsing ─────────────────────────────────────────────────────────────── def parse_url(url: str) -> tuple[str, str]: """Return (platform, id). Accepts full URL or `platform:id` shorthand.""" if url.startswith("yes24:"): return "yes24", url[6:] if url.startswith("interpark:"): return "interpark", url[10:] m = re.search( r"yes24\.com/(?:[Nn]ew/)?[Pp]erf/(?:[Dd]etail/)?(?:[Vv]iew/)?(\d+)", url ) if m: return "yes24", m.group(1) m = re.search(r"interpark\.com/goods/(\d+)", url, re.IGNORECASE) if m: return "interpark", m.group(1) if re.fullmatch(r"\d+", url): raise ValueError( f"플랫폼을 명시하세요: yes24:{url} 또는 interpark:{url}" ) raise ValueError(f"URL을 인식할 수 없습니다: {url}") def _fmt_date(d: str) -> str: if d and len(d) == 8 and d.isdigit(): return f"{d[:4]}-{d[4:6]}-{d[6:]}" return d def _fmt_time(t: str) -> str: if t and len(t) == 4 and t.isdigit(): return f"{t[:2]}:{t[2:]}" return t # ── HTTP Setup ──────────────────────────────────────────────────────────────── UA = ( "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 " "Chrome/124.0.0.0 Safari/537.36" ) HEADERS_YES24 = { "User-Agent": UA, "Referer": "https://ticket.yes24.com/", "Content-Type": "application/x-www-form-urlencoded", "Accept": "*/*", "X-Requested-With": "XMLHttpRequest", } HEADERS_INTERPARK = { "User-Agent": UA, "Referer": "https://tickets.interpark.com/", "Accept": "application/json", } YES24_BASE = "https://ticket.yes24.com" INTERPARK_BASE = "https://api-ticketfront.interpark.com" # ── YES24 Client ────────────────────────────────────────────────────────────── class Yes24Client: def __init__(self) -> None: http = _require_httpx() self.http = http.Client( headers=HEADERS_YES24, timeout=20, follow_redirects=True ) def _dates(self, perf_id: str, month_count: int) -> list[str]: now = datetime.now() months: list[str] = [] for delta in range(month_count): month = now.month + delta year = now.year + (month - 1) // 12 month = ((month - 1) % 12) + 1 months.append(f"{year:04d}-{month:02d}") dates: list[str] = [] cutoff = now.strftime("%Y%m%d") for month_str in months: r = self.http.post( f"{YES24_BASE}/New/Perf/Sale/Ajax/axPerfDay.aspx", data={ "pGetMode": "days", "pIdPerf": perf_id, "pPerfMonth": month_str, "pIdCode": "", "pIsMania": "0", }, )