nodejs与微博开发笔记

微博开发API

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

申请微博API

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

网站接入

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

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

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

安装nodejs与express request

1
npm install nodejs express request --save

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

oauth2.0

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

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

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

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

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

nodejs编写服务获取accesstoken

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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上代码即可 下面给出完整的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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)*/