Go-home - 回家最优路线查询系统
](https://github.com/huanchong-99/Go-Home)
一款整合机票和火车票查询的智能出行规划软件,通过 AI + MCP 协议实现跨模式交通组合查询,帮助你找到回家的最优路线方案。
项目地址:
推荐 API 服务:SiliconFlow API(注册链接,邀请码:JoeKp6UF)
- API Base URL:
https://api.siliconflow.cn/v1 - 提供多种高性价比模型选择
- 国内访问速度快,稳定性好
功能特性
- 国际航班查询:支持查询全球 152个 国际机场的航班信息
- 智能中转推荐:自动通过 39个国内枢纽 + 152个国际机场 计算最优中转组合
- 灵活查询策略:快速/推荐/全面 三档可选,根据国际节点开关自动调整枢纽数量(8-73个)
- 国际节点智能开关:
- 默认关闭:中国大陆往返其他地区仅使用国内枢纽中转,适合亚洲区域内旅行(如东南亚、东亚、港澳台) - 开启后:启用全球枢纽网络(含中东、欧洲等国际枢纽),适合跨洲际旅行(如去欧美、非洲) - 智能建议:亚洲区域内旅行保持关闭即可,避免不必要的绕路;远程洲际旅行才需开启
- 跨模式组合:支持 飞机→飞机、飞机→高铁、高铁→飞机、高铁→高铁 等多种组合
- 14种出行场景:2种直达 + 4种两段中转 + 8种三段中转,每种场景支持2小时/3小时换乘时间
- 程序化路线计算:所有价格、时长、换乘可行性由程序精确计算,AI 只负责自然语言总结
- 智能路线检测:自动识别国内/国际路线类型,选择合适的中转枢纽
- 多策略优化:省钱优先、省时优先、均衡推荐
- 住宿费用计算:自动识别需要过夜的中转方案,计算真实成本(¥200/次)
- 现代化 UI:基于 CustomTkinter 的深色/浅色主题界面
- 便携版发布:打包成独立 exe,无需安装 Python 环境即可使用
核心设计理念
数据计算 vs AI 总结
本系统采用 "程序计算数据,AI 总结结果" 的架构设计:
┌─────────────────────────────────────────────────────────────────┐
│ 传统方案(已弃用) │
│ 原始数据 ──────────────────────────────────▶ AI 计算+总结 │
│ (大量航班/车次信息) (容易产生幻觉) │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ Go-home 方案 │
│ 原始数据 ──▶ 程序精确计算 ──▶ 结构化结果 ──▶ AI 自然语言总结 │
│ route_calculator 价格/时长 (无幻觉风险) │
│ 均已计算好 │
└─────────────────────────────────────────────────────────────────┘优势:
- 价格、时长、换乘时间等关键数据 100% 准确
- AI 只负责将结构化数据转为用户友好的自然语言描述
- 避免 AI 在复杂计算场景下产生幻觉
核心功能
国际航班查询
支持查询全球 152个 国际机场,覆盖六大洲主要城市:
| 地区 | 机场数量 | 主要城市 |
|---|---|---|
| 东南亚 | 16个 | 曼谷、新加坡、吉隆坡、雅加达、马尼拉、普吉岛、巴厘岛 |
| 东亚 | 10个 | 东京、大阪、首尔、釜山、福冈、札幌 |
| 南亚 | 11个 | 新德里、孟买、科伦坡、马尔代夫、加德满都 |
| 中东 | 14个 | 迪拜、多哈、阿布扎比、利雅得、伊斯坦布尔 |
| 欧洲 | 34个 | 伦敦、巴黎、法兰克福、阿姆斯特丹、莫斯科、罗马 |
| 北美洲 | 26个 | 纽约、洛杉矶、旧金山、芝加哥、温哥华、多伦多 |
| 中南美洲 | 10个 | 墨西哥城、圣保罗、布宜诺斯艾利斯 |
| 大洋洲 | 12个 | 悉尼、墨尔本、奥克兰、斐济 |
| 非洲 | 9个 | 开罗、约翰内斯堡、内罗毕、毛里求斯 |
| 港澳台 | 10个 | 香港、澳门、台北、高雄 |
完整机场列表请查看 中转枢纽.md
智能路线检测
系统自动识别 4 种路线类型,选择最合适的中转枢纽:
| 路线类型 | 示例 | 自动选择的枢纽 |
|---|---|---|
| 国内路线 | 北京→南京 | 39个国内枢纽 |
| 国内→东南亚 | 北京→曼谷 | 华南门户(广州、深圳、昆明)+ 东南亚枢纽 |
| 国内→远程国际 | 北京→纽约 | 全球枢纽(含中东、欧洲转机点) |
| 国际→国内 | 曼谷→南京 | 国际枢纽 + 国内门户城市 |
中转航班解析
正确解析携程的中转航班信息:
- 多航班号提取(如 CX337/CX872)
- 中转城市识别(如"经中国香港")
- 中转等待时间(如"1h35m")
- 总飞行时长(考虑跨天)
结果导出功能
导出完整的查询数据,便于离线分析和对比:
- 全量数据:所有单段查询结果(包括成功和失败的查询)+ 所有组合路线方案
- 详细信息:每个查询的ID、路线、交通方式、查询状态、耗时
- 智能分组:按段数分组(直达、中转),按中转城市分类
- 文件命名:自动命名为"Go-home_完整数据_出发地到目的地_日期_时间戳.txt"
- 数据完整性:包含查询参数、枢纽列表、所有原始查询响应
AI 推荐详情
AI 为所有推荐方案输出完整详情:
- 具体的航班号或车次号
- 出发时间、到达时间
- 价格详情
- 中转等待时间(如有)
- 统一格式输出,便于对比选择
便携版发布
完整的便携版发布包(约 351MB),无需安装任何依赖:
dist/
├── Go-home.exe (45MB) - 主程序
├── config.json - 配置文件(需填写API Key)
├── 启动说明.txt - 使用说明
├── node/ (86MB) - Node.js 运行时
├── 12306-mcp/ (158MB) - 火车票服务
└── FlightTicketMCP/ (64MB) - 机票服务与官方查询的区别
官方平台算法:图搜索与启发式剪枝
携程、12306 等平台在计算中转方案时,面临的是一个海量数据的图论问题。为了在毫秒级返回结果,它们并非进行全量穷举,而是采用 "基于图论的启发式搜索 + 预计算" 的混合策略。
1. 核心逻辑:有向加权图搜索
官方平台构建了一个包含所有站点(节点)和航线/车次(边)的巨大网络。算法通过综合成本函数(Cost = 票价 + 耗时 + 舒适度)来寻找最优路径。
2. 剪枝策略(决定谁是中转点)
为了效率,官方算法会通过以下手段大幅缩小搜索范围:
- 枢纽优先(Hub-and-Spoke):优先检索航空公司基地和铁路局所在城市。如果 A 和 B 很近,算法可能忽略大枢纽;如果很远,则只看核心枢纽。
- 地理围栏(Geo-Pruning):以起终点为焦点划定"椭圆区域",地理上严重偏离方向的城市(如北京去广州,经停哈尔滨)会被直接剔除。
- 连通度过滤:优先考虑线路密集的站点,小站往往在第一轮筛选中就被忽略。
3. 业务规则与预计算
- 预计算缓存:热门路线(如北京-上海)的 Top N 方案是提前算好存入缓存的,而非实时计算。
- 商业规则:优先推荐同联盟航空组合(便于行李直挂),并极力避免"异站换乘"(如虹桥转浦东),除非用户强制指定。
Go-home 的差异化价值
Go-home 并非要替代官方的高性能算法,而是为了填补官方算法因"剪枝"和"商业规则"而遗漏的盲区,特别是跨交通模式的组合。
| 维度 | 官方平台 (携程/12306) | Go-home |
|---|---|---|
| 核心策略 | 图搜索 + 启发式剪枝 | |
| 为了速度和商业合理性,过滤掉大量"非典型"路线。 | 指定枢纽 + 跨模态组合 | |
| 在用户/系统指定的枢纽范围内,进行全量跨模式计算。 | ||
| 中转点选择 | 依赖热度与地理位置 | |
| 可能因"地理围栏"算法而忽略掉便宜但稍绕路的方案。 | 覆盖全量枢纽 | |
| 即使地理上绕路(如为了省钱),只要在指定枢纽列表中,都会被计算。 | ||
| 跨模式能力 | 较弱 (空铁联运少) | |
| 通常仅支持同一平台内的组合,极少主动推荐"廉航+高铁"的极致方案。 | 极强 (无缝拼接) | |
| 打破平台壁垒,挖掘"春秋航空+绿皮车"这类官方算法不会推荐的组合。 | ||
| 异站换乘 | 尽量避免 | |
| 视为糟糕的用户体验,权重极低。 | 完全支持 | |
| 只要时间允许,诚实展示异站换乘的成本优势,由用户决定是否接受。 | ||
| 透明度 | 黑盒 (受商业影响) | |
| 优先展示高利润或合作航司方案。 | 白盒 (纯数学计算) | |
| 无商业偏见,纯粹基于价格和时间的数学最优解。 |
总结
Go-home 不受"地理围栏"和"商业惯例"的束缚,它通过计算力的堆叠,挖掘出那些被官方算法判定为"不合理"但对特定用户(如学生党、时间充裕者)极具性价比的"隐形路线"。
数据来源说明
机票数据 - 携程 (Ctrip)
重要提示
机票数据来源于携程网站,存在以下限制:
- 验证码处理:首次查询可能触发验证码,程序会弹出浏览器窗口,需要手动完成验证
- Cookie 复用:验证完成后 Cookie 会保存在
browser_data/目录,后续查询无需重复验证 - 价格差异:携程存在"杀熟"现象,不同账号看到的价格可能不同
- 活动限制:携程的优惠活动、会员折扣等无法体现在查询结果中
- 平台限制:仅能获取携程平台的机票数据,其他平台(飞猪、去哪儿等)的价格和活动无法查询
- 反爬限制:携程反爬较严格,机票查询采用串行方式执行,速度较慢
建议:查询结果仅供参考,实际购票时请多平台比价。
火车票数据 - 12306 官方
火车票数据直接来自 12306 官方 API:
- 数据准确:价格、余票信息与官方一致
- 查询限制:12306 仅支持查询 15 天内的车票
- 无需登录:火车票查询不需要登录验证
快速开始
方式一:使用安装版(推荐)
前置要求
安装 Chrome 或 Edge 浏览器(与源码运行要求相同)
安装步骤
- 从 Releases 下载
Go-Home.exe安装包 - 运行安装程序,按照向导完成安装
- 启动 "Go-home" 软件
- 在设置界面填写:
- API Key - API 链接 URL(如使用 OpenAI 则保持默认)
- 点击"保存"按钮
- 点击"一键启动服务"
- 填写行程信息,开始查询
方式二:从源码运行
0. 前置要求:安装 Chrome 或 Edge 浏览器
重要:机票查询功能依赖 Chromium 内核浏览器进行网页自动化操作。
程序会自动检测并使用以下浏览器(按优先级顺序):
| 浏览器 | 检测路径 |
|---|---|
| Chrome (优先) | C:\Program Files\Google\Chrome\Application\chrome.exe |
| Edge | C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe |
1. 环境准备
推荐使用 Conda 创建独立环境:
# 创建环境
conda create -n Go-home python=3.13
# 激活环境
conda activate Go-home
# 安装 Node.js (用于火车票服务)
conda install -c conda-forge nodejs2. 安装依赖
# 克隆项目
git clone https://github.com/huanchong-99/Go-Home.git
cd Go-home
# 安装 Python 依赖
pip install -r requirements.txt
# 安装机票 MCP 服务
pip install -e ./FlightTicketMCP
# 安装火车票 MCP 服务
cd 12306-mcp
npm install
npm run build
cd ..3. 配置 API
复制配置文件并填入你的 API 信息:
cp config.example.json config.json编辑 config.json:
{
"api_base_url": "https://api.openai.com/v1",
"api_key": "your-api-key-here",
"model": "gpt-4",
"theme": "dark",
"window_size": "1200x800",
"accommodation_enabled": true,
"accommodation_threshold": 6
}支持任何 OpenAI 兼容的 API 服务(如 Azure OpenAI、Claude API 代理等)。
推荐使用 SiliconFlow API(注册链接,邀请码:JoeKp6UF):
- API Base URL:
https://api.siliconflow.cn/v1 - 提供多种高性价比模型选择
- 国内访问速度快,稳定性好
4. 运行程序
python main.py项目架构
┌─────────────────────────────────────────────────────────────┐
│ Go-home 主程序 │
│ main.py (CustomTkinter UI + AI API) │
│ │
│ ┌─────────────────┐ ┌──────────────────────────────────┐ │
│ │ 分段查询引擎 │ │ 中转枢纽管理器 │ │
│ │ segment_query.py│ │ transfer_hubs.py │ │
│ └────────┬────────┘ └──────────────────────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ 路线计算引擎 │ ← 程序化价格/时长计算 │
│ │route_calculator │ (避免 AI 幻觉) │
│ └────────┬────────┘ │
└───────────┼─────────────────────────────────────────────────┘
│
│ MCP Protocol (stdio)
│
┌───────┴───────┐
│ │
▼ ▼
┌─────────────┐ ┌─────────────────┐
│ FlightMCP │ │ 12306-mcp │
│ (Python) │ │ (TypeScript) │
│ │ │ │
│ 航班路线查询 │ │ 火车票余票查询 │
│ 152个国际 │ │ 中转票查询 │
│ 机场支持 │ │ │
└──────┬──────┘ └────────┬────────┘
│ │
▼ ▼
携程网站 12306 官方中转枢纽策略
系统内置完善的中转枢纽网络,支持智能中转推荐:
| 类型 | 数量 | 说明 |
|---|---|---|
| 国内航空枢纽 | 39个 | 10个国际航空枢纽 + 29个区域航空枢纽 |
| 国际机场 | 152个 | 覆盖全球六大洲 |
| 空铁联运节点 | 11个 | 支持飞机-高铁零换乘/快速换乘 |
详细文档:完整的枢纽列表、空铁联运节点、区域中转策略等信息请查看 中转枢纽.md
枢纽等级
| 等级 | 城市 |
|---|---|
| 一级 | 北京、上海、广州 |
| 二级 | 深圳、成都、重庆、西安、武汉、郑州 |
| 三级 | 南京、杭州、长沙、昆明、沈阳、哈尔滨 |
| 四级 | 其他省会及重要城市 |
空铁联运枢纽
支持飞机转高铁零换乘或快速换乘的城市:
- 一体化换乘(60-90分钟):上海虹桥、北京大兴、郑州新郑、成都双流/天府、海口美兰、贵阳龙洞堡、青岛胶东、武汉天河、三亚凤凰、兰州中川
- 轨道交通连接(120分钟):长沙黄花、深圳宝安
项目结构
Go-home/
├── main.py # 主程序入口
├── segment_query.py # 分段查询引擎
├── transfer_hubs.py # 中转枢纽配置
├── route_calculator.py # 路线计算引擎
├── config.json # 用户配置 (不要提交到 Git)
├── config.example.json # 配置示例
├── requirements.txt # Python 依赖
├── Go-home.spec # PyInstaller 打包配置
│
├── FlightTicketMCP/ # 机票查询 MCP 服务
│ ├── flight_ticket_mcp_server/
│ │ ├── tools/ # 查询工具实现
│ │ └── utils/ # 城市字典(152个国际机场)
│ └── browser_data/ # 浏览器 Cookie 缓存
│
├── 12306-mcp/ # 火车票查询 MCP 服务
│ ├── src/ # TypeScript 源码
│ └── build/ # 编译输出
│
├── dist/ # 便携版发布目录
│ ├── Go-home.exe
│ ├── config.json
│ ├── node/
│ ├── 12306-mcp/
│ └── FlightTicketMCP/
│
├── 中转枢纽.md # 枢纽配置文档(39+152个枢纽详情)
└── 比较.md # 智能中转模式效果对比MCP 工具列表
机票服务 (FlightTicketMCP)
| 工具名 | 功能 |
|---|---|
searchFlightRoutes | 航班路线查询(支持152个国际机场) |
getTransferFlightsByThreePlace | 中转航班查询 |
getFlightInfo | 航班详情查询 |
getWeatherByCity | 城市天气查询 |
火车票服务 (12306-mcp)
| 工具名 | 功能 |
|---|---|
get-tickets | 火车票余票查询 |
get-interline-tickets | 中转票查询 |
get-train-route-stations | 车次经停站查询 |
get-station-code-of-citys | 城市站点代码查询 |
常见问题
Q: 机票查询弹出浏览器窗口怎么办?
A: 这是验证码检测机制。请在弹出的浏览器中完成验证(滑块/点选),完成后程序会自动继续。验证通过后 Cookie 会保存,后续查询不需要再验证。
Q: 为什么机票价格和我看到的不一样?
A: 携程对不同用户展示不同价格(俗称"杀熟")。程序获取的是未登录状态的价格,可能与你登录后看到的价格不同。此外,会员折扣、平台活动等也不会体现在查询结果中。
Q: 火车票查询显示"日期调整"是什么意思?
A: 12306 只能查询 15 天内的车票。如果你查询的日期超出范围,系统会自动调整到最远可查日期,并在结果中提示。
Q: 查询很慢怎么办?
A:
- 机票查询采用串行方式(避免触发反爬),每个查询约需 10-30 秒
- 火车票查询采用并行方式(5并发),速度较快
- 选择更快的查询策略可以加快速度
- 查询策略与预计时间:
- 快速(8-15个枢纽):≈8-23分钟 - 推荐(15-30个枢纽):≈15-45分钟 - 全面(39-73个枢纽):≈39-110分钟 - *具体数量取决于"国际节点查询"开关和路线类型*
Q: 便携版提示"12306-MCP 连接失败"?
A: 确保 dist/12306-mcp/ 目录包含完整的 node_modules 和 build 文件夹。
Q: 国际航班查询支持哪些城市?
A: 支持全球 152 个国际机场,覆盖东南亚、东亚、南亚、中东、欧洲、北美、中南美、大洋洲、非洲及港澳台地区。完整列表请查看 中转枢纽.md。
Q: 什么时候需要开启"国际节点查询"开关?
A: 国际节点开关默认关闭,适合大多数亚洲区域内旅行场景。只有在特定情况下才需要开启:
❌ 不需要开启的场景(保持默认关闭):
- 中国大陆↔东南亚(如北京→曼谷、上海→新加坡)
- 中国大陆↔东亚(如北京→东京、上海→首尔)
- 中国大陆↔港澳台地区(如广州→香港、上海→台北)
- 亚洲区域内短距离航线(飞行时间 8小时)
- 需要考虑中东枢纽中转的路线(如迪拜、多哈转机)
- 需要考虑欧洲枢纽中转的路线(如法兰克福、阿姆斯特丹转机)
为什么默认关闭?
- 亚洲区域内使用国内枢纽(如广州、昆明)直飞或中转即可,效率最高
- 开启国际节点会增加大量远程中转枢纽(如迪拜、多哈),对于短途反而绕路
- 查询时间会显著增加(多查询 30+ 个国际枢纽)
- 价格可能反而更贵(国际中转成本高于直飞)
示例:
- ❌ 北京→曼谷(4小时航程):关闭开关,使用昆明/广州中转即可
- ✅ 北京→纽约(13小时航程):开启开关,可以考虑迪拜、多哈、东京等国际枢纽中转
技术栈
- 前端:CustomTkinter (现代化 Tkinter)
- AI:OpenAI API (支持任何兼容接口)
- 路线计算:Python dataclasses + 组合算法(程序化计算,避免 AI 幻觉)
- 机票服务:Python + FastMCP + DrissionPage (浏览器自动化)
- 火车票服务:TypeScript + MCP SDK
- 打包:PyInstaller (Python) + 便携 Node.js
- 协议:Model Context Protocol (MCP)
致谢
- 12306-mcp - 火车票查询 MCP 服务
- FlightTicketMCP - 机票查询 MCP 服务
- DrissionPage - 浏览器自动化工具
- CustomTkinter - 现代化 UI 框架
License
MIT
