要使用sina微博开放平台的API.docx
《要使用sina微博开放平台的API.docx》由会员分享,可在线阅读,更多相关《要使用sina微博开放平台的API.docx(18页珍藏版)》请在冰豆网上搜索。
要使用sina微博开放平台的API
OAuth简介及sina微博开放平台
之前就在新浪微博中创建了一个应用,获得了Appkey和Secretkey以便去调用新浪微博开放平台API学习一下到底是怎样一回事。
前几天连续4天没课,算是比较耐心地去尝试弄明白怎样使用API。
虽然新浪微博开放平台中提供各种语言版本的开发SDK下载,也各自附有一些基本接口调用的Demo和接口说明文档。
但是这几天的耐心尝试之后,感觉新浪微博开放平台上的入门指导和下载到的Java开发包weibo4j包里面的Demo使用注释有些不一致。
再加上自身领悟能力有限,导致遇到好些摸不着头脑的难题。
不过幸好没有放弃去尝试弄懂它。
废话少说,下面是我学习的过程。
想要通过调用新浪微博开放平台API开发自己的微博应用,第一步是拥有sina微博账号和CSDN账号,因为我们要同时用这两个账号创建微博应用,以此获得Appkey和Secretkey。
那Appkey和Secretkey有什么用?
其实我单单看了sina微博开放平台的一系列说明都不怎么理解Appkey和Secretkey有啥用。
因为更加重点是必须理解OAuth认证、授权的整个流程,以及在整个OAuth认证、授权流程中好几个Token、4个URL的作用。
刚开始遇到完全没个概念的OAuth时,以为就没戏学习不下去了。
好在搜到下面这些文章,对于理解OAuth非常有帮助,链接如下:
OAUTH协议简介
基于OAuth安全协议的Java应用编程
在Twitter应用中使用OAuth
在OAuth中有3个参与者,分别是User、ServiceProvider、Consumer。
假设我要开发一个基于sina微博开放平台的应用(App),供其他sina微博用户使用。
它们的对应关系如下:
User => 想要使用此App的sina微博用户
Provider => sina微博开放平台
Consumer => App
其实我们这个App对于User和Provider(sina微博平台)来说,相当于一个第三方应用。
作为第三方的App想要访问User保存于sina微博平台中的资源,肯定必须经过一系列认证和授权之后才能够行得通。
下面是基于我对整个OAuth认证、授权流程的理解画成的图(可以看一下跳过,当对后面的一些概念有一定理解之后再回头看看这流程图):
结合上面的流程图,下面是我对这些术语的理解以及各个流程的描述:
Consumerkey、ConsumerSecret:
在sina微博开放平台分别称为Appkey、Secretkey。
Consumer向Provider申请希望能够调用其开放API,申请通过后由Provider分配给符合其要求的Consumer,用于唯一标识该Consumer符合Provider的要求。
对应于上图的流程1和2。
RequestToken、RequestSecret:
当User访问Consumer并希望能够获得其特殊服务,该服务由Consumer对User自身存放在Provider中的资源进行整合操作之后返回。
此时Consumer向Provider请求获得RequstToken,用于唯一标识该Consumer与该User的特定关联。
对应于上图的流程3、4、5。
至流程6,Consumer必须把User引导到Provider所提供的OAuth认证、授权页面,其实就是浏览器重定向到附加有RequestToken和RequestSecret参数的authenticationURL。
该URL由Provider提供。
接下来流程7和8中User授权该Consumer(一般是通过输入账号、密码登录而已),则Provider将重定向到流程1中Consumer提供的Callback_URL,并且在该URL参数中附加了OAuthToken和OAuthVerifier。
流程9是Consumer通过之前已从Provider那里获取来的RequestToken再次请求Provider以获取AccessToken。
AccessToken、AccessSecret:
若流程10中Provider返回一个未经User授权的AccessToken,它用于唯一标识特定Consumer可以访问某User存放在Provider中的资源、信息。
那么Consumer就可以开始使用获取到的AccessToken和AccessSecret访问对应User存放在Provider中的资源。
经过流程11中对User信息的整合、操作之后,就可以将特定的服务结果返回给User了。
通过上面对于OAuth流程的理解,我们知道其实User完全没有将自己登录Provider所需的账号、密码等泄露给第三方的Consumer。
同时User又能使用到Consumer的特殊服务。
真是很巧妙的而又安全的操作流程啊!
此外,上图中Consumer有3次与Provider发出不同的请求,其实就是由Provider提供3个不同作用的URL给Consumer访问。
在sina微博开放平台中这3个URL的截图如下:
小结:
1、以上对于OAuth的流程理解非常有可能存在误解,因为我更多的是根据sina微博开发包weibo4j中的代码的理解,以及动手做测试总结出来的。
当然,上面那些文章包括sina微博的部分API文档我都看了好几遍了…希望若发现错误,请指正一下,谢谢!
2、光是一些理论知识的理解还不够,要动手操作实现一下,下一篇文章应该就会给出实际代码了。
sina微博开放平台中使用OAuth验证并发表微博
要使用sina微博开放平台的API,应先获取sina分配的Appkey和AppSecret,下面是我创建应用之后sina分配的Appkey和AppSecret(这个可是要保密的哦)。
然后是下载微博SDK,我用Java的weibo4j。
目前有以下的语言版本:
修改SDK包里面Weibo.java类的AppKey和AppSecret为刚刚获取的AppKey和AppSecret,如下图使用说明所示:
完成了这些之后,就可以根据提供的Demo开始写代码了。
如下:
WebOAuth.java,用于初始化Weibo.java类所需的AppKey和AppSecret,并提供获取RequestToken和AccessToken的方法getRequestToken()、gettAccessToken(),其所需参数如代码所示。
另外,还提供了发布一个文本微博的方法update()。
1.package weibo4j.examples;
2.
3.import weibo4j.Status;
4.import weibo4j.Weibo;
5.import weibo4j.WeiboException;
6.import weibo4j.http.AccessToken;
7.import weibo4j.http.RequestToken;
8.import java.io.UnsupportedEncodingException;
9.
10.// Web 方式认证
11.public class WebOAuth {
12. private Weibo weibo;
13.
14. public WebOAuth(){
15. // 准备好Consumer Key、Consumer Secret
16. // 对应于新浪微博应用就是申请到的 App key 和 Secret key
17. System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY);
18. System.setProperty("weibo4j.oauth.consumerSecret", Weibo.CONSUMER_SECRET);
19. weibo = new Weibo();
20. }
21.
22. // 根据传入的 callback_url 获取 request token
23. public RequestToken getRequestToken(String backUrl) {
24. try {
25. // 指定 callback_url 并获得 request token
26. RequestToken requestToken = weibo.getOAuthRequestToken(backUrl);
27.
28. System.out.println("Request token:
" + requestToken.getToken());
29. System.out.println("Request token secret:
" + requestToken.getTokenSecret());
30.
31. return requestToken;
32. } catch (Exception e) {
33. System.out.println("获取Request token发生异常!
");
34. e.printStackTrace();
35. return null;
36. }
37. }
38.
39. // 根据传入的 request token 和 verifier 获取 access token
40. public AccessToken gettAccessToken(RequestToken requestToken, String verifier) {
41. try {
42. AccessToken accessToken = weibo.getOAuthAccessToken(requestToken
43. .getToken(), requestToken.getTokenSecret(), verifier);
44.
45. System.out.println("Access token:
" + accessToken.getToken());
46. System.out.println("Access token secret:
" + accessToken.getTokenSecret());
47.
48. return accessToken;
49. } catch (Exception e) {
50. System.out.println("获取Access token发生异常!
");
51. e.printStackTrace();
52. return null;
53. }
54. }
55.
56. // 根据传入的 Access Token 和内容发表微博
57. public void update(AccessToken access, String content) {
58. try {
59. weibo.setToken(access.getToken(), access.getTokenSecret());
60. content = new String(content.getBytes("GBK"), "UTF-8");
61. Status status = weibo.updateStatus(content);
62. System.out.println("成功发表微博:
" + status.getText() + ".");
63. } catch (UnsupportedEncodingException e) {
64. System.out.println("微博内容转编码发生异常!
");
65. e.printStackTrace();
66. } catch (WeiboException e) {
67. System.out.println("发表微博发生异常!
");
68. e.printStackTrace();
69. }
70. }
71.}
request.jsp,用于提供callback_url(这里我们自定义为下文中的callback.jsp),当获取得到RequestToken之后,保存该RequestToken到Session中,并将页面重定向到callback.jsp进行验证、授权。
1.<%@ page contentType="text/html;charset=utf-8" %>
2.<%@ page language="java" import="weibo4j.*" %>
3.<%@ page language="java" import="weibo4j.http.*" %>
4.<%@ page language="java" import="weibo4j.util.*" %>
5.
6.useBean id="weboauth" scope="session" class="weibo4j.examples.WebOAuth" />
7.
8.<%
9. if("1".equals(request.getParameter("opt")))
10. {
11. // 传入callback_url
12. String callback_url = "http:
//localhost:
8080/sinaweibo/callback.jsp";
13. RequestToken requestToken = weboauth.getRequestToken(callback_url);
14.
15. if(requestToken !
= null){
16. out.println(requestToken.getToken());
17. out.println(requestToken.getTokenSecret());
18. session.setAttribute("requestToken",requestToken);
19.
20. String url = requestToken.getAuthorizationURL()+"&oauth_callback="+callback_url;
21. System.out.println("AuthorizationURL:
" + url);
22.
23. //BareBonesBrowserLaunch.openURL(callback_url);
24. //response.sendRedirect(requestToken.getAuthorizationURL());
25.
26. // 重定向到附加了callback_url回调地址的sina微博认证页面
27. response.sendRedirect(url);
28. }else{
29. out.println("request error");
30. }
31. }else{
32.%>
33. opt=1">请点击进行Web方式的OAuth认证!
34.<% } %>
callback.jsp,在上一步中重定向之后,callback_url后面会被附加了oauth_verifier参数,此时我们根据保存在Session中的RequestToken和获取到的oauth_verifier参数申请获得AccessToken。
一旦获得AccessToken,我们再把页面重定向到编写微博的页面writeWeibo.html。
1.<%@ page contentType="text/html;charset=utf-8" %>
2.<%@ page language="java" import="weibo4j.http.*" %>
3.<%@ page language="java" import="weibo4j.*" %>
4.
5.useBean id="weboauth" scope="session" class="weibo4j.examples.WebOAuth" />
6.<%
7. // 获得HTTP请求中的 oauth_verifier 参数
8. String verifier=request.getParameter("oauth_verifier");
9.
10. out.println("oauth_verifier:
"+verifier);
11. System.out.println("oauth_verifier:
"+verifier);
12.
13. if(verifier !
= null){
14.
15. RequestToken requestToken = (RequestToken)session.getAttribute("requestToken");
16.
17. if(requestToken !
= null){
18.
19. AccessToken accessToken = weboauth.gettAccessToken(requestToken,verifier);
20.
21. if(accessToken !
= null){
22. try{
23. session.setAttribute("accessToken",accessToken);
24.
25. out.println("5 秒后转到 writeWeibo.html");
26. Thread.sleep(5000);
27. response.sendRedirect("http:
//localhost:
8080/sinaweibo/writeWeibo.html");
28.
29. }catch(Exception e){
30. e.printStackTrace();
31. }
32. }else{
33. out.println("access token request error");
34. }
35. }else{
36. out.println("request token session error");
37. }
38. }else{
39. out.println("verifier String error");
40. }
41.%>
writeWeibo.html,很简单的HTML文件。
1.
2.
发布sina微博
3.
4.
10.
11.
updateWeibo.jsp,用于发表文本微博,即调用WebOAuth.java中的update方法。
1.<%@ page contentType="text/html;charset=utf-8" %>
2.<%@ page language="java" import="weibo4j.http.*" %>
3.<%@ page language="java"