初识OAuth:
下面讲一下另外一种方式读取微博和操作微博的方式, OAuth协议来认证和操作新浪微博的过程。
OAuth官网是http://oauth.net/ ,上面有介绍该协议,为桌面或者网站程序提供一个简单的标准的方式去访问需要授权的API开发协议。 起草于2006年,2007年发布第一个版本,最新的2.0处于草稿阶段,http://tools.ietf.org/html/draft-ietf-oauth-v2-22,可以看到协议的描述。对于.net,也有人写了OAuth的服务端和客户端的实现代码:http://code.google.com/p/oauth-dot-net/,如果需要编写服务端代码也有一定参考价值。
现在的互联网公司的网站等都推出了开放平台,比如新浪微博开放平台http://open.weibo.com/,腾讯社区开放平台http://opensns.qq.com/,淘宝网开放平台http://open.taobao.com/,等,其中新浪、腾讯等开放平台可以通过OAuth认证并交互处理数据。
新浪微博OAuth认证及操作:
为了更清楚的了解OAuth协议客户端的调用过程,我没有用官方推荐的.net客户端OAuthBase.cs(http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs )做一些基础的加解密编码工作,而是全部自己调用.net框架类库的方式加解密编码等来调用新浪的OAuth开放平台,让我在用OAuth验证过程中,遇到各种返回401未经授权的问题,但最后终于找到问题原因并解决了。
下面介绍OAuth认证新浪微博获取粉丝并发布微博的过程。
新浪微博开放平台官网SDK提供了一个网友的提供的开放平台调用DEMO,http://code.google.com/p/opensinaapi/,可供参考。
要使用新浪微博开放平台,首先需要申请一个应用,我申请的应用如下:
申请后,会得到两个参数:App Key,App Secret,这个都是后面通过OAuth调用需要用到的参数。
下面直接借用新浪OAuth认证的流程图:
一个认证过程,需要有3次的交互,用到的URL地址分别为:
http://api.t.sina.com.cn/oauth/request_token
http://api.t.sina.com.cn/oauth/authorize
http://api.t.sina.com.cn/oauth/access_token
分别为请求临时未授权的Request Token,它将返回比较重要的oauth_token和oauth_token_secret参数;
然后请求对该Request Token授权;
然后对授权后的Request Token请求Access Token,它也将返回oauth_token和oauth_token_secret参数,这两个参数将作为后续的发布微博,获取微博粉丝等的重要参数,还返回新浪的uid,不过这里基本不用。
http://open.weibo.com/wiki/index.php/Oauth,这里有认证流程的描述,细节可以参考。但我在开发过程中遇到一定的问题,比如HMACSHA1加密字符串为类试:GET&http%3A%2F%2Fapi.t.sina.com.cn%2Foauth%2Frequest_token&oauth_consumer_key%3D1331820154%26oauth_nonce%3D7971285%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318247463%26oauth_version%3D1.0。这里的“=”符号不是用.net的URLEncode的,而是%3D,我开始用框架自带的URLEncode后为%3d,导致老是提示401未授权的问题。这里的所有URLEncode后的小写字母都必须大写,并且request_token&oauth_consumer_key这里的“&”符号并没有进行任何编码处理,否则也会出问题。
新浪微博提供的API接口也相当多,详细描述可以参考http://open.weibo.com/wiki/API%E6%96%87%E6%A1%A3, 下面以获取粉丝为例:http://open.weibo.com/wiki/Statuses/followers,请求URL地址为:http://api.t.sina.com.cn/statuses/followers.(json|xml) 基本都支持xml和json两种返回格式,请求方式为GET,新浪API有比较详细的描述,我用xml,它会返回类试:
<?xml version="1.0" encoding="UTF-8"?><users><user><id>2290721941</id><screen_name>辉明时</screen_name><name>辉明时</name><province>45</province><city>1000</city><location>广西</location><description></description><url></url><profile_image_url>http://tp2.sinaimg.cn/2290721941/50/5612099136/1</profile_image_url><domain></domain><gender>m</gender><followers_count>5</followers_count><friends_count>46</friends_count><statuses_count>1</statuses_count><favourites_count>0</favourites_count><created_at>Tue Aug 09 00:00:00 +0800 2011</created_at><following>false</following><verified>false</verified><allow_all_act_msg>false</allow_all_act_msg><geo_enabled>true</geo_enabled><status><created_at>Tue Aug 09 19:38:47 +0800 2011</created_at><id>3344565122238306</id><text>为什么你下雨还要拉着我出来散步… [泪]</text><source><a href="http://weibo.com">新浪微博</a></source><favorited>false</favorited><truncated>false</truncated><geo/><in_reply_to_status_id></in_reply_to_status_id><in_reply_to_user_id></in_reply_to_user_id><in_reply_to_screen_name></in_reply_to_screen_name><mid>3344565122238306</mid></status></user>。。。
的xml字符串返回,自己可以通过xml的结构,组装成相应数据结构,再展现出来。
下面通过OAuth发布一条新浪微博出来,请求的URL地址为:http://api.t.sina.com.cn/statuses/update.(json|xml) ,这里需要请求方式为POST,具体参数可以参考http://open.weibo.com/wiki/Statuses/update。
发布成功后为:
这里是因为我创建了一个应用,但应用还没有正式审核,所以这么显示的。