with one click
travel-query
火车票/高铁时刻查询。直接调 12306 官方 API,免登录、免验证码,一次 curl 获取车次/时间/历时/票价。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
火车票/高铁时刻查询。直接调 12306 官方 API,免登录、免验证码,一次 curl 获取车次/时间/历时/票价。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
消息渠道接入配置:飞书 WebSocket 长连接配置与使用说明。未来支持微信、Telegram 等渠道。
飞书云文档(Docx / Wiki 文档):读取和编辑飞书文档内容。当用户给出文档 URL 或 token,或需要查看、创建、编辑文档、插入或下载文档图片附件时使用。文档中嵌入的电子表格、多维表格、画板,先用本 skill 提取 token 再切到对应 skill。当用户给出 doubao.com 的 /docx/ 或 /wiki/ URL/token 时,也应直接使用本 skill;路由依据是 URL 路径模式和 token,而不是域名。不负责文档评论管理,也不负责表格或 Base 的数据操作。
飞书即时通讯:收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件(支持大文件分片下载)、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片(Interactive Card)、监听卡片按钮回调(card.action.trigger)。当用户需要发消息、查看或搜索聊天记录、下载聊天中的文件、查看群成员、搜索群、创建群聊或话题群、管理标记数据、管理 Feed 置顶(添加/移除/查询置顶会话)、管理标签数据、处理卡片回调时使用。
Use when first setting up lark-cli, running auth login, switching user/bot identity (--as), handling permission denied or scope errors, needing to update lark-cli, or seeing _notice in JSON output.
微信读书助手 — 搜索书籍、管理书架、查看笔记划线、阅读统计、发现推荐好书。
对代码变更做审查:识别 bug、安全漏洞、性能问题。P0 必须修复写评论,P1 建议性评论,P2 只在总结里一句带过。
| name | travel-query |
| description | 火车票/高铁时刻查询。直接调 12306 官方 API,免登录、免验证码,一次 curl 获取车次/时间/历时/票价。 |
| trigger | 12306|高铁|火车|动车|车次|列车|北京到|上海到|广州到|深圳到|车票|时刻表|G\d+|D\d+|K\d+ |
两步 curl 搞定,不要用 web_search 搜时刻表。
# 获取 cookie 并发现动态查询路径
COOKIE_FILE=/tmp/12306_cookie.txt
curl -s -c "$COOKIE_FILE" "https://kyfw.12306.cn/otn/leftTicket/init" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" -o /dev/null
# 获取动态 endpoint(12306 定期变更查询路径)
QUERY_URL=$(curl -s -b "$COOKIE_FILE" "https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={日期}&leftTicketDTO.from_station={出发站编码}&leftTicketDTO.to_station={到达站编码}&purpose_codes=ADULT" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
-H "Referer: https://kyfw.12306.cn/otn/leftTicket/init" | python3 -c "import json,sys; d=json.loads(sys.stdin.read()); print(d.get('c_url','leftTicket/queryG'))")
curl -s -b "$COOKIE_FILE" "https://kyfw.12306.cn/otn/$QUERY_URL?leftTicketDTO.train_date={日期}&leftTicketDTO.from_station={出发站编码}&leftTicketDTO.to_station={到达站编码}&purpose_codes=ADULT" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
-H "Referer: https://kyfw.12306.cn/otn/leftTicket/init" | python3 -c "
import json, sys
data = json.loads(sys.stdin.read())
results = data.get('data', {}).get('result', [])
print(f'共 {len(results)} 趟车')
print(f'{\"车次\":<8}{\"出发\":<8}{\"到达\":<8}{\"历时\":<8}{\"商务/特\":<6}{\"一等\":<6}{\"二等\":<6}')
for r in results[:15]:
p = r.split('|')
if len(p) > 30:
# 3=车次, 8=出发时间, 9=到达时间, 10=历时, 25=商务座, 31=一等座, 30=二等座
print(f'{p[3]:<8}{p[8]:<8}{p[9]:<8}{p[10]:<8}{p[25] or \"-\":<6}{p[31] or \"-\":<6}{p[30] or \"-\":<6}')
"
COOKIE_FILE=/tmp/12306_cookie.txt && \
curl -s -c "$COOKIE_FILE" "https://kyfw.12306.cn/otn/leftTicket/init" -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" -o /dev/null && \
QURL=$(curl -s -b "$COOKIE_FILE" "https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={日期}&leftTicketDTO.from_station={出发站编码}&leftTicketDTO.to_station={到达站编码}&purpose_codes=ADULT" -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" -H "Referer: https://kyfw.12306.cn/otn/leftTicket/init" | python3 -c "import json,sys;d=json.loads(sys.stdin.read());print(d.get('c_url','leftTicket/queryG'))") && \
curl -s -b "$COOKIE_FILE" "https://kyfw.12306.cn/otn/$QURL?leftTicketDTO.train_date={日期}&leftTicketDTO.from_station={出发站编码}&leftTicketDTO.to_station={到达站编码}&purpose_codes=ADULT" -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" -H "Referer: https://kyfw.12306.cn/otn/leftTicket/init" | python3 -c "
import json, sys
data = json.loads(sys.stdin.read())
results = data.get('data', {}).get('result', [])
print(f'共 {len(results)} 趟车')
print(f'{\"车次\":<8}{\"出发\":<8}{\"到达\":<8}{\"历时\":<8}{\"商务/特\":<6}{\"一等\":<6}{\"二等\":<6}')
for r in results:
p = r.split('|')
if len(p) > 31:
print(f'{p[3]:<8}{p[8]:<8}{p[9]:<8}{p[10]:<8}{p[25] or \"-\":<6}{p[31] or \"-\":<6}{p[30] or \"-\":<6}')
"
YYYY-MM-DD——如 2026-07-11| 站名 | 编码 | 站名 | 编码 |
|---|---|---|---|
| 北京南 | VNP | 上海虹桥 | AOH |
| 北京 | BJP | 上海 | SHH |
| 广州南 | IZQ | 深圳北 | IOQ |
| 杭州东 | HGH | 南京南 | NKH |
| 武汉 | WHN | 成都东 | ICW |
| 重庆北 | CUW | 长沙南 | CWQ |
| 天津 | TJP | 西安北 | EAY |
| 郑州东 | FEF | 合肥南 | ENH |
| 苏州 | SZH | 无锡 | WXH |
| 济南 | JNK | 青岛 | QDK |
| 厦门北 | XKS | 福州南 | FYS |
| 昆明南 | KMM | 贵阳北 | KQW |
| 石家庄 | SJP | 太原南 | TNV |
不确定站码时,使用 12306 站名查询 API:
curl -s "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js" | grep -oP "'[A-Z]{3}'" | head或直接搜索:
curl -s "https://search.12306.cn/search/v1/station/search?keyword={站名}" -H "User-Agent: Mozilla/5.0"
| 用户意图 | 做什么 |
|---|---|
| 查某日A到B的车次 | 直接调 12306 API(合并版) |
| 查最早/最晚一班 | 调 API → 按出发时间排序取首/尾 |
| 查某车次详情 | 搜索 API:https://search.12306.cn/search/v1/train/search?keyword={车次}&date={YYYYMMDD} |
| 对比两个方案 | 分别查两条线路,表格对比 |
| 分隔)| 索引 | 含义 | 索引 | 含义 |
|---|---|---|---|
| 3 | 车次 | 6 | 出发站 |
| 7 | 到达站 | 8 | 出发时间 |
| 9 | 到达时间 | 10 | 历时 |
| 25 | 商务座/特等座 | 31 | 一等座 |
| 30 | 二等座 | 26 | 软卧/一等卧 |
| 28 | 硬卧/二等卧 | 29 | 硬座 |
票量值:数字=有票,有=充足,无=售罄,空=不支持
✅ 正确流程:
1. 确定日期、出发站、到达站
2. 查站码映射(常用站码表直接查)
3. 一次 shell 合并命令搞定
4. 按需求排序/筛选,直接回答
❌ 绕路(禁止):
1. web_search("北京到上海高铁")(搜索引擎时效差)
2. web_fetch("https://www.12306.cn/...")(12306 需 JS 渲染)
3. 多次重试同一个错误的 endpoint(拿到 c_url 后直接用)
4. 使用 browser_session 打开 12306(太慢,API 更快)
activate_tools: shell