跳到正文
CHUN折腾
全部项目
已跑通 2026-10-15

车来了:把广州实时公交数据抓下来自己用

想在自己设备上查到站时间。翻了官方 H5 产物,确认签名不在网页里;改用现成的开源实现把数据打通,挂到家里的 NAS 上做成网页,iPhone 打开就能看。

开始
2026-10-15
结束
持续使用中
耗时
约 5 小时
花费
0 元
技术栈 JavaScript前端产物分析第三方 API飞牛 NAS

背景

「车来了」是个实时公交 App,我实际只想要一个功能:广州的公交车现在到哪了、还有多久到站。

官方 App 广告多、要登录、要开定位权限。想法很朴素——能不能只取那一小块数据,塞进自己的小屏或者脚本里。

方案

正常会走三条路,先按成本从低到高排:

  1. 看官方网页版有没有现成接口(成本最低,先试这个)
  2. 官方/政府开放数据平台
  3. 商业数据接口

我从第 1 条开始:把车来了 H5 落地页的产物拉下来,看它到底怎么跟服务端通信。

过程

官方页面只加载三个脚本:

index.html
├── cll-md-1.0.1.js     30KB   自研埋点 SDK
├── chunk-vendors.js   102KB   框架 + 依赖
└── app.js              21KB   业务代码

逐个读下来,结论很干脆:

  • app.js 是”下载落地页”,通篇是 navigator.userAgent 分流 + 跳应用商店,整份文件里出现的域名只有 CDN、下载站和 itunes.apple.com
  • 没有任何业务 API 调用,也没有 secret / sign 这类签名字段
  • cll-md.js 是自研埋点 SDK,用 1×1 图片 beacon 把事件打到日志域名,字段白名单里确实有 secret/sign/imei/mac——但那只是”上报时顺手带上”,签名逻辑不在里面

顺手记了两条事实:

  • 应用包名有三个变体(标准版 / 大字版 / 鸿蒙版),深链能直接拉起 App
  • 下载链路是 302 跳到 APK,包有 78MB,混淆过——静态分析成本远高于收益

所以第 1 条路直接堵死:网页端不承载业务接口,签名要么在 App 原生层,要么在服务端做。

转折

社区里已经有现成的开源实现把签名和响应解密都做掉了(MD5 签名 + AES 解密,免登录、不需要 key)。

拿它验证了一下,数据是真的:城市 ID、站点下的线路、在途车辆、到站倒计时都能拿到。 既然路已经有人铺好,就没必要自己去反编译 78MB 的 APK。

接上去之后就没再停。最后它落在家里常开的飞牛 NAS 上,做成一个网页—— 出门前在 iPhone 上打开,看一眼要坐的线路和到站时间,跟装个 App 没区别,但干净得多。

踩坑

现象原因解法
一开始以为落地页里藏着接口埋点字段里出现了 secret/sign分清”上报携带的字段”和”签名算法”,前者不含后者
想直接反编译 APK 拿算法包 78MB 且混淆成本太高,先找现成实现验证可行性
数据能拿到但不敢直接信调用的是未公开接口,字段语义不明用小范围已知站点对一遍(站点下线路数、在途车数)再依赖
接口可能随时变未公开接口没有兼容承诺只取自己需要的那几个字段,不做批量采集,失败了容易发现

结果

跑通了,一直在用:飞牛 NAS 上跑着服务,网页版,iPhone 打开就看。

车来了网页版在 iPhone 上的样子:我的线路、附近站点、底部导航

界面很简单,三块就够用:

  • 我的线路:常坐的置顶,直接显示”还有几分钟 / 还有几站”(截图里 B8 是 7 分钟、还有 2 站)
  • 附近站点:按距离排,每个站点下面直接列线路和到站时间
  • 底部导航:附近 / 收藏 / 换乘 / 城市

细节上做了一点区分:换乘站会单独标出地铁(体育西路这种),公交线路会带运营时段(777 是 06:30–22:00)。

  • 广州的城市、站点、线路、在途车辆、到站倒计时都能稳定取到
  • 拿手机 Safari 打开网页即可,不用装 App、不用看广告、不用给定位权限
  • 常驻 NAS,不需要我开电脑;NAS 本来就 7×24 开着,等于白嫖
  • 成本 0,只是几个字段的请求

为什么选”网页 + 自建 NAS”而不是做个小程序或者 App:

  • 网页是零安装成本:iPhone 加到主屏幕就当一个图标用,跟 App 一样
  • NAS 是现成的服务器:家里本来就有,不用额外租云主机
  • 不自己的账号体系:就我一个人用,不需要登录、不需要多用户

这个组合让我意识到一件事:很多时候”做个 App”是不必要的, 一个网页 + 一台常开的机器,就够覆盖自己一个人的使用场景。

复盘

  • “官网看起来有接口”和”接口真的能被复用”是两件事。先花一小时确认产物里到底有什么,比直接上手反编译省得多
  • 这事最后不是我逆出来的——认清”我要的是结果,不是过程”,能直接用现成实现就别死磕
  • 未公开接口最大的成本不是写代码,是长期维护:所以只取最小字段、不做批量、出问题能立刻发现

合规说明

这条记录只写分析结论,不包含接口地址、参数字段和签名实现。 未公开接口的抓取通常违反服务条款,也可能影响对方服务;真要长期用,走开放数据或买接口更省心。

更新日志

  1. 部署到飞牛 NAS,做成网页,iPhone 上直接打开查线。
  2. 拉取官方 H5 三个产物,逐个分析,确认页面里没有业务接口。
  3. 改用现成开源实现打通数据,广州线路、站点、在途车、到站倒计时都能取到。