使用新浪微博开放平台api同步微博内容至自己网站(调用新浪微博开放平台API开发自己的微博应用(App))
优采云 发布时间: 2021-12-16 09:15使用新浪微博开放平台api同步微博内容至自己网站(调用新浪微博开放平台API开发自己的微博应用(App))
新浪微博开放平台虽然提供了各种语言版本的开发SDK下载,但也附带了一些基本接口调用的demo和接口描述文档。但是经过这几天的耐心尝试,感觉新浪微博开放平台上的入门指南与下载的Java开发包weibo4j包中的demo使用注释有些不一致。再加上自我理解能力有限,导致了很多困惑。幸运的是,我并没有放弃尝试去理解它。废话少说,以下是我的学习过程。
如果你想通过调用新浪微博开放平台API开发自己的微博应用,首先要有一个新浪微博账号和一个CSDN账号,因为我们需要同时用这两个账号创建一个微博应用获取App key和Secret key。App key和Secret key有什么用?
其实我只是在新浪微博开放平台上看了一系列的说明,并不是很了解App key和Secret key的使用。因为更重要的是了解OAuth认证授权的整个过程,以及几个Token和4个URL在整个OAuth认证授权过程中的作用。
当我第一次遇到完全没有概念的 OAuth 时,我认为它是不可能学习的。幸好找到了下面的文章,对理解OAuth很有帮助。链接如下:
OAuth 有 3 个参与者,分别是 User、Service Provider 和 Consumer。假设我想开发一个基于新浪微博开放平台的应用程序(App),供其他新浪微博用户使用。它们的对应关系如下:
实际上,我们的App相当于User和Provider(新浪微博平台)的第三方应用。由于第三方App想要访问用户在新浪微博平台上保存的资源,必须经过一系列的认证和授权才能工作。
下面是根据我对整个OAuth认证授权流程的理解绘制的图(可以跳过,对以下一些概念有一定了解后再看流程图):
结合上面的流程图,下面是我对这些术语的理解以及对每个过程的描述:
消费者秘钥和消费者秘钥:在新浪微博开放平台上分别称为App秘钥和秘钥。消费者向提供者申请,希望能够调用其开放的API。申请通过后,Provider将其分配给满足其要求的Consumer,以唯一标识该Consumer满足Provider的要求。
对应上图中的流程1和流程2。
Request Token、Request Secret:当用户访问Consumer,希望获得其特殊服务时,在用户整合Provider中存储的资源后,由Consumer返回该服务。此时,Consumer向Provider请求获取Requst Token,用于唯一标识Consumer和User之间的具体关联。
对应上图中的过程3、4、5。
要处理 6,消费者必须将用户引导至提供者提供的 OAuth 身份验证和授权页面。实际上,浏览器会重定向到带有请求令牌和请求秘密参数的 authenticationURL。URL 由提供商提供。
接下来,User在流程7和流程8中授权Consumer(一般是通过输入账号和密码登录),然后Provider会被重定向到流程1中Consumer提供的Callback_URL,URL参数附加OAuth令牌和 OAuth 验证器。
流程9是Consumer使用之前从Provider获取的Request Token再次向Provider请求获取Access Token。
Access Token,Access Secret:如果Provider在流程10中返回一个未经User授权的Access Token,则用于唯一标识特定Consumer可以访问用户在Provider中存储的资源和信息。然后Consumer就可以开始使用获取到的Access Token和Access Secret来访问Provider中对应User存储的资源了。
在流程11中对用户信息进行整合操作后,即可将具体的服务结果返回给用户。
通过以上对OAuth流程的理解,我们知道,实际上User并没有向第三方Consumer透露登录Provider所需的账号和密码。同时,用户可以使用消费者的特殊服务。多么巧妙而安全的操作过程!
另外,在上图中,Consumer 向 Provider 提出了 3 个不同的请求。实际上,Provider 提供了 3 个不同功能的 URL 供 Consumer 访问。这3个网址在新浪微博开放平台的截图如下:
新浪微博开放平台使用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("发表微博发生异常!");
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、 如果我们登录新浪微博的账号信息的cookies已经保存在浏览器中,那么授权时就不需要输入账号信息了,当然不用当前账号也可以修改授权;
3、 控制台中也有一些输入的信息,如Token、URL、服务器返回信息等,截图中没有显示。