プログラミング

OAuthをPHPでイチから書いてみた(最後)

この記事は2年以上前ですので、内容が古い可能性があります

最後です。取得したアクセストークンを使ってユーザーのデータを取得します。
今回はユーザーのホームのタイムラインを取得して表示します。しかし、実際には処理内容に関して、特に解説することはほとんどありません。今までと同じように署名を作ってサーバーと通信するだけです。気をつけることといえばデータの取得は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) . '&amp;';
}
$signatureBaseString = substr($signatureBaseString,0,-1);
$signatureBaseString = $method . '&amp;' . rawurlencode($url)
    . '&amp;' .  rawurlencode($signatureBaseString);
$signingKey = rawurlencode($oauthConfig['consumerSecret'])
    . '&amp;' . 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 . '=&quot;' . rawurlencode($val) .'&quot;,';
}
$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=&quot;ja&quot;>
<head>
<meta charset=&quot;UTF-8&quot;>
<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: &quot;.&quot;;}
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!#$%&amp;\'()*+,\-.\/:;=?@~]*)/','<a href=&quot;$1&quot;>$1</a>',$v['text']);
    print '<li><div class=&quot;left&quot;><img src=&quot;' . $v['img'] . '&quot;></div>';
    print '<div class=&quot;right&quot;><p class=&quot;name&quot;>' . $v['name'] . '</p><p class=&quot;text&quot;>' . $v['text'] . '</p></div></li>';
}
print '</ul></body></html>';
この記事をシェアする:
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇

私たちと一緒に働きませんか?

「OAuthをPHPでイチから書いてみた(最後)」はいかがでしたか?
株式会社プレスマンでは、 WordPressが大好きな方、仕事を通してさらにスキルを磨きたい方を募集しています。 まずは募集職種をご覧の上、お気軽にお問い合わせください。 あなたとお会いできるのを楽しみにしています。

採用情報を見る

-プログラミング
-,

© 2024 PRESSMAN*Tech Powered by STINGER