经改进的基于nodejs的新浪微博2.0 SDK

2012-09-15 00:15

经改进的基于nodejs的新浪微博2.0 SDK

by admin

at 2012-09-14 16:15:22

original http://item.feedsky.com/~feedsky/helloJavaScript/~8514355/703064733/6618683/1/item.html

经改进的基于nodejs的新浪微博2.0 SDK

git 地址

https://bitbucket.org/xinyu198736/node-weibo2/wiki/Home

安装

npm install weibov2

特性

市面上的weibo nodejs sdk 不少,但是有些是1.0,有些2.0的大部分功能不够完善,用的人少,所以有问题也很少改进。

这个模块是根据weibo-v2.js(https://github.com/vzhishu/node-weibo-v2)改进而来。有以下改进。

  • 支持从本地发图片,也就是upload,目前看到的2.0的nodejs sdk,发现这个功能都没有实现的。我参考一个1.0的框架实现了此功能。
  • 支持url缩短,url缩短需要向sdk传入多个索引名相同的配置属性,js不支持,在此模块中,多个相同索引名的属性,只需要这样传入:
var prefix=""
var option={
    access_token:token
}
for(var i=0;i<reg_result.length;i++){
    option[prefix+"url_long"]=reg_result[i]
    prefix+="__multi__"
}
api.statuses.shorten(option,function(_d){
//...
})
}}}

在模块内发出请求之前会把所有的multi替换成空,以此实现传入多个相同名字的参数。

  • 原来的weibo-v2.js里面有很多特殊的空字符,导致js完全执行不了,会一直报错,而且很多json的最后都写着逗号,编辑器会一直报错。所以我觉得这个模块挺坑爹的,对这些问题都做了改进,可以正常运行。
  • 错误处理,weibo-v2.js里面不光没有做统一的错误处理,还把返回的json格式打乱了,做了统一处理,每次callback,如果第二个参数存在,就说明api返回了错误,error即为返回的错误json生成的对象。

使用示例-上传图片和错误处理

var wb = require('./lib/weibo-v2.js').WeiboApi;
 var opts = {
   app_key       :  config.weibo_key ,
   app_secret    :  config.weibo_secret
};
var api = new wb(opts);
//上传图片
api.statuses.upload({
    access_token:token,
    status:data.content
},data.pic,function(_d,error){
if(error){console.log(" upload error :"+error);return;}
console.log("upload success")
})

授权示例

以express和weibov2结合来示例:

var weibo2 = require('weibov2');
var express = require('express')
 
var app = express();
//省略express初始化配置若干句
 
auth = function(req, res) {
    var opts = {
        app_key       :  APP_KEY ,
        app_secret    :  APP_SECRET ,
        redirect_uri : 'http://'+req.host+':'+PORT+'/sina_auth_cb'
    };
    console.log('http://'+req.host+':'+PORT+'/sina_auth_cb')
    var api = new weibo2.WeiboApi(opts);
    var auth_url = api.getAuthorizeUrl({
        redirect_uri : 'http://'+req.host+':'+PORT+'/sina_auth_cb'
    });
    console.log(auth_url);
    res.writeHead(
        302,
        {
            'Location': auth_url
        }
        );
    res.end();
};
 
sina_auth_cb = function(req, res, query_info) {
    var code = req.query.code;
    if(!code) {
        req.session.index_error="授权失败,请重试!(code获取失败)"
        res.redirect('/');
        return;
    };
    console.log(code)
    var opts = {
        app_key       :  APP_KEY ,
        app_secret    :  APP_SECRET ,
        'redirect_uri' : 'http://'+req.host+':'+PORT+'/sina_auth_cb'
    };
    var api = new weibo2.WeiboApi(opts);
    api.accessToken(
    {
        code : code
    },
    function(data) {
 
        var access_token=data.access_token
        api.users.show({
            uid:data.uid,
            access_token:data.access_token
        },function(d){
            var user=d;
 
            console.log("oauth success! userid:"+user.id)
            //将用户id和用户名存储到cookie,下次无需认证直接可以使用。
            res.cookie("userid", user.id,{
                expires: new Date(Date.now() + 604800000),
                httpOnly: true
            });
            res.cookie("username", user.name,{
                expires: new Date(Date.now() + 604800000),
                httpOnly: true
            });
            //将用户的accesstoken存储到数据库,在后台可以直接用这两个信息发送微博,无需用户参与。
            //。。。。
            //认证成功跳转到oauth页面
            res.redirect('oauth');
        })
    }
    );
 
};
 
app.get("/auth",auth)
app.get("/sina_auth_cb",sina_auth_cb)
}}}