其实要写个完整的Demo是挺困难的,而且目前我只做了Python的开发,没有写过其它版本,而且以我的习惯,我也不喜欢写完整的代码给别人去抄,所谓授之以鱼不如授之以渔。写个自然语言的版本吧,写起来简单,看的人也容易使用自己喜欢的语言来搞定。
为什么把三个放在一起呢,其实它们的API区别不大,流程都是一样的,只是参数名字的区别而已。
API的工作流程如下:(这些东西三个网站的开发手册里都有)
用户登录到校内/Manyou/Alisoft以后,进入他的应用列表,可以看到他安装过的所有的应用,点击某个应用的时候,就会跳到一个特定的地址。校内和Manyou有XNML/MYML的开发方式,在这种方式下,用户的每次点击都是点到他们的地址上,在他们的服务器上把请求转发到你的网址。这种情况下你在自己的网站上是不能用Session或者Cookie来记住用户的,因为所有的用户都是同一个地方发来的请求。所以你只能每个页面都要从他们传过来的参数里获取当前用户的信息。而IFrame的方式要简单的多,只要给他们一个入口,他们就会生成一个IFrame把参数传入你这个入口地址,以后用户的所有操作都是在你的网站上,所以只要这个入口页面处理查询用户信息并用你自己的Cookie来登录,剩下的跟其它的页面逻辑是一样的。Alisoft也是这样做的。所以这里我只讲IFrame方式。
校内和Manyou是跳到它自己域名的一个URL,然后生成一个IFrame链接到你网站的一个地址,Alisoft则是直接跳到你的网站上的地址。跳到这个地址的时候会带一些参数过来,比如当前用户的ID,SessionID,还有其它一些参数,但是真正有用的就是这两个。凭这两个参数,你就可以反过来去查询该用户的所有信息。
所以你首先需要一个处理登录的页面,接收他传过来的参数,在参数里获取用户ID,SessionID,然后查询用户的真实身份和用户名,如果验证是从API应用里点过来的,就在你自己的站上查询这个用户ID是否已存在,如果存在就取出来设他的Cookie或Session让他登录,如果不存在,就生成一个新用户,跟这个用户ID绑定起来,然后让他登录就行了。用户再点你其它的链接,就是你网站的一般逻辑而已了。
各种语言都有自己发POST请求的方式,需要自己去看看帮助了。
查询用户信息的方式:
校内的:只需要在REQUEST里获取这两个参数:xn_sig_user,xn_sig_session_key,然后往这个地址http://api.xiaonei.com/restserver.do Post这些参数:
api_key:你的应用的Key,官方给出来的那个串,method:’xiaonei.users.getInfo’,session_key:就是前面获取的这个,call_id:0,sig:空字符串,v: ‘1.0’,fields:’name,sex’,uids:前面获取的那个user。
单引号括起来的就是固定字符串。至于sig,本来它应该是个用来验证请求身份是否合法的加密串,但是校内现在并没有用到,所以传个空的过去就行。如果用户是合法的,你就会得到一个包含<name>和<sex>的XML文本,剩下的应该是你自己的问题啦。
Manyou的:你需要获取三个参数:my_sig_uId,my_sig_sessionId,my_sig_prefix,前两个跟校内一样,最后一个是该用户实际所在站点的URL(因为Manyou是一个应用服务器给所有的UCenter子站服务的)。当然还有个参数my_sig_key可以用来验证传过来的参数是否合法,如果你只需要获取用户ID,不需要知道他的名字,就用这个参数来验证的话就可以省却一次POST的时间了。
然后需要需要往这个地址http://api.manyou.com/openapi.php POST这些参数:
api_key:你的应用的key,官方给的,format:’JSON’,(否则默认返回PHP格式的),method:’user.getinfo’,session_key:前面获取的sessionId,v:’0.1′,args[fields]: ‘name,sex’,args[uids]:前面获取的uId,sig:加密字符串。
重点在这个加密字符串的计算上,它的算法是把通用参数按字母排序,再加上你所调用的这个API方法的专用参数,再加上你的应用的安全码(申请的时候给的),拼成一个字符串算出来的MD5。比如上面这个方法,拼字符串就是:
‘api_key=’+apikey+’&format=JSON&method=user.getinfo&session_key=’+my_sig_sessionId+’&v=0.1&args[fields]=name,sex&args[uids]=’+userid+’&’+code
注意我中间引号外面的是自己的变量名,别照抄。最后的code就是你的安全码。对这个字符串算一个MD5就是前面需要POST的那个sig参数的值了。
这样如果请求合法,你会得到一个JSON格式的返回,格式为"name":"用户名","sex":"性别"。你只要分解字符串就可以拿到这个用户名了。剩下的就是自己的问题了。
Alisoft的:跟Manyou的非常相似
你需要获取三个参数:user_id,app_instance_id(就是sessionID),token(有特殊用途)。
然后往这个地址http://sipdev.alisoft.com/sip/rest (正式上线后把域名里的dev去掉)POST以下参数:
appId:你的应用的编号(官方给出的),appInstanceId:前面给出的,sip_apiname : ‘alisoft.validateUser’,sip_appkey:跟appId一样,sip_timestamp:当前时间字符串,格式为2008-10-01 08:00:00,token:前面获取的那个,userId:前面获取的那个,sip_sign:加密字符串。
加密字符串的计算方法跟Manyou类似,但是串联字符串的时候没有&和=,而是把所有的内容串在一起,而且你的安全码是放在字符串的最前面的,前面这个方法的字符串就是:
code+’appId’+appid+’appInstanceId’+instance+’sip_apinamealisoft.validateUser’+'sip_appkey’+appid+’sip_timestamp’+now +’token’+token+’userId’+userid
code是你的安全码,now就是前面说的时间字符串,其它的变量一看就知道了。
返回的内容只有一个<String>1</String>,包含这个就说明该用户是合法的,但是并不会返回他的用户名,如果你想获取用户名的话,还得再去调用另外一个API,自己去看看官方的文档吧(因为他的用户可能是淘宝的,也可能是阿里巴巴的)。调用方法是一样的。
是时候研究一下国内的开放式API了,所以抽时间搞了一下,先从校内下手吧,相对来讲他的资料算是最多的了。但是即使如此,想从零开始写一个应用出来,还真是花了我不少功夫。资料实在是太难找了。校内的API从6、7月份就出来了,还弄了个专门的Wiki作为开放平台的门户,但是里面的资料出奇的少,除了对几个api函数的说明,对xnml的简单说明,其它的几乎为0。所谓的一个上手指南只讲了怎么注册用户和怎么注册程序,注册完以后的开放过程却一点也没提。想根据这份东西写个真正的应用出来,简直是不可能的任务。没办法,上Google,上社区,上应用的论坛,一篇篇帖子里找线索,最后总算是把一个应用给凑出来了。
如此糟糕的技术支持能力,直接决定了校内API应用的未来。
开发过程简介:
首先需要注册成校内用户,然后在自己的菜单上有个应用,添加一个“开发者”应用,这里面包括一个社区,一些开发所需要的链接。进入这个应用以后,可以看到一个申请开发许可证的按钮,点击就进入设置应用属性的环节,起名字,定URL之类的。(这一步在校内的Wiki上是有说明的。)有个安装到校内的选项,默认是否,结果选了以后我的应用就变成了外部应用,在校内只提供一个链接进入而已,这当然不行了。当我把应用删了重新添加的时候,原来使用的那个URL被占用了,无耐,换了个更难看的URL。应用还有一个重要的属性,就是运行状态,是以iframe形式还是xnml形式,这个待会再讲。第一次建议先选iframe形式,这个是随时可以修改的。
Continue reading »


近期评论