这里使用的是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