1. 程式人生 > >抓取摩拜單車車輛位置資料

抓取摩拜單車車輛位置資料

注:此篇文章是轉載,如有侵權請告知,將予以刪除

轉自:https://www.zh30.com/crawl-mobike-location.html

 

每天從下車站到公司還有好幾米的路要走,這對於現在能免費騎車的懶癌患者怎麼能忍?車站人流量大,能找到輛車實屬不易,所以就得在下公交車前不停的重新整理app檢視下車點是否有車,有車就馬上預訂。

一路上不停的拿著手機重新整理太麻煩了,身為碼農怎麼能忍?我這裡要實現的就是把重新整理檢視目的地是否有車的這個過程實現了自動化。

實現思路是首先找到摩拜單車在地圖上標記車輛位置的這個介面,然後想辦法使用程式模擬這個請求,從獲得的車輛資料中檢查是否有符合的車輛,如果有則傳送提示訊息。

使用的抓包工具是charles,它可以很輕鬆的獲取到移動裝置的資料請求,具體使用方法不做介紹,請百度。

開始時是使用charles開啟ssl代理,抓取手機上摩拜單車app的請求,摩拜的每個https請求都是unknow(http method是connect),看錯誤提示應該是證書的問題,但手機上其它的https請求是正常的(比如京東),網上的說法是使用了http隧道通訊,代理工具無法抓取。

app無法抓包,轉戰微信小程式,在摩拜的微信小程式中檢視附近車輛時,charles成功抓取到車輛位置的api(nearbyBikeInfo.do)

知道了api後就可以很輕鬆的模擬出請求,這裡使用了python+requests進行post請求。多次測試發現header中有些看似很關鍵的引數其實不必要的,所以這裡已經移除。

#coding=utf8
#www.zh30.com
import requests
headers = {
    "Host": "mwx.mobike.com",
    "time": "1500887680",
    "eption": "bb15c",
    "open_src": "list",
    "platform": "3",
    "citycode": "0532",
    "User-Agent": "Mozilla/5.0 (iPhone;www.zh30.com; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Mobile/14F89 MicroMessenger/6.5.12 NetType/WIFI Language/zh_CN",
    "lang": "zh",
    "Referer": "https://servicewechat.com/wxxxxxxxx/70/page-frame.html"
}
body = {
    "longitude":"120.413333",
    "latitude":"36.087741",
    "citycode":"0532",
}

r = requests.post("https://mwx.mobike.com/mobike-api/rent/nearbyBikesInfo.do",data=body, headers=headers, verify=False);
print r.text.encode('utf-8')

注意,程式碼有改動:)

成功返回json資料。

格式化後,資料很清晰明白,介面返回查詢的座標周圍有幾輛車,幷包含有每輛車的編號、座標和與目標座標的相對距離等資訊。

接下來要做的就是從資料裡過濾出比較近的車輛(distance的單位是米,值可按自己的需求定),並給出提示訊息。提示訊息推送可以使用pushbullet這類工具,實現也很方便。更復雜點兒可以距離座標計算一下每個車輛在目標位置的哪個方向。這裡就不實現了~