在路上.......分享 http://blog.sciencenet.cn/u/longxie1983 一念嗔心起,百万障门开

博文

通过OAuth调用Twitter API

已有 12861 次阅读 2011-11-2 17:09 |个人分类:科研工具|系统分类:科研笔记| 密码, 如何, Twitter, API, 第三方软件

需要从Twitter抓取数据,简单的用了一下Twitter的API,整体还是很好用的。只是由于我是技术控,发现很少有详细介绍如何构建OAuth信息进行第三方API调用的文章,大多是直接调用一些封装好的库,没有技术细节,就把自己的一点心得记录在这里。

注:本文内容偏技术,不喜者请勿围观。

一,什么是OAuth?有什么好处?
OAuth是一种访问权限验证机制。想象一下,你想通过某第三方软件读取你科学网账户的信息,现有的做法是你要把你的用户名和密码提交给这个第三方软件。可是这样做是有风险也是显而易见的。OAuth就是为了避免你把自己的用户名密码提交给第三方应用,同时又可以让第三方应用获得对你用户某些访问权限的机制。详细可以看看《OAUTH协议简介》这篇博文。

二,本文关注的问题
本文针对的是,当第三方应用已经获取到了用户的授权,如何通过OAuth验证的方式调用Twitter API.

三,准备材料
根据OAuth的技术要求,应确保如下材料已经就绪:
主要信息:
oauth_consumer_key 和 oauth_consumer_secret 这两个参数在你注册Twitter应用的时候由Twitter提供。
oauth_token和oauth_token_secret 这两个参数在通过用户授权后可以获得
次要信息:
oauth_timestamp      你提交请求的时间点距离标准时间的秒数,也就是time(0)返回的数据,允许±600秒的误差,
oauth_nonce          一个随机字符串
oauth_version        这里用1.0
oauth_signature_method 签名的加密方法

四,实例
下面通过调用https://api.twitter.com/1/friends/ids.json这个API的作为例子进行,详细讲解
我们最终要调用的完整API是https://api.twitter.com/1/friends/ids.json?cursor=-1&screen_name=Twitterapi
并假设 三 中的各项信息如下
oauth_consumer_key    = "abcdX"
oauth_consumer_secret = "xkdfjw"
oauth_token           = "sdfewef"
oauth_token_secret    = "dfwUIDf"
oauth_timestamp       = "1320118351"
oauth_nonce           = "dsfeweed"
oauth_version         = "1.0"
oauth_signature_method = "HMAC-SHA1"

1.构建OAuth基本信息串
这个串包含,oauth_consumer_key,oauth_token,oauth_timestamp,oauth_nonce,oauth_version ,oauth_signature_method以及提交给API的参数,这里分别是cursor 和 screen_name。
根据OAuth的要求,首先对这些部分按照字母序排序,然后连同其值一起组成一个串。参数名 和 值之间用 "%3D"(也就是=号,但是Twitter好像只能用%3D)连接,两个部分之间用"%26"(也就是&)连接。
我们最终得到的结果为:
cursor%3D-1%26oauth_consumer_key%3DabcdX%26oauth_nonce%3Ddsfeweed%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1320118351%26oauth_token%3Dsdfewef%26oauth_version%3D1.0%26screen_name%3DTwitterapi

然后,再吧使用的HTTP方法和请求的URL信息加进来,各部分之间用&连接,url也需要进行转码,具体规则google就行了,记住. _ - ~是不需要转码的。
在我们这里HTTP方法用的是GET,URL就是https://api.twitter.com/1/friends/ids.json这个
最终我们基本信息串的内容为:
GET&https%3A%2F%2Fapi.twitter.com%2F1%2Ffriends%2Fids.json&cursor%3D-1%26oauth_consumer_key%3DabcdX%26oauth_nonce%3Ddsfeweed%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1320118351%26oauth_token%3Dsdfewef%26oauth_version%3D1.0%26screen_name%3DTwitterapi

2.对基本信息串进行签名
我们用的是HMAC-SHA1,一个加密算法,挺高深的,我就没有实现,用的现成的。用的密钥是由
oauth_consumer_secret与oauth_token_secret合成的,合成方法就是用&把他们连接起来我们这里就是xkdfjw&dfwUIDf,签名后的结果是
Ve7FgTvnQXeBPXwyFu5SwYA188c=
这还不行,还需要和url一样进行转码,转码后的结果为
Ve7FgTvnQXeBPXwyFu5SwYA188c%3D

3.进行API调用
我们离胜利很近了,下面先把上面那些信息和得到的签名进行整合,这次有点不同,不同部分间用逗号(,),值要用双引号(")括起来。
OAuth oauth_consumer_key="abcdX",oauth_nonce="dsfeweed",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1320118351",oauth_token="sdfewef",oauth_version="1.0",oauth_signature="Ve7FgTvnQXeBPXwyFu5SwYA188c%3D"

恩,差不多成了,现在在把这个信息附加到请求https://api.twitter.com/1/friends/ids.json?cursor=-1&screen_name=Twitterapi的HTTP报文的头中。域名用"Authorization",同时报文的ContentType设置为application/x-www-form-urlencoded

完整的HTTP报头信息为
GET /1/friends/ids.json?cursor=-1&screen_name=Twitterapi HTTP/1.1
Authorization: OAuth oauth_consumer_key="abcdX",oauth_nonce="dsfeweed",oauth_sig
nature_method="HMAC-SHA1",oauth_timestamp="1320118351",oauth_token="sdfewef",oau
th_version="1.0",oauth_signature="Ve7FgTvnQXeBPXwyFu5SwYA188c%3D"
Content-Type: application/x-www-form-urlencoded


大功告成,接着处理请求道的信息吧

{"next_cursor":0,"previous_cursor":0,"ids":[183709371,7588892,38895958,22891211,
31393,9019482,14488353,11750202,12249,22915745,1249881,14927800,1523501,24597045
4,22548447,15062340,133031077,17874544,777925,4265731,27674040,26123649,9576402,
821958,7852612,12863272,819797,1401881,8285392,9160152,795649,3191321,783214],"n
ext_cursor_str":"0","previous_cursor_str":"0"}。


五,参考资料
http://codebrook.wordpress.com/2010/07/08/twitter-oauth-in-cpp-for-win32/
http://www.codeproject.com/KB/cs/Delicious-OAuth-API.aspx



https://blog.sciencenet.cn/blog-483379-503881.html

上一篇:巴厘岛的瞬间
下一篇:Latex不常用宏包介绍(6)
收藏 IP: 202.161.43.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (8 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-25 10:43

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部