원클릭으로
travel-query
火车票/高铁时刻查询。直接调 12306 官方 API,免登录、免验证码,一次 curl 获取车次/时间/历时/票价。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
火车票/高铁时刻查询。直接调 12306 官方 API,免登录、免验证码,一次 curl 获取车次/时间/历时/票价。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
消息渠道接入配置:飞书 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