nodejs与微博开发笔记

微博开发API

地址 github 开发工具 nodejs+express+request

申请微博API

首先去微博开发地址注册个开发者账号,然后填写个人身份认证下. 个人只能选微链接,不能选择微服务.

网站接入

我申请的是网站接入..可以先不提交审核拿来用..不知道为啥我审核总是不过.说是需要部署微博组件..囧 不过没关系我们主要关注以下的几个重要的内容.

  • 网站信息-基本信息中的 App Key 与 App Secret
  • 网站信息-测试账号中的 已关联测试账号
  • 接口管理-授权机制中的 授权回调页和取消授权回调页

首先我们需要设置已关联账号和设置授权回调页和取消授权回调页设置关联账号就设置你个人微博 输入你个人微博名称即可.授权回调页我设置的是htttp://t.relsoul.com/oauth取消回调页我设置的是http://t.relsoul.com/calceloauth

安装nodejs与express request

npm install nodejs express request --save 

首先我们需要了解oath2.0认证

oauth2.0

大概是这么回事首先呢 你要使用微博的服务你就必须得有一个很重要的参数也就是accesstoken那么这个accesstoken怎么来呢?就是通过oauth2.0来.首先用户点击你的网站发送一次授权认证

https://api.weibo.com/oauth2/authorize"+"?client_id="+app_key+"&redirect_uri="+redirect_uri 

也就是发起一个get请求同时附加上两个参数,具体的可以去这里看看微博oauth 那么这两个参数一个是app_key 这个我们上面已经获取到了,redirect_uri就是回调页,这里我们自己设置了.当用户发起一个get请求后.然后会跳转到微博授权页面,如果用户同意的话,那么会跳转到回调页

http://t.relsoul.com/oauth?code=xxxx 

后面的code就是我们所需要的获取accesstoken必不可少的一个参数

nodejs编写服务获取accesstoken

app.get("/oauth",function(req,res){ 
   var code=req.query.code; 
   if(!code){ 
       return res.redirect("https://api.weibo.com/oauth2/authorize"+"?client_id="+developer_info.app_key+"&redirect_uri="+developer_info.redirect_uri) 
   } 
   request.post({ 
       url:access_token_url, 
       qs:{ 
           code:code, 
           client_id:developer_info.app_key, 
           client_secret:developer_info.app_secret, 
           grant_type:developer_info.grant_type, 
           redirect_uri:developer_info.redirect_uri, 
       } 
   },function(err,data){ 
       var _d=JSON.parse(data.body) 
       if("error_code" in _d){ 
           return res.json(_d) 
       } 

       app.set("accessToken",_d) 
       console.log(52,app.get("accessToken")) 
       res.json(JSON.parse(data.body)) 
   }); 

}); 

很简单 当用户直接访问oauth那么则认为要授权 所以重定向到授权页.、如果是带有code参数的话那么就认为是获取access_token;然后会发起一个post请求 注意这里有个大坑 post请求附加的参数千万不要放在body 实际上这些参数都是附加在url上的.这个坑把我坑了一下午.

编写短链接API

当获取了accessToken那么就把他保存起来 然后就可以使用这个accessToken了下面编写一个长连接转短链接的API

app.get("/api/longToShort",accessToken,function(req,res){ 
   console.log(38,req.access_token); 
   var long_url=req.query.long_url; 
   console.log(40,long_url); 
   request.get({ 
       url:"https://api.weibo.com/2/short_url/shorten.json", 
       qs:{ 
           access_token:req.access_token, 
           url_long:long_url 
       } 
   },function(err,data){ 
       if(err){ 
           return res.json({ 
               error:err 
           }) 
       } 
       if(data.statusCode==400){ 
           return res.json({ 
               error:"please contact adminstrator email admin@emufan.com " 
           }) 
       } 
       res.json(JSON.parse(data.body)); 
   }) 
   console.log("is okay!") 
}) 

下面浏览器直接ajax访问/api/longToShort?long_url=xxx 就可以转换了

具体的不说了哈 都是挺简单了 看github上代码即可 下面给出完整的代码

var express=require("express"); 
var request=require("request"); 
var path=require("path"); 


var app=express(); 

var developer_info={ 
   app_key:"", 
   app_secret:"", 
   grant_type:"authorization_code", 
   redirect_uri:"http://t.relsoul.com/oauth", 
} 
var access_token_url="https://api.weibo.com/oauth2/access_token"; 

app.use("/libs",express.static(path.join(__dirname,"libs"))) 

var accessToken=function(req,res,next){ 
   var access_token=app.get("accessToken") 
   if(!access_token){ 
       return res.json({ 
           error:" get access_token error please go http://t.relsoul.com/oauth" 
       }) 

   } 
   req.access_token=access_token["access_token"]; 
   next() 
} 




app.get("/",function(req,res){ 
   res.sendFile(path.join(__dirname,"index.html")) 
}); 

app.get("/api/longToShort",accessToken,function(req,res){ 
   console.log(38,req.access_token); 
   var long_url=req.query.long_url; 
   console.log(40,long_url); 
   request.get({ 
       url:"https://api.weibo.com/2/short_url/shorten.json", 
       qs:{ 
           access_token:req.access_token, 
           url_long:long_url 
       } 
   },function(err,data){ 
       if(err){ 
           return res.json({ 
               error:err 
           }) 
       } 
       if(data.statusCode==400){ 
           return res.json({ 
               error:"please contact adminstrator email admin@emufan.com " 
           }) 
       } 
       res.json(JSON.parse(data.body)); 
   }) 
   console.log("is okay!") 
}) 


app.get("/oauth",function(req,res){ 
   var code=req.query.code; 
   if(!code){ 
       return res.redirect("https://api.weibo.com/oauth2/authorize"+"?client_id="+developer_info.app_key+"&redirect_uri="+developer_info.redirect_uri) 
   } 
   request.post({ 
       url:access_token_url, 
       qs:{ 
           code:code, 
           client_id:developer_info.app_key, 
           client_secret:developer_info.app_secret, 
           grant_type:developer_info.grant_type, 
           redirect_uri:developer_info.redirect_uri, 
       } 
   },function(err,data){ 
       var _d=JSON.parse(data.body) 
       if("error_code" in _d){ 
           return res.json(_d) 
       } 

       app.set("accessToken",_d) 
       console.log(52,app.get("accessToken")) 
       res.json(JSON.parse(data.body)) 
   }); 

}); 


app.listen(3001); 
console.log("running 3001") 
/*setTimeout(function(){ 
   request.get("https://api.weibo.com/oauth2/authorize"+"?client_id="+developer_info.app_key+"&redirect_uri="+developer_info.redirect_uri,function(err,res){ 
       console.log(44,res) 
   }) 
},5000)*/