@nomadamas/k-skill 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/k-skill.js +60 -0
- package/package.json +37 -0
- package/skills/assembly-bill-vote-search/instruction.md +111 -0
- package/skills/assembly-bill-vote-search/skill.json +10 -0
- package/skills/biz-health-check/instruction.md +69 -0
- package/skills/biz-health-check/scripts/biz_health_check.py +163 -0
- package/skills/biz-health-check/skill.json +10 -0
- package/skills/bok-ecos-stats/instruction.md +95 -0
- package/skills/bok-ecos-stats/scripts/bok_ecos.py +302 -0
- package/skills/bok-ecos-stats/skill.json +10 -0
- package/skills/building-register-search/instruction.md +69 -0
- package/skills/building-register-search/scripts/building_register.py +309 -0
- package/skills/building-register-search/scripts/building_register_xml.py +32 -0
- package/skills/building-register-search/skill.json +9 -0
- package/skills/bunjang-search/instruction.md +154 -0
- package/skills/bunjang-search/skill.json +10 -0
- package/skills/catchtable-sniper/instruction.md +270 -0
- package/skills/catchtable-sniper/skill.json +9 -0
- package/skills/cheap-gas-nearby/instruction.md +107 -0
- package/skills/cheap-gas-nearby/skill.json +10 -0
- package/skills/corporate-registration-consulting/instruction.md +117 -0
- package/skills/corporate-registration-consulting/scripts/fill_official_hwp.py +106 -0
- package/skills/corporate-registration-consulting/skill.json +8 -0
- package/skills/coupang-product-search/instruction.md +219 -0
- package/skills/coupang-product-search/scripts/coupang_partners_mcp.py +146 -0
- package/skills/coupang-product-search/skill.json +10 -0
- package/skills/court-auction-notice-search/instruction.md +201 -0
- package/skills/court-auction-notice-search/skill.json +9 -0
- package/skills/court-payment-order-assistant/instruction.md +120 -0
- package/skills/court-payment-order-assistant/skill.json +10 -0
- package/skills/d2b-notice-search/instruction.md +117 -0
- package/skills/d2b-notice-search/skill.json +10 -0
- package/skills/daangn-cars-search/instruction.md +91 -0
- package/skills/daangn-cars-search/scripts/daangn_cars.py +72 -0
- package/skills/daangn-cars-search/skill.json +9 -0
- package/skills/daangn-jobs-search/instruction.md +90 -0
- package/skills/daangn-jobs-search/scripts/daangn_jobs.py +98 -0
- package/skills/daangn-jobs-search/skill.json +9 -0
- package/skills/daangn-realty-search/instruction.md +114 -0
- package/skills/daangn-realty-search/scripts/daangn_detail_ld.py +76 -0
- package/skills/daangn-realty-search/scripts/daangn_realty.py +216 -0
- package/skills/daangn-realty-search/scripts/daangn_relay_store.py +174 -0
- package/skills/daangn-realty-search/skill.json +8 -0
- package/skills/daangn-used-goods-search/instruction.md +90 -0
- package/skills/daangn-used-goods-search/scripts/daangn_used_goods.py +80 -0
- package/skills/daangn-used-goods-search/skill.json +9 -0
- package/skills/daishin-report-search/instruction.md +138 -0
- package/skills/daishin-report-search/skill.json +10 -0
- package/skills/daiso-product-search/instruction.md +172 -0
- package/skills/daiso-product-search/skill.json +8 -0
- package/skills/danawa-price-search/instruction.md +183 -0
- package/skills/danawa-price-search/scripts/danawa_search.py +354 -0
- package/skills/danawa-price-search/skill.json +8 -0
- package/skills/delivery-tracking/instruction.md +358 -0
- package/skills/delivery-tracking/skill.json +8 -0
- package/skills/donation-place-search/instruction.md +129 -0
- package/skills/donation-place-search/skill.json +9 -0
- package/skills/emergency-room-beds/instruction.md +82 -0
- package/skills/emergency-room-beds/skill.json +8 -0
- package/skills/ev-charger-nearby/instruction.md +80 -0
- package/skills/ev-charger-nearby/scripts/ev_charger.py +222 -0
- package/skills/ev-charger-nearby/skill.json +10 -0
- package/skills/ev-subsidy-status/instruction.md +165 -0
- package/skills/ev-subsidy-status/skill.json +10 -0
- package/skills/express-bus-booking/instruction.md +207 -0
- package/skills/express-bus-booking/references/kobus-http-flow.md +159 -0
- package/skills/express-bus-booking/scripts/kobus_express_booking.py +243 -0
- package/skills/express-bus-booking/skill.json +8 -0
- package/skills/fine-dust-location/instruction.md +89 -0
- package/skills/fine-dust-location/skill.json +9 -0
- package/skills/flight-ticket-search/instruction.md +237 -0
- package/skills/flight-ticket-search/scripts/flight_ticket_search.py +501 -0
- package/skills/flight-ticket-search/skill.json +9 -0
- package/skills/foresttrip-vacancy/instruction.md +167 -0
- package/skills/foresttrip-vacancy/scripts/run_foresttrip_vacancy.py +549 -0
- package/skills/foresttrip-vacancy/skill.json +10 -0
- package/skills/fsc-corporate-info/instruction.md +57 -0
- package/skills/fsc-corporate-info/scripts/fsc_corporate_info.py +113 -0
- package/skills/fsc-corporate-info/skill.json +10 -0
- package/skills/g2b-order-plan-search/instruction.md +131 -0
- package/skills/g2b-order-plan-search/scripts/g2b_order_plan.py +158 -0
- package/skills/g2b-order-plan-search/skill.json +10 -0
- package/skills/g2b-sanctioned-supplier/instruction.md +61 -0
- package/skills/g2b-sanctioned-supplier/scripts/g2b_sanctioned_supplier.py +114 -0
- package/skills/g2b-sanctioned-supplier/skill.json +10 -0
- package/skills/gangnamunni-clinic-search/instruction.md +113 -0
- package/skills/gangnamunni-clinic-search/skill.json +9 -0
- package/skills/geeknews-search/instruction.md +69 -0
- package/skills/geeknews-search/scripts/geeknews_search.py +296 -0
- package/skills/geeknews-search/skill.json +8 -0
- package/skills/gongsijiga-search/instruction.md +128 -0
- package/skills/gongsijiga-search/skill.json +9 -0
- package/skills/gov-overseas-trip-report/instruction.md +488 -0
- package/skills/gov-overseas-trip-report/scripts/gov_overseas_trip_report.py +1206 -0
- package/skills/gov-overseas-trip-report/skill.json +9 -0
- package/skills/han-river-water-level/instruction.md +83 -0
- package/skills/han-river-water-level/skill.json +10 -0
- package/skills/highway-traffic-status/instruction.md +88 -0
- package/skills/highway-traffic-status/scripts/highway_traffic.py +315 -0
- package/skills/highway-traffic-status/skill.json +11 -0
- package/skills/hipass-receipt/instruction.md +97 -0
- package/skills/hipass-receipt/skill.json +10 -0
- package/skills/hola-poke-yeoksam/instruction.md +247 -0
- package/skills/hola-poke-yeoksam/skill.json +8 -0
- package/skills/household-waste-info/instruction.md +117 -0
- package/skills/household-waste-info/skill.json +10 -0
- package/skills/housing-official-price/instruction.md +177 -0
- package/skills/housing-official-price/skill.json +10 -0
- package/skills/hwp/instruction.md +206 -0
- package/skills/hwp/skill.json +8 -0
- package/skills/intercity-bus-booking/instruction.md +189 -0
- package/skills/intercity-bus-booking/references/tmoney-intercity-http-flow.md +126 -0
- package/skills/intercity-bus-booking/scripts/intercity_bus_search.py +381 -0
- package/skills/intercity-bus-booking/skill.json +8 -0
- package/skills/iros-registry-automation/instruction.md +229 -0
- package/skills/iros-registry-automation/scripts/iros_pdf_summary.py +249 -0
- package/skills/iros-registry-automation/scripts/upstream.pin +1 -0
- package/skills/iros-registry-automation/skill.json +9 -0
- package/skills/job-posting-match/instruction.md +130 -0
- package/skills/job-posting-match/scripts/job_posting_match.py +396 -0
- package/skills/job-posting-match/scripts/test_job_posting_match.py +54 -0
- package/skills/job-posting-match/skill.json +8 -0
- package/skills/jobkorea-talent-search/instruction.md +118 -0
- package/skills/jobkorea-talent-search/scripts/jobkorea_talent_models.py +27 -0
- package/skills/jobkorea-talent-search/scripts/jobkorea_talent_parse.py +186 -0
- package/skills/jobkorea-talent-search/scripts/jobkorea_talent_search.py +94 -0
- package/skills/jobkorea-talent-search/scripts/jobkorea_talent_search_condition.py +136 -0
- package/skills/jobkorea-talent-search/scripts/test_jobkorea_talent_search.py +76 -0
- package/skills/jobkorea-talent-search/skill.json +9 -0
- package/skills/joseon-sillok-search/instruction.md +76 -0
- package/skills/joseon-sillok-search/scripts/sillok_search.py +552 -0
- package/skills/joseon-sillok-search/skill.json +8 -0
- package/skills/k-dart/instruction.md +406 -0
- package/skills/k-dart/skill.json +8 -0
- package/skills/k-schoollunch-menu/instruction.md +109 -0
- package/skills/k-schoollunch-menu/skill.json +9 -0
- package/skills/k-skill-cleaner/instruction.md +80 -0
- package/skills/k-skill-cleaner/scripts/k_skill_cleaner.py +410 -0
- package/skills/k-skill-cleaner/skill.json +8 -0
- package/skills/k-skill-setup/instruction.md +253 -0
- package/skills/k-skill-setup/skill.json +11 -0
- package/skills/kakao-bar-nearby/instruction.md +76 -0
- package/skills/kakao-bar-nearby/skill.json +8 -0
- package/skills/kakao-map/instruction.md +176 -0
- package/skills/kakao-map/skill.json +10 -0
- package/skills/kakaotalk-mac/instruction.md +189 -0
- package/skills/kakaotalk-mac/skill.json +8 -0
- package/skills/kbl-results/instruction.md +89 -0
- package/skills/kbl-results/skill.json +9 -0
- package/skills/kbo-results/instruction.md +82 -0
- package/skills/kbo-results/skill.json +8 -0
- package/skills/keris-academic-search/instruction.md +81 -0
- package/skills/keris-academic-search/scripts/keris_academic.py +210 -0
- package/skills/keris-academic-search/skill.json +10 -0
- package/skills/kleague-results/instruction.md +92 -0
- package/skills/kleague-results/skill.json +8 -0
- package/skills/kopis-performance-search/instruction.md +109 -0
- package/skills/kopis-performance-search/skill.json +10 -0
- package/skills/korea-weather/instruction.md +93 -0
- package/skills/korea-weather/skill.json +10 -0
- package/skills/korean-character-count/instruction.md +87 -0
- package/skills/korean-character-count/scripts/korean_character_count.js +268 -0
- package/skills/korean-character-count/skill.json +8 -0
- package/skills/korean-cinema-search/instruction.md +177 -0
- package/skills/korean-cinema-search/skill.json +8 -0
- package/skills/korean-heritage-search/instruction.md +106 -0
- package/skills/korean-heritage-search/scripts/korean_heritage_search.py +321 -0
- package/skills/korean-heritage-search/skill.json +8 -0
- package/skills/korean-holiday-calendar/instruction.md +97 -0
- package/skills/korean-holiday-calendar/skill.json +9 -0
- package/skills/korean-humanizer/instruction.md +389 -0
- package/skills/korean-humanizer/references/ai-tell-taxonomy.md +147 -0
- package/skills/korean-humanizer/skill.json +8 -0
- package/skills/korean-jangbu-for/instruction.md +133 -0
- package/skills/korean-jangbu-for/scripts/install.sh +237 -0
- package/skills/korean-jangbu-for/scripts/upstream.pin +1 -0
- package/skills/korean-jangbu-for/skill.json +8 -0
- package/skills/korean-law-search/instruction.md +126 -0
- package/skills/korean-law-search/skill.json +10 -0
- package/skills/korean-marathon-schedule/instruction.md +111 -0
- package/skills/korean-marathon-schedule/skill.json +9 -0
- package/skills/korean-middle-korean/instruction.md +79 -0
- package/skills/korean-middle-korean/scripts/korean_middle_korean.js +214 -0
- package/skills/korean-middle-korean/skill.json +8 -0
- package/skills/korean-patent-search/instruction.md +79 -0
- package/skills/korean-patent-search/scripts/patent_search.py +409 -0
- package/skills/korean-patent-search/skill.json +9 -0
- package/skills/korean-privacy-terms/instruction.md +128 -0
- package/skills/korean-privacy-terms/scripts/install.sh +108 -0
- package/skills/korean-privacy-terms/scripts/upstream.pin +1 -0
- package/skills/korean-privacy-terms/skill.json +8 -0
- package/skills/korean-scholarship-search/instruction.md +317 -0
- package/skills/korean-scholarship-search/references/report-format.md +40 -0
- package/skills/korean-scholarship-search/references/school-discovery.md +61 -0
- package/skills/korean-scholarship-search/references/search-clues.md +58 -0
- package/skills/korean-scholarship-search/references/source-patterns.md +67 -0
- package/skills/korean-scholarship-search/scripts/scholarship_filter.py +811 -0
- package/skills/korean-scholarship-search/scripts/test_scholarship_filter.py +224 -0
- package/skills/korean-scholarship-search/scripts/university_search_plan.py +148 -0
- package/skills/korean-scholarship-search/skill.json +8 -0
- package/skills/korean-slang-writing/instruction.md +181 -0
- package/skills/korean-slang-writing/scripts/_slang_http.py +91 -0
- package/skills/korean-slang-writing/scripts/slang_lookup.py +291 -0
- package/skills/korean-slang-writing/scripts/slang_search.py +284 -0
- package/skills/korean-slang-writing/skill.json +8 -0
- package/skills/korean-spell-check/instruction.md +105 -0
- package/skills/korean-spell-check/scripts/korean_spell_check.py +523 -0
- package/skills/korean-spell-check/skill.json +9 -0
- package/skills/korean-stock-search/instruction.md +194 -0
- package/skills/korean-stock-search/skill.json +10 -0
- package/skills/korean-transit-route/instruction.md +113 -0
- package/skills/korean-transit-route/skill.json +10 -0
- package/skills/kosis-stats/instruction.md +232 -0
- package/skills/kosis-stats/references/kosis-openapi-guide.md +171 -0
- package/skills/kosis-stats/scripts/run_kosis_stats.py +896 -0
- package/skills/kosis-stats/skill.json +9 -0
- package/skills/kr-whois-lookup/instruction.md +107 -0
- package/skills/kr-whois-lookup/skill.json +10 -0
- package/skills/kstartup-search/instruction.md +186 -0
- package/skills/kstartup-search/scripts/run_kstartup.py +424 -0
- package/skills/kstartup-search/skill.json +11 -0
- package/skills/ktx-booking/instruction.md +244 -0
- package/skills/ktx-booking/skill.json +10 -0
- package/skills/lck-analytics/instruction.md +192 -0
- package/skills/lck-analytics/scripts/_lib.js +103 -0
- package/skills/lck-analytics/scripts/analyze-live-game.js +52 -0
- package/skills/lck-analytics/scripts/build-match-report.js +44 -0
- package/skills/lck-analytics/scripts/sync-oracle.js +50 -0
- package/skills/lck-analytics/skill.json +9 -0
- package/skills/lh-notice-search/instruction.md +206 -0
- package/skills/lh-notice-search/skill.json +10 -0
- package/skills/library-book-search/instruction.md +139 -0
- package/skills/library-book-search/skill.json +9 -0
- package/skills/local-election-candidate-search/instruction.md +77 -0
- package/skills/local-election-candidate-search/skill.json +8 -0
- package/skills/localdata-business-status/instruction.md +64 -0
- package/skills/localdata-business-status/scripts/localdata_business_status.py +206 -0
- package/skills/localdata-business-status/skill.json +8 -0
- package/skills/lotto-results/instruction.md +80 -0
- package/skills/lotto-results/skill.json +8 -0
- package/skills/lovebug-report/instruction.md +185 -0
- package/skills/lovebug-report/skill.json +9 -0
- package/skills/market-kurly-search/instruction.md +125 -0
- package/skills/market-kurly-search/skill.json +8 -0
- package/skills/mfds-drug-safety/instruction.md +86 -0
- package/skills/mfds-drug-safety/scripts/mfds_drug_safety.py +184 -0
- package/skills/mfds-drug-safety/skill.json +10 -0
- package/skills/mfds-food-safety/instruction.md +126 -0
- package/skills/mfds-food-safety/scripts/mfds_food_safety.py +281 -0
- package/skills/mfds-food-safety/skill.json +10 -0
- package/skills/myrealtrip-search/instruction.md +239 -0
- package/skills/myrealtrip-search/scripts/myrealtrip_mcp.py +194 -0
- package/skills/myrealtrip-search/scripts/test_myrealtrip_mcp.py +99 -0
- package/skills/myrealtrip-search/skill.json +9 -0
- package/skills/naming-house/instruction.md +146 -0
- package/skills/naming-house/skill.json +8 -0
- package/skills/national-pension-workplace/instruction.md +64 -0
- package/skills/national-pension-workplace/scripts/national_pension_workplace.py +113 -0
- package/skills/national-pension-workplace/skill.json +10 -0
- package/skills/naver-ad-performance/instruction.md +108 -0
- package/skills/naver-ad-performance/scripts/naver_ad_performance.py +240 -0
- package/skills/naver-ad-performance/skill.json +9 -0
- package/skills/naver-blog-research/instruction.md +128 -0
- package/skills/naver-blog-research/scripts/_naver_http.py +58 -0
- package/skills/naver-blog-research/scripts/naver_download_images.py +233 -0
- package/skills/naver-blog-research/scripts/naver_read.py +256 -0
- package/skills/naver-blog-research/scripts/naver_search.py +192 -0
- package/skills/naver-blog-research/skill.json +8 -0
- package/skills/naver-news-search/instruction.md +103 -0
- package/skills/naver-news-search/skill.json +10 -0
- package/skills/naver-shopping-search/instruction.md +94 -0
- package/skills/naver-shopping-search/skill.json +11 -0
- package/skills/nhis-care-checkup-search/instruction.md +116 -0
- package/skills/nhis-care-checkup-search/skill.json +10 -0
- package/skills/nts-business-registration/instruction.md +115 -0
- package/skills/nts-business-registration/scripts/nts_business_registration.py +215 -0
- package/skills/nts-business-registration/skill.json +10 -0
- package/skills/nts-tax-delinquency/instruction.md +54 -0
- package/skills/nts-tax-delinquency/scripts/nts_tax_delinquency.py +150 -0
- package/skills/nts-tax-delinquency/skill.json +8 -0
- package/skills/ohou-today-deal/instruction.md +182 -0
- package/skills/ohou-today-deal/scripts/ohou_today_deal.py +369 -0
- package/skills/ohou-today-deal/skill.json +9 -0
- package/skills/olive-young-search/instruction.md +154 -0
- package/skills/olive-young-search/skill.json +8 -0
- package/skills/parking-lot-search/instruction.md +96 -0
- package/skills/parking-lot-search/skill.json +9 -0
- package/skills/popbill/instruction.md +146 -0
- package/skills/popbill/scripts/popbill_cli.py +284 -0
- package/skills/popbill/scripts/popbill_registry.py +54 -0
- package/skills/popbill/scripts/popbill_safety.py +37 -0
- package/skills/popbill/scripts/popbill_templates.py +71 -0
- package/skills/popbill/skill.json +9 -0
- package/skills/public-restroom-nearby/instruction.md +89 -0
- package/skills/public-restroom-nearby/skill.json +9 -0
- package/skills/real-estate-search/instruction.md +172 -0
- package/skills/real-estate-search/skill.json +10 -0
- package/skills/rhwp-advanced/instruction.md +145 -0
- package/skills/rhwp-advanced/skill.json +8 -0
- package/skills/rhwp-edit/instruction.md +153 -0
- package/skills/rhwp-edit/skill.json +8 -0
- package/skills/s2b-notice-search/instruction.md +66 -0
- package/skills/s2b-notice-search/skill.json +9 -0
- package/skills/saju-fortune/instruction.md +177 -0
- package/skills/saju-fortune/skill.json +8 -0
- package/skills/saramin-talent-search/instruction.md +119 -0
- package/skills/saramin-talent-search/skill.json +9 -0
- package/skills/seoul-bike/instruction.md +83 -0
- package/skills/seoul-bike/scripts/seoul_bike.py +247 -0
- package/skills/seoul-bike/skill.json +10 -0
- package/skills/seoul-density/instruction.md +109 -0
- package/skills/seoul-density/scripts/seoul_density.py +271 -0
- package/skills/seoul-density/skill.json +10 -0
- package/skills/seoul-subway-arrival/instruction.md +85 -0
- package/skills/seoul-subway-arrival/skill.json +9 -0
- package/skills/sh-notice-search/instruction.md +150 -0
- package/skills/sh-notice-search/skill.json +9 -0
- package/skills/srt-booking/instruction.md +181 -0
- package/skills/srt-booking/scripts/srt_booking.py +272 -0
- package/skills/srt-booking/scripts/srt_seats.py +156 -0
- package/skills/srt-booking/skill.json +20 -0
- package/skills/subway-lost-property/instruction.md +93 -0
- package/skills/subway-lost-property/scripts/subway_lost_property.py +244 -0
- package/skills/subway-lost-property/skill.json +8 -0
- package/skills/ticket-availability/instruction.md +175 -0
- package/skills/ticket-availability/scripts/ticket_availability.py +430 -0
- package/skills/ticket-availability/skill.json +9 -0
- package/skills/toss-securities/instruction.md +116 -0
- package/skills/toss-securities/skill.json +9 -0
- package/skills/used-car-price-search/instruction.md +109 -0
- package/skills/used-car-price-search/skill.json +8 -0
- package/skills/yebigun-training/instruction.md +177 -0
- package/skills/yebigun-training/skill.json +9 -0
- package/skills/zipcode-search/instruction.md +159 -0
- package/skills/zipcode-search/scripts/zipcode_search.py +150 -0
- package/skills/zipcode-search/skill.json +8 -0
- package/src/assemble.js +134 -0
- package/src/detect.js +18 -0
- package/templates/action-account.md +4 -0
- package/templates/action-booking.md +5 -0
- package/templates/action-commerce.md +5 -0
- package/templates/action-communication.md +5 -0
- package/templates/action-submission.md +5 -0
- package/templates/browser.md +4 -0
- package/templates/core.md +5 -0
- package/templates/hard-boundary.md +3 -0
- package/templates/local.md +2 -0
- package/templates/lookup.md +2 -0
- package/templates/proxy.md +2 -0
- package/templates/vault.md +4 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import json
|
|
7
|
+
import shlex
|
|
8
|
+
import subprocess
|
|
9
|
+
from dataclasses import asdict, dataclass
|
|
10
|
+
from datetime import date, timedelta
|
|
11
|
+
from typing import Callable
|
|
12
|
+
|
|
13
|
+
LOST112_LIST_URL = "https://www.lost112.go.kr/find/findList.do"
|
|
14
|
+
LOST112_REFERER_URL = "https://www.lost112.go.kr/"
|
|
15
|
+
LOST112_OUTPUT_FILE = "lost112-search-result.html"
|
|
16
|
+
LOST112_CURL_MAX_TIME = 60
|
|
17
|
+
SEOUL_METRO_LOST_CENTER_URL = "https://www.seoulmetro.co.kr/kr/page.do?menuIdx=541"
|
|
18
|
+
CURL_USER_AGENT = "Mozilla/5.0"
|
|
19
|
+
|
|
20
|
+
Runner = Callable[..., subprocess.CompletedProcess[str]]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass(frozen=True)
|
|
24
|
+
class SearchQuery:
|
|
25
|
+
station: str
|
|
26
|
+
item: str | None = None
|
|
27
|
+
line: str | None = None
|
|
28
|
+
start_date: date | None = None
|
|
29
|
+
end_date: date | None = None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass(frozen=True)
|
|
33
|
+
class SearchPlan:
|
|
34
|
+
query: SearchQuery
|
|
35
|
+
payload: dict[str, str]
|
|
36
|
+
suggested_keywords: list[str]
|
|
37
|
+
official_sources: list[dict[str, str]]
|
|
38
|
+
guidance: list[str]
|
|
39
|
+
cautions: list[str]
|
|
40
|
+
curl_example: str
|
|
41
|
+
|
|
42
|
+
def to_dict(self) -> dict[str, object]:
|
|
43
|
+
return {
|
|
44
|
+
"query": {
|
|
45
|
+
**asdict(self.query),
|
|
46
|
+
"start_date": self.query.start_date.isoformat() if self.query.start_date else None,
|
|
47
|
+
"end_date": self.query.end_date.isoformat() if self.query.end_date else None,
|
|
48
|
+
},
|
|
49
|
+
"payload": self.payload,
|
|
50
|
+
"suggested_keywords": self.suggested_keywords,
|
|
51
|
+
"official_sources": self.official_sources,
|
|
52
|
+
"guidance": self.guidance,
|
|
53
|
+
"cautions": self.cautions,
|
|
54
|
+
"curl_example": self.curl_example,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def normalize_station(station: str) -> str:
|
|
59
|
+
normalized = " ".join(station.split())
|
|
60
|
+
if not normalized:
|
|
61
|
+
raise ValueError("station is required")
|
|
62
|
+
return normalized
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def expand_station_keywords(station: str) -> list[str]:
|
|
66
|
+
normalized = normalize_station(station)
|
|
67
|
+
keywords = [normalized]
|
|
68
|
+
if normalized.endswith("μ") and len(normalized) > 1:
|
|
69
|
+
keywords.append(normalized[:-1])
|
|
70
|
+
return list(dict.fromkeys(keyword for keyword in keywords if keyword))
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def build_search_payload(query: SearchQuery) -> dict[str, str]:
|
|
74
|
+
station = normalize_station(query.station)
|
|
75
|
+
if not query.start_date or not query.end_date:
|
|
76
|
+
raise ValueError("start_date and end_date are required")
|
|
77
|
+
|
|
78
|
+
payload = {
|
|
79
|
+
"pageIndex": "1",
|
|
80
|
+
"START_YMD": query.start_date.strftime("%Y%m%d"),
|
|
81
|
+
"END_YMD": query.end_date.strftime("%Y%m%d"),
|
|
82
|
+
"PRDT_NM": (query.item or "").strip(),
|
|
83
|
+
"DEP_PLACE": station,
|
|
84
|
+
"SITE": "V",
|
|
85
|
+
"PLACE_SE_CD": "",
|
|
86
|
+
"FD_LCT_CD": "",
|
|
87
|
+
"FD_SIGUNGU": "",
|
|
88
|
+
"IN_NM": "",
|
|
89
|
+
"ATC_ID": "",
|
|
90
|
+
"F_ATC_ID": "",
|
|
91
|
+
"PRDT_CL_CD01": "",
|
|
92
|
+
"PRDT_CL_CD02": "",
|
|
93
|
+
"PRDT_CL_NM": "",
|
|
94
|
+
"MENU_NO": "",
|
|
95
|
+
}
|
|
96
|
+
return payload
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _base_curl_command(url: str | None, max_time: int, *, follow_redirects: bool = True) -> list[str]:
|
|
100
|
+
command = [
|
|
101
|
+
"curl",
|
|
102
|
+
"-fsS",
|
|
103
|
+
"--http1.1",
|
|
104
|
+
"--tls-max",
|
|
105
|
+
"1.2",
|
|
106
|
+
"--retry",
|
|
107
|
+
"1",
|
|
108
|
+
"--max-time",
|
|
109
|
+
str(max_time),
|
|
110
|
+
"-A",
|
|
111
|
+
CURL_USER_AGENT,
|
|
112
|
+
]
|
|
113
|
+
if follow_redirects:
|
|
114
|
+
command.insert(2, "-L")
|
|
115
|
+
if url:
|
|
116
|
+
command.append(url)
|
|
117
|
+
return command
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def build_curl_command(payload: dict[str, str]) -> str:
|
|
121
|
+
command = _base_curl_command("", LOST112_CURL_MAX_TIME, follow_redirects=False)
|
|
122
|
+
command.extend(["--referer", LOST112_REFERER_URL])
|
|
123
|
+
for key, value in payload.items():
|
|
124
|
+
if value:
|
|
125
|
+
command.extend(["--data-urlencode", f"{key}={value}"])
|
|
126
|
+
command.extend(["--output", LOST112_OUTPUT_FILE])
|
|
127
|
+
command.append(LOST112_LIST_URL)
|
|
128
|
+
return " ".join(shlex.quote(part) for part in command)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def probe_source(name: str, url: str, runner: Runner = subprocess.run) -> dict[str, str]:
|
|
132
|
+
command = _base_curl_command(url, 15)
|
|
133
|
+
try:
|
|
134
|
+
completed = runner(command, capture_output=True, text=True, check=True)
|
|
135
|
+
return {
|
|
136
|
+
"name": name,
|
|
137
|
+
"url": url,
|
|
138
|
+
"status": "reachable",
|
|
139
|
+
"detail": f"fetched {len(completed.stdout)} bytes",
|
|
140
|
+
}
|
|
141
|
+
except subprocess.CalledProcessError as error:
|
|
142
|
+
detail = (error.stderr or error.stdout or str(error)).strip() or "unknown error"
|
|
143
|
+
status = "timeout" if error.returncode == 28 or "timed out" in detail.lower() else "error"
|
|
144
|
+
return {"name": name, "url": url, "status": status, "detail": detail}
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def build_search_plan(
|
|
148
|
+
station: str,
|
|
149
|
+
item: str | None = None,
|
|
150
|
+
line: str | None = None,
|
|
151
|
+
days: int = 30,
|
|
152
|
+
today: date | None = None,
|
|
153
|
+
verify_live: bool = False,
|
|
154
|
+
probe: Callable[[str, str], dict[str, str]] | None = None,
|
|
155
|
+
) -> SearchPlan:
|
|
156
|
+
normalized_station = normalize_station(station)
|
|
157
|
+
if days <= 0:
|
|
158
|
+
raise ValueError("days must be positive")
|
|
159
|
+
|
|
160
|
+
today = today or date.today()
|
|
161
|
+
end_date = today
|
|
162
|
+
start_date = today - timedelta(days=days)
|
|
163
|
+
query = SearchQuery(
|
|
164
|
+
station=normalized_station,
|
|
165
|
+
item=(item or "").strip() or None,
|
|
166
|
+
line=(line or "").strip() or None,
|
|
167
|
+
start_date=start_date,
|
|
168
|
+
end_date=end_date,
|
|
169
|
+
)
|
|
170
|
+
payload = build_search_payload(query)
|
|
171
|
+
suggested_keywords = expand_station_keywords(normalized_station)
|
|
172
|
+
if query.line:
|
|
173
|
+
suggested_keywords.append(query.line)
|
|
174
|
+
suggested_keywords = list(dict.fromkeys(suggested_keywords))
|
|
175
|
+
|
|
176
|
+
default_sources = [
|
|
177
|
+
{
|
|
178
|
+
"name": "LOST112 μ΅λλ¬Ό λͺ©λ‘",
|
|
179
|
+
"url": LOST112_LIST_URL,
|
|
180
|
+
"purpose": "κ²½μ°° μ΄μΈ κΈ°κ΄(μ§νμ² Β·κ³΅ν λ±) μ΅λλ¬Ό κ²μ",
|
|
181
|
+
"status": "not_checked",
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"name": "μμΈκ΅ν΅κ³΅μ¬ μ μ€λ¬ΌμΌν°",
|
|
185
|
+
"url": SEOUL_METRO_LOST_CENTER_URL,
|
|
186
|
+
"purpose": "μμΈ μ§νμ² κ³΅μ μ μ€λ¬Ό μ§μ
μ /μΆκ° μλ΄",
|
|
187
|
+
"status": "not_checked",
|
|
188
|
+
},
|
|
189
|
+
]
|
|
190
|
+
if verify_live:
|
|
191
|
+
probe = probe or probe_source
|
|
192
|
+
default_sources = [
|
|
193
|
+
{**probe(source["name"], source["url"]), "purpose": source["purpose"]}
|
|
194
|
+
for source in default_sources
|
|
195
|
+
]
|
|
196
|
+
|
|
197
|
+
item_hint = query.item or "λΆμ€λ¬Ό"
|
|
198
|
+
guidance = [
|
|
199
|
+
f"λ¨Όμ LOST112μμ 보κ΄μ₯μλ₯Ό '{normalized_station}' λ‘, λ¬Όνλͺ
μ '{item_hint}' λ‘ κ²μν©λλ€.",
|
|
200
|
+
"κ²μ νΌμμλ SITE=V(κ²½μ°°μ΄μΈμκΈ°κ΄) κΈ°μ€μΌλ‘ μ§νμ² /곡ν λ± κΈ°κ΄ μ΅λλ¬Όμ μ°μ μ’νλλ€.",
|
|
201
|
+
"κ²°κ³Όκ° μμΌλ©΄ μλͺ
μμ 'μ'μ λΊ ν€μλλ νΈμ λͺ
μ μΆκ°λ‘ κ²μν©λλ€.",
|
|
202
|
+
"μμΈκ΅ν΅κ³΅μ¬ μλ΄ νμ΄μ§λ₯Ό ν¨κ» μ΄μ΄ μ΄μμ¬ μ μ€λ¬ΌμΌν°/νμ μ μ°¨λ₯Ό νμΈν©λλ€.",
|
|
203
|
+
]
|
|
204
|
+
cautions = [
|
|
205
|
+
"v1μ 곡μ μΉ μ‘°ν κ²½λ‘λ₯Ό ꡬ쑰ννλ μλ΄ν/νμ΄λΈλ¦¬λ μ€ν¬μ΄λ€.",
|
|
206
|
+
"κ³΅κ° APIκ° νμΈλμ§ μμ μλ κ²°κ³Ό μμ§μ 보μ₯νμ§ μλλ€.",
|
|
207
|
+
"곡μ μ¬μ΄νΈ μλ΅ μλκ° λ리면 manual openμΌλ‘ μ ννλ€.",
|
|
208
|
+
]
|
|
209
|
+
|
|
210
|
+
return SearchPlan(
|
|
211
|
+
query=query,
|
|
212
|
+
payload=payload,
|
|
213
|
+
suggested_keywords=suggested_keywords,
|
|
214
|
+
official_sources=default_sources,
|
|
215
|
+
guidance=guidance,
|
|
216
|
+
cautions=cautions,
|
|
217
|
+
curl_example=build_curl_command(payload),
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
|
222
|
+
parser = argparse.ArgumentParser(description="Generate official subway lost-property search guidance.")
|
|
223
|
+
parser.add_argument("--station", required=True, help="μλͺ
λλ 보κ΄μ₯μ ν€μλ")
|
|
224
|
+
parser.add_argument("--item", help="μ: μ§κ°, μ΄μ΄ν°")
|
|
225
|
+
parser.add_argument("--line", help="μ: 2νΈμ ")
|
|
226
|
+
parser.add_argument("--days", type=int, default=30, help="κ²μ κΈ°κ°(μΌ), κΈ°λ³Έκ° 30")
|
|
227
|
+
parser.add_argument("--verify-live", action="store_true", help="곡μ νμ΄μ§ reachabilityλ₯Ό curlλ‘ νμΈ")
|
|
228
|
+
return parser.parse_args(argv)
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def main(argv: list[str] | None = None) -> None:
|
|
232
|
+
args = parse_args(argv)
|
|
233
|
+
plan = build_search_plan(
|
|
234
|
+
station=args.station,
|
|
235
|
+
item=args.item,
|
|
236
|
+
line=args.line,
|
|
237
|
+
days=args.days,
|
|
238
|
+
verify_live=args.verify_live,
|
|
239
|
+
)
|
|
240
|
+
print(json.dumps(plan.to_dict(), ensure_ascii=False, indent=2))
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
if __name__ == "__main__":
|
|
244
|
+
main()
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "subway-lost-property",
|
|
3
|
+
"description": "Use when the user asks how to look up μ§νμ² λΆμ€λ¬Ό or μ μ€λ¬Ό by μλͺ
/λ¬Όνλͺ
. v1 is an μλ΄ν/νμ΄λΈλ¦¬λ skill that structures the official LOST112 + μμΈκ΅ν΅κ³΅μ¬ flow conservatively. λμ μμλ 곡μ νλ©΄μ ν΅ν νμ μ‘μ
κΉμ§ μ§ννλ€.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"action:communication"
|
|
6
|
+
],
|
|
7
|
+
"frontmatter": "name: subway-lost-property\ndescription: Use when the user asks how to look up μ§νμ² λΆμ€λ¬Ό or μ μ€λ¬Ό by μλͺ
/λ¬Όνλͺ
. v1 is an μλ΄ν/νμ΄λΈλ¦¬λ skill that structures the official LOST112 + μμΈκ΅ν΅κ³΅μ¬ flow conservatively. λμ μμλ 곡μ νλ©΄μ ν΅ν νμ μ‘μ
κΉμ§ μ§ννλ€.\nlicense: MIT\nmetadata:\n category: transit\n locale: ko-KR\n phase: v1"
|
|
8
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# Ticket Availability
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
YES24 (`ticket.yes24.com`) μ μΈν°νν¬ (`tickets.interpark.com`) μ κ³΅κ° BFF JSON / Ajax endpoint λ₯Ό λ¨μΌ HTTP μμ²μΌλ‘ νΈμΆν΄ κ³΅μ° μΌμ κ³Ό λ±κΈλ³ μμ¬μ μλ₯Ό μ κ·ννλ€.
|
|
6
|
+
|
|
7
|
+
- κ³΅μ° URL λλ `platform:id` νκΈ°λ‘ μ
λ ₯μ λ°λλ€.
|
|
8
|
+
- μΌμ (λ μ§Β·μκ°Β·νμ°¨) μ‘°ν.
|
|
9
|
+
- λ±κΈλ³ μμ¬μ μ μ‘°ν (λ±κΈλͺ
, μμ¬μ, YES24μ κ²½μ° λ
ΈμΆκ°).
|
|
10
|
+
- μ’μλ§΅ / μ’μ μ ν / μλ§€ / κ²°μ / λ‘κ·ΈμΈ μΈμ
μ κ·Όμ νμ§ μλλ€.
|
|
11
|
+
- CloakBrowser, Playwright, fingerprint spoofing, CAPTCHA μ°νλ₯Ό μ¬μ©νμ§ μλλ€ (`httpx` only).
|
|
12
|
+
|
|
13
|
+
## When to use
|
|
14
|
+
|
|
15
|
+
- "μ€λ μΈν°νν¬ ββ κ³΅μ° μμ¬μ μμ΄?"
|
|
16
|
+
- "YES24 μ½μνΈ ID 58026 μΌμ μλ €μ€"
|
|
17
|
+
- "μ΄ κ³΅μ° Rμ λͺ μ리 λ¨μμ΄?"
|
|
18
|
+
- "κ³΅μ° URL μ€κ², νμ°¨λ³ μμ¬μ νμΈν΄μ€"
|
|
19
|
+
|
|
20
|
+
## When not to use
|
|
21
|
+
|
|
22
|
+
- μλ§€Β·κ²°μ Β·μ·¨μΒ·νλΆ μ²λ¦¬ β **곡μ°λ² Β§4μ‘°μ2 (2023.9 μν) λ§€ν¬λ‘ μ
μ₯κΆ λΆμ ꡬ맀·νλ§€ κΈμ§** λμμ΄λ©° μ΄ μ€ν¬μ μλμ μΌλ‘ μλ§€λ₯Ό μ§μνμ§ μλλ€.
|
|
23
|
+
- μ’μ μ ν, μ’μλ§΅ μκ°ν, νΉμ μ’μ λ²νΈ νμΈ β μμ¬ *μ* λ§ λ
ΈμΆνλ€.
|
|
24
|
+
- νμ λ±κΈλ³ μ°μ μλ§€, μΏ ν°κ°, μΉ΄λμ¬ ν μΈκ° β κ³΅κ° endpoint λ§ μ¬μ©νλ€.
|
|
25
|
+
- μ°¨λ¨ μ°ν, CAPTCHA μ°ν, headless κ°μ§ μ°ν β `httpx` ν νΈμΆλ‘ μ λλ©΄ μ€ν¨ λͺ¨λλ‘ μ²λ¦¬νκ³ μ’
λ£νλ€.
|
|
26
|
+
|
|
27
|
+
## Required inputs
|
|
28
|
+
|
|
29
|
+
κ³΅μ° URL λλ `platform:id` νκΈ°κ° μμΌλ©΄ λ¨Όμ λ¬Όμ΄λ³Έλ€.
|
|
30
|
+
|
|
31
|
+
κΆμ₯ μ§λ¬Έ:
|
|
32
|
+
|
|
33
|
+
> νμΈνμ€ κ³΅μ°μ YES24 λλ μΈν°νν¬ URLμ μλ €μ£ΌμΈμ.
|
|
34
|
+
> μ: `https://tickets.interpark.com/goods/26000541`
|
|
35
|
+
> `https://ticket.yes24.com/Perf/58026`
|
|
36
|
+
|
|
37
|
+
## Prerequisites
|
|
38
|
+
|
|
39
|
+
- Python 3.9+
|
|
40
|
+
- `httpx` (νμ€ ν¨ν€μ§)
|
|
41
|
+
|
|
42
|
+
μ€μΉ:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pip install httpx
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Workflow
|
|
49
|
+
|
|
50
|
+
### 1. URL νμ±
|
|
51
|
+
|
|
52
|
+
| μ
λ ₯ | λ§€μΉ |
|
|
53
|
+
|---|---|
|
|
54
|
+
| `https://tickets.interpark.com/goods/<goods_code>` | platform=interpark |
|
|
55
|
+
| `https://ticket.yes24.com/Perf/<perf_id>` | platform=yes24 |
|
|
56
|
+
| `https://ticket.yes24.com/New/Perf/Detail/View/<perf_id>` | platform=yes24 |
|
|
57
|
+
| `yes24:<id>` / `interpark:<id>` | shorthand |
|
|
58
|
+
|
|
59
|
+
### 2. μΌμ μ‘°ν (`schedule`)
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
python3 scripts/ticket_availability.py schedule "https://tickets.interpark.com/goods/26000541"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
μλ΅ β Interpark:
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"platform": "interpark",
|
|
69
|
+
"id": "26000541",
|
|
70
|
+
"schedule": [
|
|
71
|
+
{"date": "2026-05-13", "time": "14:30", "play_seq": "055"},
|
|
72
|
+
{"date": "2026-05-14", "time": "19:30", "play_seq": "057"}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
μλ΅ β YES24:
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"platform": "yes24",
|
|
81
|
+
"id": "58026",
|
|
82
|
+
"schedule": [
|
|
83
|
+
{"date": "2026-05-16", "time_label": "1ν", "id_time": "1432397"}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
YES24 λ κΈ°λ³Έ 3μ£Ό μλμ°. 6κ°μ μ 체λ `--all-dates` μΆκ°.
|
|
89
|
+
|
|
90
|
+
### 3. μμ¬μ μ‘°ν (`seats`)
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
python3 scripts/ticket_availability.py seats "interpark:26000541"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
μλ΅:
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"platform": "interpark",
|
|
100
|
+
"id": "26000541",
|
|
101
|
+
"seats": {
|
|
102
|
+
"2026-05-13|14:30|055": {
|
|
103
|
+
"date": "2026-05-13", "time": "14:30", "play_seq": "055",
|
|
104
|
+
"seats": [
|
|
105
|
+
{"grade": "VIPμ", "remain": 150},
|
|
106
|
+
{"grade": "Rμ", "remain": 36},
|
|
107
|
+
{"grade": "Sμ", "remain": 82},
|
|
108
|
+
{"grade": "Aμ", "remain": 71}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
YES24 μλ΅μ λ±κΈλ³ `price` (λ
ΈμΆκ°) λ ν¬ν¨:
|
|
116
|
+
```json
|
|
117
|
+
{"grade": "μ μ", "price": "110,000μ", "remain": 2}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 4. ν¬μ€μ²΄ν¬ (`health`)
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
python3 scripts/ticket_availability.py health
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
μλ΅:
|
|
127
|
+
```json
|
|
128
|
+
{"yes24": {"status": 200, "ok": true}, "interpark": {"status": 200, "ok": true}}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Output format
|
|
132
|
+
|
|
133
|
+
κΈ°λ³Έ μΆλ ₯μ λ€μ¬μ°κΈ° JSON. νμ΄ν/μ€ν¬λ¦½νΈμ©μ `--compact` μΆκ° (ν μ€ JSON).
|
|
134
|
+
|
|
135
|
+
## Endpoints used
|
|
136
|
+
|
|
137
|
+
μ΄ μ€ν¬μ΄ νΈμΆνλ κ³΅κ° endpoint λ§:
|
|
138
|
+
|
|
139
|
+
| Platform | Method | URL |
|
|
140
|
+
|---|---|---|
|
|
141
|
+
| YES24 | POST | `https://ticket.yes24.com/New/Perf/Sale/Ajax/axPerfDay.aspx` |
|
|
142
|
+
| YES24 | POST | `https://ticket.yes24.com/NEw/Perf/Detail/Ajax/axPerfPlayTime.aspx` |
|
|
143
|
+
| YES24 | POST | `https://ticket.yes24.com/New/Perf/Detail/Ajax/axPerfRemainSeat.aspx` |
|
|
144
|
+
| Interpark | GET | `https://api-ticketfront.interpark.com/v1/goods/<id>/playSeq` |
|
|
145
|
+
| Interpark | GET | `https://api-ticketfront.interpark.com/v1/goods/<id>/playSeq/PlaySeq/<seq>/REMAINSEAT` |
|
|
146
|
+
|
|
147
|
+
μ λΆ λΉλ‘κ·ΈμΈ / 무μΈμ¦. ν€λλ `User-Agent` + `Referer` + JSON `Accept` λ§.
|
|
148
|
+
|
|
149
|
+
## Failure modes
|
|
150
|
+
|
|
151
|
+
- **YES24 `schedule` κ²°κ³Ό λΉ λ°°μ΄**: κ³΅μ° ID κ° μ ν¨νμ§λ§ ν₯ν 3μ£Ό(λλ 6κ°μ) λ΄ μΌμ μ΄ μμ. ID μμ²΄κ° μλͺ»λ κ²½μ°μ ꡬλΆλμ§ μμΌλ―λ‘, μ¬μ©μμκ² `--all-dates` λλ λ€λ₯Έ ID νμΈμ μλ΄νλ€.
|
|
152
|
+
- **Interpark `data: []`**: goods_code κ° μ§λκ°κ±°λ μμ§ μ€ν μ / λΉκ³΅κ°. λ€λ₯Έ ID νμΈμ μλ΄νλ€.
|
|
153
|
+
- **HTTP 4xx/5xx**: μ°¨λ¨/μΌμ μ₯μ . μ°ν μλνμ§ μκ³ `http error` μΆλ ₯ ν μ’
λ£.
|
|
154
|
+
- **JSON μ€ν€λ§ λ³κ²½**: YES24 axPerfRemainSeat λ HTML μλ΅μ μ κ·μμΌλ‘ νμ± β μ¬μ΄νΈ κ°±μ μ μν₯ κ°λ₯. `remain` 0 μΌλ‘ μλͺ» λ³΄κ³ λ μ μμ΄ μ¬μ©μμκ² "μ‘°ν μκ° κΈ°μ€" μ΄λΌκ³ νκΈ°.
|
|
155
|
+
- **κ³΅μ° λ§€μ§**: API λ `remain: 0` λ°ν. λ§€μ§ νμ.
|
|
156
|
+
|
|
157
|
+
## Response style
|
|
158
|
+
|
|
159
|
+
- μμ¬μμ "μ‘°ν μκ° κΈ°μ€" μΌλ‘ νννλ€ (μ€μκ° λ³λ).
|
|
160
|
+
- "λ§€ν¬λ‘", "μ μ ", "μ€νλ°", "μλ μλ§€" νν κΈμ§ β μ΄ μ€ν¬μ μ‘°ν μ μ©.
|
|
161
|
+
- μμ¬μ μμΉ + λ±κΈλͺ
λ§ μΈμ©. μ’μ λ²νΈ / μ’μ μμΉλ λ
ΈμΆνμ§ μλλ€.
|
|
162
|
+
- "μ§κΈ μ¬λΌ" κ°μ νμ μ λ κΈμ§ β μ¬μ©μκ° μ§μ νμ΄μ§μμ κ²°μ .
|
|
163
|
+
|
|
164
|
+
## Notes
|
|
165
|
+
|
|
166
|
+
- λ³Έ μ€ν¬μ μλμ μΌλ‘ **μλ§€ / κ²°μ / μ’μμ ν / λ‘κ·ΈμΈ μλν** λ₯Ό ν¬ν¨νμ§ μλλ€. λ§€ν¬λ‘λ₯Ό ν΅ν μ
μ₯κΆ λΆμ ꡬ맀·νλ§€λ 곡μ°λ² Β§4μ‘°μ2 (2023.9.22 μν) μ μν΄ νμ¬μ²λ² λμ.
|
|
167
|
+
- μν¬λ¦Ώ / ν€ / λ‘κ·ΈμΈ μΈμ
μΌμ²΄ μ¬μ©νμ§ μλλ€.
|
|
168
|
+
- Rate limit: `seats` λͺ
λ Ήμ νμ°¨λ³ μμ°¨ νΈμΆ β Interpark 0.3s, YES24 0.4s κ°κ²©. 100νμ°¨ μ§λ¦¬ 곡μ°μ΄λ©΄ μ½ 30s ~ 40s μμ. μ§§μ λͺ¨λν°λ§ 루νμ λ£μ§ λ§ κ².
|
|
169
|
+
|
|
170
|
+
## Done when
|
|
171
|
+
|
|
172
|
+
- κ³΅μ° URL λλ `platform:id` κ° νμΈλμλ€.
|
|
173
|
+
- μΌμ λλ μμ¬μ κ²°κ³Ό JSON μ λ°ννκ±°λ, λΉ κ²°κ³Ό μ¬μ λ₯Ό μ€λͺ
νλ€.
|
|
174
|
+
- μλ§€ / κ²°μ / μ’μ μ ν κΈ°λ₯μ μλννμ§ μμλ€.
|
|
175
|
+
- μ‘°ν μκ° κΈ°μ€μμ μλ΄νλ€.
|