拼车APP有趣的API设计
最近上下班开始搭顺风车,我这国内驾照还没领到一年,注册嘀嗒、滴滴都过了,其中嘀嗒拼车秒过,而注册Uber的个人信息页就提示初次领证时间距今太短,没法继续注册。从这点来说,国外APP还是稍微规矩一些,规定还是严格执行着,国内APP,呵呵。。。因为刚刚开始,每天都要花不少时间去刷手机APP,因为乘客的信息会实时更新,那些既顺路又时间恰好的单子,往往大家也都得抢,手慢无。于是乎,嘀嗒、滴滴、易道这些APP每天我都轮着刷,但这绝非长久之计啊,要是能写个脚本去轮训那些APP的后台API就好了!
因为之前没抓过iOS的包,以前调Android的时候还可以remote进去看系统log,寻思半天正在犹豫要不要掏腰包买个国产机,随手搜了下iOS抓包,没想到真发现了rvictl
这条命令,在OSX上可以启一个虚拟Interface,这样就可以直接Wireshark抓包了,泪牛满面,省下几千大洋了。
抓包的过程在此不表,但抓出来的结果实在太出乎意料,国内创业公司舍得花钱做推广,但就是舍不得花钱招程序员写个优秀的APP。
嘀嗒
因为我平时用嘀嗒最多,每单的收益基本在12到15之间,比易道、滴滴好一些。嗯,所以就先拿嘀嗒开刀吧。
首先,不管是啥请求,一股脑都上POST;不管请求是否成功,一股脑都给200。想当年我们在学校做项目的时候,好像也就是这么弄的,就不详细吐槽了,像嘀嗒这么设计最明显的问题就是对于Exception的Handling还必须要跟API请求的Response Body解析产生关联,这种耦合会给之后代码的维护和Diagnosis带来很大的工作量。
其次,如图所示,地理位置这些信息都直接给了,用户token也直接给了。嗯,我开始还担心自己写轮训脚本会不会有验证或者session的问题,现在看来,有了这些信息,想干嘛干嘛吧,把APP的功能都跑一边,基本API的路径什么的也就都知道了。
再其次,我刷了好多功能,发现他们所有API都是调了同一个Destination IP,这么大的流量能handle住也确实是值得让人佩服的。
最后,之所以我能看到所有这些信息,是因为他们没有用HTTPS。
滴滴
滴滴用得不太多,上面拼车的乘客太少,估计大家平时都是叫快车了吧。Anyway,第二个拿滴滴开刀。
第一个发现很有意思的是,他们API的入口都是beatles,哇塞,他们最初的几位程序员(或者是他们的某些architect)一定是Beatles的NC粉啊。
第二个,滴滴相对嘀嗒来说,已经不再是一股脑全是GET请求了,POST、PUT也都看到了,截图中没有。
第三,滴滴除了有图中101.227.169.160这个IP作为主要API的服务器之外,滴滴还用到了其他的服务器做用户数据收集,我没截图,这些数据包括,收集型号、IMEI、运营商、地理位置、操作系统以及用户的token,我猜是用来表征用户身份。API的入口是broker,我猜后端是用的Kafka做日志收集了。
第四,他们也没有用HTTPS,呵呵呵呵。。。
Uber
事实上,我到现在还没能注册成为Uber的司机,因为某些个人原因不是很喜欢这家公司,但不得不承认,他们做的APP还是相对比较严谨的。
首先,他们都用了HTTPS,都用了HTTPS,都用了HTTPS。。。于是,我什么都看不到了,除了那条Client Hello,看上去真有种像我炫耀的感觉。只能等下次有了Android机,解压下apk看下里面有没啥证书可以用的。
另外,为了多留了个心眼,我也过滤了一下HTTP协议,发现他们也不是所有东西都是HTTPS的,比如说图片。确实图片这种资源本身并不包含太多敏感信息,另外由于图片体积相对较大,加载时间相对较长,所以上HTTPS得不偿失。
除此之外,我还意外发现Uber他们图片是用到了CloudFront的CDN加速的。嗯,我们Team得加油啊,这种体量的客户,怎么说也得忽悠过来让他们用上国内的CDN节点嘛,用亚马逊的CDN,指不定哪天就404无法访问了呢,嘿嘿。
À la Fin
今晚折腾了一下,没想到挖出了这么多东西,最大的体会就是,普通程序员跟优秀的程序员相比,做出来的东西差距还是很大的。很庆幸进了MS,接触到了很多很优秀的Engineer,学到了很多的同时,也慢慢变得更加professional,有种进了正规军的感觉。当然了,成事在人,最终还是要靠自己,只有不停学习不停思考,才能不断进步。