新浪微博API学习使用笔记(2)

来源:互联网 发布:淘宝商品会下架吗 编辑:程序博客网 时间:2024/05/18 03:21
本来还在想该写个啥例子来实际用一用新浪的api,结果实验室的考勤机就火了,8号那天盯着微博盯了一个下午,眼看着那条微博的转发量从开始的一点一点增长,到后面的快速增长。于是就想写个东西来分析一下一条微博是怎么火起来的。

        因为我擅长写的是B/S的工程,所以先确定了这个分析工具是一个B/S架构的,然后来想想都应该有哪些功能点。

        首先想到的就是粉丝增长的情况,展现可以用折线图,横轴是时间,纵轴是粉丝数。但是去新浪找了一圈也没有找到可以实现这功能的api,新浪提供的功能最近的api是friendships/followers(获取用户的粉丝列表),但是返回值里并没有成为粉丝的时间这一项。我现在能想象到的数据库表的设计大概是用户一张表,然后这张表里有一列follower(粉丝),里面的值是用户的id,这样的话确实没有地方存成为粉丝的时间这一项(不知道实际是不是这样的)。所以这项功能暂时无法实现。

        其次想到的是粉丝的分布情况,展现可以用柱形图,横轴是省份,纵轴是粉丝数,新浪提供的api(friendships/followers:获取用户的粉丝列表)可以获取粉丝所在的省份(.getProvince(),返回的是数字),然后再根据api(common/get province:获取省份列表)可以得到数字对应的省份名称,于是在前台获取要查找的微博名称,然后使用ext来作图,效果如下:


(上图统计时间是2012-3-12晚9点20,粉丝总数为4770)

开发笔记:

        1.认证相关:用的是OAuth方式认证,有一个登陆页面login.jsp和一个回调页面index.jsp,在login.jsp中打开新浪的认证页面,认证成功后跳到回调页面index.jsp(要在应用申请的地方和工程中同时配置好回调页面,见上一篇博文),此时在index.jsp的地址栏里有code值(下一步要用到),用request.getParameter("code")获取这个值,然后执行oauth.getAccessTokenByCode(code).getAccessToken()获取最重要的accessToken,有了这个值才算是认证成功,后面调用api基本都要用到这个值,所以把它存在session里(session.setAttribute("accessToken",accessToken))。至此,认证成功。但是出现一个问题就是当刷新index.jsp时,会报错“error:invalid_grant error_code:21325/oauth2/access_token”,所以更改一下,在index.jsp的一开始先判断session.getAttribute("accessToken")是否有值,如果没有则进行认证,如果有就不操作。这样改了之后还是报错,报的是空指针的错,原来是因为当用户第一次登陆进来的时候session里面根本没有accessToken这一项,解决方法就是去login.jsp里加一句session.setAttribute("accessToken","")。

        2.friendships/followers的参数是screen_name(用户昵称),count(单页返回的记录条数,默认为50,最大值是200),cursor(返回结果的游标,默认为0),也就是说执行一次最多只能返回200条记录,所以需要多次执行。每次执行完毕都可以根据users.getNextCursor()来获取此时游标所在的位置,获取这个值,然后在下次执行的时候作为参数cursor的值。我使用的是do-while的方法,循环的条件是users.getNextCursor()不为0(因为当最后一次执行完毕后,users.getNextCursor()=0)。

        3.存储省份人数的方式:用一个大小为100的数组a来存储省份人数,初始值都为0,省份编码即数组编号(比如北京的省份编码是11,则当粉丝的省份是11时,a[11]++)。

        4.按人数从大到小排序:设立两个参数(int biggest=0和int p=-1)遍历一次数组a,biggest用来存找到的最大值,p用来存相应的省份代码。用do-while循环,循环的条件是p!=-1,时间复杂度是100*n(人数不为0的省份个数)。

        5.将省份编码转换为对应省份的方式:common/get province可以获取省份列表,这个api的参数是country(国家代码),我一开始用的是086,结果查出来结果都是空,然后根据另一个接口common/get_country(获取国家列表)才发现中国的代码应该是001(呃...)。在新浪提供的例子里没有找到使用获取省份列表接口的,于是自己模仿着写了一个,返回值是JSONArray的格式,然后用json.getString(index)获取第index组,再对这个得到的String(例如:{"001011","北京"})进行处理,获取省份编号对应的省份名称。为了减少接口调用的次数,所以把这个功能分成了两个函数,一个是调用接口,返回json,另一个函数是根据省份编码获取省份名称,参数是(json,省份编码),返回值是省份名称。

        


存在的问题:

        1.换一个用户昵称再点查询,回在原先的图下面再生成一张图,最好能使原图消失,然后在这个位置重新生成新的图,这应该是前台代码的问题,ext还要再多熟悉熟悉。

        2.friendships/followers最多返回5000条记录,所以要是粉丝数超过5000的就只能分析最新的5000个粉丝的分布了。(马上就要破5千啦,啊啊啊)

        3.应该在图上或者网页上显示粉丝总数

        4.现在速度很慢,粉丝数4770的这一条用了20多秒才出图。