damien.h

平台不是一天建成的-从开发者角度看国内SNS平台技术

题外先说一句,最近太忙,欠着的GAE+Django开发SNS应用的文章一直没写好,很抱歉。之前给康盛的《站长》杂志写过一篇简单的稿子,准备整理和丰富下具体的代码例子再发布到本Blog上。

上周末把测试完毕的Py51放上了google code,至此我已经为校内UCHome Manyou,以及51这3个目前国内最主要和最先开放的SNS平台都发布了各自的Python SDK。通过这些工作我对这几个SNS平台技术有了比较详细的了解,有不少经验想分享。今天写下来的主要是一些技术细节,可能不是你感兴趣的。但是目前还没看到有从细节方面总结的各平台的开发经验,所以觉得还是值得写一下。

魔鬼藏在细节中

网站面向的是所有普通用户,而开发者平台面向的是有专业技术背景的开发者。设计和实现API,是难度最高的软件工程,需要出色的技术和经验。

国内SNS的开放平台,主流都是模仿Facebook F8平台的,所以可以称作F8系平台。但虽然从表面看和F8平台的设计基本一致,仔细接触的话就会发现,技术方面的差距其实很大。

  • 校内平台

校内是国内最早开放的F8系平台,我从开放不久就开始在校内平台上做开发。在校内经过一段时间的开发,明显感到校内平台的仓促上阵,和技术实力的捉襟见肘。刚开放的时候,整个平台功能极其单一。XNML只提供非常有限的重用组件标签(现在也没什么改善),不支持除了inline方式以外的css,不支持js(这两个最近已经支持了)。最严重的是校内明显对API服务器的负荷缺少准备,API调用经常堵塞超时,还动不动发生整个应用服务器长时间无法正常工作,所有应用都没法打开的问题。而这样的问题持续了不少时间都没有明显改善。

不过最夸张的还是校内API不设防的安全机制。校内平台对来自第三方服务器的API调用从刚开放到目前一直是不做签名检查的。记得你在新建校内应用时候得到的API Secret字串吗?其实这个Secret根本就用不到,就是摆样子的。做过Facebook开发的同学肯定知道Facebook App也是有一个唯一的secret字串,校内看起来和Facebook平台也一样,到底有什么区别呢?

Facebook平台要求第三方应用调用其API的时候除了调用参数还要提交一个签名字串,而这个签名字串就是用调用参数外加应用的secret做的md5 hash。由于你的secret是唯一而不公开的,那么平台就能通过你的签名字串来唯一验证这个API调用是不是来自真正的应用本身。

而校内平台在接受第三方应用调用API的时候并不需要和检查签名字串,这样,只要得到了某个应用的API Key,那么任何应用就可以在调用API的时候冒充其他某个应用了。而得到一个应用的API Key也是举手之劳,因为API Key是明文POST到校内服务器的,任何人只要用一下某个应用,截取应用发出的POST就能得到它的API Key了。于是,就在大赛期间出现了某名列前茅的第三方应用利用校内自己“特权”应用的API Key突破平台限制获利的事件。

  • Manyou平台

Manyou平台在国内来看是目前技术方面最严谨功能也最强的一个F8系平台,从功能和稳定性来看都做的不错。这点和康盛拥有若干PHP大牛是分不开的。但奇怪的问题还是有的。

首先是有些过分神经质的签名算法。具体细节现在在Manyou开发者wiki上应该有更详细的解释了,但是我在写PyManyou的时候在签名问题上着实费了不少周折。不过,有这么神经质的签名算法可见Manyou对平台安全的重视,所以还是应该赞一下的。

另外有一个诡异的细节问题,通过MYML的表单POST到应用服务器地址的多值参数,会让django无法解析成list。

比如,我在一个form里有一批多选框,input的name是”select[]”。在正常情况下,包括facebook,校内和51.com,这个form在post过来以后,从django的request.POST里可以通过getlist直接得到”selectp[]”值的数组。但是在Manyou上,从django得到的POST数据确是”select[0]”, “select[1]”这样的变量名,也无法通过getlist得到多值参数数组。select[n]这样的变量名对PHP的处理来说是正常的,但是我不理解的是为什么其他平台都没问题,唯独Manyou要设计成这样,对非PHP的语言缺乏考虑了。

  • 51平台

实话说,51.com就算是网站本身,也是几个里面技术上最落后的。不说别的,在utf8编码早就成为广泛接受的标准的今天,51.com还用的gbk编码。这也造成了51平台混乱而毫无意义的编码问题,就连用51官方的PHP SDK也需要为编码折腾。

提交到51应用服务器的非英文参数值,如果编码和51期望的不一致,就会发生签名错误。经过和51技术人员的沟通和自己的摸索,最后终于发现,尽管声称一切用UTF8,但实际上对非英文数据,在计算签名字串的时候必需用encode(‘GBK’)把unicode字串编码成GBK二进制格式,而在向51服务器发出POST的时候又要用UTF8。另外,在发布中文feed内容时候,也需要把中文编码成GBK。

平台不是一天建成的

国内SNS平台到目前为止给人的感觉是,为了让手上的投资有地方用,抓着开放平台和第三方应用的概念炒一把。从校内51平台的开发协议就可以看出,两个SNS的管理层在理念上和它们竞相模仿的Facebook只是貌合神离。这方面Manyou确实做的最正宗,只是Manyou的模式太独特了,还需要发展和完善。

不过值得赞扬的是,虽然校内和51第一版协议都让人非常无语,但是在听到了开发者的骂声以后,两家还都是用开放的心态确实在改进。而随着年底前更多开放平台的加入,相信国内的SNS平台在明年能逐步发展到脱离幼稚期。只是,其实一开始肯定能料到开发者的抗议,为什么还要来侥幸一把呢?

Browse Happy logo

My tweets

2016年七月
« 八    
 123
45678910
11121314151617
18192021222324
25262728293031

分类目录

Articles

Fancy Stats