{"id":"36aef6e4-ca7b-49f4-839b-1e82d5acd347","entityType":"agent","slug":"clawhub-amurtiger01-ticket-price-compare","name":"Ticket Price Compare","canonicalUrl":"https://www.xpersona.co/agent/clawhub-amurtiger01-ticket-price-compare","canonicalPath":"/agent/clawhub-amurtiger01-ticket-price-compare","generatedAt":"2026-10-10T21:50:00.641Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:21:46.582Z","emptyReason":null},"description":"Compare real-time flight and train ticket prices across major platforms with direct booking links, real-time train availability, and discount condition details.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s175x3pfx5fnahtt36c088xke984q9v6:ticket-price-compare","sourceUrl":"https://clawhub.ai/amurtiger01/ticket-price-compare","homepage":"https://clawhub.ai/amurtiger01/skills/ticket-price-compare","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/amurtiger01/ticket-price-compare","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/amurtiger01/skills/ticket-price-compare","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":63,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Ticket Price Compare technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:21:46.582Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:21:46.582Z","emptyReason":null},"stars":null,"forks":null,"downloads":1341,"packageName":null,"latestVersion":"1.2.7","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:21:46.582Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T16:21:46.582Z","lastCrawledAt":"2026-10-10T16:21:46.582Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T16:21:46.582Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.7","createdAt":"2026-07-09T16:45:43.151Z","changelog":"Set author to Amurtiger01","fileCount":8,"zipByteSize":43101},{"version":"1.2.6","createdAt":"2026-04-25T16:28:21.307Z","changelog":"Remove SSL bypass entirely: no CERT_NONE in codebase, full TLS verification for all connections","fileCount":8,"zipByteSize":42183},{"version":"1.2.5","createdAt":"2026-04-25T16:09:03.952Z","changelog":"Security: SSL fallback opt-in, declare env vars and network access in manifest","fileCount":6,"zipByteSize":39113},{"version":"1.2.4","createdAt":"2026-04-24T16:26:31.641Z","changelog":"Security: SSL verify-first fallback for 12306 (reduces MITM exposure), unify train output format","fileCount":6,"zipByteSize":38337},{"version":"1.2.3","createdAt":"2026-04-24T09:20:05.581Z","changelog":"Fix train ticket output: unify price+seats into one table, prevent AI from ignoring train prices","fileCount":6,"zipByteSize":37831},{"version":"1.2.2","createdAt":"2026-04-24T07:07:24.205Z","changelog":"Add detailed API key setup guide with step-by-step instructions for Firecrawl, Tequila, and Amadeus","fileCount":6,"zipByteSize":37487},{"version":"1.2.1","createdAt":"2026-04-24T06:50:59.441Z","changelog":"Update README/SKILL.md with Firecrawl documentation, enhanced data source details","fileCount":6,"zipByteSize":36363},{"version":"1.2.0","createdAt":"2026-04-19T18:38:12.433Z","changelog":"Version 1.2.0 - Updated platform and UI references from Chinese-only names to international equivalents (e.g., “Я��” to “Ctrip”). - Clarified supported data sources and output sections for better user guidance. - Improved and standardized terminology in documentation (platform list, seat/coach types, field labels). - Enhanced clarity on workflow and fallback data sources. - Updated discount conditions instructions to reference the latest platforms_guide.md. - General documentation and formatting improvements across README.md and SKILL.md.","fileCount":6,"zipByteSize":28493}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s175x3pfx5fnahtt36c088xke984q9v6:ticket-price-compare","setupComplexity":"medium","setupSteps":["Install using `clawhub skill install s175x3pfx5fnahtt36c088xke984q9v6:ticket-price-compare` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/amurtiger01/ticket-price-compare before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-amurtiger01-ticket-price-compare/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-amurtiger01-ticket-price-compare/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-amurtiger01-ticket-price-compare/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-amurtiger01-ticket-price-compare/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-amurtiger01-ticket-price-compare/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-amurtiger01-ticket-price-compare/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T21:50:00.637Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-amurtiger01-ticket-price-compare/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-amurtiger01-ticket-price-compare/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-amurtiger01-ticket-price-compare/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-amurtiger01-ticket-price-compare/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:21:46.582Z","emptyReason":null},"readme":"Skill: Ticket Price Compare\n\nOwner: amurtiger01\n\nSummary: Compare real-time flight and train ticket prices across major platforms with direct booking links, real-time train availability, and discount condition details.\n\nTags: latest:1.2.7\n\nVersion history:\n\nv1.2.7 | 2026-07-09T16:45:43.151Z | user\n\nSet author to Amurtiger01\n\nv1.2.6 | 2026-04-25T16:28:21.307Z | user\n\nRemove SSL bypass entirely: no CERT_NONE in codebase, full TLS verification for all connections\n\nv1.2.5 | 2026-04-25T16:09:03.952Z | user\n\nSecurity: SSL fallback opt-in, declare env vars and network access in manifest\n\nv1.2.4 | 2026-04-24T16:26:31.641Z | user\n\nSecurity: SSL verify-first fallback for 12306 (reduces MITM exposure), unify train output format\n\nv1.2.3 | 2026-04-24T09:20:05.581Z | user\n\nFix train ticket output: unify price+seats into one table, prevent AI from ignoring train prices\n\nv1.2.2 | 2026-04-24T07:07:24.205Z | user\n\nAdd detailed API key setup guide with step-by-step instructions for Firecrawl, Tequila, and Amadeus\n\nv1.2.1 | 2026-04-24T06:50:59.441Z | user\n\nUpdate README/SKILL.md with Firecrawl documentation, enhanced data source details\n\nv1.2.0 | 2026-04-19T18:38:12.433Z | auto\n\nVersion 1.2.0\n\n- Updated platform and UI references from Chinese-only names to international equivalents (e.g., “Я��” to “Ctrip”).\n- Clarified supported data sources and output sections for better user guidance.\n- Improved and standardized terminology in documentation (platform list, seat/coach types, field labels).\n- Enhanced clarity on workflow and fallback data sources.\n- Updated discount conditions instructions to reference the latest platforms_guide.md.\n- General documentation and formatting improvements across README.md and SKILL.md.\n\nv1.1.0 | 2026-04-19T18:03:54.483Z | user\n\nv1.1.0: Removed PerimeterX bypass code, fixed SSL verification (scoped to 12306 only), removed proxy credential hints. Addresses ClawHub security review findings.\n\nv1.0.0 | 2026-04-19T17:35:36.218Z | user\n\nInitial release: 12306 real-time train tickets, Ctrip flight scraping, multi-platform links, optional Skyscanner/Tequila/Amadeus APIs\n\nArchive index:\n\nArchive v1.2.7: 8 files, 43101 bytes\n\nFiles: README.md (12068b), references/platforms_guide.md (7813b), RELEASE_NOTES.md (5284b), scripts/requirements.txt (469b), scripts/ticket_search.py (98914b), skill-card.md (2211b), SKILL.md (10409b), _meta.json (139b)\n\nFile v1.2.7:SKILL.md\n\n---\nname: ticket-price-compare\nversion: 1.2.7\nauthor: Amurtiger01\ndescription: This skill should be used when the user wants to compare and search for flight or train ticket prices across multiple platforms. It supports both domestic (China) and international routes, fetches real-time train availability via 12306, uses Firecrawl to render Ctrip JS pages for detailed flight data (flight numbers, times, aircraft types, prices), generates direct search links for all major booking platforms and airline official websites, provides WeChat mini program quick links for mobile search, and highlights discount conditions. Trigger scenarios include: searching for cheap flights, comparing train ticket prices, finding international flight deals, looking for the best ticket booking platform, or asking about ticket discount conditions.\nenvironment_variables:\n  - name: FIRECRAWL_API_KEY\n    required: false\n    description: \"Firecrawl API key for JS rendering of Ctrip flight pages. Register at firecrawl.dev. Free tier available (500 credits/month).\"\n  - name: TEQUILA_API_KEY\n    required: false\n    description: \"Kiwi.com Tequila API key for international flight data. Self-service registration is closed.\"\n  - name: AMADEUS_CLIENT_ID\n    required: false\n    description: \"Amadeus API client ID. Self-service registration is closed.\"\n  - name: AMADEUS_CLIENT_SECRET\n    required: false\n    description: \"Amadeus API client secret. Self-service registration is closed.\"\nnetwork_access:\n  - domain: kyfw.12306.cn\n    purpose: \"12306 train schedule & fare queries (public API, no auth)\"\n  - domain: flights.ctrip.com\n    purpose: \"Ctrip PC flight search page (scraping / Firecrawl JS rendering)\"\n  - domain: m.ctrip.com\n    purpose: \"Ctrip mobile H5 flight page (Firecrawl fallback for price calendar)\"\n  - domain: flight.qunar.com\n    purpose: \"Qunar flight search page (link generation)\"\n  - domain: api.firecrawl.dev\n    purpose: \"Firecrawl /v2/scrape API for JS rendering (optional, requires FIRECRAWL_API_KEY)\"\n  - domain: api.tequila.kiwi.com\n    purpose: \"Kiwi.com Tequila flight search API (optional, requires TEQUILA_API_KEY)\"\n  - domain: api.amadeus.com\n    purpose: \"Amadeus production API (optional, requires AMADEUS credentials)\"\n  - domain: test.api.amadeus.com\n    purpose: \"Amadeus test API (optional, for development)\"\n---\n\n# Ticket Price Compare - Multi-Platform Ticket Price Comparison\n\n## Overview\n\nThis skill enables real-time comparison of flight and train ticket prices. It fetches **real-time train availability** via 12306 (no API key needed), and uses **Firecrawl to render Ctrip JS pages** for detailed flight data when `FIRECRAWL_API_KEY` is set. It also generates direct search links for all major booking platforms and **WeChat mini program quick links** for convenient mobile search. Tequila/Amadeus APIs are available as optional fallbacks for users who already have keys. Discount conditions and restrictions are clearly listed separately.\n\n## Data Sources\n\n### Firecrawl + Ctrip (Primary for Flight Data, Optional API Key)\n- Uses Firecrawl's `/v2/scrape` API (v2) to render Ctrip's JavaScript-heavy flight search pages\n- **PC page** (primary): Returns individual flight numbers, times, aircraft types, and prices\n- **Mobile H5 page** (fallback): Returns price calendar with daily lowest prices across dates\n- v2 features used: `maxAge` (5-min cache window for price freshness), `location` (geo-targeted scraping: CN for domestic, US for international), `actions` (explicit wait for JS rendering), 60s timeout\n- Requires `FIRECRAWL_API_KEY` environment variable. Register at [firecrawl.dev](https://firecrawl.dev)\n- Falls back gracefully to direct scraping if not configured\n\n### Ctrip Direct Scraping (No API Key Needed)\n- Attempts direct HTTP request to Ctrip flight search pages\n- **No registration or API key required** - works out of the box\n- Limited data: Ctrip renders pages via JavaScript, so direct scraping may not always return prices. In that case, platform links are provided for manual search.\n\n### 12306 (Train Tickets, No API Key Needed)\n- Uses 12306 public `leftTicket/queryZ` endpoint for real-time train availability\n- Uses 12306 public `queryTicketPrice` endpoint for actual fares per seat type\n- Supports major Chinese cities with station code auto-mapping\n\n### Optional APIs (For Existing Key Holders Only)\n- **Kiwi.com Tequila API**: If `TEQUILA_API_KEY` is set (registration may no longer be available)\n- **Amadeus API**: If `AMADEUS_CLIENT_ID` + `AMADEUS_CLIENT_SECRET` are set (registration is closed)\n- These are used as fallbacks only when web scraping returns no results\n\n## Core Capabilities\n\n### 1. Flight Ticket Search\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" flight\n```\n- Domestic: `python scripts/ticket_search.py \"Beijing\" \"Shanghai\" \"2026-05-01\" flight`\n- International: `python scripts/ticket_search.py \"Shanghai\" \"Tokyo\" \"2026-06-15\" flight`\n\n**Data sources (in order of priority)**:\n1. Firecrawl + Ctrip PC page (if `FIRECRAWL_API_KEY` set) - Best quality: individual flights, times, aircraft, prices\n2. Firecrawl + Ctrip Mobile H5 (fallback) - Price calendar with daily lowest prices\n3. Ctrip Direct Scraping (no API key, limited data)\n4. Tequila API (if API key configured)\n5. Amadeus API (if API keys configured)\n\n**Covered domestic platforms**: Ctrip, Qunar, Fliggy, Tongcheng, Tuniu\n\n**Covered international platforms**: Skyscanner, Google Flights, Kayak, Momondo, Expedia, Booking.com\n\n**Covered airline official sites**: 10 Chinese + 13 international airlines\n\n### 2. Train Ticket Search with Real-Time Availability\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" train\n```\n\n**Real-time data from 12306**: Returns actual train schedules with:\n- Train code & type (High-Speed/EMU/Express/Fast)\n- Departure/arrival stations & times\n- Duration\n- Available seat types & counts (Business Class/First Class/Second Class/Hard Sleeper/Hard Seat etc.)\n- Actual fares per seat type\n\n### 3. Combined Search (Flight + Train)\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" all\n```\n\nTrain results are automatically excluded for international routes.\n\n## Output Sections\n\nThe script generates structured output with these sections (in order):\n\n1. **Route Summary** - Departure, arrival, date, route type\n2. **Data Source Status** - Whether Firecrawl/scraping/APIs returned live data\n3. **Real-Time Flight Prices** - Table of flight offers with prices (if available)\n4. **Transfer Details** - Multi-segment flight details (if any transfers)\n5. **Flight Discount Conditions** - Refund/change rules, baggage limits, cabin restrictions\n6. **Real-Time Train Info** - Table of actual trains with seat availability and fares (if domestic)\n7. **Train Discount Conditions** - Student tickets, child tickets, change rules\n8. **Platform Links** - Direct search URLs for all booking platforms\n9. **Airline Official Sites** - Direct links to airline websites\n10. **WeChat Mini Program Quick Links** - Mobile H5 links + WeChat mini program search tips for Ctrip/Fliggy/Tongcheng/Qunar and major airlines\n11. **Search Tips** - Route-specific advice\n\n### Discount Conditions\n\nAlways include the dedicated \"Discount Conditions / Restrictions\" section. Reference `references/platforms_guide.md` for detailed per-platform discount conditions. Load this file when:\n- User asks about specific discount conditions\n- Presenting results that include discounted fares\n- User asks which platform has the best deals for their situation\n\n## Workflow\n\n1. **Collect query parameters**: Get departure city, arrival city, and travel date. If date not specified, ask. Default ticket type to \"all\".\n\n2. **Execute search**: Run `scripts/ticket_search.py` with the parameters.\n\n3. **Present results**: Show the **complete output** from the script. **IMPORTANT**: Do NOT summarize or omit train ticket price information. Always include:\n   - **Train ticket prices** - The \"票价（余票）\" column contains actual fares like `二等座¥305(有) / 一等座¥488(12)`. This is real-time pricing data from 12306 and MUST be shown to the user.\n   - **Flight prices** (if available from Firecrawl, scraping, or API)\n   - All platform links for comparison\n   - Discount conditions section\n   - Search tips\n\n4. **If no flight prices returned**: Inform the user that real-time flight prices could not be fetched automatically, and recommend clicking the platform links to compare prices manually. **Always mention that 12306 train data with real-time prices is available for domestic routes.**\n\n5. **When user asks for \"all\" or combined search**: Present train results and flight results side by side. Do NOT skip or truncate the train price table even when flight data is extensive.\n\n## Date Flexibility\n\nIf a user asks for \"cheapest dates\" or \"price trends\":\n- Run the script with multiple date parameters to compare\n- For domestic flights: Also suggest Ctrip/Qunar price calendar features\n- For international flights: Suggest Skyscanner \"cheapest month\" or Google Flights date grid\n\n## Important Notes\n\n- **Primary method**: Firecrawl + Ctrip (if API key set) - renders JS pages, gets detailed flight data\n- **Fallback scraping**: Direct Ctrip HTTP request - no API key needed, but limited data due to JS rendering\n- **Fallback APIs**: Tequila/Amadeus - only for users who already have keys; registration is closed for new users\n- **Without any flight data**: Platform search links are always provided (users click to see prices)\n- **12306 train data** is always real-time (no API key needed)\n- **SSL verification**: All connections use full TLS verification. 12306 endpoints never bypass SSL — if certificate verification fails, train data is unavailable for that request but all other features (flight search, platform links) still work.\n- **Firecrawl proxy**: Uses `proxy: \"basic\"` for optimal reliability with Chinese booking sites\n- **Firecrawl v2 features**: `maxAge: 300000` (5-min cache for price freshness), `location` (CN for domestic, US+en for international), `actions` (wait for JS rendering), `timeout: 60000` (60s for v2 JS pipeline)\n- Prices vary in real-time; recommend checking 2-3 platforms for confirmation\n- Airline official websites sometimes offer exclusive prices not available on OTA platforms\n- Always remind users about potential discount conditions before booking\n\nFile v1.2.7:README.md\n\n# Ticket Price Compare - Multi-Platform Ticket Price Comparison\n\n[![Version](https://img.shields.io/badge/Version-v1.2.7-blue)]()\n[![Skill Type](https://img.shields.io/badge/Type-AI%20Skill-blue)]()\n[![Python](https://img.shields.io/badge/Python-3.8%2B-green)]()\n[![License](https://img.shields.io/badge/License-MIT-yellow)]()\n\n> Real-time multi-platform flight and train ticket price comparison Skill. Supports domestic/international routes, 12306 real-time seat availability, Firecrawl-powered detailed flight data, no API key required for core features.\n\n## Highlights\n\n- **Firecrawl-Powered Flight Data** - Renders Ctrip JS pages via Firecrawl, gets detailed flight numbers, times, aircraft types, and prices\n- **Real-Time Train Seat Availability** - Direct 12306 public endpoint, returns actual schedules, seats, and fares\n- **Zero Configuration Core** - 12306 train queries work out of the box; Firecrawl enhances flight data when API key is set\n- **Multi-Source Flight Comparison** - Firecrawl / Ctrip scraping / Tequila / Amadeus multiple data sources\n- **Domestic + International Routes** - Supports both Chinese and English city names\n- **Platform Search Links** - One-click access to Ctrip, Qunar, Fliggy, Tongcheng, Skyscanner, Google Flights, etc.\n- **Airline Official Sites** - Covers 10 Chinese + 13 international airlines\n- **WeChat Mini Program Links** - Mini program search tips for convenient mobile search\n- **Discount Condition Alerts** - Auto-lists student tickets, child tickets, refund/change rules\n\n## Data Sources\n\n| Data Source | Type | API Key Required | Description |\n|-------------|------|:--------------:|-------------|\n| **Firecrawl + Ctrip** | JS Rendering | Optional | Renders Ctrip flight pages, gets individual flight numbers, times, aircraft types, and prices. Set `FIRECRAWL_API_KEY` to enable. Register at [firecrawl.dev](https://firecrawl.dev) |\n| 12306 | Public API | No | Real-time train seat availability and fares |\n| Ctrip Scraping | Direct HTTP | No | Basic flight info without JS rendering (limited data) |\n| Tequila | REST API | Optional | Kiwi.com flight data (registration closed) |\n| Amadeus | REST API | Optional | Global flight data (registration closed) |\n\n## What's New in v1.2.0\n\n- **Firecrawl Integration** - Added `FirecrawlScraper` class that uses Firecrawl's `/v2/scrape` API to render Ctrip's JavaScript-heavy flight search pages, extracting detailed flight data (flight numbers, departure/arrival times, aircraft types, individual cabin prices, transfer details)\n- **Dual-Source Flight Scraping** - PC page (primary) returns per-flight details; mobile H5 page (fallback) returns price calendar with daily lowest prices\n- **Smart Parsing** - Robust markdown parser extracts structured flight data from Ctrip's rendered output, handling various cabin classes and transfer flights\n- **Proxy Optimization** - Switched from `proxy: \"auto\"` to `proxy: \"basic\"` for better reliability with Chinese booking sites\n- **Enhanced Train Prices** - 12306 `queryTicketPrice` endpoint integration for actual fare data per seat type\n\n## Quick Start (Zero Config)\n\nThe script uses only Python standard library, no extra packages needed. Train tickets (12306) work out of the box:\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-05-01 train\n```\n\nFlight search also works without any API key (provides platform links for manual comparison):\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-05-01 flight\n```\n\n> **Tip**: To get detailed flight prices (flight numbers, times, aircraft types) instead of just links, set the `FIRECRAWL_API_KEY` environment variable. See [API Key Setup Guide](#api-key-setup-guide) below.\n\n## API Key Setup Guide\n\nAll API keys are **optional**. The script works without any configuration (train data always available, flight links always provided). API keys only enhance the flight data quality.\n\n### Key Required vs Optional Summary\n\n| API Key | Required? | What It Enables | Registration Status |\n|---------|:---------:|----------------|---------------------|\n| `FIRECRAWL_API_KEY` | **Recommended** | Detailed Ctrip flight data (flight numbers, times, aircraft, prices) | **Open** - Free tier available |\n| `TEQUILA_API_KEY` | No | Kiwi.com international flight data | **Closed** |\n| `AMADEUS_CLIENT_ID` + `AMADEUS_CLIENT_SECRET` | No | Amadeus global flight data | **Closed** |\n\n---\n\n### 1. Firecrawl API Key (Recommended - Free Tier Available)\n\nFirecrawl renders Ctrip's JavaScript-heavy flight pages, extracting detailed flight data that direct HTTP requests cannot get.\n\n#### Step 1: Register\n\n1. Go to [https://firecrawl.dev](https://firecrawl.dev)\n2. Click **\"Get Started\"** or **\"Sign Up\"**\n3. Sign up with Google/GitHub/email\n4. Free tier includes **500 credits/month** (each scrape = 1 credit)\n\n#### Step 2: Get Your API Key\n\n1. After login, go to the **Dashboard**\n2. Copy your **API Key** (format: `fc-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`)\n\n#### Step 3: Set Environment Variable\n\n**Linux / macOS** (temporary, current session only):\n```bash\nexport FIRECRAWL_API_KEY=\"fc-your-actual-api-key-here\"\n```\n\n**Linux / macOS** (permanent, add to `~/.bashrc` or `~/.zshrc`):\n```bash\necho 'export FIRECRAWL_API_KEY=\"fc-your-actual-api-key-here\"' >> ~/.bashrc\nsource ~/.bashrc\n```\n\n**Windows CMD** (temporary, current window only):\n```cmd\nset FIRECRAWL_API_KEY=fc-your-actual-api-key-here\n```\n\n**Windows CMD** (permanent, system-level):\n```cmd\nsetx FIRECRAWL_API_KEY \"fc-your-actual-api-key-here\"\n```\n> Note: `setx` takes effect in **new** terminal windows, not the current one.\n\n**Windows PowerShell** (temporary, current session only):\n```powershell\n$env:FIRECRAWL_API_KEY = \"fc-your-actual-api-key-here\"\n```\n\n**Windows PowerShell** (permanent, user-level):\n```powershell\n[Environment]::SetEnvironmentVariable(\"FIRECRAWL_API_KEY\", \"fc-your-actual-api-key-here\", \"User\")\n```\n> Note: Takes effect in **new** PowerShell sessions.\n\n#### Step 4: Verify\n\n```bash\npython scripts/ticket_search.py Beijing Shanghai 2026-05-01 flight\n```\nIf you see `Data Source: Ctrip (via Firecrawl)` in the output, the key is working.\n\n> **No pip install needed** - the script calls Firecrawl's REST API directly via Python's built-in `urllib` library.\n\n---\n\n### 2. Tequila API Key (Optional - Registration Closed)\n\nKiwi.com Tequila API for international flight data. **Self-service registration is no longer available.**\n\nIf you already have a key:\n\n**Linux / macOS:**\n```bash\nexport TEQUILA_API_KEY=\"your-tequila-api-key\"\n```\n\n**Windows CMD:**\n```cmd\nset TEQUILA_API_KEY=your-tequila-api-key\n```\n\n**Windows PowerShell:**\n```powershell\n$env:TEQUILA_API_KEY = \"your-tequila-api-key\"\n```\n\n---\n\n### 3. Amadeus API Keys (Optional - Registration Closed)\n\nAmadeus API for global flight data. **Self-service registration is closed.**\n\nIf you already have keys, you also need to install the SDK:\n\n```bash\npip install amadeus>=12.0.0\n```\n\nThen set both environment variables:\n\n**Linux / macOS:**\n```bash\nexport AMADEUS_CLIENT_ID=\"your-client-id\"\nexport AMADEUS_CLIENT_SECRET=\"your-client-secret\"\n```\n\n**Windows CMD:**\n```cmd\nset AMADEUS_CLIENT_ID=your-client-id\nset AMADEUS_CLIENT_SECRET=your-client-secret\n```\n\n**Windows PowerShell:**\n```powershell\n$env:AMADEUS_CLIENT_ID = \"your-client-id\"\n$env:AMADEUS_CLIENT_SECRET = \"your-client-secret\"\n```\n\n---\n\n### Environment Variable Quick Reference\n\n| Variable | Where to Get | Format | Required? |\n|----------|-------------|--------|:---------:|\n| `FIRECRAWL_API_KEY` | [firecrawl.dev](https://firecrawl.dev) Dashboard | `fc-xxxx...` | Recommended |\n| `TEQUILA_API_KEY` | Kiwi.com (closed) | String | No |\n| `AMADEUS_CLIENT_ID` | Amadeus (closed) | String | No |\n| `AMADEUS_CLIENT_SECRET` | Amadeus (closed) | String | No |\n\n> **Note**: Environment variables set via `export`/`set`/`$env:` are session-only and will be lost when you close the terminal. Use `setx` (Windows) or add to `~/.bashrc` (Linux/macOS) for persistence.\n\n## Usage\n\n### Train Ticket Search\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 train\n```\n\n### Flight Ticket Search\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 flight\n```\n\n### Combined Search (Flight + Train)\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 all\n```\n\n### International Routes\n\n```bash\npython scripts/ticket_search.py Shanghai Tokyo 2026-06-15 flight\npython scripts/ticket_search.py Shanghai Tokyo 2026-06-15 all\n```\n\n## Output Examples\n\n### Flight Ticket Output (with Firecrawl)\n\n```\n=== Flight Search Results ===\nDeparture: Beijing  Arrival: Shanghai  Date: 2026-04-25\nData Source: Ctrip (via Firecrawl)\n\nFlight     Airline         Aircraft      Depart  Arrive    Price\nCA1501     Air China       Boeing 737    07:30   09:45     CNY 520\nMU5101     China Eastern   Airbus A320   08:00   10:20     CNY 480\nCZ6901     China Southern  Airbus A321   09:00   11:15     CNY 460\n...\n\nPlatform Search Links:\n- Ctrip: https://flights.ctrip.com/...\n- Qunar: https://flight.qunar.com/...\n- Skyscanner: https://www.skyscanner.net/...\n```\n\n### Train Ticket Output\n\n```\n=== 12306 Real-Time Query Results ===\nDeparture: Beijing  Arrival: Guangzhou  Date: 2026-04-20\n\nTrain    Departure->Arrival       Time          Duration  Second Class  First Class\nG303     Beijing Xi->Guangzhou South  10:00-17:17   7:17     CNY 1033     CNY 1488\nD923     Beijing Xi->Guangzhou South  20:22-06:47   10:25    CNY 709      -\nZ13      Beijing Fengtai->Guangzhou Baiyun  14:25-12:36+1  22:11   -   CNY 251 (Hard Sleeper)\n```\n\n## Project Structure\n\n```\nticket-price-compare/\n+-- SKILL.md                        # Skill definition (triggers, workflow)\n+-- README.md                       # This file\n+-- .gitignore\n+-- references/\n|   +-- platforms_guide.md          # Detailed per-platform discount conditions\n+-- scripts/\n    +-- ticket_search.py            # Core search script (~2200 lines)\n    +-- requirements.txt            # Dependencies (core has zero dependencies)\n    +-- skyscanner_lib/             # Skyscanner affiliate link builder\n```\n\n## Technical Details\n\n- **Core Zero Dependencies** - `ticket_search.py` uses only Python standard library (`urllib`, `json`, `ssl`)\n- **Firecrawl JS Rendering** - Calls Firecrawl `/v2/scrape` API with v2 features: `maxAge` (5-min cache for price freshness), `location` (geo-targeted: CN for domestic, US for international), `actions` (explicit wait for JS rendering), 60s timeout for v2 JS pipeline, then parses the resulting markdown\n- **Dual-Source Ctrip** - PC page (`flights.ctrip.com`) for per-flight details; mobile H5 (`m.ctrip.com`) for price calendar fallback\n- **12306 Endpoints** - Uses `leftTicket/queryZ` for schedules + `queryTicketPrice` for actual fares, no login required\n- **City Name Mapping** - Built-in 200+ Chinese city/station name to IATA/telegraph code mapping\n- **SSL Security** - All connections use full TLS verification. 12306 endpoints never bypass SSL — if certificate verification fails, train data is unavailable for that request but all other features (flight search, platform links) still work.\n- **Encoding Compatibility** - Auto-handles Windows console UTF-8 encoding issues\n\n## Flight Data Source Priority\n\n1. **Firecrawl + Ctrip PC** (if `FIRECRAWL_API_KEY` set) - Best quality: individual flights, times, aircraft, prices\n2. **Firecrawl + Ctrip Mobile** (fallback) - Price calendar with daily lowest prices\n3. **Direct Ctrip Scraping** (no API key) - Limited data, may not work due to JS rendering\n4. **Tequila API** (if key set) - International flights\n5. **Amadeus API** (if keys set) - Global flights\n6. **Platform Links Only** - If no data source returns prices, provides direct links for manual search\n\n## As an AI Skill\n\nThis Skill can be used on AI skill platforms such as CodeBuddy / ClawHub. It auto-triggers when users ask:\n\n- \"Find me flights from Beijing to Guangzhou\"\n- \"How much is Shanghai to Tokyo on April 20\"\n- \"Check train ticket seat availability\"\n- \"Which platform has the cheapest flights\"\n- \"What student ticket discounts are available\"\n\n## License\n\nMIT\n\nFile v1.2.7:_meta.json\n\n{\n  \"ownerId\": \"kn74yqvqr8gy2c7yr0n4yg1kv584p8mw\",\n  \"slug\": \"ticket-price-compare\",\n  \"version\": \"1.2.7\",\n  \"publishedAt\": 1783615543151\n}\n\nFile v1.2.7:references/platforms_guide.md\n\n# Ticket Price Comparison Platform Detailed Guide\n\n## 1. Domestic Flight Platforms\n\n### Ctrip\n- **URL**: https://flights.ctrip.com\n- **Advantages**: Largest domestic OTA, most comprehensive flight coverage, good refund/change service\n- **Features**:\n  - Price calendar: view price trends for 7 days before/after\n  - Ctrip special deals section\n  - Ctrip premium member discounts\n- **Common Discount Conditions**:\n  - New user first-order discount (requires new account registration)\n  - Ctrip Black Diamond/Diamond member exclusive discounts\n  - Bank card payment discount (requires specific bank card)\n  - Early/late flight specials (typically flights before 6:00 or after 22:00)\n\n### Qunar\n- **URL**: https://flight.qunar.com\n- **Advantages**: Price comparison aggregator, compare multiple agent prices for the same flight\n- **Features**:\n  - Price monitoring alerts\n  - Special deals calendar\n  - \"Last-minute\" low-price flight recommendations\n- **Common Discount Conditions**:\n  - Agent coupons (discount vouchers)\n  - Qunar new user welcome package\n  - Special fare cabins (may be group tickets, strict refund/change rules)\n  - Flash sales (typically limited to 2 hours)\n\n### Fliggy\n- **URL**: https://www.fliggy.com\n- **Advantages**: Alibaba ecosystem, 88VIP members get extra discounts\n- **Features**:\n  - Fliggy mileage offset\n  - Taobao/Alipay quick payment\n  - Credit Fly (fly now, pay later)\n- **Common Discount Conditions**:\n  - 88VIP member exclusive prices\n  - Alipay payment random discount\n  - New user exclusive coupons\n  - Mileage redemption discount\n\n### Tongcheng (LY.com)\n- **URL**: https://www.ly.com\n- **Advantages**: WeChat mini program easy access, sometimes has exclusive low prices\n- **Features**:\n  - WeChat one-click login and purchase\n  - Tongcheng Black Whale member discount\n  - CNY 9.9 flight deals section (limited quantity)\n- **Common Discount Conditions**:\n  - WeChat Pay exclusive discount\n  - Tongcheng member tier discount\n  - Flash sale prices (limited quantity)\n\n### Spring Airlines Official Site\n- **URL**: https://www.ch.com\n- **Advantages**: Low-cost carrier, usually the lowest prices\n- **Features**:\n  - CNY 9/99/199 special tickets\n  - Spring Green Wing member discount\n- **Common Discount Conditions**:\n  - Special tickets do not include checked baggage (must purchase separately)\n  - No free meals\n  - Smaller seat pitch\n  - High refund/change fees\n  - Special tickets usually non-refundable and non-changeable\n\n## 2. International Flight Platforms\n\n### Skyscanner\n- **URL**: https://www.skyscanner.net\n- **Advantages**: World's largest flight comparison, covers 1200+ airlines and OTAs\n- **Features**:\n  - \"Cheapest month\" search\n  - \"Everywhere\" exploration (enter departure, find cheapest destination)\n  - Price alert feature\n- **Common Discount Conditions**:\n  - Special tickets usually non-refundable and non-changeable\n  - Some prices from agents (refund/change must contact agent)\n  - Connecting flights are cheaper but take longer\n\n### Google Flights\n- **URL**: https://www.google.com/travel/flights\n- **Advantages**: Calendar view shows monthly low prices, accurate price prediction algorithm\n- **Features**:\n  - Price trend chart (whether to buy now)\n  - Date grid (price comparison across dates)\n  - Explore destinations feature\n- **Common Discount Conditions**:\n  - Google does not sell tickets directly, redirects to airline/OTA\n  - Prices may vary based on cookie/login status\n  - Some deals only available on airline official sites\n\n### Kayak\n- **URL**: https://www.kayak.com\n- **Advantages**: Excellent price prediction, \"Hacker Fares\" combine different airlines for round-trip\n- **Features**:\n  - Price forecast (buy/wait recommendation)\n  - Hacker Fares (outbound and return on different airlines)\n  - Flexible date search\n- **Common Discount Conditions**:\n  - Hacker Fares require purchasing two separate tickets\n  - If change needed, each ticket handled separately\n  - Some combinations may lack connection protection\n\n### Momondo\n- **URL**: https://www.momondo.com\n- **Advantages**: Often finds hidden low prices not available on other platforms\n- **Features**:\n  - \"Flight Insight\" shows best booking time\n  - \"Ticket Check\" validates fare reasonableness\n- **Common Discount Conditions**:\n  - Some low prices from small travel agencies\n  - Refund/change must contact ticket issuer\n  - Ticket confirmation may be slow\n\n## 3. International Airline Official Site Discount Conditions\n\n### Common Discount Types\n| Discount Type | Description | Conditions |\n|---------------|-------------|------------|\n| Early Bird | Book 60/90 days in advance for discount | Must book in advance, non-refundable/changeable |\n| Member Exclusive | Airline member exclusive discount | Must register as member (free) |\n| Credit Card | Specific credit card payment discount | Must hold designated credit card |\n| Student Discount | Discount for passengers aged 12-25 | Must provide student proof |\n| Senior Discount | Discount for passengers aged 60+ | Must provide age proof |\n| Military Discount | Discount for active/retired military | Must provide military proof |\n| Group Tickets | Discount for 10+ passengers | Must issue tickets together, partial refund not allowed |\n| Codeshare | Alliance partner shared pricing | Actual operating carrier may differ |\n| Mileage Redemption | Frequent flyer miles for tickets | Must have sufficient miles, high change fees |\n| Transit Special | Special fares via specific connecting cities | Must accept longer connection times |\n\n## 4. Train Ticket Discount Conditions\n\n### 12306 Discounts\n| Discount Type | Description | Conditions |\n|---------------|-------------|------------|\n| Student Ticket | 50% off regular hard seat, 25% off EMU second class | Must be within discount route, 4 times per year |\n| Child Ticket | Half price for height 1.2-1.5m | Must be accompanied by adult |\n| Military Priority | Active military priority booking | Must show military ID |\n| Points Redemption | 10000 points for one free ticket | Must register as 12306 member |\n\n### Third-Party Platform Additional Discounts\n| Platform | Discount | Conditions |\n|----------|----------|------------|\n| Ctrip | Ticket-grabbing acceleration package | Paid purchase, increases waitlist success rate |\n| Qunar | Smart transfer recommendation | May require transfer, total time increases |\n| Fliggy | New user coupon | First train ticket purchase |\n| Tongcheng | WeChat Pay instant discount | Auto-deducted when using WeChat Pay |\n\n## 5. Common Restrictions on Special Fares\n\n### Flight Special Fare Restrictions\n1. **Non-refundable/Non-changeable**: Most special tickets cannot be refunded or changed\n2. **Baggage Limits**: LCC special tickets usually include only 7kg carry-on, checked baggage costs extra\n3. **Cabin Class**: Special tickets are lowest cabin class (e.g., below Y class), limited seat selection\n4. **Date Restrictions**: Special tickets valid only on specific dates/time slots\n5. **Quantity Limits**: Special tickets are limited, sold out quickly\n6. **Identity Restrictions**: Some deals only for new users/members\n7. **Payment Restrictions**: Some discounts require specific payment methods\n8. **Transit Restrictions**: International specials may require transit via specific cities, may need transit visa\n9. **Change Fees**: Even if changeable, fees may approach ticket face value\n10. **Ticketing Deadline**: Some special tickets must be paid within 24 hours of booking\n\n### Train Special Fare Restrictions\n1. **Student Tickets**: Only during winter/summer break, must be within student certificate discount route\n2. **Waitlist**: No guarantee of waitlist success\n3. **Change Limits**: No refund after departure, only one change allowed\n4. **Transfer Tickets**: Passenger responsible for any issues caused by insufficient transfer time\n\nFile v1.2.7:scripts/requirements.txt\n\n# No required dependencies - the script uses Python stdlib only\n# Web scraping for flight prices (Ctrip/Qunar) and 12306 train API\n# work out of the box without any additional packages.\n\n# Optional: Firecrawl (JS rendering for Ctrip flight pages)\n# Set FIRECRAWL_API_KEY env var to enable. Register at https://firecrawl.dev\n# No pip install needed - uses REST API via urllib\n\n# Optional: Amadeus Python SDK (only for existing Amadeus API key holders)\n# amadeus>=12.0.0\n\nFile v1.2.7:RELEASE_NOTES.md\n\n# Release Notes — ticket-price-compare\n\n## v1.2.6 — Remove SSL Bypass Entirely\n\n**🔒 Security Fix**: All `ssl.CERT_NONE` code removed from codebase.\n\n### Changes\n- **SSL bypass completely removed**: The `_urlopen_12306()` function and all related code no longer contain any `ssl.CERT_NONE` or unverified SSL context. Full TLS verification is always enforced for all connections.\n- **Removed `TICKET_ALLOW_UNVERIFIED_SSL` environment variable**: No longer exists — there is no way to disable SSL verification from within the script.\n- **Graceful degradation**: If 12306 SSL verification fails, train data is unavailable for that request but all other features (flight search, platform links) continue to work normally.\n- **Updated manifest**: `environment_variables` and `network_access` declarations in SKILL.md and skill.json no longer reference the removed env var.\n\n### Rationale\nClawHub security review flagged the presence of any SSL bypass mechanism (even opt-in) as a significant vulnerability. The 12306 queries are public data with no credentials transmitted, so the impact of a MITM attack is limited to data integrity only. Removing the bypass entirely eliminates the attack surface while preserving all other functionality.\n\n---\n\n## v1.2.5 — Security Hardening (superseded by v1.2.6)\n\n**⚠️ Breaking Change**: 12306 SSL unverified fallback is no longer automatic.\n\n### Security Fixes\n- **SSL fallback now opt-in only**: The `_urlopen_12306()` function previously auto-fell back to unverified SSL (`ssl.CERT_NONE`) when certificate verification failed. This has been flagged as a MITM risk. Now:\n  - **Default behavior**: SSL certificate errors raise an exception with a helpful message\n  - **Opt-in fallback**: Set `TICKET_ALLOW_UNVERIFIED_SSL=true` to re-enable the fallback (only on trusted networks)\n  - This change was prompted by a ClawHub security review that identified the automatic SSL bypass as a vulnerability\n\n### Manifest Transparency\n- **Environment variables declared**: SKILL.md frontmatter now includes `environment_variables` section declaring all 5 env vars:\n  - `FIRECRAWL_API_KEY` (optional, recommended)\n  - `TEQUILA_API_KEY` (optional, registration closed)\n  - `AMADEUS_CLIENT_ID` (optional, registration closed)\n  - `AMADEUS_CLIENT_SECRET` (optional, registration closed)\n  - `TICKET_ALLOW_UNVERIFIED_SSL` (optional, opt-in security flag)\n- **Network access declared**: SKILL.md frontmatter now includes `network_access` section listing all 8 target domains with purpose descriptions:\n  - `kyfw.12306.cn` — Train schedule & fare queries\n  - `flights.ctrip.com` — Ctrip PC flight search\n  - `m.ctrip.com` — Ctrip mobile H5 fallback\n  - `flight.qunar.com` — Qunar link generation\n  - `api.firecrawl.dev` — Firecrawl JS rendering API\n  - `api.tequila.kiwi.com` — Kiwi.com Tequila API\n  - `api.amadeus.com` — Amadeus production API\n  - `test.api.amadeus.com` — Amadeus test API\n\n### Files Changed\n- `scripts/ticket_search.py` — SSL fallback made opt-in, `_ALLOW_UNVERIFIED_SSL` env var check\n- `SKILL.md` — Added `version`, `environment_variables`, `network_access` in frontmatter; updated SSL description\n- `README.md` — Updated version badge, SSL description, environment variable table\n- `skill.json` — Added `environment_variables` and `network_access` sections\n\n---\n\n## v1.2.4 — SSL Verify-First Strategy\n\n- Replaced blanket `ssl.CERT_NONE` with \"verify first, fallback on error\" strategy via `_urlopen_12306()` function\n- Default context uses full TLS verification; fallback to unverified only on SSL certificate errors\n- All other connections always use full TLS verification\n\n---\n\n## v1.2.3 — Train Output Format Optimization\n\n- **Unified single table**: Merged dual-table train output (schedule + price) into one table with \"票价（余票）\" column\n- Price+seat availability combined: e.g., `二等座¥305(有) / 一等座¥488(12)`\n- Fixed AI agents ignoring train price data due to confusing dual-table format\n- Added `IMPORTANT` directive in SKILL.md workflow to prevent AI from omitting train prices\n- Added step 5: mixed search must not truncate train price table\n\n---\n\n## v1.2.2 — API Key Setup Guide\n\n- Rewrote Installation section into comprehensive \"API Key Setup Guide\"\n- Step-by-step instructions for Firecrawl, Tequila, and Amadeus keys\n- Covers all platforms: Linux/macOS, Windows CMD, Windows PowerShell\n- Both temporary and permanent environment variable setup methods\n- Environment Variable Quick Reference table\n- Clarified that Firecrawl uses REST API directly (no pip install needed)\n\n---\n\n## v1.2.1 — ClawHub Publishing Fix\n\n- Re-published to ClawHub as v1.2.1 (v1.2.0 already existed)\n\n---\n\n## v1.2.0 — Firecrawl Integration\n\n- **Firecrawl JS Rendering**: Added `FirecrawlScraper` class using `/v2/scrape` API to render Ctrip's JavaScript-heavy flight pages\n- **Dual-Source Ctrip**: PC page (primary) returns per-flight details; mobile H5 page (fallback) returns price calendar\n- **Smart Parsing**: Robust markdown parser extracts structured flight data from rendered output\n- **Proxy Optimization**: Switched from `proxy: \"auto\"` to `proxy: \"basic\"` for Chinese booking sites\n- **Enhanced Train Prices**: 12306 `queryTicketPrice` endpoint for actual fares per seat type\n\nFile v1.2.7:skill-card.md\n\n## Description:\n\nCompare real-time flight and train ticket prices across major platforms with direct booking links, train availability, and discount condition details.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[amurtiger01](https://clawhub.ai/user/amurtiger01)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and travel-planning agents use this skill to compare flight and train options for domestic China and international routes, including live train availability, available flight prices, booking links, and fare restrictions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Travel route and date details may be sent to listed travel services during searches.\n\nMitigation: Use the skill only for routes and dates the user is comfortable sharing with those services.\n\nRisk: Optional API keys can be exposed if stored permanently in plaintext shell profiles or command history.\n\nMitigation: Prefer temporary environment variables or a secret manager, and rotate any key that may have been exposed.\n\nRisk: The optional Amadeus SDK install adds dependency risk when installed unpinned or into a shared environment.\n\nMitigation: Install optional dependencies only when needed, pin versions, and use an isolated environment.\n\n## Reference(s):\n\n- [Ticket Price Comparison Platform Detailed Guide](references/platforms_guide.md)\n- [Firecrawl](https://firecrawl.dev)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown with tabular search results, direct links, discount notes, and optional setup commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include live or recently fetched travel prices, seat availability, route-specific search tips, and booking platform links.]\n\n## Skill Version(s):\n\n1.2.7 (source: SKILL.md frontmatter and server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.6: 8 files, 42183 bytes\n\nFiles: README.md (11960b), references/platforms_guide.md (7813b), RELEASE_NOTES.md (4053b), scripts/requirements.txt (469b), scripts/ticket_search.py (97893b), skill-card.md (2673b), SKILL.md (9969b), _meta.json (139b)\n\nFile v1.2.6:SKILL.md\n\n---\nname: ticket-price-compare\nversion: 1.2.6\ndescription: This skill should be used when the user wants to compare and search for flight or train ticket prices across multiple platforms. It supports both domestic (China) and international routes, fetches real-time train availability via 12306, uses Firecrawl to render Ctrip JS pages for detailed flight data (flight numbers, times, aircraft types, prices), generates direct search links for all major booking platforms and airline official websites, provides WeChat mini program quick links for mobile search, and highlights discount conditions. Trigger scenarios include: searching for cheap flights, comparing train ticket prices, finding international flight deals, looking for the best ticket booking platform, or asking about ticket discount conditions.\nenvironment_variables:\n  - name: FIRECRAWL_API_KEY\n    required: false\n    description: \"Firecrawl API key for JS rendering of Ctrip flight pages. Register at firecrawl.dev. Free tier available (500 credits/month).\"\n  - name: TEQUILA_API_KEY\n    required: false\n    description: \"Kiwi.com Tequila API key for international flight data. Self-service registration is closed.\"\n  - name: AMADEUS_CLIENT_ID\n    required: false\n    description: \"Amadeus API client ID. Self-service registration is closed.\"\n  - name: AMADEUS_CLIENT_SECRET\n    required: false\n    description: \"Amadeus API client secret. Self-service registration is closed.\"\nnetwork_access:\n  - domain: kyfw.12306.cn\n    purpose: \"12306 train schedule & fare queries (public API, no auth)\"\n  - domain: flights.ctrip.com\n    purpose: \"Ctrip PC flight search page (scraping / Firecrawl JS rendering)\"\n  - domain: m.ctrip.com\n    purpose: \"Ctrip mobile H5 flight page (Firecrawl fallback for price calendar)\"\n  - domain: flight.qunar.com\n    purpose: \"Qunar flight search page (link generation)\"\n  - domain: api.firecrawl.dev\n    purpose: \"Firecrawl /v2/scrape API for JS rendering (optional, requires FIRECRAWL_API_KEY)\"\n  - domain: api.tequila.kiwi.com\n    purpose: \"Kiwi.com Tequila flight search API (optional, requires TEQUILA_API_KEY)\"\n  - domain: api.amadeus.com\n    purpose: \"Amadeus production API (optional, requires AMADEUS credentials)\"\n  - domain: test.api.amadeus.com\n    purpose: \"Amadeus test API (optional, for development)\"\n---\n\n# Ticket Price Compare - Multi-Platform Ticket Price Comparison\n\n## Overview\n\nThis skill enables real-time comparison of flight and train ticket prices. It fetches **real-time train availability** via 12306 (no API key needed), and uses **Firecrawl to render Ctrip JS pages** for detailed flight data when `FIRECRAWL_API_KEY` is set. It also generates direct search links for all major booking platforms and **WeChat mini program quick links** for convenient mobile search. Tequila/Amadeus APIs are available as optional fallbacks for users who already have keys. Discount conditions and restrictions are clearly listed separately.\n\n## Data Sources\n\n### Firecrawl + Ctrip (Primary for Flight Data, Optional API Key)\n- Uses Firecrawl's `/v2/scrape` API to render Ctrip's JavaScript-heavy flight search pages\n- **PC page** (primary): Returns individual flight numbers, times, aircraft types, and prices\n- **Mobile H5 page** (fallback): Returns price calendar with daily lowest prices across dates\n- Requires `FIRECRAWL_API_KEY` environment variable. Register at [firecrawl.dev](https://firecrawl.dev)\n- Falls back gracefully to direct scraping if not configured\n\n### Ctrip Direct Scraping (No API Key Needed)\n- Attempts direct HTTP request to Ctrip flight search pages\n- **No registration or API key required** - works out of the box\n- Limited data: Ctrip renders pages via JavaScript, so direct scraping may not always return prices. In that case, platform links are provided for manual search.\n\n### 12306 (Train Tickets, No API Key Needed)\n- Uses 12306 public `leftTicket/queryZ` endpoint for real-time train availability\n- Uses 12306 public `queryTicketPrice` endpoint for actual fares per seat type\n- Supports major Chinese cities with station code auto-mapping\n\n### Optional APIs (For Existing Key Holders Only)\n- **Kiwi.com Tequila API**: If `TEQUILA_API_KEY` is set (registration may no longer be available)\n- **Amadeus API**: If `AMADEUS_CLIENT_ID` + `AMADEUS_CLIENT_SECRET` are set (registration is closed)\n- These are used as fallbacks only when web scraping returns no results\n\n## Core Capabilities\n\n### 1. Flight Ticket Search\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" flight\n```\n- Domestic: `python scripts/ticket_search.py \"Beijing\" \"Shanghai\" \"2026-05-01\" flight`\n- International: `python scripts/ticket_search.py \"Shanghai\" \"Tokyo\" \"2026-06-15\" flight`\n\n**Data sources (in order of priority)**:\n1. Firecrawl + Ctrip PC page (if `FIRECRAWL_API_KEY` set) - Best quality: individual flights, times, aircraft, prices\n2. Firecrawl + Ctrip Mobile H5 (fallback) - Price calendar with daily lowest prices\n3. Ctrip Direct Scraping (no API key, limited data)\n4. Tequila API (if API key configured)\n5. Amadeus API (if API keys configured)\n\n**Covered domestic platforms**: Ctrip, Qunar, Fliggy, Tongcheng, Tuniu\n\n**Covered international platforms**: Skyscanner, Google Flights, Kayak, Momondo, Expedia, Booking.com\n\n**Covered airline official sites**: 10 Chinese + 13 international airlines\n\n### 2. Train Ticket Search with Real-Time Availability\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" train\n```\n\n**Real-time data from 12306**: Returns actual train schedules with:\n- Train code & type (High-Speed/EMU/Express/Fast)\n- Departure/arrival stations & times\n- Duration\n- Available seat types & counts (Business Class/First Class/Second Class/Hard Sleeper/Hard Seat etc.)\n- Actual fares per seat type\n\n### 3. Combined Search (Flight + Train)\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" all\n```\n\nTrain results are automatically excluded for international routes.\n\n## Output Sections\n\nThe script generates structured output with these sections (in order):\n\n1. **Route Summary** - Departure, arrival, date, route type\n2. **Data Source Status** - Whether Firecrawl/scraping/APIs returned live data\n3. **Real-Time Flight Prices** - Table of flight offers with prices (if available)\n4. **Transfer Details** - Multi-segment flight details (if any transfers)\n5. **Flight Discount Conditions** - Refund/change rules, baggage limits, cabin restrictions\n6. **Real-Time Train Info** - Table of actual trains with seat availability and fares (if domestic)\n7. **Train Discount Conditions** - Student tickets, child tickets, change rules\n8. **Platform Links** - Direct search URLs for all booking platforms\n9. **Airline Official Sites** - Direct links to airline websites\n10. **WeChat Mini Program Quick Links** - Mobile H5 links + WeChat mini program search tips for Ctrip/Fliggy/Tongcheng/Qunar and major airlines\n11. **Search Tips** - Route-specific advice\n\n### Discount Conditions\n\nAlways include the dedicated \"Discount Conditions / Restrictions\" section. Reference `references/platforms_guide.md` for detailed per-platform discount conditions. Load this file when:\n- User asks about specific discount conditions\n- Presenting results that include discounted fares\n- User asks which platform has the best deals for their situation\n\n## Workflow\n\n1. **Collect query parameters**: Get departure city, arrival city, and travel date. If date not specified, ask. Default ticket type to \"all\".\n\n2. **Execute search**: Run `scripts/ticket_search.py` with the parameters.\n\n3. **Present results**: Show the **complete output** from the script. **IMPORTANT**: Do NOT summarize or omit train ticket price information. Always include:\n   - **Train ticket prices** - The \"票价（余票）\" column contains actual fares like `二等座¥305(有) / 一等座¥488(12)`. This is real-time pricing data from 12306 and MUST be shown to the user.\n   - **Flight prices** (if available from Firecrawl, scraping, or API)\n   - All platform links for comparison\n   - Discount conditions section\n   - Search tips\n\n4. **If no flight prices returned**: Inform the user that real-time flight prices could not be fetched automatically, and recommend clicking the platform links to compare prices manually. **Always mention that 12306 train data with real-time prices is available for domestic routes.**\n\n5. **When user asks for \"all\" or combined search**: Present train results and flight results side by side. Do NOT skip or truncate the train price table even when flight data is extensive.\n\n## Date Flexibility\n\nIf a user asks for \"cheapest dates\" or \"price trends\":\n- Run the script with multiple date parameters to compare\n- For domestic flights: Also suggest Ctrip/Qunar price calendar features\n- For international flights: Suggest Skyscanner \"cheapest month\" or Google Flights date grid\n\n## Important Notes\n\n- **Primary method**: Firecrawl + Ctrip (if API key set) - renders JS pages, gets detailed flight data\n- **Fallback scraping**: Direct Ctrip HTTP request - no API key needed, but limited data due to JS rendering\n- **Fallback APIs**: Tequila/Amadeus - only for users who already have keys; registration is closed for new users\n- **Without any flight data**: Platform search links are always provided (users click to see prices)\n- **12306 train data** is always real-time (no API key needed)\n- **SSL verification**: All connections use full TLS verification. 12306 endpoints never bypass SSL — if certificate verification fails, train data is unavailable for that request but all other features (flight search, platform links) still work.\n- **Firecrawl proxy**: Uses `proxy: \"basic\"` for optimal reliability with Chinese booking sites\n- Prices vary in real-time; recommend checking 2-3 platforms for confirmation\n- Airline official websites sometimes offer exclusive prices not available on OTA platforms\n- Always remind users about potential discount conditions before booking\n\nFile v1.2.6:README.md\n\n# Ticket Price Compare - Multi-Platform Ticket Price Comparison\n\n[![Version](https://img.shields.io/badge/Version-v1.2.6-blue)]()\n[![Skill Type](https://img.shields.io/badge/Type-AI%20Skill-blue)]()\n[![Python](https://img.shields.io/badge/Python-3.8%2B-green)]()\n[![License](https://img.shields.io/badge/License-MIT-yellow)]()\n\n> Real-time multi-platform flight and train ticket price comparison Skill. Supports domestic/international routes, 12306 real-time seat availability, Firecrawl-powered detailed flight data, no API key required for core features.\n\n## Highlights\n\n- **Firecrawl-Powered Flight Data** - Renders Ctrip JS pages via Firecrawl, gets detailed flight numbers, times, aircraft types, and prices\n- **Real-Time Train Seat Availability** - Direct 12306 public endpoint, returns actual schedules, seats, and fares\n- **Zero Configuration Core** - 12306 train queries work out of the box; Firecrawl enhances flight data when API key is set\n- **Multi-Source Flight Comparison** - Firecrawl / Ctrip scraping / Tequila / Amadeus multiple data sources\n- **Domestic + International Routes** - Supports both Chinese and English city names\n- **Platform Search Links** - One-click access to Ctrip, Qunar, Fliggy, Tongcheng, Skyscanner, Google Flights, etc.\n- **Airline Official Sites** - Covers 10 Chinese + 13 international airlines\n- **WeChat Mini Program Links** - Mini program search tips for convenient mobile search\n- **Discount Condition Alerts** - Auto-lists student tickets, child tickets, refund/change rules\n\n## Data Sources\n\n| Data Source | Type | API Key Required | Description |\n|-------------|------|:--------------:|-------------|\n| **Firecrawl + Ctrip** | JS Rendering | Optional | Renders Ctrip flight pages, gets individual flight numbers, times, aircraft types, and prices. Set `FIRECRAWL_API_KEY` to enable. Register at [firecrawl.dev](https://firecrawl.dev) |\n| 12306 | Public API | No | Real-time train seat availability and fares |\n| Ctrip Scraping | Direct HTTP | No | Basic flight info without JS rendering (limited data) |\n| Tequila | REST API | Optional | Kiwi.com flight data (registration closed) |\n| Amadeus | REST API | Optional | Global flight data (registration closed) |\n\n## What's New in v1.2.0\n\n- **Firecrawl Integration** - Added `FirecrawlScraper` class that uses Firecrawl's `/v2/scrape` API to render Ctrip's JavaScript-heavy flight search pages, extracting detailed flight data (flight numbers, departure/arrival times, aircraft types, individual cabin prices, transfer details)\n- **Dual-Source Flight Scraping** - PC page (primary) returns per-flight details; mobile H5 page (fallback) returns price calendar with daily lowest prices\n- **Smart Parsing** - Robust markdown parser extracts structured flight data from Ctrip's rendered output, handling various cabin classes and transfer flights\n- **Proxy Optimization** - Switched from `proxy: \"auto\"` to `proxy: \"basic\"` for better reliability with Chinese booking sites\n- **Enhanced Train Prices** - 12306 `queryTicketPrice` endpoint integration for actual fare data per seat type\n\n## Quick Start (Zero Config)\n\nThe script uses only Python standard library, no extra packages needed. Train tickets (12306) work out of the box:\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-05-01 train\n```\n\nFlight search also works without any API key (provides platform links for manual comparison):\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-05-01 flight\n```\n\n> **Tip**: To get detailed flight prices (flight numbers, times, aircraft types) instead of just links, set the `FIRECRAWL_API_KEY` environment variable. See [API Key Setup Guide](#api-key-setup-guide) below.\n\n## API Key Setup Guide\n\nAll API keys are **optional**. The script works without any configuration (train data always available, flight links always provided). API keys only enhance the flight data quality.\n\n### Key Required vs Optional Summary\n\n| API Key | Required? | What It Enables | Registration Status |\n|---------|:---------:|----------------|---------------------|\n| `FIRECRAWL_API_KEY` | **Recommended** | Detailed Ctrip flight data (flight numbers, times, aircraft, prices) | **Open** - Free tier available |\n| `TEQUILA_API_KEY` | No | Kiwi.com international flight data | **Closed** |\n| `AMADEUS_CLIENT_ID` + `AMADEUS_CLIENT_SECRET` | No | Amadeus global flight data | **Closed** |\n\n---\n\n### 1. Firecrawl API Key (Recommended - Free Tier Available)\n\nFirecrawl renders Ctrip's JavaScript-heavy flight pages, extracting detailed flight data that direct HTTP requests cannot get.\n\n#### Step 1: Register\n\n1. Go to [https://firecrawl.dev](https://firecrawl.dev)\n2. Click **\"Get Started\"** or **\"Sign Up\"**\n3. Sign up with Google/GitHub/email\n4. Free tier includes **500 credits/month** (each scrape = 1 credit)\n\n#### Step 2: Get Your API Key\n\n1. After login, go to the **Dashboard**\n2. Copy your **API Key** (format: `fc-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`)\n\n#### Step 3: Set Environment Variable\n\n**Linux / macOS** (temporary, current session only):\n```bash\nexport FIRECRAWL_API_KEY=\"fc-your-actual-api-key-here\"\n```\n\n**Linux / macOS** (permanent, add to `~/.bashrc` or `~/.zshrc`):\n```bash\necho 'export FIRECRAWL_API_KEY=\"fc-your-actual-api-key-here\"' >> ~/.bashrc\nsource ~/.bashrc\n```\n\n**Windows CMD** (temporary, current window only):\n```cmd\nset FIRECRAWL_API_KEY=fc-your-actual-api-key-here\n```\n\n**Windows CMD** (permanent, system-level):\n```cmd\nsetx FIRECRAWL_API_KEY \"fc-your-actual-api-key-here\"\n```\n> Note: `setx` takes effect in **new** terminal windows, not the current one.\n\n**Windows PowerShell** (temporary, current session only):\n```powershell\n$env:FIRECRAWL_API_KEY = \"fc-your-actual-api-key-here\"\n```\n\n**Windows PowerShell** (permanent, user-level):\n```powershell\n[Environment]::SetEnvironmentVariable(\"FIRECRAWL_API_KEY\", \"fc-your-actual-api-key-here\", \"User\")\n```\n> Note: Takes effect in **new** PowerShell sessions.\n\n#### Step 4: Verify\n\n```bash\npython scripts/ticket_search.py Beijing Shanghai 2026-05-01 flight\n```\nIf you see `Data Source: Ctrip (via Firecrawl)` in the output, the key is working.\n\n> **No pip install needed** - the script calls Firecrawl's REST API directly via Python's built-in `urllib` library.\n\n---\n\n### 2. Tequila API Key (Optional - Registration Closed)\n\nKiwi.com Tequila API for international flight data. **Self-service registration is no longer available.**\n\nIf you already have a key:\n\n**Linux / macOS:**\n```bash\nexport TEQUILA_API_KEY=\"your-tequila-api-key\"\n```\n\n**Windows CMD:**\n```cmd\nset TEQUILA_API_KEY=your-tequila-api-key\n```\n\n**Windows PowerShell:**\n```powershell\n$env:TEQUILA_API_KEY = \"your-tequila-api-key\"\n```\n\n---\n\n### 3. Amadeus API Keys (Optional - Registration Closed)\n\nAmadeus API for global flight data. **Self-service registration is closed.**\n\nIf you already have keys, you also need to install the SDK:\n\n```bash\npip install amadeus>=12.0.0\n```\n\nThen set both environment variables:\n\n**Linux / macOS:**\n```bash\nexport AMADEUS_CLIENT_ID=\"your-client-id\"\nexport AMADEUS_CLIENT_SECRET=\"your-client-secret\"\n```\n\n**Windows CMD:**\n```cmd\nset AMADEUS_CLIENT_ID=your-client-id\nset AMADEUS_CLIENT_SECRET=your-client-secret\n```\n\n**Windows PowerShell:**\n```powershell\n$env:AMADEUS_CLIENT_ID = \"your-client-id\"\n$env:AMADEUS_CLIENT_SECRET = \"your-client-secret\"\n```\n\n---\n\n### Environment Variable Quick Reference\n\n| Variable | Where to Get | Format | Required? |\n|----------|-------------|--------|:---------:|\n| `FIRECRAWL_API_KEY` | [firecrawl.dev](https://firecrawl.dev) Dashboard | `fc-xxxx...` | Recommended |\n| `TEQUILA_API_KEY` | Kiwi.com (closed) | String | No |\n| `AMADEUS_CLIENT_ID` | Amadeus (closed) | String | No |\n| `AMADEUS_CLIENT_SECRET` | Amadeus (closed) | String | No |\n\n> **Note**: Environment variables set via `export`/`set`/`$env:` are session-only and will be lost when you close the terminal. Use `setx` (Windows) or add to `~/.bashrc` (Linux/macOS) for persistence.\n\n## Usage\n\n### Train Ticket Search\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 train\n```\n\n### Flight Ticket Search\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 flight\n```\n\n### Combined Search (Flight + Train)\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 all\n```\n\n### International Routes\n\n```bash\npython scripts/ticket_search.py Shanghai Tokyo 2026-06-15 flight\npython scripts/ticket_search.py Shanghai Tokyo 2026-06-15 all\n```\n\n## Output Examples\n\n### Flight Ticket Output (with Firecrawl)\n\n```\n=== Flight Search Results ===\nDeparture: Beijing  Arrival: Shanghai  Date: 2026-04-25\nData Source: Ctrip (via Firecrawl)\n\nFlight     Airline         Aircraft      Depart  Arrive    Price\nCA1501     Air China       Boeing 737    07:30   09:45     CNY 520\nMU5101     China Eastern   Airbus A320   08:00   10:20     CNY 480\nCZ6901     China Southern  Airbus A321   09:00   11:15     CNY 460\n...\n\nPlatform Search Links:\n- Ctrip: https://flights.ctrip.com/...\n- Qunar: https://flight.qunar.com/...\n- Skyscanner: https://www.skyscanner.net/...\n```\n\n### Train Ticket Output\n\n```\n=== 12306 Real-Time Query Results ===\nDeparture: Beijing  Arrival: Guangzhou  Date: 2026-04-20\n\nTrain    Departure->Arrival       Time          Duration  Second Class  First Class\nG303     Beijing Xi->Guangzhou South  10:00-17:17   7:17     CNY 1033     CNY 1488\nD923     Beijing Xi->Guangzhou South  20:22-06:47   10:25    CNY 709      -\nZ13      Beijing Fengtai->Guangzhou Baiyun  14:25-12:36+1  22:11   -   CNY 251 (Hard Sleeper)\n```\n\n## Project Structure\n\n```\nticket-price-compare/\n+-- SKILL.md                        # Skill definition (triggers, workflow)\n+-- README.md                       # This file\n+-- .gitignore\n+-- references/\n|   +-- platforms_guide.md          # Detailed per-platform discount conditions\n+-- scripts/\n    +-- ticket_search.py            # Core search script (~2200 lines)\n    +-- requirements.txt            # Dependencies (core has zero dependencies)\n    +-- skyscanner_lib/             # Skyscanner affiliate link builder\n```\n\n## Technical Details\n\n- **Core Zero Dependencies** - `ticket_search.py` uses only Python standard library (`urllib`, `json`, `ssl`)\n- **Firecrawl JS Rendering** - Calls Firecrawl `/v2/scrape` API with `waitFor: 15000ms` and `proxy: \"basic\"` to render Ctrip's React-based flight search pages, then parses the resulting markdown\n- **Dual-Source Ctrip** - PC page (`flights.ctrip.com`) for per-flight details; mobile H5 (`m.ctrip.com`) for price calendar fallback\n- **12306 Endpoints** - Uses `leftTicket/queryZ` for schedules + `queryTicketPrice` for actual fares, no login required\n- **City Name Mapping** - Built-in 200+ Chinese city/station name to IATA/telegraph code mapping\n- **SSL Security** - All connections use full TLS verification. 12306 endpoints never bypass SSL — if certificate verification fails, train data is unavailable for that request but all other features (flight search, platform links) still work.\n- **Encoding Compatibility** - Auto-handles Windows console UTF-8 encoding issues\n\n## Flight Data Source Priority\n\n1. **Firecrawl + Ctrip PC** (if `FIRECRAWL_API_KEY` set) - Best quality: individual flights, times, aircraft, prices\n2. **Firecrawl + Ctrip Mobile** (fallback) - Price calendar with daily lowest prices\n3. **Direct Ctrip Scraping** (no API key) - Limited data, may not work due to JS rendering\n4. **Tequila API** (if key set) - International flights\n5. **Amadeus API** (if keys set) - Global flights\n6. **Platform Links Only** - If no data source returns prices, provides direct links for manual search\n\n## As an AI Skill\n\nThis Skill can be used on AI skill platforms such as CodeBuddy / ClawHub. It auto-triggers when users ask:\n\n- \"Find me flights from Beijing to Guangzhou\"\n- \"How much is Shanghai to Tokyo on April 20\"\n- \"Check train ticket seat availability\"\n- \"Which platform has the cheapest flights\"\n- \"What student ticket discounts are available\"\n\n## License\n\nMIT\n\nFile v1.2.6:_meta.json\n\n{\n  \"ownerId\": \"kn74yqvqr8gy2c7yr0n4yg1kv584p8mw\",\n  \"slug\": \"ticket-price-compare\",\n  \"version\": \"1.2.6\",\n  \"publishedAt\": 1777134501307\n}\n\nFile v1.2.6:references/platforms_guide.md\n\n# Ticket Price Comparison Platform Detailed Guide\n\n## 1. Domestic Flight Platforms\n\n### Ctrip\n- **URL**: https://flights.ctrip.com\n- **Advantages**: Largest domestic OTA, most comprehensive flight coverage, good refund/change service\n- **Features**:\n  - Price calendar: view price trends for 7 days before/after\n  - Ctrip special deals section\n  - Ctrip premium member discounts\n- **Common Discount Conditions**:\n  - New user first-order discount (requires new account registration)\n  - Ctrip Black Diamond/Diamond member exclusive discounts\n  - Bank card payment discount (requires specific bank card)\n  - Early/late flight specials (typically flights before 6:00 or after 22:00)\n\n### Qunar\n- **URL**: https://flight.qunar.com\n- **Advantages**: Price comparison aggregator, compare multiple agent prices for the same flight\n- **Features**:\n  - Price monitoring alerts\n  - Special deals calendar\n  - \"Last-minute\" low-price flight recommendations\n- **Common Discount Conditions**:\n  - Agent coupons (discount vouchers)\n  - Qunar new user welcome package\n  - Special fare cabins (may be group tickets, strict refund/change rules)\n  - Flash sales (typically limited to 2 hours)\n\n### Fliggy\n- **URL**: https://www.fliggy.com\n- **Advantages**: Alibaba ecosystem, 88VIP members get extra discounts\n- **Features**:\n  - Fliggy mileage offset\n  - Taobao/Alipay quick payment\n  - Credit Fly (fly now, pay later)\n- **Common Discount Conditions**:\n  - 88VIP member exclusive prices\n  - Alipay payment random discount\n  - New user exclusive coupons\n  - Mileage redemption discount\n\n### Tongcheng (LY.com)\n- **URL**: https://www.ly.com\n- **Advantages**: WeChat mini program easy access, sometimes has exclusive low prices\n- **Features**:\n  - WeChat one-click login and purchase\n  - Tongcheng Black Whale member discount\n  - CNY 9.9 flight deals section (limited quantity)\n- **Common Discount Conditions**:\n  - WeChat Pay exclusive discount\n  - Tongcheng member tier discount\n  - Flash sale prices (limited quantity)\n\n### Spring Airlines Official Site\n- **URL**: https://www.ch.com\n- **Advantages**: Low-cost carrier, usually the lowest prices\n- **Features**:\n  - CNY 9/99/199 special tickets\n  - Spring Green Wing member discount\n- **Common Discount Conditions**:\n  - Special tickets do not include checked baggage (must purchase separately)\n  - No free meals\n  - Smaller seat pitch\n  - High refund/change fees\n  - Special tickets usually non-refundable and non-changeable\n\n## 2. International Flight Platforms\n\n### Skyscanner\n- **URL**: https://www.skyscanner.net\n- **Advantages**: World's largest flight comparison, covers 1200+ airlines and OTAs\n- **Features**:\n  - \"Cheapest month\" search\n  - \"Everywhere\" exploration (enter departure, find cheapest destination)\n  - Price alert feature\n- **Common Discount Conditions**:\n  - Special tickets usually non-refundable and non-changeable\n  - Some prices from agents (refund/change must contact agent)\n  - Connecting flights are cheaper but take longer\n\n### Google Flights\n- **URL**: https://www.google.com/travel/flights\n- **Advantages**: Calendar view shows monthly low prices, accurate price prediction algorithm\n- **Features**:\n  - Price trend chart (whether to buy now)\n  - Date grid (price comparison across dates)\n  - Explore destinations feature\n- **Common Discount Conditions**:\n  - Google does not sell tickets directly, redirects to airline/OTA\n  - Prices may vary based on cookie/login status\n  - Some deals only available on airline official sites\n\n### Kayak\n- **URL**: https://www.kayak.com\n- **Advantages**: Excellent price prediction, \"Hacker Fares\" combine different airlines for round-trip\n- **Features**:\n  - Price forecast (buy/wait recommendation)\n  - Hacker Fares (outbound and return on different airlines)\n  - Flexible date search\n- **Common Discount Conditions**:\n  - Hacker Fares require purchasing two separate tickets\n  - If change needed, each ticket handled separately\n  - Some combinations may lack connection protection\n\n### Momondo\n- **URL**: https://www.momondo.com\n- **Advantages**: Often finds hidden low prices not available on other platforms\n- **Features**:\n  - \"Flight Insight\" shows best booking time\n  - \"Ticket Check\" validates fare reasonableness\n- **Common Discount Conditions**:\n  - Some low prices from small travel agencies\n  - Refund/change must contact ticket issuer\n  - Ticket confirmation may be slow\n\n## 3. International Airline Official Site Discount Conditions\n\n### Common Discount Types\n| Discount Type | Description | Conditions |\n|---------------|-------------|------------|\n| Early Bird | Book 60/90 days in advance for discount | Must book in advance, non-refundable/changeable |\n| Member Exclusive | Airline member exclusive discount | Must register as member (free) |\n| Credit Card | Specific credit card payment discount | Must hold designated credit card |\n| Student Discount | Discount for passengers aged 12-25 | Must provide student proof |\n| Senior Discount | Discount for passengers aged 60+ | Must provide age proof |\n| Military Discount | Discount for active/retired military | Must provide military proof |\n| Group Tickets | Discount for 10+ passengers | Must issue tickets together, partial refund not allowed |\n| Codeshare | Alliance partner shared pricing | Actual operating carrier may differ |\n| Mileage Redemption | Frequent flyer miles for tickets | Must have sufficient miles, high change fees |\n| Transit Special | Special fares via specific connecting cities | Must accept longer connection times |\n\n## 4. Train Ticket Discount Conditions\n\n### 12306 Discounts\n| Discount Type | Description | Conditions |\n|---------------|-------------|------------|\n| Student Ticket | 50% off regular hard seat, 25% off EMU second class | Must be within discount route, 4 times per year |\n| Child Ticket | Half price for height 1.2-1.5m | Must be accompanied by adult |\n| Military Priority | Active military priority booking | Must show military ID |\n| Points Redemption | 10000 points for one free ticket | Must register as 12306 member |\n\n### Third-Party Platform Additional Discounts\n| Platform | Discount | Conditions |\n|----------|----------|------------|\n| Ctrip | Ticket-grabbing acceleration package | Paid purchase, increases waitlist success rate |\n| Qunar | Smart transfer recommendation | May require transfer, total time increases |\n| Fliggy | New user coupon | First train ticket purchase |\n| Tongcheng | WeChat Pay instant discount | Auto-deducted when using WeChat Pay |\n\n## 5. Common Restrictions on Special Fares\n\n### Flight Special Fare Restrictions\n1. **Non-refundable/Non-changeable**: Most special tickets cannot be refunded or changed\n2. **Baggage Limits**: LCC special tickets usually include only 7kg carry-on, checked baggage costs extra\n3. **Cabin Class**: Special tickets are lowest cabin class (e.g., below Y class), limited seat selection\n4. **Date Restrictions**: Special tickets valid only on specific dates/time slots\n5. **Quantity Limits**: Special tickets are limited, sold out quickly\n6. **Identity Restrictions**: Some deals only for new users/members\n7. **Payment Restrictions**: Some discounts require specific payment methods\n8. **Transit Restrictions**: International specials may require transit via specific cities, may need transit visa\n9. **Change Fees**: Even if changeable, fees may approach ticket face value\n10. **Ticketing Deadline**: Some special tickets must be paid within 24 hours of booking\n\n### Train Special Fare Restrictions\n1. **Student Tickets**: Only during winter/summer break, must be within student certificate discount route\n2. **Waitlist**: No guarantee of waitlist success\n3. **Change Limits**: No refund after departure, only one change allowed\n4. **Transfer Tickets**: Passenger responsible for any issues caused by insufficient transfer time\n\nFile v1.2.6:scripts/requirements.txt\n\n# No required dependencies - the script uses Python stdlib only\n# Web scraping for flight prices (Ctrip/Qunar) and 12306 train API\n# work out of the box without any additional packages.\n\n# Optional: Firecrawl (JS rendering for Ctrip flight pages)\n# Set FIRECRAWL_API_KEY env var to enable. Register at https://firecrawl.dev\n# No pip install needed - uses REST API via urllib\n\n# Optional: Amadeus Python SDK (only for existing Amadeus API key holders)\n# amadeus>=12.0.0\n\nFile v1.2.6:RELEASE_NOTES.md\n\n# Release Notes — ticket-price-compare\n\n## v1.2.5 — Security Hardening\n\n**⚠️ Breaking Change**: 12306 SSL unverified fallback is no longer automatic.\n\n### Security Fixes\n- **SSL fallback now opt-in only**: The `_urlopen_12306()` function previously auto-fell back to unverified SSL (`ssl.CERT_NONE`) when certificate verification failed. This has been flagged as a MITM risk. Now:\n  - **Default behavior**: SSL certificate errors raise an exception with a helpful message\n  - **Opt-in fallback**: Set `TICKET_ALLOW_UNVERIFIED_SSL=true` to re-enable the fallback (only on trusted networks)\n  - This change was prompted by a ClawHub security review that identified the automatic SSL bypass as a vulnerability\n\n### Manifest Transparency\n- **Environment variables declared**: SKILL.md frontmatter now includes `environment_variables` section declaring all 5 env vars:\n  - `FIRECRAWL_API_KEY` (optional, recommended)\n  - `TEQUILA_API_KEY` (optional, registration closed)\n  - `AMADEUS_CLIENT_ID` (optional, registration closed)\n  - `AMADEUS_CLIENT_SECRET` (optional, registration closed)\n  - `TICKET_ALLOW_UNVERIFIED_SSL` (optional, opt-in security flag)\n- **Network access declared**: SKILL.md frontmatter now includes `network_access` section listing all 8 target domains with purpose descriptions:\n  - `kyfw.12306.cn` — Train schedule & fare queries\n  - `flights.ctrip.com` — Ctrip PC flight search\n  - `m.ctrip.com` — Ctrip mobile H5 fallback\n  - `flight.qunar.com` — Qunar link generation\n  - `api.firecrawl.dev` — Firecrawl JS rendering API\n  - `api.tequila.kiwi.com` — Kiwi.com Tequila API\n  - `api.amadeus.com` — Amadeus production API\n  - `test.api.amadeus.com` — Amadeus test API\n\n### Files Changed\n- `scripts/ticket_search.py` — SSL fallback made opt-in, `_ALLOW_UNVERIFIED_SSL` env var check\n- `SKILL.md` — Added `version`, `environment_variables`, `network_access` in frontmatter; updated SSL description\n- `README.md` — Updated version badge, SSL description, environment variable table\n- `skill.json` — Added `environment_variables` and `network_access` sections\n\n---\n\n## v1.2.4 — SSL Verify-First Strategy\n\n- Replaced blanket `ssl.CERT_NONE` with \"verify first, fallback on error\" strategy via `_urlopen_12306()` function\n- Default context uses full TLS verification; fallback to unverified only on SSL certificate errors\n- All other connections always use full TLS verification\n\n---\n\n## v1.2.3 — Train Output Format Optimization\n\n- **Unified single table**: Merged dual-table train output (schedule + price) into one table with \"票价（余票）\" column\n- Price+seat availability combined: e.g., `二等座¥305(有) / 一等座¥488(12)`\n- Fixed AI agents ignoring train price data due to confusing dual-table format\n- Added `IMPORTANT` directive in SKILL.md workflow to prevent AI from omitting train prices\n- Added step 5: mixed search must not truncate train price table\n\n---\n\n## v1.2.2 — API Key Setup Guide\n\n- Rewrote Installation section into comprehensive \"API Key Setup Guide\"\n- Step-by-step instructions for Firecrawl, Tequila, and Amadeus keys\n- Covers all platforms: Linux/macOS, Windows CMD, Windows PowerShell\n- Both temporary and permanent environment variable setup methods\n- Environment Variable Quick Reference table\n- Clarified that Firecrawl uses REST API directly (no pip install needed)\n\n---\n\n## v1.2.1 — ClawHub Publishing Fix\n\n- Re-published to ClawHub as v1.2.1 (v1.2.0 already existed)\n\n---\n\n## v1.2.0 — Firecrawl Integration\n\n- **Firecrawl JS Rendering**: Added `FirecrawlScraper` class using `/v2/scrape` API to render Ctrip's JavaScript-heavy flight pages\n- **Dual-Source Ctrip**: PC page (primary) returns per-flight details; mobile H5 page (fallback) returns price calendar\n- **Smart Parsing**: Robust markdown parser extracts structured flight data from rendered output\n- **Proxy Optimization**: Switched from `proxy: \"auto\"` to `proxy: \"basic\"` for Chinese booking sites\n- **Enhanced Train Prices**: 12306 `queryTicketPrice` endpoint for actual fares per seat type\n\nFile v1.2.6:skill-card.md\n\n## Description: <br>\nCompares flight and train ticket prices across multiple platforms, including real-time 12306 train availability, optional Firecrawl-rendered Ctrip flight data, booking links, mobile quick links, and discount condition details. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[amurtiger01](https://clawhub.ai/user/amurtiger01) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and agents use this skill to compare domestic China and international flight or train options, inspect real-time fares or availability where available, and open provider-specific booking links. It is intended for travel price discovery and comparison, not autonomous purchasing. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Route, date, and city searches may be shared with 12306, Ctrip, Firecrawl, Tequila, or Amadeus depending on configuration. <br>\nMitigation: Only configure optional provider API keys for services the user accepts, and avoid submitting sensitive travel searches unless external provider disclosure is acceptable. <br>\nRisk: Optional API keys and client secrets are sensitive credentials. <br>\nMitigation: Store provider credentials in environment variables and limit them to the services needed for the search. <br>\nRisk: Ticket prices, availability, booking links, and discount conditions can change before purchase. <br>\nMitigation: Verify prices, seat availability, refund rules, baggage terms, and eligibility conditions on the booking platform before buying. <br>\n\n\n## Reference(s): <br>\n- [Ticket Price Compare on ClawHub](https://clawhub.ai/amurtiger01/ticket-price-compare) <br>\n- [Ticket Price Comparison Platform Detailed Guide](references/platforms_guide.md) <br>\n- [Firecrawl](https://firecrawl.dev) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Text, Markdown, Shell commands, Guidance] <br>\n**Output Format:** [Markdown or plain text with fare tables, route summaries, provider links, discount notes, and optional bash commands.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May include real-time external query results, direct booking or search links, and warnings when live flight data is unavailable.] <br>\n\n## Skill Version(s): <br>\n1.2.6 (source: server evidence and SKILL.md frontmatter) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.2.5: 6 files, 39113 bytes\n\nFiles: README.md (12120b), references/platforms_guide.md (7813b), scripts/requirements.txt (469b), scripts/ticket_search.py (98544b), SKILL.md (10407b), _meta.json (139b)\n\nFile v1.2.5:SKILL.md\n\n---\nname: ticket-price-compare\nversion: 1.2.5\ndescription: This skill should be used when the user wants to compare and search for flight or train ticket prices across multiple platforms. It supports both domestic (China) and international routes, fetches real-time train availability via 12306, uses Firecrawl to render Ctrip JS pages for detailed flight data (flight numbers, times, aircraft types, prices), generates direct search links for all major booking platforms and airline official websites, provides WeChat mini program quick links for mobile search, and highlights discount conditions. Trigger scenarios include: searching for cheap flights, comparing train ticket prices, finding international flight deals, looking for the best ticket booking platform, or asking about ticket discount conditions.\nenvironment_variables:\n  - name: FIRECRAWL_API_KEY\n    required: false\n    description: \"Firecrawl API key for JS rendering of Ctrip flight pages. Register at firecrawl.dev. Free tier available (500 credits/month).\"\n  - name: TEQUILA_API_KEY\n    required: false\n    description: \"Kiwi.com Tequila API key for international flight data. Self-service registration is closed.\"\n  - name: AMADEUS_CLIENT_ID\n    required: false\n    description: \"Amadeus API client ID. Self-service registration is closed.\"\n  - name: AMADEUS_CLIENT_SECRET\n    required: false\n    description: \"Amadeus API client secret. Self-service registration is closed.\"\n  - name: TICKET_ALLOW_UNVERIFIED_SSL\n    required: false\n    description: \"Set to 'true' to allow fallback to unverified SSL for 12306.cn when certificate verification fails. Default: disabled (SSL errors raise exceptions instead of silently bypassing). Only enable on trusted networks.\"\nnetwork_access:\n  - domain: kyfw.12306.cn\n    purpose: \"12306 train schedule & fare queries (public API, no auth)\"\n  - domain: flights.ctrip.com\n    purpose: \"Ctrip PC flight search page (scraping / Firecrawl JS rendering)\"\n  - domain: m.ctrip.com\n    purpose: \"Ctrip mobile H5 flight page (Firecrawl fallback for price calendar)\"\n  - domain: flight.qunar.com\n    purpose: \"Qunar flight search page (link generation)\"\n  - domain: api.firecrawl.dev\n    purpose: \"Firecrawl /v2/scrape API for JS rendering (optional, requires FIRECRAWL_API_KEY)\"\n  - domain: api.tequila.kiwi.com\n    purpose: \"Kiwi.com Tequila flight search API (optional, requires TEQUILA_API_KEY)\"\n  - domain: api.amadeus.com\n    purpose: \"Amadeus production API (optional, requires AMADEUS credentials)\"\n  - domain: test.api.amadeus.com\n    purpose: \"Amadeus test API (optional, for development)\"\n---\n\n# Ticket Price Compare - Multi-Platform Ticket Price Comparison\n\n## Overview\n\nThis skill enables real-time comparison of flight and train ticket prices. It fetches **real-time train availability** via 12306 (no API key needed), and uses **Firecrawl to render Ctrip JS pages** for detailed flight data when `FIRECRAWL_API_KEY` is set. It also generates direct search links for all major booking platforms and **WeChat mini program quick links** for convenient mobile search. Tequila/Amadeus APIs are available as optional fallbacks for users who already have keys. Discount conditions and restrictions are clearly listed separately.\n\n## Data Sources\n\n### Firecrawl + Ctrip (Primary for Flight Data, Optional API Key)\n- Uses Firecrawl's `/v2/scrape` API to render Ctrip's JavaScript-heavy flight search pages\n- **PC page** (primary): Returns individual flight numbers, times, aircraft types, and prices\n- **Mobile H5 page** (fallback): Returns price calendar with daily lowest prices across dates\n- Requires `FIRECRAWL_API_KEY` environment variable. Register at [firecrawl.dev](https://firecrawl.dev)\n- Falls back gracefully to direct scraping if not configured\n\n### Ctrip Direct Scraping (No API Key Needed)\n- Attempts direct HTTP request to Ctrip flight search pages\n- **No registration or API key required** - works out of the box\n- Limited data: Ctrip renders pages via JavaScript, so direct scraping may not always return prices. In that case, platform links are provided for manual search.\n\n### 12306 (Train Tickets, No API Key Needed)\n- Uses 12306 public `leftTicket/queryZ` endpoint for real-time train availability\n- Uses 12306 public `queryTicketPrice` endpoint for actual fares per seat type\n- Supports major Chinese cities with station code auto-mapping\n\n### Optional APIs (For Existing Key Holders Only)\n- **Kiwi.com Tequila API**: If `TEQUILA_API_KEY` is set (registration may no longer be available)\n- **Amadeus API**: If `AMADEUS_CLIENT_ID` + `AMADEUS_CLIENT_SECRET` are set (registration is closed)\n- These are used as fallbacks only when web scraping returns no results\n\n## Core Capabilities\n\n### 1. Flight Ticket Search\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" flight\n```\n- Domestic: `python scripts/ticket_search.py \"Beijing\" \"Shanghai\" \"2026-05-01\" flight`\n- International: `python scripts/ticket_search.py \"Shanghai\" \"Tokyo\" \"2026-06-15\" flight`\n\n**Data sources (in order of priority)**:\n1. Firecrawl + Ctrip PC page (if `FIRECRAWL_API_KEY` set) - Best quality: individual flights, times, aircraft, prices\n2. Firecrawl + Ctrip Mobile H5 (fallback) - Price calendar with daily lowest prices\n3. Ctrip Direct Scraping (no API key, limited data)\n4. Tequila API (if API key configured)\n5. Amadeus API (if API keys configured)\n\n**Covered domestic platforms**: Ctrip, Qunar, Fliggy, Tongcheng, Tuniu\n\n**Covered international platforms**: Skyscanner, Google Flights, Kayak, Momondo, Expedia, Booking.com\n\n**Covered airline official sites**: 10 Chinese + 13 international airlines\n\n### 2. Train Ticket Search with Real-Time Availability\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" train\n```\n\n**Real-time data from 12306**: Returns actual train schedules with:\n- Train code & type (High-Speed/EMU/Express/Fast)\n- Departure/arrival stations & times\n- Duration\n- Available seat types & counts (Business Class/First Class/Second Class/Hard Sleeper/Hard Seat etc.)\n- Actual fares per seat type\n\n### 3. Combined Search (Flight + Train)\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" all\n```\n\nTrain results are automatically excluded for international routes.\n\n## Output Sections\n\nThe script generates structured output with these sections (in order):\n\n1. **Route Summary** - Departure, arrival, date, route type\n2. **Data Source Status** - Whether Firecrawl/scraping/APIs returned live data\n3. **Real-Time Flight Prices** - Table of flight offers with prices (if available)\n4. **Transfer Details** - Multi-segment flight details (if any transfers)\n5. **Flight Discount Conditions** - Refund/change rules, baggage limits, cabin restrictions\n6. **Real-Time Train Info** - Table of actual trains with seat availability and fares (if domestic)\n7. **Train Discount Conditions** - Student tickets, child tickets, change rules\n8. **Platform Links** - Direct search URLs for all booking platforms\n9. **Airline Official Sites** - Direct links to airline websites\n10. **WeChat Mini Program Quick Links** - Mobile H5 links + WeChat mini program search tips for Ctrip/Fliggy/Tongcheng/Qunar and major airlines\n11. **Search Tips** - Route-specific advice\n\n### Discount Conditions\n\nAlways include the dedicated \"Discount Conditions / Restrictions\" section. Reference `references/platforms_guide.md` for detailed per-platform discount conditions. Load this file when:\n- User asks about specific discount conditions\n- Presenting results that include discounted fares\n- User asks which platform has the best deals for their situation\n\n## Workflow\n\n1. **Collect query parameters**: Get departure city, arrival city, and travel date. If date not specified, ask. Default ticket type to \"all\".\n\n2. **Execute search**: Run `scripts/ticket_search.py` with the parameters.\n\n3. **Present results**: Show the **complete output** from the script. **IMPORTANT**: Do NOT summarize or omit train ticket price information. Always include:\n   - **Train ticket prices** - The \"票价（余票）\" column contains actual fares like `二等座¥305(有) / 一等座¥488(12)`. This is real-time pricing data from 12306 and MUST be shown to the user.\n   - **Flight prices** (if available from Firecrawl, scraping, or API)\n   - All platform links for comparison\n   - Discount conditions section\n   - Search tips\n\n4. **If no flight prices returned**: Inform the user that real-time flight prices could not be fetched automatically, and recommend clicking the platform links to compare prices manually. **Always mention that 12306 train data with real-time prices is available for domestic routes.**\n\n5. **When user asks for \"all\" or combined search**: Present train results and flight results side by side. Do NOT skip or truncate the train price table even when flight data is extensive.\n\n## Date Flexibility\n\nIf a user asks for \"cheapest dates\" or \"price trends\":\n- Run the script with multiple date parameters to compare\n- For domestic flights: Also suggest Ctrip/Qunar price calendar features\n- For international flights: Suggest Skyscanner \"cheapest month\" or Google Flights date grid\n\n## Important Notes\n\n- **Primary method**: Firecrawl + Ctrip (if API key set) - renders JS pages, gets detailed flight data\n- **Fallback scraping**: Direct Ctrip HTTP request - no API key needed, but limited data due to JS rendering\n- **Fallback APIs**: Tequila/Amadeus - only for users who already have keys; registration is closed for new users\n- **Without any flight data**: Platform search links are always provided (users click to see prices)\n- **12306 train data** is always real-time (no API key needed)\n- **SSL verification**: 12306 endpoints use full TLS verification by default. If certificate verification fails, the script raises an error rather than silently bypassing. To opt in to the unverified SSL fallback (reduces MITM protection), set `TICKET_ALLOW_UNVERIFIED_SSL=true` environment variable — only recommended on trusted networks. All other connections always use full TLS verification.\n- **Firecrawl proxy**: Uses `proxy: \"basic\"` for optimal reliability with Chinese booking sites\n- Prices vary in real-time; recommend checking 2-3 platforms for confirmation\n- Airline official websites sometimes offer exclusive prices not available on OTA platforms\n- Always remind users about potential discount conditions before booking\n\nFile v1.2.5:README.md\n\n# Ticket Price Compare - Multi-Platform Ticket Price Comparison\n\n[![Version](https://img.shields.io/badge/Version-v1.2.5-blue)]()\n[![Skill Type](https://img.shields.io/badge/Type-AI%20Skill-blue)]()\n[![Python](https://img.shields.io/badge/Python-3.8%2B-green)]()\n[![License](https://img.shields.io/badge/License-MIT-yellow)]()\n\n> Real-time multi-platform flight and train ticket price comparison Skill. Supports domestic/international routes, 12306 real-time seat availability, Firecrawl-powered detailed flight data, no API key required for core features.\n\n## Highlights\n\n- **Firecrawl-Powered Flight Data** - Renders Ctrip JS pages via Firecrawl, gets detailed flight numbers, times, aircraft types, and prices\n- **Real-Time Train Seat Availability** - Direct 12306 public endpoint, returns actual schedules, seats, and fares\n- **Zero Configuration Core** - 12306 train queries work out of the box; Firecrawl enhances flight data when API key is set\n- **Multi-Source Flight Comparison** - Firecrawl / Ctrip scraping / Tequila / Amadeus multiple data sources\n- **Domestic + International Routes** - Supports both Chinese and English city names\n- **Platform Search Links** - One-click access to Ctrip, Qunar, Fliggy, Tongcheng, Skyscanner, Google Flights, etc.\n- **Airline Official Sites** - Covers 10 Chinese + 13 international airlines\n- **WeChat Mini Program Links** - Mini program search tips for convenient mobile search\n- **Discount Condition Alerts** - Auto-lists student tickets, child tickets, refund/change rules\n\n## Data Sources\n\n| Data Source | Type | API Key Required | Description |\n|-------------|------|:--------------:|-------------|\n| **Firecrawl + Ctrip** | JS Rendering | Optional | Renders Ctrip flight pages, gets individual flight numbers, times, aircraft types, and prices. Set `FIRECRAWL_API_KEY` to enable. Register at [firecrawl.dev](https://firecrawl.dev) |\n| 12306 | Public API | No | Real-time train seat availability and fares |\n| Ctrip Scraping | Direct HTTP | No | Basic flight info without JS rendering (limited data) |\n| Tequila | REST API | Optional | Kiwi.com flight data (registration closed) |\n| Amadeus | REST API | Optional | Global flight data (registration closed) |\n\n## What's New in v1.2.0\n\n- **Firecrawl Integration** - Added `FirecrawlScraper` class that uses Firecrawl's `/v2/scrape` API to render Ctrip's JavaScript-heavy flight search pages, extracting detailed flight data (flight numbers, departure/arrival times, aircraft types, individual cabin prices, transfer details)\n- **Dual-Source Flight Scraping** - PC page (primary) returns per-flight details; mobile H5 page (fallback) returns price calendar with daily lowest prices\n- **Smart Parsing** - Robust markdown parser extracts structured flight data from Ctrip's rendered output, handling various cabin classes and transfer flights\n- **Proxy Optimization** - Switched from `proxy: \"auto\"` to `proxy: \"basic\"` for better reliability with Chinese booking sites\n- **Enhanced Train Prices** - 12306 `queryTicketPrice` endpoint integration for actual fare data per seat type\n\n## Quick Start (Zero Config)\n\nThe script uses only Python standard library, no extra packages needed. Train tickets (12306) work out of the box:\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-05-01 train\n```\n\nFlight search also works without any API key (provides platform links for manual comparison):\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-05-01 flight\n```\n\n> **Tip**: To get detailed flight prices (flight numbers, times, aircraft types) instead of just links, set the `FIRECRAWL_API_KEY` environment variable. See [API Key Setup Guide](#api-key-setup-guide) below.\n\n## API Key Setup Guide\n\nAll API keys are **optional**. The script works without any configuration (train data always available, flight links always provided). API keys only enhance the flight data quality.\n\n### Key Required vs Optional Summary\n\n| API Key | Required? | What It Enables | Registration Status |\n|---------|:---------:|----------------|---------------------|\n| `FIRECRAWL_API_KEY` | **Recommended** | Detailed Ctrip flight data (flight numbers, times, aircraft, prices) | **Open** - Free tier available |\n| `TEQUILA_API_KEY` | No | Kiwi.com international flight data | **Closed** |\n| `AMADEUS_CLIENT_ID` + `AMADEUS_CLIENT_SECRET` | No | Amadeus global flight data | **Closed** |\n\n---\n\n### 1. Firecrawl API Key (Recommended - Free Tier Available)\n\nFirecrawl renders Ctrip's JavaScript-heavy flight pages, extracting detailed flight data that direct HTTP requests cannot get.\n\n#### Step 1: Register\n\n1. Go to [https://firecrawl.dev](https://firecrawl.dev)\n2. Click **\"Get Started\"** or **\"Sign Up\"**\n3. Sign up with Google/GitHub/email\n4. Free tier includes **500 credits/month** (each scrape = 1 credit)\n\n#### Step 2: Get Your API Key\n\n1. After login, go to the **Dashboard**\n2. Copy your **API Key** (format: `fc-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`)\n\n#### Step 3: Set Environment Variable\n\n**Linux / macOS** (temporary, current session only):\n```bash\nexport FIRECRAWL_API_KEY=\"fc-your-actual-api-key-here\"\n```\n\n**Linux / macOS** (permanent, add to `~/.bashrc` or `~/.zshrc`):\n```bash\necho 'export FIRECRAWL_API_KEY=\"fc-your-actual-api-key-here\"' >> ~/.bashrc\nsource ~/.bashrc\n```\n\n**Windows CMD** (temporary, current window only):\n```cmd\nset FIRECRAWL_API_KEY=fc-your-actual-api-key-here\n```\n\n**Windows CMD** (permanent, system-level):\n```cmd\nsetx FIRECRAWL_API_KEY \"fc-your-actual-api-key-here\"\n```\n> Note: `setx` takes effect in **new** terminal windows, not the current one.\n\n**Windows PowerShell** (temporary, current session only):\n```powershell\n$env:FIRECRAWL_API_KEY = \"fc-your-actual-api-key-here\"\n```\n\n**Windows PowerShell** (permanent, user-level):\n```powershell\n[Environment]::SetEnvironmentVariable(\"FIRECRAWL_API_KEY\", \"fc-your-actual-api-key-here\", \"User\")\n```\n> Note: Takes effect in **new** PowerShell sessions.\n\n#### Step 4: Verify\n\n```bash\npython scripts/ticket_search.py Beijing Shanghai 2026-05-01 flight\n```\nIf you see `Data Source: Ctrip (via Firecrawl)` in the output, the key is working.\n\n> **No pip install needed** - the script calls Firecrawl's REST API directly via Python's built-in `urllib` library.\n\n---\n\n### 2. Tequila API Key (Optional - Registration Closed)\n\nKiwi.com Tequila API for international flight data. **Self-service registration is no longer available.**\n\nIf you already have a key:\n\n**Linux / macOS:**\n```bash\nexport TEQUILA_API_KEY=\"your-tequila-api-key\"\n```\n\n**Windows CMD:**\n```cmd\nset TEQUILA_API_KEY=your-tequila-api-key\n```\n\n**Windows PowerShell:**\n```powershell\n$env:TEQUILA_API_KEY = \"your-tequila-api-key\"\n```\n\n---\n\n### 3. Amadeus API Keys (Optional - Registration Closed)\n\nAmadeus API for global flight data. **Self-service registration is closed.**\n\nIf you already have keys, you also need to install the SDK:\n\n```bash\npip install amadeus>=12.0.0\n```\n\nThen set both environment variables:\n\n**Linux / macOS:**\n```bash\nexport AMADEUS_CLIENT_ID=\"your-client-id\"\nexport AMADEUS_CLIENT_SECRET=\"your-client-secret\"\n```\n\n**Windows CMD:**\n```cmd\nset AMADEUS_CLIENT_ID=your-client-id\nset AMADEUS_CLIENT_SECRET=your-client-secret\n```\n\n**Windows PowerShell:**\n```powershell\n$env:AMADEUS_CLIENT_ID = \"your-client-id\"\n$env:AMADEUS_CLIENT_SECRET = \"your-client-secret\"\n```\n\n---\n\n### Environment Variable Quick Reference\n\n| Variable | Where to Get | Format | Required? |\n|----------|-------------|--------|:---------:|\n| `FIRECRAWL_API_KEY` | [firecrawl.dev](https://firecrawl.dev) Dashboard | `fc-xxxx...` | Recommended |\n| `TEQUILA_API_KEY` | Kiwi.com (closed) | String | No |\n| `AMADEUS_CLIENT_ID` | Amadeus (closed) | String | No |\n| `AMADEUS_CLIENT_SECRET` | Amadeus (closed) | String | No |\n| `TICKET_ALLOW_UNVERIFIED_SSL` | N/A (user opt-in) | `true` | No |\n\n> **Note**: Environment variables set via `export`/`set`/`$env:` are session-only and will be lost when you close the terminal. Use `setx` (Windows) or add to `~/.bashrc` (Linux/macOS) for persistence.\n\n## Usage\n\n### Train Ticket Search\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 train\n```\n\n### Flight Ticket Search\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 flight\n```\n\n### Combined Search (Flight + Train)\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 all\n```\n\n### International Routes\n\n```bash\npython scripts/ticket_search.py Shanghai Tokyo 2026-06-15 flight\npython scripts/ticket_search.py Shanghai Tokyo 2026-06-15 all\n```\n\n## Output Examples\n\n### Flight Ticket Output (with Firecrawl)\n\n```\n=== Flight Search Results ===\nDeparture: Beijing  Arrival: Shanghai  Date: 2026-04-25\nData Source: Ctrip (via Firecrawl)\n\nFlight     Airline         Aircraft      Depart  Arrive    Price\nCA1501     Air China       Boeing 737    07:30   09:45     CNY 520\nMU5101     China Eastern   Airbus A320   08:00   10:20     CNY 480\nCZ6901     China Southern  Airbus A321   09:00   11:15     CNY 460\n...\n\nPlatform Search Links:\n- Ctrip: https://flights.ctrip.com/...\n- Qunar: https://flight.qunar.com/...\n- Skyscanner: https://www.skyscanner.net/...\n```\n\n### Train Ticket Output\n\n```\n=== 12306 Real-Time Query Results ===\nDeparture: Beijing  Arrival: Guangzhou  Date: 2026-04-20\n\nTrain    Departure->Arrival       Time          Duration  Second Class  First Class\nG303     Beijing Xi->Guangzhou South  10:00-17:17   7:17     CNY 1033     CNY 1488\nD923     Beijing Xi->Guangzhou South  20:22-06:47   10:25    CNY 709      -\nZ13      Beijing Fengtai->Guangzhou Baiyun  14:25-12:36+1  22:11   -   CNY 251 (Hard Sleeper)\n```\n\n## Project Structure\n\n```\nticket-price-compare/\n+-- SKILL.md                        # Skill definition (triggers, workflow)\n+-- README.md                       # This file\n+-- .gitignore\n+-- references/\n|   +-- platforms_guide.md          # Detailed per-platform discount conditions\n+-- scripts/\n    +-- ticket_search.py            # Core search script (~2200 lines)\n    +-- requirements.txt            # Dependencies (core has zero dependencies)\n    +-- skyscanner_lib/             # Skyscanner affiliate link builder\n```\n\n## Technical Details\n\n- **Core Zero Dependencies** - `ticket_search.py` uses only Python standard library (`urllib`, `json`, `ssl`)\n- **Firecrawl JS Rendering** - Calls Firecrawl `/v2/scrape` API with `waitFor: 15000ms` and `proxy: \"basic\"` to render Ctrip's React-based flight search pages, then parses the resulting markdown\n- **Dual-Source Ctrip** - PC page (`flights.ctrip.com`) for per-flight details; mobile H5 (`m.ctrip.com`) for price calendar fallback\n- **12306 Endpoints** - Uses `leftTicket/queryZ` for schedules + `queryTicketPrice` for actual fares, no login required\n- **City Name Mapping** - Built-in 200+ Chinese city/station name to IATA/telegraph code mapping\n- **SSL Security** - 12306 endpoints use full TLS verification by default. If certificate verification fails, the error is raised (no silent bypass). To allow unverified SSL fallback for 12306, set `TICKET_ALLOW_UNVERIFIED_SSL=true` (opt-in, not recommended on untrusted networks). All other connections always use full TLS verification.\n- **Encoding Compatibility** - Auto-handles Windows console UTF-8 encoding issues\n\n## Flight Data Source Priority\n\n1. **Firecrawl + Ctrip PC** (if `FIRECRAWL_API_KEY` set) - Best quality: individual flights, times, aircraft, prices\n2. **Firecrawl + Ctrip Mobile** (fallback) - Price calendar with daily lowest prices\n3. **Direct Ctrip Scraping** (no API key) - Limited data, may not work due to JS rendering\n4. **Tequila API** (if key set) - International flights\n5. **Amadeus API** (if keys set) - Global flights\n6. **Platform Links Only** - If no data source returns prices, provides direct links for manual search\n\n## As an AI Skill\n\nThis Skill can be used on AI skill platforms such as CodeBuddy / ClawHub. It auto-triggers when users ask:\n\n- \"Find me flights from Beijing to Guangzhou\"\n- \"How much is Shanghai to Tokyo on April 20\"\n- \"Check train ticket seat availability\"\n- \"Which platform has the cheapest flights\"\n- \"What student ticket discounts are available\"\n\n## License\n\nMIT\n\nFile v1.2.5:_meta.json\n\n{\n  \"ownerId\": \"kn74yqvqr8gy2c7yr0n4yg1kv584p8mw\",\n  \"slug\": \"ticket-price-compare\",\n  \"version\": \"1.2.5\",\n  \"publishedAt\": 1777133343952\n}\n\nFile v1.2.5:references/platforms_guide.md\n\n# Ticket Price Comparison Platform Detailed Guide\n\n## 1. Domestic Flight Platforms\n\n### Ctrip\n- **URL**: https://flights.ctrip.com\n- **Advantages**: Largest domestic OTA, most comprehensive flight coverage, good refund/change service\n- **Features**:\n  - Price calendar: view price trends for 7 days before/after\n  - Ctrip special deals section\n  - Ctrip premium member discounts\n- **Common Discount Conditions**:\n  - New user first-order discount (requires new account registration)\n  - Ctrip Black Diamond/Diamond member exclusive discounts\n  - Bank card payment discount (requires specific bank card)\n  - Early/late flight specials (typically flights before 6:00 or after 22:00)\n\n### Qunar\n- **URL**: https://flight.qunar.com\n- **Advantages**: Price comparison aggregator, compare multiple agent prices for the same flight\n- **Features**:\n  - Price monitoring alerts\n  - Special deals calendar\n  - \"Last-minute\" low-price flight recommendations\n- **Common Discount Conditions**:\n  - Agent coupons (discount vouchers)\n  - Qunar new user welcome package\n  - Special fare cabins (may be group tickets, strict refund/change rules)\n  - Flash sales (typically limited to 2 hours)\n\n### Fliggy\n- **URL**: https://www.fliggy.com\n- **Advantages**: Alibaba ecosystem, 88VIP members get extra discounts\n- **Features**:\n  - Fliggy mileage offset\n  - Taobao/Alipay quick payment\n  - Credit Fly (fly now, pay later)\n- **Common Discount Conditions**:\n  - 88VIP member exclusive prices\n  - Alipay payment random discount\n  - New user exclusive coupons\n  - Mileage redemption discount\n\n### Tongcheng (LY.com)\n- **URL**: https://www.ly.com\n- **Advantages**: WeChat mini program easy access, sometimes has exclusive low prices\n- **Features**:\n  - WeChat one-click login and purchase\n  - Tongcheng Black Whale member discount\n  - CNY 9.9 flight deals section (limited quantity)\n- **Common Discount Conditions**:\n  - WeChat Pay exclusive discount\n  - Tongcheng member tier discount\n  - Flash sale prices (limited quantity)\n\n### Spring Airlines Official Site\n- **URL**: https://www.ch.com\n- **Advantages**: Low-cost carrier, usually the lowest prices\n- **Features**:\n  - CNY 9/99/199 special tickets\n  - Spring Green Wing member discount\n- **Common Discount Conditions**:\n  - Special tickets do not include checked baggage (must purchase separately)\n  - No free meals\n  - Smaller seat pitch\n  - High refund/change fees\n  - Special tickets usually non-refundable and non-changeable\n\n## 2. International Flight Platforms\n\n### Skyscanner\n- **URL**: https://www.skyscanner.net\n- **Advantages**: World's largest flight comparison, covers 1200+ airlines and OTAs\n- **Features**:\n  - \"Cheapest month\" search\n  - \"Everywhere\" exploration (enter departure, find cheapest destination)\n  - Price alert feature\n- **Common Discount Conditions**:\n  - Special tickets usually non-refundable and non-changeable\n  - Some prices from agents (refund/change must contact agent)\n  - Connecting flights are cheaper but take longer\n\n### Google Flights\n- **URL**: https://www.google.com/travel/flights\n- **Advantages**: Calendar view shows monthly low prices, accurate price prediction algorithm\n- **Features**:\n  - Price trend chart (whether to buy now)\n  - Date grid (price comparison across dates)\n  - Explore destinations feature\n- **Common Discount Conditions**:\n  - Google does not sell tickets directly, redirects to airline/OTA\n  - Prices may vary based on cookie/login status\n  - Some deals only available on airline official sites\n\n### Kayak\n- **URL**: https://www.kayak.com\n- **Advantages**: Excellent price prediction, \"Hacker Fares\" combine different airlines for round-trip\n- **Features**:\n  - Price forecast (buy/wait recommendation)\n  - Hacker Fares (outbound and return on different airlines)\n  - Flexible date search\n- **Common Discount Conditions**:\n  - Hacker Fares require purchasing two separate tickets\n  - If change needed, each ticket handled separately\n  - Some combinations may lack connection protection\n\n### Momondo\n- **URL**: https://www.momondo.com\n- **Advantages**: Often finds hidden low prices not available on other platforms\n- **Features**:\n  - \"Flight Insight\" shows best booking time\n  - \"Ticket Check\" validates fare reasonableness\n- **Common Discount Conditions**:\n  - Some low prices from small travel agencies\n  - Refund/change must contact ticket issuer\n  - Ticket confirmation may be slow\n\n## 3. International Airline Official Site Discount Conditions\n\n### Common Discount Types\n| Discount Type | Description | Conditions |\n|---------------|-------------|------------|\n| Early Bird | Book 60/90 days in advance for discount | Must book in advance, non-refundable/changeable |\n| Member Exclusive | Airline member exclusive discount | Must register as member (free) |\n| Credit Card | Specific credit card payment discount | Must hold designated credit card |\n| Student Discount | Discount for passengers aged 12-25 | Must provide student proof |\n| Senior Discount | Discount for passengers aged 60+ | Must provide age proof |\n| Military Discount | Discount for active/retired military | Must provide military proof |\n| Group Tickets | Discount for 10+ passengers | Must issue tickets together, partial refund not allowed |\n| Codeshare | Alliance partner shared pricing | Actual operating carrier may differ |\n| Mileage Redemption | Frequent flyer miles for tickets | Must have sufficient miles, high change fees |\n| Transit Special | Special fares via specific connecting cities | Must accept longer connection times |\n\n## 4. Train Ticket Discount Conditions\n\n### 12306 Discounts\n| Discount Type | Description | Conditions |\n|---------------|-------------|------------|\n| Student Ticket | 50% off regular hard seat, 25% off EMU second class | Must be within discount route, 4 times per year |\n| Child Ticket | Half price for height 1.2-1.5m | Must be accompanied by adult |\n| Military Priority | Active military priority booking | Must show military ID |\n| Points Redemption | 10000 points for one free ticket | Must register as 12306 member |\n\n### Third-Party Platform Additional Discounts\n| Platform | Discount | Conditions |\n|----------|----------|------------|\n| Ctrip | Ticket-grabbing acceleration package | Paid purchase, increases waitlist success rate |\n| Qunar | Smart transfer recommendation | May require transfer, total time increases |\n| Fliggy | New user coupon | First train ticket purchase |\n| Tongcheng | WeChat Pay instant discount | Auto-deducted when using WeChat Pay |\n\n## 5. Common Restrictions on Special Fares\n\n### Flight Special Fare Restrictions\n1. **Non-refundable/Non-changeable**: Most special tickets cannot be refunded or changed\n2. **Baggage Limits**: LCC special tickets usually include only 7kg carry-on, checked baggage costs extra\n3. **Cabin Class**: Special tickets are lowest cabin class (e.g., below Y class), limited seat selection\n4. **Date Restrictions**: Special tickets valid only on specific dates/time slots\n5. **Quantity Limits**: Special tickets are limited, sold out quickly\n6. **Identity Restrictions**: Some deals only for new users/members\n7. **Payment Restrictions**: Some discounts require specific payment methods\n8. **Transit Restrictions**: International specials may require transit via specific cities, may need transit visa\n9. **Change Fees**: Even if changeable, fees may approach ticket face value\n10. **Ticketing Deadline**: Some special tickets must be paid within 24 hours of booking\n\n### Train Special Fare Restrictions\n1. **Student Tickets**: Only during winter/summer break, must be within student certificate discount route\n2. **Waitlist**: No guarantee of waitlist success\n3. **Change Limits**: No refund after departure, only one change allowed\n4. **Transfer Tickets**: Passenger responsible for any issues caused by insufficient transfer time\n\nFile v1.2.5:scripts/requirements.txt\n\n# No required dependencies - the script uses Python stdlib only\n# Web scraping for flight prices (Ctrip/Qunar) and 12306 train API\n# work out of the box without any additional packages.\n\n# Optional: Firecrawl (JS rendering for Ctrip flight pages)\n# Set FIRECRAWL_API_KEY env var to enable. Register at https://firecrawl.dev\n# No pip install needed - uses REST API via urllib\n\n# Optional: Amadeus Python SDK (only for existing Amadeus API key holders)\n# amadeus>=12.0.0\n\nArchive v1.2.4: 6 files, 38337 bytes\n\nFiles: README.md (11974b), references/platforms_guide.md (7813b), scripts/requirements.txt (469b), scripts/ticket_search.py (97855b), SKILL.md (8477b), _meta.json (139b)\n\nFile v1.2.4:SKILL.md\n\n---\nname: ticket-price-compare\ndescription: This skill should be used when the user wants to compare and search for flight or train ticket prices across multiple platforms. It supports both domestic (China) and international routes, fetches real-time train availability via 12306, uses Firecrawl to render Ctrip JS pages for detailed flight data (flight numbers, times, aircraft types, prices), generates direct search links for all major booking platforms and airline official websites, provides WeChat mini program quick links for mobile search, and highlights discount conditions. Trigger scenarios include: searching for cheap flights, comparing train ticket prices, finding international flight deals, looking for the best ticket booking platform, or asking about ticket discount conditions.\n---\n\n# Ticket Price Compare - Multi-Platform Ticket Price Comparison\n\n## Overview\n\nThis skill enables real-time comparison of flight and train ticket prices. It fetches **real-time train availability** via 12306 (no API key needed), and uses **Firecrawl to render Ctrip JS pages** for detailed flight data when `FIRECRAWL_API_KEY` is set. It also generates direct search links for all major booking platforms and **WeChat mini program quick links** for convenient mobile search. Tequila/Amadeus APIs are available as optional fallbacks for users who already have keys. Discount conditions and restrictions are clearly listed separately.\n\n## Data Sources\n\n### Firecrawl + Ctrip (Primary for Flight Data, Optional API Key)\n- Uses Firecrawl's `/v2/scrape` API to render Ctrip's JavaScript-heavy flight search pages\n- **PC page** (primary): Returns individual flight numbers, times, aircraft types, and prices\n- **Mobile H5 page** (fallback): Returns price calendar with daily lowest prices across dates\n- Requires `FIRECRAWL_API_KEY` environment variable. Register at [firecrawl.dev](https://firecrawl.dev)\n- Falls back gracefully to direct scraping if not configured\n\n### Ctrip Direct Scraping (No API Key Needed)\n- Attempts direct HTTP request to Ctrip flight search pages\n- **No registration or API key required** - works out of the box\n- Limited data: Ctrip renders pages via JavaScript, so direct scraping may not always return prices. In that case, platform links are provided for manual search.\n\n### 12306 (Train Tickets, No API Key Needed)\n- Uses 12306 public `leftTicket/queryZ` endpoint for real-time train availability\n- Uses 12306 public `queryTicketPrice` endpoint for actual fares per seat type\n- Supports major Chinese cities with station code auto-mapping\n\n### Optional APIs (For Existing Key Holders Only)\n- **Kiwi.com Tequila API**: If `TEQUILA_API_KEY` is set (registration may no longer be available)\n- **Amadeus API**: If `AMADEUS_CLIENT_ID` + `AMADEUS_CLIENT_SECRET` are set (registration is closed)\n- These are used as fallbacks only when web scraping returns no results\n\n## Core Capabilities\n\n### 1. Flight Ticket Search\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" flight\n```\n- Domestic: `python scripts/ticket_search.py \"Beijing\" \"Shanghai\" \"2026-05-01\" flight`\n- International: `python scripts/ticket_search.py \"Shanghai\" \"Tokyo\" \"2026-06-15\" flight`\n\n**Data sources (in order of priority)**:\n1. Firecrawl + Ctrip PC page (if `FIRECRAWL_API_KEY` set) - Best quality: individual flights, times, aircraft, prices\n2. Firecrawl + Ctrip Mobile H5 (fallback) - Price calendar with daily lowest prices\n3. Ctrip Direct Scraping (no API key, limited data)\n4. Tequila API (if API key configured)\n5. Amadeus API (if API keys configured)\n\n**Covered domestic platforms**: Ctrip, Qunar, Fliggy, Tongcheng, Tuniu\n\n**Covered international platforms**: Skyscanner, Google Flights, Kayak, Momondo, Expedia, Booking.com\n\n**Covered airline official sites**: 10 Chinese + 13 international airlines\n\n### 2. Train Ticket Search with Real-Time Availability\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" train\n```\n\n**Real-time data from 12306**: Returns actual train schedules with:\n- Train code & type (High-Speed/EMU/Express/Fast)\n- Departure/arrival stations & times\n- Duration\n- Available seat types & counts (Business Class/First Class/Second Class/Hard Sleeper/Hard Seat etc.)\n- Actual fares per seat type\n\n### 3. Combined Search (Flight + Train)\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" all\n```\n\nTrain results are automatically excluded for international routes.\n\n## Output Sections\n\nThe script generates structured output with these sections (in order):\n\n1. **Route Summary** - Departure, arrival, date, route type\n2. **Data Source Status** - Whether Firecrawl/scraping/APIs returned live data\n3. **Real-Time Flight Prices** - Table of flight offers with prices (if available)\n4. **Transfer Details** - Multi-segment flight details (if any transfers)\n5. **Flight Discount Conditions** - Refund/change rules, baggage limits, cabin restrictions\n6. **Real-Time Train Info** - Table of actual trains with seat availability and fares (if domestic)\n7. **Train Discount Conditions** - Student tickets, child tickets, change rules\n8. **Platform Links** - Direct search URLs for all booking platforms\n9. **Airline Official Sites** - Direct links to airline websites\n10. **WeChat Mini Program Quick Links** - Mobile H5 links + WeChat mini program search tips for Ctrip/Fliggy/Tongcheng/Qunar and major airlines\n11. **Search Tips** - Route-specific advice\n\n### Discount Conditions\n\nAlways include the dedicated \"Discount Conditions / Restrictions\" section. Reference `references/platforms_guide.md` for detailed per-platform discount conditions. Load this file when:\n- User asks about specific discount conditions\n- Presenting results that include discounted fares\n- User asks which platform has the best deals for their situation\n\n## Workflow\n\n1. **Collect query parameters**: Get departure city, arrival city, and travel date. If date not specified, ask. Default ticket type to \"all\".\n\n2. **Execute search**: Run `scripts/ticket_search.py` with the parameters.\n\n3. **Present results**: Show the **complete output** from the script. **IMPORTANT**: Do NOT summarize or omit train ticket price information. Always include:\n   - **Train ticket prices** - The \"票价（余票）\" column contains actual fares like `二等座¥305(有) / 一等座¥488(12)`. This is real-time pricing data from 12306 and MUST be shown to the user.\n   - **Flight prices** (if available from Firecrawl, scraping, or API)\n   - All platform links for comparison\n   - Discount conditions section\n   - Search tips\n\n4. **If no flight prices returned**: Inform the user that real-time flight prices could not be fetched automatically, and recommend clicking the platform links to compare prices manually. **Always mention that 12306 train data with real-time prices is available for domestic routes.**\n\n5. **When user asks for \"all\" or combined search**: Present train results and flight results side by side. Do NOT skip or truncate the train price table even when flight data is extensive.\n\n## Date Flexibility\n\nIf a user asks for \"cheapest dates\" or \"price trends\":\n- Run the script with multiple date parameters to compare\n- For domestic flights: Also suggest Ctrip/Qunar price calendar features\n- For international flights: Suggest Skyscanner \"cheapest month\" or Google Flights date grid\n\n## Important Notes\n\n- **Primary method**: Firecrawl + Ctrip (if API key set) - renders JS pages, gets detailed flight data\n- **Fallback scraping**: Direct Ctrip HTTP request - no API key needed, but limited data due to JS rendering\n- **Fallback APIs**: Tequila/Amadeus - only for users who already have keys; registration is closed for new users\n- **Without any flight data**: Platform search links are always provided (users click to see prices)\n- **12306 train data** is always real-time (no API key needed)\n- **SSL verification**: 12306 endpoints use a \"verify first, fallback on error\" strategy — full TLS verification is attempted first; only if SSL certificate errors occur does it fall back to unverified mode. All other connections use full TLS verification at all times.\n- **Firecrawl proxy**: Uses `proxy: \"basic\"` for optimal reliability with Chinese booking sites\n- Prices vary in real-time; recommend checking 2-3 platforms for confirmation\n- Airline official websites sometimes offer exclusive prices not available on OTA platforms\n- Always remind users about potential discount conditions before booking\n\nFile v1.2.4:README.md\n\n# Ticket Price Compare - Multi-Platform Ticket Price Comparison\n\n[![Version](https://img.shields.io/badge/Version-v1.2.0-blue)]()\n[![Skill Type](https://img.shields.io/badge/Type-AI%20Skill-blue)]()\n[![Python](https://img.shields.io/badge/Python-3.8%2B-green)]()\n[![License](https://img.shields.io/badge/License-MIT-yellow)]()\n\n> Real-time multi-platform flight and train ticket price comparison Skill. Supports domestic/international routes, 12306 real-time seat availability, Firecrawl-powered detailed flight data, no API key required for core features.\n\n## Highlights\n\n- **Firecrawl-Powered Flight Data** - Renders Ctrip JS pages via Firecrawl, gets detailed flight numbers, times, aircraft types, and prices\n- **Real-Time Train Seat Availability** - Direct 12306 public endpoint, returns actual schedules, seats, and fares\n- **Zero Configuration Core** - 12306 train queries work out of the box; Firecrawl enhances flight data when API key is set\n- **Multi-Source Flight Comparison** - Firecrawl / Ctrip scraping / Tequila / Amadeus multiple data sources\n- **Domestic + International Routes** - Supports both Chinese and English city names\n- **Platform Search Links** - One-click access to Ctrip, Qunar, Fliggy, Tongcheng, Skyscanner, Google Flights, etc.\n- **Airline Official Sites** - Covers 10 Chinese + 13 international airlines\n- **WeChat Mini Program Links** - Mini program search tips for convenient mobile search\n- **Discount Condition Alerts** - Auto-lists student tickets, child tickets, refund/change rules\n\n## Data Sources\n\n| Data Source | Type | API Key Required | Description |\n|-------------|------|:--------------:|-------------|\n| **Firecrawl + Ctrip** | JS Rendering | Optional | Renders Ctrip flight pages, gets individual flight numbers, times, aircraft types, and prices. Set `FIRECRAWL_API_KEY` to enable. Register at [firecrawl.dev](https://firecrawl.dev) |\n| 12306 | Public API | No | Real-time train seat availability and fares |\n| Ctrip Scraping | Direct HTTP | No | Basic flight info without JS rendering (limited data) |\n| Tequila | REST API | Optional | Kiwi.com flight data (registration closed) |\n| Amadeus | REST API | Optional | Global flight data (registration closed) |\n\n## What's New in v1.2.0\n\n- **Firecrawl Integration** - Added `FirecrawlScraper` class that uses Firecrawl's `/v2/scrape` API to render Ctrip's JavaScript-heavy flight search pages, extracting detailed flight data (flight numbers, departure/arrival times, aircraft types, individual cabin prices, transfer details)\n- **Dual-Source Flight Scraping** - PC page (primary) returns per-flight details; mobile H5 page (fallback) returns price calendar with daily lowest prices\n- **Smart Parsing** - Robust markdown parser extracts structured flight data from Ctrip's rendered output, handling various cabin classes and transfer flights\n- **Proxy Optimization** - Switched from `proxy: \"auto\"` to `proxy: \"basic\"` for better reliability with Chinese booking sites\n- **Enhanced Train Prices** - 12306 `queryTicketPrice` endpoint integration for actual fare data per seat type\n\n## Quick Start (Zero Config)\n\nThe script uses only Python standard library, no extra packages needed. Train tickets (12306) work out of the box:\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-05-01 train\n```\n\nFlight search also works without any API key (provides platform links for manual comparison):\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-05-01 flight\n```\n\n> **Tip**: To get detailed flight prices (flight numbers, times, aircraft types) instead of just links, set the `FIRECRAWL_API_KEY` environment variable. See [API Key Setup Guide](#api-key-setup-guide) below.\n\n## API Key Setup Guide\n\nAll API keys are **optional**. The script works without any configuration (train data always available, flight links always provided). API keys only enhance the flight data quality.\n\n### Key Required vs Optional Summary\n\n| API Key | Required? | What It Enables | Registration Status |\n|---------|:---------:|----------------|---------------------|\n| `FIRECRAWL_API_KEY` | **Recommended** | Detailed Ctrip flight data (flight numbers, times, aircraft, prices) | **Open** - Free tier available |\n| `TEQUILA_API_KEY` | No | Kiwi.com international flight data | **Closed** |\n| `AMADEUS_CLIENT_ID` + `AMADEUS_CLIENT_SECRET` | No | Amadeus global flight data | **Closed** |\n\n---\n\n### 1. Firecrawl API Key (Recommended - Free Tier Available)\n\nFirecrawl renders Ctrip's JavaScript-heavy flight pages, extracting detailed flight data that direct HTTP requests cannot get.\n\n#### Step 1: Register\n\n1. Go to [https://firecrawl.dev](https://firecrawl.dev)\n2. Click **\"Get Started\"** or **\"Sign Up\"**\n3. Sign up with Google/GitHub/email\n4. Free tier includes **500 credits/month** (each scrape = 1 credit)\n\n#### Step 2: Get Your API Key\n\n1. After login, go to the **Dashboard**\n2. Copy your **API Key** (format: `fc-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`)\n\n#### Step 3: Set Environment Variable\n\n**Linux / macOS** (temporary, current session only):\n```bash\nexport FIRECRAWL_API_KEY=\"fc-your-actual-api-key-here\"\n```\n\n**Linux / macOS** (permanent, add to `~/.bashrc` or `~/.zshrc`):\n```bash\necho 'export FIRECRAWL_API_KEY=\"fc-your-actual-api-key-here\"' >> ~/.bashrc\nsource ~/.bashrc\n```\n\n**Windows CMD** (temporary, current window only):\n```cmd\nset FIRECRAWL_API_KEY=fc-your-actual-api-key-here\n```\n\n**Windows CMD** (permanent, system-level):\n```cmd\nsetx FIRECRAWL_API_KEY \"fc-your-actual-api-key-here\"\n```\n> Note: `setx` takes effect in **new** terminal windows, not the current one.\n\n**Windows PowerShell** (temporary, current session only):\n```powershell\n$env:FIRECRAWL_API_KEY = \"fc-your-actual-api-key-here\"\n```\n\n**Windows PowerShell** (permanent, user-level):\n```powershell\n[Environment]::SetEnvironmentVariable(\"FIRECRAWL_API_KEY\", \"fc-your-actual-api-key-here\", \"User\")\n```\n> Note: Takes effect in **new** PowerShell sessions.\n\n#### Step 4: Verify\n\n```bash\npython scripts/ticket_search.py Beijing Shanghai 2026-05-01 flight\n```\nIf you see `Data Source: Ctrip (via Firecrawl)` in the output, the key is working.\n\n> **No pip install needed** - the script calls Firecrawl's REST API directly via Python's built-in `urllib` library.\n\n---\n\n### 2. Tequila API Key (Optional - Registration Closed)\n\nKiwi.com Tequila API for international flight data. **Self-service registration is no longer available.**\n\nIf you already have a key:\n\n**Linux / macOS:**\n```bash\nexport TEQUILA_API_KEY=\"your-tequila-api-key\"\n```\n\n**Windows CMD:**\n```cmd\nset TEQUILA_API_KEY=your-tequila-api-key\n```\n\n**Windows PowerShell:**\n```powershell\n$env:TEQUILA_API_KEY = \"your-tequila-api-key\"\n```\n\n---\n\n### 3. Amadeus API Keys (Optional - Registration Closed)\n\nAmadeus API for global flight data. **Self-service registration is closed.**\n\nIf you already have keys, you also need to install the SDK:\n\n```bash\npip install amadeus>=12.0.0\n```\n\nThen set both environment variables:\n\n**Linux / macOS:**\n```bash\nexport AMADEUS_CLIENT_ID=\"your-client-id\"\nexport AMADEUS_CLIENT_SECRET=\"your-client-secret\"\n```\n\n**Windows CMD:**\n```cmd\nset AMADEUS_CLIENT_ID=your-client-id\nset AMADEUS_CLIENT_SECRET=your-client-secret\n```\n\n**Windows PowerShell:**\n```powershell\n$env:AMADEUS_CLIENT_ID = \"your-client-id\"\n$env:AMADEUS_CLIENT_SECRET = \"your-client-secret\"\n```\n\n---\n\n### Environment Variable Quick Reference\n\n| Variable | Where to Get | Format | Required? |\n|----------|-------------|--------|:---------:|\n| `FIRECRAWL_API_KEY` | [firecrawl.dev](https://firecrawl.dev) Dashboard | `fc-xxxx...` | Recommended |\n| `TEQUILA_API_KEY` | Kiwi.com (closed) | String | No |\n| `AMADEUS_CLIENT_ID` | Amadeus (closed) | String | No |\n| `AMADEUS_CLIENT_SECRET` | Amadeus (closed) | String | No |\n\n> **Note**: Environment variables set via `export`/`set`/`$env:` are session-only and will be lost when you close the terminal. Use `setx` (Windows) or add to `~/.bashrc` (Linux/macOS) for persistence.\n\n## Usage\n\n### Train Ticket Search\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 train\n```\n\n### Flight Ticket Search\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 flight\n```\n\n### Combined Search (Flight + Train)\n\n```bash\npython scripts/ticket_search.py Beijing Guangzhou 2026-04-20 all\n```\n\n### International Routes\n\n```bash\npython scripts/ticket_search.py Shanghai Tokyo 2026-06-15 flight\npython scripts/ticket_search.py Shanghai Tokyo 2026-06-15 all\n```\n\n## Output Examples\n\n### Flight Ticket Output (with Firecrawl)\n\n```\n=== Flight Search Results ===\nDeparture: Beijing  Arrival: Shanghai  Date: 2026-04-25\nData Source: Ctrip (via Firecrawl)\n\nFlight     Airline         Aircraft      Depart  Arrive    Price\nCA1501     Air China       Boeing 737    07:30   09:45     CNY 520\nMU5101     China Eastern   Airbus A320   08:00   10:20     CNY 480\nCZ6901     China Southern  Airbus A321   09:00   11:15     CNY 460\n...\n\nPlatform Search Links:\n- Ctrip: https://flights.ctrip.com/...\n- Qunar: https://flight.qunar.com/...\n- Skyscanner: https://www.skyscanner.net/...\n```\n\n### Train Ticket Output\n\n```\n=== 12306 Real-Time Query Results ===\nDeparture: Beijing  Arrival: Guangzhou  Date: 2026-04-20\n\nTrain    Departure->Arrival       Time          Duration  Second Class  First Class\nG303     Beijing Xi->Guangzhou South  10:00-17:17   7:17     CNY 1033     CNY 1488\nD923     Beijing Xi->Guangzhou South  20:22-06:47   10:25    CNY 709      -\nZ13      Beijing Fengtai->Guangzhou Baiyun  14:25-12:36+1  22:11   -   CNY 251 (Hard Sleeper)\n```\n\n## Project Structure\n\n```\nticket-price-compare/\n+-- SKILL.md                        # Skill definition (triggers, workflow)\n+-- README.md                       # This file\n+-- .gitignore\n+-- references/\n|   +-- platforms_guide.md          # Detailed per-platform discount conditions\n+-- scripts/\n    +-- ticket_search.py            # Core search script (~2200 lines)\n    +-- requirements.txt            # Dependencies (core has zero dependencies)\n    +-- skyscanner_lib/             # Skyscanner affiliate link builder\n```\n\n## Technical Details\n\n- **Core Zero Dependencies** - `ticket_search.py` uses only Python standard library (`urllib`, `json`, `ssl`)\n- **Firecrawl JS Rendering** - Calls Firecrawl `/v2/scrape` API with `waitFor: 15000ms` and `proxy: \"basic\"` to render Ctrip's React-based flight search pages, then parses the resulting markdown\n- **Dual-Source Ctrip** - PC page (`flights.ctrip.com`) for per-flight details; mobile H5 (`m.ctrip.com`) for price calendar fallback\n- **12306 Endpoints** - Uses `leftTicket/queryZ` for schedules + `queryTicketPrice` for actual fares, no login required\n- **City Name Mapping** - Built-in 200+ Chinese city/station name to IATA/telegraph code mapping\n- **SSL Security** - 12306 endpoints use a \"verify first, fallback on error\" strategy: full TLS verification is attempted first; only if SSL certificate errors occur does it fall back to unverified mode. All other connections always use full TLS verification.\n- **Encoding Compatibility** - Auto-handles Windows console UTF-8 encoding issues\n\n## Flight Data Source Priority\n\n1. **Firecrawl + Ctrip PC** (if `FIRECRAWL_API_KEY` set) - Best quality: individual flights, times, aircraft, prices\n2. **Firecrawl + Ctrip Mobile** (fallback) - Price calendar with daily lowest prices\n3. **Direct Ctrip Scraping** (no API key) - Limited data, may not work due to JS rendering\n4. **Tequila API** (if key set) - International flights\n5. **Amadeus API** (if keys set) - Global flights\n6. **Platform Links Only** - If no data source returns prices, provides direct links for manual search\n\n## As an AI Skill\n\nThis Skill can be used on AI skill platforms such as CodeBuddy / ClawHub. It auto-triggers when users ask:\n\n- \"Find me flights from Beijing to Guangzhou\"\n- \"How much is Shanghai to Tokyo on April 20\"\n- \"Check train ticket seat availability\"\n- \"Which platform has the cheapest flights\"\n- \"What student ticket discounts are available\"\n\n## License\n\nMIT\n\nFile v1.2.4:_meta.json\n\n{\n  \"ownerId\": \"kn74yqvqr8gy2c7yr0n4yg1kv584p8mw\",\n  \"slug\": \"ticket-price-compare\",\n  \"version\": \"1.2.4\",\n  \"publishedAt\": 1777047991641\n}\n\nFile v1.2.4:references/platforms_guide.md\n\n# Ticket Price Comparison Platform Detailed Guide\n\n## 1. Domestic Flight Platforms\n\n### Ctrip\n- **URL**: https://flights.ctrip.com\n- **Advantages**: Largest domestic OTA, most comprehensive flight coverage, good refund/change service\n- **Features**:\n  - Price calendar: view price trends for 7 days before/after\n  - Ctrip special deals section\n  - Ctrip premium member discounts\n- **Common Discount Conditions**:\n  - New user first-order discount (requires new account registration)\n  - Ctrip Black Diamond/Diamond member exclusive discounts\n  - Bank card payment discount (requires specific bank card)\n  - Early/late flight specials (typically flights before 6:00 or after 22:00)\n\n### Qunar\n- **URL**: https://flight.qunar.com\n- **Advantages**: Price comparison aggregator, compare multiple agent prices for the same flight\n- **Features**:\n  - Price monitoring alerts\n  - Special deals calendar\n  - \"Last-minute\" low-price flight recommendations\n- **Common Discount Conditions**:\n  - Agent coupons (discount vouchers)\n  - Qunar new user welcome package\n  - Special fare cabins (may be group tickets, strict refund/change rules)\n  - Flash sales (typically limited to 2 hours)\n\n### Fliggy\n- **URL**: https://www.fliggy.com\n- **Advantages**: Alibaba ecosystem, 88VIP members get extra discounts\n- **Features**:\n  - Fliggy mileage offset\n  - Taobao/Alipay quick payment\n  - Credit Fly (fly now, pay later)\n- **Common Discount Conditions**:\n  - 88VIP member exclusive prices\n  - Alipay payment random discount\n  - New user exclusive coupons\n  - Mileage redemption discount\n\n### Tongcheng (LY.com)\n- **URL**: https://www.ly.com\n- **Advantages**: WeChat mini program easy access, sometimes has exclusive low prices\n- **Features**:\n  - WeChat one-click login and purchase\n  - Tongcheng Black Whale member discount\n  - CNY 9.9 flight deals section (limited quantity)\n- **Common Discount Conditions**:\n  - WeChat Pay exclusive discount\n  - Tongcheng member tier discount\n  - Flash sale prices (limited quantity)\n\n### Spring Airlines Official Site\n- **URL**: https://www.ch.com\n- **Advantages**: Low-cost carrier, usually the lowest prices\n- **Features**:\n  - CNY 9/99/199 special tickets\n  - Spring Green Wing member discount\n- **Common Discount Conditions**:\n  - Special tickets do not include checked baggage (must purchase separately)\n  - No free meals\n  - Smaller seat pitch\n  - High refund/change fees\n  - Special tickets usually non-refundable and non-changeable\n\n## 2. International Flight Platforms\n\n### Skyscanner\n- **URL**: https://www.skyscanner.net\n- **Advantages**: World's largest flight comparison, covers 1200+ airlines and OTAs\n- **Features**:\n  - \"Cheapest month\" search\n  - \"Everywhere\" exploration (enter departure, find cheapest destination)\n  - Price alert feature\n- **Common Discount Conditions**:\n  - Special tickets usually non-refundable and non-changeable\n  - Some prices from agents (refund/change must contact agent)\n  - Connecting flights are cheaper but take longer\n\n### Google Flights\n- **URL**: https://www.google.com/travel/flights\n- **Advantages**: Calendar view shows monthly low prices, accurate price prediction algorithm\n- **Features**:\n  - Price trend chart (whether to buy now)\n  - Date grid (price comparison across dates)\n  - Explore destinations feature\n- **Common Discount Conditions**:\n  - Google does not sell tickets directly, redirects to airline/OTA\n  - Prices may vary based on cookie/login status\n  - Some deals only available on airline official sites\n\n### Kayak\n- **URL**: https://www.kayak.com\n- **Advantages**: Excellent price prediction, \"Hacker Fares\" combine different airlines for round-trip\n- **Features**:\n  - Price forecast (buy/wait recommendation)\n  - Hacker Fares (outbound and return on different airlines)\n  - Flexible date search\n- **Common Discount Conditions**:\n  - Hacker Fares require purchasing two separate tickets\n  - If change needed, each ticket handled separately\n  - Some combinations may lack connection protection\n\n### Momondo\n- **URL**: https://www.momondo.com\n- **Advantages**: Often finds hidden low prices not available on other platforms\n- **Features**:\n  - \"Flight Insight\" shows best booking time\n  - \"Ticket Check\" validates fare reasonableness\n- **Common Discount Conditions**:\n  - Some low prices from small travel agencies\n  - Refund/change must contact ticket issuer\n  - Ticket confirmation may be slow\n\n## 3. International Airline Official Site Discount Conditions\n\n### Common Discount Types\n| Discount Type | Description | Conditions |\n|---------------|-------------|------------|\n| Early Bird | Book 60/90 days in advance for discount | Must book in advance, non-refundable/changeable |\n| Member Exclusive | Airline member exclusive discount | Must register as member (free) |\n| Credit Card | Specific credit card payment discount | Must hold designated credit card |\n| Student Discount | Discount for passengers aged 12-25 | Must provide student proof |\n| Senior Discount | Discount for passengers aged 60+ | Must provide age proof |\n| Military Discount | Discount for active/retired military | Must provide military proof |\n| Group Tickets | Discount for 10+ passengers | Must issue tickets together, partial refund not allowed |\n| Codeshare | Alliance partner shared pricing | Actual operating carrier may differ |\n| Mileage Redemption | Frequent flyer miles for tickets | Must have sufficient miles, high change fees |\n| Transit Special | Special fares via specific connecting cities | Must accept longer connection times |\n\n## 4. Train Ticket Discount Conditions\n\n### 12306 Discounts\n| Discount Type | Description | Conditions |\n|---------------|-------------|------------|\n| Student Ticket | 50% off regular hard seat, 25% off EMU second class | Must be within discount route, 4 times per year |\n| Child Ticket | Half price for height 1.2-1.5m | Must be accompanied by adult |\n| Military Priority | Active military priority booking | Must show military ID |\n| Points Redemption | 10000 points for one free ticket | Must register as 12306 member |\n\n### Third-Party Platform Additional Discounts\n| Platform | Discount | Conditions |\n|----------|----------|------------|\n| Ctrip | Ticket-grabbing acceleration package | Paid purchase, increases waitlist success rate |\n| Qunar | Smart transfer recommendation | May require transfer, total time increases |\n| Fliggy | New user coupon | First train ticket purchase |\n| Tongcheng | WeChat Pay instant discount | Auto-deducted when using WeChat Pay |\n\n## 5. Common Restrictions on Special Fares\n\n### Flight Special Fare Restrictions\n1. **Non-refundable/Non-changeable**: Most special tickets cannot be refunded or changed\n2. **Baggage Limits**: LCC special tickets usually include only 7kg carry-on, checked baggage costs extra\n3. **Cabin Class**: Special tickets are lowest cabin class (e.g., below Y class), limited seat selection\n4. **Date Restrictions**: Special tickets valid only on specific dates/time slots\n5. **Quantity Limits**: Special tickets are limited, sold out quickly\n6. **Identity Restrictions**: Some deals only for new users/members\n7. **Payment Restrictions**: Some discounts require specific payment methods\n8. **Transit Restrictions**: International specials may require transit via specific cities, may need transit visa\n9. **Change Fees**: Even if changeable, fees may approach ticket face value\n10. **Ticketing Deadline**: Some special tickets must be paid within 24 hours of booking\n\n### Train Special Fare Restrictions\n1. **Student Tickets**: Only during winter/summer break, must be within student certificate discount route\n2. **Waitlist**: No guarantee of waitlist success\n3. **Change Limits**: No refund after departure, only one change allowed\n4. **Transfer Tickets**: Passenger responsible for any issues caused by insufficient transfer time\n\nFile v1.2.4:scripts/requirements.txt\n\n# No required dependencies - the script uses Python stdlib only\n# Web scraping for flight prices (Ctrip/Qunar) and 12306 train API\n# work out of the box without any additional packages.\n\n# Optional: Firecrawl (JS rendering for Ctrip flight pages)\n# Set FIRECRAWL_API_KEY env var to enable. Register at https://firecrawl.dev\n# No pip install needed - uses REST API via urllib\n\n# Optional: Amadeus Python SDK (only for existing Amadeus API key holders)\n# amadeus>=12.0.0\n\nArchive v1.2.3: 6 files, 37831 bytes\n\nFiles: README.md (11868b), references/platforms_guide.md (7813b), scripts/requirements.txt (469b), scripts/ticket_search.py (96709b), SKILL.md (8345b), _meta.json (139b)\n\nFile v1.2.3:SKILL.md\n\n---\nname: ticket-price-compare\ndescription: This skill should be used when the user wants to compare and search for flight or train ticket prices across multiple platforms. It supports both domestic (China) and international routes, fetches real-time train availability via 12306, uses Firecrawl to render Ctrip JS pages for detailed flight data (flight numbers, times, aircraft types, prices), generates direct search links for all major booking platforms and airline official websites, provides WeChat mini program quick links for mobile search, and highlights discount conditions. Trigger scenarios include: searching for cheap flights, comparing train ticket prices, finding international flight deals, looking for the best ticket booking platform, or asking about ticket discount conditions.\n---\n\n# Ticket Price Compare - Multi-Platform Ticket Price Comparison\n\n## Overview\n\nThis skill enables real-time comparison of flight and train ticket prices. It fetches **real-time train availability** via 12306 (no API key needed), and uses **Firecrawl to render Ctrip JS pages** for detailed flight data when `FIRECRAWL_API_KEY` is set. It also generates direct search links for all major booking platforms and **WeChat mini program quick links** for convenient mobile search. Tequila/Amadeus APIs are available as optional fallbacks for users who already have keys. Discount conditions and restrictions are clearly listed separately.\n\n## Data Sources\n\n### Firecrawl + Ctrip (Primary for Flight Data, Optional API Key)\n- Uses Firecrawl's `/v2/scrape` API to render Ctrip's JavaScript-heavy flight search pages\n- **PC page** (primary): Returns individual flight numbers, times, aircraft types, and prices\n- **Mobile H5 page** (fallback): Returns price calendar with daily lowest prices across dates\n- Requires `FIRECRAWL_API_KEY` environment variable. Register at [firecrawl.dev](https://firecrawl.dev)\n- Falls back gracefully to direct scraping if not configured\n\n### Ctrip Direct Scraping (No API Key Needed)\n- Attempts direct HTTP request to Ctrip flight search pages\n- **No registration or API key required** - works out of the box\n- Limited data: Ctrip renders pages via JavaScript, so direct scraping may not always return prices. In that case, platform links are provided for manual search.\n\n### 12306 (Train Tickets, No API Key Needed)\n- Uses 12306 public `leftTicket/queryZ` endpoint for real-time train availability\n- Uses 12306 public `queryTicketPrice` endpoint for actual fares per seat type\n- Supports major Chinese cities with station code auto-mapping\n\n### Optional APIs (For Existing Key Holders Only)\n- **Kiwi.com Tequila API**: If `TEQUILA_API_KEY` is set (registration may no longer be available)\n- **Amadeus API**: If `AMADEUS_CLIENT_ID` + `AMADEUS_CLIENT_SECRET` are set (registration is closed)\n- These are used as fallbacks only when web scraping returns no results\n\n## Core Capabilities\n\n### 1. Flight Ticket Search\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" flight\n```\n- Domestic: `python scripts/ticket_search.py \"Beijing\" \"Shanghai\" \"2026-05-01\" flight`\n- International: `python scripts/ticket_search.py \"Shanghai\" \"Tokyo\" \"2026-06-15\" flight`\n\n**Data sources (in order of priority)**:\n1. Firecrawl + Ctrip PC page (if `FIRECRAWL_API_KEY` set) - Best quality: individual flights, times, aircraft, prices\n2. Firecrawl + Ctrip Mobile H5 (fallback) - Price calendar with daily lowest prices\n3. Ctrip Direct Scraping (no API key, limited data)\n4. Tequila API (if API key configured)\n5. Amadeus API (if API keys configured)\n\n**Covered domestic platforms**: Ctrip, Qunar, Fliggy, Tongcheng, Tuniu\n\n**Covered international platforms**: Skyscanner, Google Flights, Kayak, Momondo, Expedia, Booking.com\n\n**Covered airline official sites**: 10 Chinese + 13 international airlines\n\n### 2. Train Ticket Search with Real-Time Availability\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" train\n```\n\n**Real-time data from 12306**: Returns actual train schedules with:\n- Train code & type (High-Speed/EMU/Express/Fast)\n- Departure/arrival stations & times\n- Duration\n- Available seat types & counts (Business Class/First Class/Second Class/Hard Sleeper/Hard Seat etc.)\n- Actual fares per seat type\n\n### 3. Combined Search (Flight + Train)\n\n```bash\npython scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" all\n```\n\nTrain results are automatically excluded for international routes.\n\n## Output Sections\n\nThe script generates structured output with these sections (in order):\n\n1. **Route Summary** - Departure, arrival, date, route type\n2. **Data Source Status** - Whether Firecrawl/scraping/APIs returned live data\n3. **Real-Time Flight Prices** - Table of flight offers with prices (if available)\n4. **Transfer Details** - Multi-segment flight details (if any transfers)\n5. **Flight Discount Conditions** - Refund/change rules, baggage limits, cabin restrictions\n6. **Real-Time Train Info** - Table of actual trains with \n\nArchive v1.2.2: 6 files, 37487 bytes\n\nFiles: README.md (11868b), references/platforms_guide.md (7813b), scripts/requirements.txt (469b), scripts/ticket_search.py (96825b), SKILL.md (7823b), _meta.json (139b)\n\nArchive v1.2.1: 6 files, 36363 bytes\n\nFiles: README.md (8307b), references/platforms_guide.md (7813b), scripts/requirements.txt (469b), scripts/ticket_search.py (96825b), SKILL.md (7823b), _meta.json (139b)\n\nArchive v1.2.0: 6 files, 28493 bytes\n\nFiles: README.md (5087b), references/platforms_guide.md (7813b), scripts/requirements.txt (285b), scripts/ticket_search.py (70831b), SKILL.md (6753b), _meta.json (139b)\n\nArchive v1.1.0: 6 files, 28554 bytes\n\nFiles: README.md (4712b), references/platforms_guide.md (6480b), scripts/requirements.txt (285b), scripts/ticket_search.py (70831b), SKILL.md (6682b), _meta.json (139b)\n\nArchive v1.0.0: 13 files, 42304 bytes\n\nFiles: README.md (5860b), references/platforms_guide.md (6480b), scripts/requirements.txt (664b), scripts/skyscanner_lib/__init__.py (60b), scripts/skyscanner_lib/config.py (1227b), scripts/skyscanner_lib/devicedata.json (2572b), scripts/skyscanner_lib/errors.py (912b), scripts/skyscanner_lib/px.py (9034b), scripts/skyscanner_lib/skyscanner.py (17022b), scripts/skyscanner_lib/types.py (2164b), scripts/ticket_search.py (83343b), SKILL.md (7434b), _meta.json (139b)","readmeExcerpt":"Skill: Ticket Price Compare Owner: amurtiger01 Summary: Compare real-time flight and train ticket prices across major platforms with direct booking links, real-time train availability, and discount condition details. Tags: latest:1.2.7 Version history: v1.2.7 | 2026-07-09T16:45:43.151Z | user Set author to Amurtiger01 v1.2.6 | 2026-04-25T16:28:21.307Z | user Remove SSL bypass entirely: no CERT_NONE in codebase, full ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"python scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" flight"},{"language":"bash","snippet":"python scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" train"},{"language":"bash","snippet":"python scripts/ticket_search.py \"<departure>\" \"<arrival>\" \"<date>\" all"},{"language":"bash","snippet":"python scripts/ticket_search.py Beijing Guangzhou 2026-05-01 train"},{"language":"bash","snippet":"python scripts/ticket_search.py Beijing Guangzhou 2026-05-01 flight"},{"language":"bash","snippet":"export FIRECRAWL_API_KEY=\"fc-your-actual-api-key-here\""}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: ticket-price-compare\nversion: 1.2.7\nauthor: Amurtiger01\ndescription: This skill should be used when the user wants to compare and search for flight or train ticket prices across multiple platforms. It supports both domestic (China) and international routes, fetches real-time train availability via 12306, uses Firecrawl to render Ctrip JS pages for detailed flight data (flight numbers, times, aircraft types, prices), generates direct search links for all major booking platforms and airline official websites, provides WeChat mini program quick links for mobile search, and highlights discount conditions. Trigger scenarios include: searching for cheap flights, comparing train ticket prices, finding international flight deals, looking for the best ticket booking platform, or asking about ticket discount conditions.\nenvironment_variables:\n  - name: FIRECRAWL_API_KEY\n    required: false\n    description: \"Firecrawl API key for JS rendering of Ctrip flight pages. Register at firecrawl.dev. Free tier available (500 credits/month).\"\n  - name: TEQUILA_API_KEY\n    required: false\n    description: \"Kiwi.com Tequila API key for international flight data. Self-service registration is closed.\"\n  - name: AMADEUS_CLIENT_ID\n    required: false\n    description: \"Amadeus API client ID. Self-service registration is closed.\"\n  - name: AMADEUS_CLIENT_SECRET\n    required: false\n    description: \"Amadeus API client secret. Self-service registration is closed.\"\nnetwork_access:\n  - domain: kyfw.12306.cn\n    purpose: \"12306 train schedule & fare queries (public API, no auth)\"\n  - domain: flights.ctrip.com\n    purpose: \"Ctrip PC flight search page (scraping / Firecrawl JS rendering)\"\n  - domain: m.ctrip.com\n    purpose: \"Ctrip mobile H5 flight page (Firecrawl fallback for price calendar)\"\n  - domain: flight.qunar.com\n    purpose: \"Qunar flight search page (link generation)\"\n  - domain: api.firecrawl.dev\n    purpose: \"Firecrawl /v2/scrape API for JS rendering (optional, requires FIRECRAWL_API_KEY)\"\n  - domain: api.tequila.kiwi.com\n    purpose: \"Kiwi.com Tequila flight search API (optional, requires TEQUILA_API_KEY)\"\n  - domain: api.amadeus.com\n    purpose: \"Amadeus production API (optional, requires AMADEUS credentials)\"\n  - domain: test.api.amadeus.com\n    purpose: \"Amadeus test API (optional, for development)\"\n---\n\n# Ticket Price Compare - Multi-Platform Ticket Price Comparison\n\n## Overview\n\nThis skill enables real-time comparison of flight and train ticket prices. It fetches **real-time train availability** via 12306 (no API key needed), and uses **Firecrawl to render Ctrip JS pages** for detailed flight data when `FIRECRAWL_API_KEY` is set. It also generates direct search links for all major booking platforms and **WeChat mini program quick links** for convenient mobile search. Tequila/Amadeus APIs are available as optional fallbacks for users who already have keys. Discount conditions and restrictions are clearly listed separately.\n\n## Data Sources\n\n### Firecrawl"},{"path":"README.md","content":"# Ticket Price Compare - Multi-Platform Ticket Price Comparison\n\n[![Version](https://img.shields.io/badge/Version-v1.2.7-blue)]()\n[![Skill Type](https://img.shields.io/badge/Type-AI%20Skill-blue)]()\n[![Python](https://img.shields.io/badge/Python-3.8%2B-green)]()\n[![License](https://img.shields.io/badge/License-MIT-yellow)]()\n\n> Real-time multi-platform flight and train ticket price comparison Skill. Supports domestic/international routes, 12306 real-time seat availability, Firecrawl-powered detailed flight data, no API key required for core features.\n\n## Highlights\n\n- **Firecrawl-Powered Flight Data** - Renders Ctrip JS pages via Firecrawl, gets detailed flight numbers, times, aircraft types, and prices\n- **Real-Time Train Seat Availability** - Direct 12306 public endpoint, returns actual schedules, seats, and fares\n- **Zero Configuration Core** - 12306 train queries work out of the box; Firecrawl enhances flight data when API key is set\n- **Multi-Source Flight Comparison** - Firecrawl / Ctrip scraping / Tequila / Amadeus multiple data sources\n- **Domestic + International Routes** - Supports both Chinese and English city names\n- **Platform Search Links** - One-click access to Ctrip, Qunar, Fliggy, Tongcheng, Skyscanner, Google Flights, etc.\n- **Airline Official Sites** - Covers 10 Chinese + 13 international airlines\n- **WeChat Mini Program Links** - Mini program search tips for convenient mobile search\n- **Discount Condition Alerts** - Auto-lists student tickets, child tickets, refund/change rules\n\n## Data Sources\n\n| Data Source | Type | API Key Required | Description |\n|-------------|------|:--------------:|-------------|\n| **Firecrawl + Ctrip** | JS Rendering | Optional | Renders Ctrip flight pages, gets individual flight numbers, times, aircraft types, and prices. Set `FIRECRAWL_API_KEY` to enable. Register at [firecrawl.dev](https://firecrawl.dev) |\n| 12306 | Public API | No | Real-time train seat availability and fares |\n| Ctrip Scraping | Direct HTTP | No | Basic flight info without JS rendering (limited data) |\n| Tequila | REST API | Optional | Kiwi.com flight data (registration closed) |\n| Amadeus | REST API | Optional | Global flight data (registration closed) |\n\n## What's New in v1.2.0\n\n- **Firecrawl Integration** - Added `FirecrawlScraper` class that uses Firecrawl's `/v2/scrape` API to render Ctrip's JavaScript-heavy flight search pages, extracting detailed flight data (flight numbers, departure/arrival times, aircraft types, individual cabin prices, transfer details)\n- **Dual-Source Flight Scraping** - PC page (primary) returns per-flight details; mobile H5 page (fallback) returns price calendar with daily lowest prices\n- **Smart Parsing** - Robust markdown parser extracts structured flight data from Ctrip's rendered output, handling various cabin classes and transfer flights\n- **Proxy Optimization** - Switched from `proxy: \"auto\"` to `proxy: \"basic\"` for better reliability with Chinese booking sites\n- **Enhanced Train Prices** - 123"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn74yqvqr8gy2c7yr0n4yg1kv584p8mw\",\n  \"slug\": \"ticket-price-compare\",\n  \"version\": \"1.2.7\",\n  \"publishedAt\": 1783615543151\n}"},{"path":"references/platforms_guide.md","content":"# Ticket Price Comparison Platform Detailed Guide\n\n## 1. Domestic Flight Platforms\n\n### Ctrip\n- **URL**: https://flights.ctrip.com\n- **Advantages**: Largest domestic OTA, most comprehensive flight coverage, good refund/change service\n- **Features**:\n  - Price calendar: view price trends for 7 days before/after\n  - Ctrip special deals section\n  - Ctrip premium member discounts\n- **Common Discount Conditions**:\n  - New user first-order discount (requires new account registration)\n  - Ctrip Black Diamond/Diamond member exclusive discounts\n  - Bank card payment discount (requires specific bank card)\n  - Early/late flight specials (typically flights before 6:00 or after 22:00)\n\n### Qunar\n- **URL**: https://flight.qunar.com\n- **Advantages**: Price comparison aggregator, compare multiple agent prices for the same flight\n- **Features**:\n  - Price monitoring alerts\n  - Special deals calendar\n  - \"Last-minute\" low-price flight recommendations\n- **Common Discount Conditions**:\n  - Agent coupons (discount vouchers)\n  - Qunar new user welcome package\n  - Special fare cabins (may be group tickets, strict refund/change rules)\n  - Flash sales (typically limited to 2 hours)\n\n### Fliggy\n- **URL**: https://www.fliggy.com\n- **Advantages**: Alibaba ecosystem, 88VIP members get extra discounts\n- **Features**:\n  - Fliggy mileage offset\n  - Taobao/Alipay quick payment\n  - Credit Fly (fly now, pay later)\n- **Common Discount Conditions**:\n  - 88VIP member exclusive prices\n  - Alipay payment random discount\n  - New user exclusive coupons\n  - Mileage redemption discount\n\n### Tongcheng (LY.com)\n- **URL**: https://www.ly.com\n- **Advantages**: WeChat mini program easy access, sometimes has exclusive low prices\n- **Features**:\n  - WeChat one-click login and purchase\n  - Tongcheng Black Whale member discount\n  - CNY 9.9 flight deals section (limited quantity)\n- **Common Discount Conditions**:\n  - WeChat Pay exclusive discount\n  - Tongcheng member tier discount\n  - Flash sale prices (limited quantity)\n\n### Spring Airlines Official Site\n- **URL**: https://www.ch.com\n- **Advantages**: Low-cost carrier, usually the lowest prices\n- **Features**:\n  - CNY 9/99/199 special tickets\n  - Spring Green Wing member discount\n- **Common Discount Conditions**:\n  - Special tickets do not include checked baggage (must purchase separately)\n  - No free meals\n  - Smaller seat pitch\n  - High refund/change fees\n  - Special tickets usually non-refundable and non-changeable\n\n## 2. International Flight Platforms\n\n### Skyscanner\n- **URL**: https://www.skyscanner.net\n- **Advantages**: World's largest flight comparison, covers 1200+ airlines and OTAs\n- **Features**:\n  - \"Cheapest month\" search\n  - \"Everywhere\" exploration (enter departure, find cheapest destination)\n  - Price alert feature\n- **Common Discount Conditions**:\n  - Special tickets usually non-refundable and non-changeable\n  - Some prices from agents (refund/change must contact agent)\n  - Connecting flights are cheaper but take longer\n\n### Google "},{"path":"scripts/requirements.txt","content":"# No required dependencies - the script uses Python stdlib only\n# Web scraping for flight prices (Ctrip/Qunar) and 12306 train API\n# work out of the box without any additional packages.\n\n# Optional: Firecrawl (JS rendering for Ctrip flight pages)\n# Set FIRECRAWL_API_KEY env var to enable. Register at https://firecrawl.dev\n# No pip install needed - uses REST API via urllib\n\n# Optional: Amadeus Python SDK (only for existing Amadeus API key holders)\n# amadeus>=12.0.0"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1785,"uniquenessScore":42,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T16:21:46.582Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T16:21:46.582Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:50:00.641Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}