使用新浪微博开放平台api同步微博内容至自己网站(调用新浪微博开放平台API开发自己的微博应用(App))
优采云 发布时间: 2022-01-12 22:14使用新浪微博开放平台api同步微博内容至自己网站(调用新浪微博开放平台API开发自己的微博应用(App))
新浪微博开放平台虽然提供多种语言的开发SDK下载,但也有一些基本接口调用的demo和接口说明文档。但是经过几天的耐心尝试,感觉新浪微博开放平台上的入门指南和下载的Java开发包weibo4j包中的demo用法注释有些不一致。再加上自身领悟能力有限,遇到了不少难题。幸运的是,我没有放弃尝试理解它。废话不多说,这是我的学习过程。
如果你想通过调用新浪微博开放平台API来开发自己的微博应用,第一步就是要有一个新浪微博账号和一个CSDN账号,因为我们需要同时用这两个账号创建一个微博应用,从而获得App key和CSDN账号。密钥 。App key 和 Secret key 有什么用?
其实我只是看了新浪微博开放平台上的一系列说明,对App key和Secret key的使用并不是很了解。因为更重要的一点是要了解OAuth认证授权的整个过程,以及几个Token和4个URL在整个OAuth认证授权过程中的作用。
当我第一次遇到完全没有概念的 OAuth 时,我认为它是不可能学习的。幸运的是,我找到了下面的文章,对理解OAuth很有帮助。链接如下:
OAuth 中共有三个参与者,即用户、服务提供者和消费者。假设我想开发一个基于新浪微博开放平台的应用程序(App),供其他新浪微博用户使用。它们的对应关系如下:
实际上,我们的App相当于User和Provider(新浪微博平台)的第三方应用。作为第三方App,要想访问用户存储在新浪微博平台的资源,必须经过一系列的认证和授权后才能工作。
下面是根据我对整个OAuth认证授权过程的理解绘制的图(可以看略过,对以下一些概念有一定了解后再看这个流程图):
结合上面的流程图,下面是我对这些术语的理解和对各个流程的描述:
Consumer key和Consumer Secret:在新浪微博开放平台上分别称为App key和Secret key。Consumer 向 Provider 申请能够调用其开放的 API。申请通过后,Provider将其分配给满足其要求的Consumer,以唯一标识满足Provider要求的Consumer。
对应上图中的流1和2。
Request Token,Request Secret:当User访问Consumer,想要获取其特殊服务时,该服务由Consumer整合存储在Provider中的User自己的资源后返回。此时,Consumer 向 Provider 请求获取一个 Requst Token,用于唯一标识 Consumer 和 User 之间的具体关联。
对应上图中的流程3、4、5。
在流程6中,Consumer必须将User引导到Provider提供的OAuth认证授权页面。实际上,浏览器会重定向到附加了 Request Token 和 Request Secret 参数的 authenticationURL。URL 由 Provider 提供。
接下来在流程7和流程8中,User授权Consumer(一般是输入账号和密码登录),然后Provider会重定向到流程1中Consumer提供的Callback_URL,并附加OAuth Token和OAuth URL 参数的验证程序。.
流程9,Consumer通过之前已经从Provider获取的Request Token,再次请求Provider获取Access Token。
Access Token和Access Secret:如果Provider在流程10中返回了一个未经User授权的Access Token,用于唯一标识特定的Consumer可以访问某个User存储在Provider中的资源和信息。然后Consumer就可以开始使用获取到的Access Token和Access Secret来访问对应User存储在Provider中的资源。
在流程11中对用户信息进行整合和操作后,可以将具体的服务结果返回给用户。
通过以上对OAuth流程的了解,我们知道User并没有将登录Provider所需的账号、密码等泄露给第三方Consumer。同时,用户可以使用消费者的特殊服务。多么巧妙又安全的操作过程!
另外,上图中,Consumer向Provider发出了三个不同的请求,实际上就是Provider提供了三个不同功能的URL供Consumer访问。新浪微博开放平台三个网址截图如下:
使用OAuth在新浪微博开放平台验证和发布微博
使用新浪微博开放平台的API,首先要获取新浪分配的App key和App Secret。以下是我创建应用后新浪分配的App key和App Secret(这个要保密)。
然后下载微博SDK,我用的是Java的weibo4j。
将SDK包中Weibo.java类的App Key和App Secret修改为刚刚获取的App Key和App Secret,如下所示:
完成这些后,就可以根据提供的Demo开始编写代码了。如下:
WebOAuth.java用于初始化Weibo.java类所需的App Key和App Secret,并提供getRequestToken()和gettAccessToken()方法获取Request Token和Access Token。所需的参数显示在代码中。此外,还提供了一种发布文本微博的方法update()。
package weibo4j.examples; import weibo4j.Status; import weibo4j.Weibo; import weibo4j.WeiboException; import weibo4j.http.AccessToken; import weibo4j.http.RequestToken; import java.io.UnsupportedEncodingException; // Web 方式认证 public class WebOAuth { private Weibo weibo; public WebOAuth(){ // 准备好Consumer Key、Consumer Secret // 对应于新浪微博应用就是申请到的 App key 和 Secret key System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY); System.setProperty("weibo4j.oauth.consumerSecret", Weibo.CONSUMER_SECRET); weibo = new Weibo(); } // 根据传入的 callback_url 获取 request token public RequestToken getRequestToken(String backUrl) { try { // 指定 callback_url 并获得 request token RequestToken requestToken = weibo.getOAuthRequestToken(backUrl); System.out.println("Request token: " + requestToken.getToken()); System.out.println("Request token secret: " + requestToken.getTokenSecret()); return requestToken; } catch (Exception e) { System.out.println("获取Request token发生异常!"); e.printStackTrace(); return null; } } // 根据传入的 request token 和 verifier 获取 access token public AccessToken gettAccessToken(RequestToken requestToken, String verifier) { try { AccessToken accessToken = weibo.getOAuthAccessToken(requestToken .getToken(), requestToken.getTokenSecret(), verifier); System.out.println("Access token: " + accessToken.getToken()); System.out.println("Access token secret: " + accessToken.getTokenSecret()); return accessToken; } catch (Exception e) { System.out.println("获取Access token发生异常!"); e.printStackTrace(); return null; } } // 根据传入的 Access Token 和内容发表微博 public void update(AccessToken access, String content) { try { weibo.setToken(access.getToken(), access.getTokenSecret()); content = new String(content.getBytes("GBK"), "UTF-8"); Status status = weibo.updateStatus(content); System.out.println("成功发表微博:" + status.getText() + "."); } catch (UnsupportedEncodingException e) { System.out.println("微博内容转编码发生异常!"); e.printStackTrace(); } catch (WeiboException e) { System.out.println(来源gaodai.ma#com搞#代!码网"发表微博发生异常!"); e.printStackTrace(); } } } request.jsp,用于提供 callback_url(这里我们自定义为下文中的callback.jsp),当获取得到RequestToken之后,保存该RequestToken到Session中,并将页面重定向到callback.jsp进行验证、授权。 请点击进行Web方式的OAuth认证!
callback.jsp,在上一步重定向后,会在callback_url后面附加oauth_verifier参数。这时候我们根据Session中保存的RequestToken和获取到的oauth_verifier参数申请AccessToken。获取到AccessToken后,我们将页面重定向到writeWeibo.html,即写微博的页面。
writeWeibo.html,很简单的HTML文件。 发布sina微博 请在这里写上140字符以内的文本:</br>测试新浪微博!</br></br> updateWeibo.jsp,用于发表文本微博,即调用WebOAuth.java 中的update方法。
运行前我们要准备好Tomcat,把上面的源文件放到正确的目录下。另外SDK包中的commons-httpclient-3.1.jar包也要加到\WEB-INF\lib目录下,还有我编译打包的weibo4j.jar(里面是新浪微博开放平台中具体的Java实现)。
运行Tomcat,在浏览器中访问request.jsp页面,如下图:
点击链接,如下图(注意地址栏的变化):
地址栏中的网址如下:
://localhost:8080/sinaweibo/callback.jsp
填写具体有效的新浪微博账号、密码和授权。以下是我用于测试和授权的微博账号填写的结果:
地址栏中的网址如下:
:8080/sinaweibo/writeWeibo.html
点击“发布”,如下图:
登录微博查看,如下图:
查看此帐户授权的应用列表:
至此,利用新浪微博开放平台发布关于OAuth方式的微博大概就是这个过程了。
概括:
1、其实还有很多细节我没有讲到。我也尝试了很多次,找到问题,理解问题,然后解决问题;
2、如果我们登录新浪微博的账号信息的cookie已经保存在浏览器中,那么授权时不需要输入账号信息,当然也可以不使用当前账号进行修改授权;
3、还有一些信息是在控制台输入的,比如Token、URL、服务器返回信息,截图中没有给出。