自定义搜索
上一篇:今天冷水管冻了,不出水
下一篇:“美国人,因杀害英国人,被意大利人判26年监禁”续;
用PHP编写Twitter客户端笔记(1):Consumer Requests Request Token
米娅 2011年1月23日 20:01:08

这是以前写的,供参考: 在Twitter应用中使用OAuth(入门级)

决定写个Twitter客户端,可以手机上用的,今天作了一部分,吃了饭,就写... ...


2楼 2011年1月23日 22:44:01 米娅

3楼 2011年1月23日 22:47:21 米娅

这里使用的是PHP,参考了中文推特圈等,有些我也不理解为什么。
下面图中是A->B的实现:
 
像图中所说,需要传递7个参数:
1, oauth_consumer_key
2, oauth_signature_method
3, oauth_signature
4, oauth_timestamp
5, oauth_nonce
6, oauth_version (optional 可选)
7, oauth_callback

请求的url: https://twitter.com/oauth/request_token
传递参数的方法: GET

oauth_consumer_key 是在注册API是可以得到;
oauth_signature_method 是 HMAC-SHA1; 
oauth_timestamp可以用函数time()取得;
oauth_nonce这里下面的代码:
$mt = microtime();
$rand = mt_rand();
$oauth_nonce = md5($mt . $rand);
个人感觉可以用任意值;
oauth_version可选,这里用 1.0a ;
oauth_callback是登陆后要返回的网页,这里用 http://localhost/itwitter/

这里比较有难度的是oauth_signature,如果弄得值不对,就会出这个提示:

Failed to validate oauth signature and token

用下面的代码得到这个oauth_signature:

function urlencode_tw($input) { return str_replace( '+', ' ',  str_replace('%7E', '~', rawurlencode($input)) ); };

$oauth_callback = 'http://localhost/itwitter/'
$oauth_callback = str_replace('+',' ', str_replace('%7E', '~', rawurlencode($oauth_callback)));

$sub_string = array( oauth_callback =>$oauth_callback, oauth_consumer_key => $oauth_consumer_key, oauth_nonce => $oauth_nonce, oauth_signature_method => 'HMAC-SHA1', oauth_timestamp => $oauth_timestamp, oauth_version => $oauth_version);

$params = $sub_string;
 
$temp = array();
foreach ($params as $param => $values) {
  if (is_array($values)) {
 natsort($values);
 foreach ($values as $value) {
   $temp[] = $param . '=' . $value;
 }
  } else {
   $temp[] = $param . '=' . $values;
    }
}  
 
$sub_string = $temp; 

$sub_string = implode('&', $sub_string);
$base_string=array("GET","https://twitter.com/oauth/request_token",$sub_string);

$base_string = array_map(urlencode_tw, $base_string);

$base_string = implode('&', $base_string);

$oauth_signature = base64_encode(hash_hmac('sha1', $base_string, $key, true));

$oauth_signature = str_replace('+',' ',str_replace('%7E', '~', rawurlencode($oauth_signature)));

我的理解就是把传递给Twitter的信息进行加密,然后得到一个值,Twitter用这个值、加密方法和得到的未加密的值对照,如果一致,说明是原始真实数据。要加密的是类似下面的字符串:
GET&https%3A%2F%2Ftwitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Flocalhost%252Fitwitter%252F%26oauth_consumer_key%3Dfwwaw3m5sQq4L3M6aXV1jg%26oauth_nonce%3Df9baa315ecf34c0aabf555f785c312fc%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1295839203%26oauth_version%3D1.0a

得到的oauth_signature是类似下面的值:
d1zMBrpd/YBdZmYVZxpqpwqxglQ=
然后用str_replace('+',' ',str_replace('%7E', '~', rawurlencode($oauth_signature)))把其中的非字符替代掉。
上面那个得到这个:
d1zMBrpd%2FYBdZmYVZxpqpwqxglQ%3D

然后,把这些值作为参数放在 https://twitter.com/oauth/request_token 后,类似下面的格式:

https://twitter.com/oauth/request_token?oauth_callback=http%3A%2F%2Flocalhost%2Fitwitter%2F&oauth_consumer_key=fwwaw3m5sQq4L3M6aXV1jg &oauth_nonce=817d10a677547378dbef3547c5545fdb&oauth_signature=Hv48dvKEbWAn4tG4JSEs0UbM1so%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1295839203&oauth_version=1.0a

用这个网址和参数,就可以得到oauth_token等,类似如下值:
oauth_token=Fh8BYm1ec2EGgCXdxFPsWIv46aFgZiGqw6Krv8iLks &oauth_token_secret=PFNmtGd166NV7SGfnZhk8DFzlU67oiaErWSFyBJlxM&oauth_callback_confirmed=true

第1页 共1页
相关链接
1. 招聘测试:用jersey获得twitter网页,获得有最大共有字符串的两条twitts
2. 用PHP编写Twitter客户端笔记(4):用户登录验证(F)
3. 用PHP编写Twitter客户端笔记(3):如何用curl传递浏览器的语言信息(C)
4. 用PHP编写Twitter客户端笔记(2):Service Provider Grants Request Token
5. 如何用twitter账号赚钱
6. Twitter传闻:不少于一百辆的运兵卡车... ...
7. 把手机绑定到Twitter上,说不准什么时候能让你化险为夷
8. 获奖精彩Twitter推特儿、新浪围脖儿作品展
9. 免翻墙实现Twitter的OAUTH登陆认证,提供代码下载
10. 在Twitter应用中使用OAuth(入门级)
11. 读“解剖Twitter:Twitter系统架构设计分析”的笔记
12. 编写一个简单的twitter API程序
13. 如何方便的读推友(Twitter)的全部推(Tweets)
14. 开源软件“推特中文圈”,先围观一下(Twitter)
15. 关于玉树地震的几个推(Twitter)
16. 复制一些推与不能用或不知道推特(Twitter)的分享