一次偶然的机会接触到一个叫全能车的APP,简单的原理就是用户共享自己摩拜、OFO、哈罗账号就可以成为APP的会员,或者可以直接买APP的会员,这样用户就可以用其他用户的账号开所有的单车,像小黄开了之后可以点继续用车无限开。这时我在想我能不能也搭建一个类似的平台呢。
这里就先拿摩拜开刀,第一步当然是去抓取API接口了。由于电脑抓取需要手机在局域网内,不方便使用,于是用安卓的Packet Capture,无需ROOT就可以抓包。软件是通过vpn建立数据传输中介,手机其他APP需通过此中介与互联网通信。如果需要抓取HTTPS的数据包记得安装证书,这里就不多说了。
打开摩拜APP,发现抓取到的数据包都是加密的,于是找到了微信上的小程序 摩拜单车 测试发现数据包都没有加密。以下面图片的摩拜单车测试,
我在https://cli.im/deqr将二维码转为链接得到http://www.mobike.com/download/app.html?b=8640179299_1
设置Packet Capture只抓取微信的数据包,从开始扫车到骑车200米之后关锁,共抓取到300多条数据。仔细查找摩拜相关的数据大约就50条左右,其它很多都是微信的数据。粗略看了下这些数据,发现摩拜单车是一直重复请求服务器。我就只取其中19条来看看。
注:以下1-19具体的数据包点击链接就可以看到。当然也可以下载压缩包:点击下载mobaidata.zip(个人手机号我就加$处理了)
1 118.89.5.17:443/mobike-api/pay/downpaymentv2.do
3 154.8.132.102:443/api/lothar/penalty/status.do
4 154.8.132.102:443/api/v2/msg/message.do
5 154.8.132.102:443/api/wechat/wxcash/getEffectiveWxCash
6 154.8.132.102:443/api/chariot/home/tab
7 118.89.5.17:443/mobike-api/rentmgr/getridestate.do
8 118.89.5.17:443/mobike-api/rentmgr/wxunlockBike.do
9 154.8.132.102:443/mobike-api/getHomeBanner.do
10 118.89.5.17:443/mobike-api/rentmgr/lockstatusv2.do
11 118.89.5.17:443/mobike-api/rentmgr/getridestate.do
12 118.89.5.17:443/mobike-api/rentmgr/lockstatusv2.do
13 154.8.132.102:443/api/v2/fencing/query.do
14 154.8.132.102:443/api/lothar/penalty/status.do
15 118.89.5.17:443/mobike-api/rentmgr/getridestate.do
16 118.89.5.17:443/mobike-api/rentmgr/getridestate.do
17 154.8.132.102:443/nearby/nearbyBikeInfo
18 154.8.132.102:443/mobike-api/rentmgr/orderinfo.do
19 154.8.132.102:443/mobike-api/rentmgr/v2/endorderinfo.do
细心的朋友会发现摩拜一直在请求154.8.132.102和118.89.5.17两个IP的433端口,查了一下这两个IP发现还真都是来自 腾讯云计算(北京)有限责任公司 腾讯云。
这里先谈谈其中几个参数,个人分析仅供参考
请求头
time: 1529060561497 时间戳 去http://www.eleuu.com/tool/?url=timestamp转换得到2018-06-15 19:02:41
nickname: %E8%91%91%E8%8C%9A%F0%9F%92%8B%E8%A8%98%E6%86%B6 用户名称 解码得到 葑茚�記憶
signature: 82e60a9e6b919c3f11743ec15bab27295e4786bc 应该是这个账号相关的签名
mobileno: 185$$$$4913 用户手机号
accesstoken: c73f078e5f45f05727d1a051c8636d81-0 这个令牌应该很有用,用于验证用户状态,估计是登录后返回的请求头里面应该有。
platform: 4 平台编号
POST参数
Userid=68032251139496167424705320这个应该是摩拜用户的唯一身份ID
latitude=30.51407 纬度
longitude=104.05528 经度
citycode=028 城市区号代码 028 代表成都 这个应该是从第6条154.8.132.102:443/api/chariot/home/tab用户提交经纬度返回的"cityCode": "028"获得
bikecode=http%3A%2F%2Fwww.mobike.com%2Fdownload%2Fapp.html%3Fb%3D8640179299_1 要开锁的单车ID,这里他将数据编码了一下,我们去http://tool.oschina.net/encode?type=2这里将其粘贴至右边框点击Native按钮就可以得到之前二维码转换得到的链接http://www.mobike.com/download/app.html?b=8640179299_1
接下来谈谈其中几个API
downpaymentv2 查询用户月卡信息
getridestate.do 查询骑行状态
wxunlockBike.do 开锁
getHomeBanner.do 获取首页横幅信息
lockstatusv2.do 查询单车开锁状态
nearbyBikeInfo 查询附近的单车信息 有兴趣的童鞋可以看看大佬写的这篇文章:《我是怎样爬下6万共享单车数据并进行分析的》
orderinfo.do 订单信息
endorderinfo.do 结算订单信息
用户开锁后会不断请求getridestate,返回的json数据中有用户骑行的时间"second": 169,表示用户骑行了169秒。如果仅开锁的话我们只需要调用118.89.5.17:443/mobike-api/rentmgr/wxunlockBike.do构造请求头信息以及POST参数信息channel=0&formId=1529060367762&bikecode=http%3A%2F%2Fwww.mobike.com%2Fdownload%2Fapp.html%3Fb%3D8640179299_1&latitude=30.51407&longitude=104.05528&btEnabled=0&openParkBike=false&userid=68032251139496167424705320×tamp=1529060371737&epdata=e5ed9924&wxcode=023CKt3t0C9EJd1sDC4t0Ewl3t0CKt3e&citycode=028
formId、timestamp的值从数据上看应该都是时间戳,epdata和wxcode需要实践测试,看是否需要。
由于不方便实际实践测试,数据方面仅能得出这些结论,有兴趣的朋友可以抓取摩拜用户登录,就能得到userid,accesstoken等参数。这样就可以使用自己的网站搭建类似于全能车的平台。用户只需要提交单车编号,经纬度信息就能开锁。
我经常给我朋友开摩拜,有时不在他旁边也能开,这里我提出一个猜想:如果用户不在单车旁边,用户输数字开锁会提交经纬度,服务器检查经纬度是否在单车附近,不在则不能开锁;但是扫二维码可以直接跳过经纬度验证,这也许就是为什么我在家也可以帮别人扫二维码开锁的原因。
好了,讲到这里你们应该对共享单车的数据传输应该有一个系统的了解了。以后有时间的测试话再讲讲怎么搭建这个平台。
发表吐槽
你肿么看?
既然没有吐槽,那就赶紧抢沙发吧!