最近工作中需要用到网站帐号绑定、OAuth授权相关的功能,所以尽管本意是不想接触OAuth这个明显是“程序员折磨程序员”类型的技术,但也只能硬着头皮去解决问题。今天决定把之中遇到的麻烦和解决过程都记录下来,以免再有人走弯路。
在此之前,推荐大家阅读arthurchenjs的文章从实现iPhone的OAuth封装看国内互联网和开放平台,写得太好了,基本能扫清所有障碍。如果看完之后还有问题没解决、或者你觉得iPhone平台和其他平台实现有区别的话,再继续看我这篇吧。
如果你之前没接触过OAuth,那么最好还是阅读下RFC 5849 – The OAuth 1.0 Protocol,这是OAuth协议的非正式RFC文档。其实所有陌生的技术在了解之初最方便、最省事的方法就是读协议——细化到互联网和IT界,自然是RFC最大。虽然看起来文档协议什么的太长(现在很多人似乎逛BBS逛久了再加上微博兴起,网上文章超过一屏就懒的看)耗费时间,但其实这是最短路径。
然后选择OAuth实现库——没错,我们最好别自己造方形轮子。OAuth协议实现细节比较碎,自己实现费时费力,选择现有的库是最佳方案。但一定要注意所选择代码的协议,例如是否可以不开源、商业应用等。Java平台推荐用SINGPOST,架构灵活,扩展方便,代码量适中。基于同样的原因在iPhone平台上可以选择ShareKit,但我对这个不熟悉,不多说。
新浪微博、腾讯微博和人人网中,前两家用的OAuth 1.0,人人网则使用2.0(因为twitter用1.0而facebook用2.0?)。SIGNPOST的实现基于1.0,所以需要进行一定的改写,或者进行再次封装。
基于同一协议实现的不同网站API使用过程中,会出现有的好用有的却不好用的情况,显然是细节的不同。新浪微博和腾讯微博虽然都声称基于RFC 5849开发,但其明显的区别有:
- 用OAuth进行帐号认证时候,新浪微博的验证参数需要通过Header中Authorization域进行传递。腾讯微博则只支持url参数传递。这个地方我当时卡了半天。
- 对于桌面客户端,获取verifier时候,新浪微博callback url要传递oob,然后自己从网页中抠那个六位数出来;腾讯微博要传递null,跳转的页面url中会带有verifier参数。
- 发送内容的时候,验证参数的位置和OAuth认证时候一样。
- 这也是最重要的不同点,在计算Signature Base String时候,新浪微博的参数不需要在组合前进行URL编码,而该死的腾讯必须编码,也就是说,组成SBS时候腾讯微博的参数值实际上被URL编码两次,举例来说就是SBS中content部分的值会有大量的%25字符出现(也就是百分号编码后)。但发送的时候,却只编码一次。我无法理解SBS内容和实际POST出去的内容为什么要不同?但事实就是这样,至于你信不信,试一下就知道了。
在这里顺便对腾讯微博的API文档和不靠谱的论坛技术支持表示无语,API文档里面基本每页都有拼写错误;返回的错误码在文档里找不到说明;甚至于最关键的POST图片时候的包体说明竟然是空白的。
人人网用的OAuth 2.0,大大简化了步骤,自己实现起来速度也很快。不过人人网的文档和API测试机制很扭曲。文档太乱,虽然是Wiki形式但完全看不出组织结构,通常一段内容会在多个页面出现,希望能下功夫整理一下。为什么说测试机制很扭曲,是因为它每个高级接口使用时候都必须经过审核,并且在审核通过前只能用测试帐号进行测试。这个测试帐号的好友数还不能多于5个。但总体来说人人网的API开放会让人觉得不错,是因为出现错误时候返回的信息,准确而且详细。
21 八 2011 in 程序, 网络
Comments [1]
上周末升级了Mango Beta,中文输入和多任务都没问题了。系统稳定性非常好,正式版出来如果没有更多功能都考虑不再升级了。
之前一直绑定的Gmail账户,用来同步联系人和邮箱。结果发现在Mango上微软真的是铆足了力气想要来个服务大一统,前提就是得用Live帐号才行,比如之前就有的Marketplace(强制要求绑定才能下载)、联系人和邮箱、Xbox Live。之前一直没绑Live原因有两个,Hotmail邮箱基本不用了,另外则是那个恶心的联系人同步:所有Hotmail里面发过信的的人,哪怕只有一封,都会同步到手机里面。而且这些联系人和Messenger联系人还混在一起。
但这回我老老实实清理了一下Hotmail联系人,为的就是绑定账户,因为Mango上多了几个抢眼功能:
- Skydrive同步。Office里面可以同步文档,也可以在图片里面进行同步。Skydrive上甚至还有我之前05年我在MSN Space里面写Blog时候的配图。
- Messenger。升级之后因为还是没看到Messenger很失望,然后偶然发现是我太土鳖了。Messenger被整合到了短信界面,绑定帐号后直接登录就能聊天。
- 联系人。对,就是之前倒霉催的联系人功能,这次有了Messenger之后,完全同步Hotmail联系人的意义就变大了。而且在手机和Hotmail内修改联系人后,会根据修改时间自动进行双向同步。
最后发现个新功能,Bing搜索里面的“Vision”,用于摄像头拍照搜索,可以自动识别条形码。并且提供翻译功能:

16 七 2011 in 网络
Comments [0]
这篇只是流水帐,请不要过于期待。
acfun是能在天朝动漫历史上留下很深一笔的站。从07年单纯的新番观赏网站到后来08年初转型成综合的弹幕视频网站,不到一年的时间迅速积累了大批忠实用户,这些人都是属于死忠类型,就算acfun三年界面不变、经常宕机(08-09年)、功能不加反减(例如从有视频预览封面到没有)、一直是使用视频外链等情况下也坚持每天上去日常的人。08年时候我基本每天都要花上1-2个小时在上面,还写了个介绍文章普及一下弹幕视频站知识。从08年到现在,acfun对于天朝内的ACG文化的推广可以说是毫无疑问的第一位,创造了数不清的(圈子内)流行词语和文化,例如新华里业务员、221的音MAD、NINI的游戏视频、TANK的各种(坑)神MAD、AIPC等等等等……
而从acfun创站开始就不停地踩掉各种同类网站,印象中的就有肥猪网(fz222)、回音山(echogames)、56网(短暂地有过一段时间支持视频评论结果迅速被喷子占领了)还有各种不知名站点。回音山高调介入让人觉得是不是acfun挑战者终于来了:界面相当华丽,甚至拥有专门的视频服务器,不用忍受新浪外链带来的不便,管理员也勤奋地很(虽然到最后播放器都很难用)。或许后来的商业化企图直接导致了回音山挂掉,但它真是没能展现出一点可以对抗acfun的态势——无论是评论、弹幕还是视频数量。其他的网站就更不必提,惨败二字足以概括。
所以后来的哔哩哔哩视频——也就是最初叫做Mikufan的那个站点起步就艰难多了,因为一直到去年中期为止,国内的弹幕视频站流量基本都被acfun霸占。但2010年11月开始,bilibili的流量开始直线上升,终于在11月24号超过了acfun,不过当时还是没稳定下来。直到今年春节后,两个站的拜年视频出来后攻守颠倒(?),bilibili在pv、ip、视频更新速度上超越acfun。我分别在alexa.cn和cn.alexa.com上查了一下两个站的数据:
cn.alexa.com:
acfun.cn的网站信息 Alexa网站流量排名: 13,946 CN的流量排名: 1,843 反向链接:178
bilibili.us的网站信息 Alexa网站流量排名: 8,866 CN的流量排名: 938 反向链接:223
alexa.cn:
站点 bilibili.us 的 Alexa 排名查询结果
当日排名 5223
日均 IP 访问量[一周平均] 447000
日均 PV 浏览量[一周平均] 3978300
站点 acfun.cn 的 Alexa 排名查询结果
当日排名 12593
日均 IP 访问量[一周平均] 378000
日均 PV 浏览量[一周平均] 1247400
很明显,差距越拉越大。对于两个站点比较的帖子其实有不少,引用一个就说acfun和bilibili,其实有些领域真是先到先得,当然那个时候acfun的访问量还在bilibili之上,但已经可以看到大家讨论acfun的问题在于:
- 更新太慢,包括视频审核速度和网站功能速度。如果说不增加新的功能也可以留住之前的死忠用户的话,那么在新用户的吸引力上必然大打折扣。acg_xilin是个有耐心而且想做更好的人,可惜没能在acfun后续发展上体现出来。实话说现在acfun的管理员之一是否还是acg_xilin都不好说了。
- 喷子泛滥,审核不力。有些投稿(90%是文章)争议性过大,尤其是政治性的,连擦边球都不是,从1L开始一直可以开战到1000L。要是说这样可以增加PV真是成本太大了。acfun能不被拔网线真是太运气了。
- 无节操地广告放置手段。有段时间甚至满屏有三四处广告,而且和界面效果完全不合拍。首页和弹出的页面还有声音,在chrome下,ad block插件开启的时候甚至有一定几率看不到弹出框但是能听到恶心的音乐。广告是非商业性网站的生存之道,几年下来我还养成了每天看视频空隙点开几个google adsense推荐的页面的习惯。但是过于密集的广告所带来的负面影响非常巨大。
- 基本功能的问题:评论引用效果差、弹幕容量小会被刷掉、搜索页面不稳定。
至于界面,不是大问题。甚至于09年取消视频封面后站上的用户多半给予理解的态度,也很快适应了纯文字的视频列表。而三年不变的“老土”界面其实也成了acfun的象征。
不过与此同时bilibili的站长bishi一步一个脚印地为网站提供改进,有段时间更新频繁到让人觉得那绝对不是一个人不脱产能产生的工作量。bilibili的细节非常值得称道,例如一开始就非常完善的搜索功能、个人空间的管理、投稿者对于本人视频的弹幕管理权力的下放(这点非常重要,可以保护优秀的字幕和效果弹幕)、缩略图直接预览、播放之中的滚动条拖动(节省流量)等等等等。最近的一次大更新增加了积分系统——无论在什么站点上,和数据有关、尤其是类似于货币流通符号的个人数据都是必要的。多数人(例如我)只是看视频,没有技术做视频,也没有时间和能力去搬运视频,但通过积分分享可以得到更多的互动性。bilibili对于实际参与非常看重,例如去年海选看板娘,还有后来的协作乡,都是在提倡每个人做点什么,而不只是看着达人们在不停地提升存在感。
总之一句话,希望a站b站促进双边合作以及双方在弹幕技术、搬运能力方面的交流,互信互利,夺取天朝ACG界的全面胜利。
03 五 2011 in 动漫, 网络
Comments [9]

写这个句子的人回去重修初中语文。中文里面最经典之一的“把”字句都用错了。
“把”的主语应该是“思维”之外的另外一个人,也必定是动作的施动者,比如“我把代码写完了”。但“担任”是“思维”的动作。这是错误之一。
而意愿动词、可能性、持续性副词,都要放在“把”之前。比如“我想把代码写完”、“我也把代码写完了”,或者这个例子中,“不再把思维当作管理员”。但不能说“把……不再”。
修改建议:“让思维不再担任管理员”、“把思维降级为普通成员”。
29 十一 2010 in 网络
Comments [0]