使用新浪微博开放平台api同步微博内容至自己网站(新浪微博开放平台做个实践,开发一个功能简单的android客户端)
优采云 发布时间: 2022-01-17 17:10使用新浪微博开放平台api同步微博内容至自己网站(新浪微博开放平台做个实践,开发一个功能简单的android客户端)
介绍
最近不太忙,花点时间学习android app开发。经过两周的学习,我在学习的同时也写了很多demo例子,可以从基本控件和基本*敏*感*词*效果的demo合集中放出,不断更新下载。
从这周开始,我打算以新浪微博开放平台为实践,开发一个功能简单的安卓客户端,尽可能的完善功能。
今天的内容
上图是这个客户端的主界面。目前只获取前20条数据。您也可以单击刷新来刷新数据。功能比较简单。
操作系统是android2.2.
用到的技术点包括ListView、自定义ListAdapter、多线程相关Message、Handler、认证相关OAuth、异步加载用户图片等。
新浪微博的验证使用signpost的OAuth组件,不使用微博的SDK。
源代码下载:新浪微博2
源码下载后,改后缀为rar,使用压缩软件解压。
关于 OAuth 身份验证
OAuth是目前比较流行的一种授权方案。twitter、facebook、google等大型开放平台均支持oauth认证方式,国内新浪微博、腾讯微博、163微博等开放平台也已支持。这种验证模式。
来自维基百科的引文
“oauth 是一种开放标准,允许用户允许第三方应用程序访问用户放置在 网站 上的私有资源,而无需将用户名和密码传递给第三方应用程序。oauth 允许用户提供一个令牌,而不是用户名和密码来访问他们存储在特定服务提供商处的数据。”
例如:
用户A在服务提供者B上存储了一些资源。B支持oauth授权方式。A 是 B 上的注册用户,拥有用户名和密码。使用用户名和密码登录B可以查看自己的资源。假设有一个应用程序C,当用户A使用C时,他需要自己存储在B上的资源。有两种方法可以在 C 上实现资源以在 B 上显示自身。
这时C就可以使用B开启的oauth授权机制,当用户A想在B上展示资源时,C会跳转到B的验证页面,用户在B的页面输入用户名和密码。通过后,会询问用户是否为C应用开发相关资源。用户可以自定义C可以访问的资源,然后跳转回C应用。这样,您就不必担心用户名和密码,也不必同时存储多个资源。
您可以通过以下网站了解更多关于oauth的具体技术细节。
从上图中我们可以看出,整个流程分为消费者和提供者两部分。消费者是示例中的 C 应用程序,提供者是示例中的 B 服务提供者。
使用 OAuth 进行认证和授权的流程如下:
用户访问客户端的网站,想要操作存储在服务提供者中的用户资源。客户端向服务提供者请求一个临时令牌。服务提供者对客户端进行身份验证后,将授予一个临时令牌。客户端获取临时token后,将用户引导至服务提供者的授权页面,请求用户授权。在这个过程中,临时令牌和客户端的回调连接被发送给服务提供者。用户在服务提供商的网页上输入用户名和密码,然后授权客户端访问所请求的资源。授权成功后,服务商引导用户返回客户端的网页。客户端根据临时令牌从服务提供者处获取访问令牌。服务提供者根据临时令牌和用户授权授予客户端访问令牌。客户端使用获得的访问令牌来访问托管在服务提供商上的受保护资源。
新浪微博的誓言
借用一张新浪微博oauth验证流程图。
当我们在新浪微博开放平台上创建一个新的应用程序时,我们会给新的应用程序分配一个key和secret,即consumerKey和consumerSecret。通过这两件事,我们去request_token,然后将用户重定向到新浪微博平台的授权页面。授权后,我们会根据callback_url跳转到我们应用的某个地址。我们再次使用request_token来获取access_token,然后我们需要通过access token来访问需要验证的开放平台提供的接口。
当然,那些不需要验证就可以访问的接口,可以直接使用key进行访问。具体请参考开放平台提供的API文档。
腾讯微博和163微博的开放平台在原理和实现上也类似。
package com.sinaweibo2;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;
import oauth.signpost.exception.OAuthNotAuthorizedException;
public class OAuth {
private OAuthConsumer mConsumer;
private OAuthProvider mProvider;
public static final String CALLBACK_URL = "sinaweibo2://WeiboListActivity";
public static final String CONSUMER_KEY = "1849239616";
public static final String CONSUMER_SECRET = "b2137bf782bf6cae004b8a8394d5d5d6";
public static final String REQUEST_TOKEN_URL = "http://api.t.sina.com.cn/oauth/request_token";
public static final String ACCESS_TOKEN_URL = "http://api.t.sina.com.cn/oauth/access_token";
public static final String AUTHORIZE_URL = "http://api.t.sina.com.cn/oauth/authorize";
public OAuth() {
}
public String RetrieveAuthUrl() throws OAuthMessageSignerException,
OAuthNotAuthorizedException, OAuthExpectationFailedException,
OAuthCommunicationException {
mConsumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
mProvider = new CommonsHttpOAuthProvider(REQUEST_TOKEN_URL,
ACCESS_TOKEN_URL, AUTHORIZE_URL);
String authUrl= mProvider.retrieveRequestToken(mConsumer, CALLBACK_URL);
return authUrl;
}
public void RetrieveAccessToken(String verifier)
throws OAuthMessageSignerException, OAuthNotAuthorizedException,
OAuthExpectationFailedException, OAuthCommunicationException {
mProvider.setOAuth10a(true);
mProvider.retrieveAccessToken(mConsumer, verifier);
OAuthUser.USER_ID=mProvider.getResponseParameters().getFirst("user_id");
OAuthUser.ACCESS_TOKEN = mConsumer.getToken();
OAuthUser.ACCESS_TOKEN_SECRET = mConsumer.getTokenSecret();
}
}
更*敏*感*词*
接下来主要完善两个功能,一是分页浏览,二是发布微博。
未来可能支持图片发布等实用功能。
有UI美化,性能优化。
总结
在学习的过程中,我看了两本书,Pro.Android.2.pdf和Professional.Android.2.Application.Development.(Wrox,.2010,.0470565527). pdf,都是很不错的入门书,书我没有看完,但是看了大部分,边看边写demo。
同时,论坛是eoe天天的开发者门户。回答问题、解决问题、提问、发帖,总之就是锻炼自己,强迫自己锻炼基础和思考。
论坛上有很多中文的pdf教程,但是我发现大部分都是android开发者中心的Dev Guide和Resources中的内容的翻译。所以我觉得,如果英文不是很差,建议直接看上面两节,同时练习里面的例子。保证在两周内,你会取得很大的进步。
参考
Technorati 标签:android, 开放平台, oauth, 新浪微博