最後です。取得したアクセストークンを使ってユーザーのデータを取得します。
今回はユーザーのホームのタイムラインを取得して表示します。しかし、実際には処理内容に関して、特に解説することはほとんどありません。今までと同じように署名を作ってサーバーと通信するだけです。気をつけることといえばデータの取得はPOSTでなくてGETで行うことくらいです。
以下ソースを参照してください。CSSで少々レイアウトを組んでそれっぽく見えるようにしてあります。Chromeでしか確認してませんけど。
XMLの処理はSimpleXMLを使っていますがDOMでやってもいいし、SAXでも好きなようにやっちゃってください。
<?php
$oauthConfig = array(
'callbackUrl' => 'http://net.pressmantech.com/twitter/accesskey.php',
'authorizeUrl' => 'https://api.twitter.com/oauth/authorize',
'requestTokenUrl' => 'https://api.twitter.com/oauth/request_token',
'accessTokenUrl' => 'https://api.twitter.com/oauth/access_token',
'consumerKey' => 'pD4dm6IQHa6jhtge82Fg',
'consumerSecret' => 'BfTtokF9bfb5Fim6BsPaEg9Fo3y4FM6kPlCQQiRPKA4'
);
session_start();
$accessToken = unserialize($_SESSION['TWITTER_ACCESS_TOKEN']);
/**
* ユーザーのホームタイムラインを取得してみる。
* データの形式はXMLで取得。
*/
$url = 'http://api.twitter.com/1/statuses/home_timeline.xml';
/**
* GETじゃないとデータは取得できない。
*/
$method = 'GET';
$nonce = md5(uniqid(rand(), true));
$timestamp = time();
$authorization = array(
'oauth_nonce' => $nonce,
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => $timestamp,
'oauth_consumer_key' => $oauthConfig['consumerKey'],
'oauth_token' => $accessToken['oauth_token'],
'oauth_version' => '1.0'
);
ksort($authorization);
$signatureBaseString = '';
foreach($authorization as $key => $val){
$signatureBaseString .= $key . '=' . rawurlencode($val) . '&';
}
$signatureBaseString = substr($signatureBaseString,0,-1);
$signatureBaseString = $method . '&' . rawurlencode($url)
. '&' . rawurlencode($signatureBaseString);
$signingKey = rawurlencode($oauthConfig['consumerSecret'])
. '&' . rawurlencode($accessToken['oauth_token_secret']);
//print $signingKey;exit();
$authorization['oauth_signature'] =
base64_encode(hash_hmac('sha1',$signatureBaseString,$signingKey,true));
$oauthHeader = 'OAuth ';
foreach($authorization as $key => $val){
$oauthHeader .= $key . '="' . rawurlencode($val) .'",';
}
$oauthHeader = substr($oauthHeader,0,-1);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Authorization :' . $oauthHeader,
'Content-Length:',
'Expect:',
'Content-Type:'
));
$response = curl_exec($curl);
$curlInfo = curl_getinfo($curl);
/**
* httpコードが200以外だったらとりあえずエラーってことで
*/
if( $curlInfo['http_code'] != '200'){
print '何かエラーがおきているようだ:';
print $response;
exit();
}
/**
* SimpleXMLを使ってXMLを処理。
*/
$xml = new SimpleXMLElement($response);
$result = array();
foreach($xml->status as $status){
$result[] = array(
'name' => (String) $status->user->name,
'img' => (String) $status->user->profile_image_url,
'text' => (String) $status->text
);
}
/**
* なんとなくツイッターっぽい画面にしてみる。Chromeでしか確認していない。
*/
print <<<HEAD
<!DOCTYPE html><html lang="ja">
<head>
<meta charset="UTF-8">
<title>OAuthのテスト</title>
<style>
ul{padding:0;width:310px;}
img{padding:10px;}
li{list-style-type:none;border-bottom:2px solid #9999DD;}
li:after{clear:both;display:block;height:0;visibility: hidden;content: ".";}
div{float:left}
div.left{width:68px;}
div.right{width:240px;}
p.name{font-size:10px;}
p.text{font-size:12px;color:#666666}
</style>
</head>
HEAD;
print '<body><ul>';
foreach($result as $v){
$v['text'] = preg_replace('/(https?:\/\/([a-z\d\-]+\.)+[a-z]{2,7}[\w!#$%&\'()*+,\-.\/:;=?@~]*)/','<a href="$1">$1</a>',$v['text']);
print '<li><div class="left"><img src="' . $v['img'] . '"></div>';
print '<div class="right"><p class="name">' . $v['name'] . '</p><p class="text">' . $v['text'] . '</p></div></li>';
}
print '</ul></body></html>';