OAuth認証が必要なAPIでは、Twitter APIとFacebook APIが有名ですが、ちょっと仕様が違うので、使い方を簡単に紹介しようとすると、記事を分けなければなりません。さらに、JavaとPHPの両方を学べるというお得な本を書いたこともあって、その読者をサポートするために、JavaとPHPの両方で記事を書かなければなりません。都合、以下の4パターンが必要です。
今回は、「PHPでTwitter API」です。「JavaでFacebook API」はまた別の機会に。
アプリの登録
http://dev.twitter.com/appsでアプリケーションを登録し、Concumer keyとConsumer secretを取得してください。その際、クライアントアプリケーションではなくブラウザウェブアプリケーションとして登録するように注意してください。
OAuthのためのライブラリ
PHPには、標準の「PECL/oauth」や準標準と言える「Pear HTTP_OAuth」、Twitterに特化した「Pear Services_Twitter」がありますが、例によって、PECLはWindowsで使いにくいし、HTTP_OAuthはベータ版、Services_Twitterはアルファ版なので、さっさと見限って「abraham / twitteroauth」を使いましょう。
OAuth.phpとtwitteroauth.phpをダウンロードして、ウェブサーバで配信できる場所に置きます。
cURL
XAMPP
PHPでcURLを使うために、php.iniに以下のように記述して、Apacheを再起動します。
extension=php_curl.dll
Ubuntu
次のコマンドを実行してcURLモジュールをインストールしてからApacheを再起動します。
sudo apt-get install php5-curl
お約束ですが、このあたりでもうついて行けないという場合は、拙著『Webアプリケーション構築入門』などを参照してください。以下のPHPプログラミングで必要な知識も本書にまとめてあります。
OAuth認証
以下の3画面で認証することにします(oauth-start.phpとoauth-end.phpは一つのファイルにまとめることもできますが、ここではわかりやすいように二つに分けています)。
- OAuth認証のためのURIを生成し、それにアクセスするためのリンクを表示するoauth-start.php

- アプリケーションを許可するTwitterページ

- Twitterからのコールバックを受信し、access tokenとtoken secretを取得するoauth-end.php

実装
oauth-start.php
OAuth認証の入り口となるoauth-start.jspは以下のようになります。「Consumer key」や「Consumer secret」、コールバックURIの部分は、状況に合わせて書き換えてください。
<?php
require_once('twitteroauth.php');
session_start();
//セッションを節約したい場合は別ファイルに書いておく。
$_SESSION['consumer_key'] = Consumer key;
$_SESSION['consumer_secret'] = Consumer secret;
$callbackUri = 'http://localhost/twitter/oauth-end.php';
$connection = new TwitterOAuth($_SESSION['consumer_key'], $_SESSION['consumer_secret']);
$request_token = $connection->getRequestToken($callbackUri);
$_SESSION['oauth_token'] = $token = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];
$authUrl = $connection->getAuthorizeURL($token);
?>
<!doctype html>
<html>
<head>
<title>OAuth Start</title>
</head>
<body>
<p><a href="<?php echo $authUrl; ?>">Twitter OAuth認証開始</a></p>
<p><a href="logout.php">logout</a></p>
</body>
</html>
oauth-end.php
コールバック後の処理を実装するoauth-endは以下のようになります。
<?php
require_once('twitteroauth.php');
session_start();
$connection = new TwitterOAuth($_SESSION['consumer_key'], $_SESSION['consumer_secret'],
$_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
$access_token = $connection->getAccessToken($_GET['oauth_verifier']);
unset($_SESSION['oauth_token']);
unset($_SESSION['oauth_token_secret']);
//セッションに記録する。データベースなどを使ってもよい。
$_SESSION['access_token'] = $access_token;
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Twitter OAuth認証完了</title>
</head>
<body>
<pre><?php print_r($access_token); ?></pre>
<p>access_tokenをセッションに保存した</p>
<p><a href="post.php">送信テスト</a></p>
<p><a href="logout.php">logout</a></p>
</body>
</html>
つぶやく
認証が終わったら、以下のようなコードでつぶやけます。
<?php
header('Content-type:text/plain; charset=utf-8');
require_once('twitteroauth.php');
session_start();
$access_token = $_SESSION['access_token'];
$connection = new TwitterOAuth($_SESSION['consumer_key'], $_SESSION['consumer_secret'],
$access_token['oauth_token'], $access_token['oauth_token_secret']);
$message = "テスト at " . time();
$parameters = array('status' => $message);
$status = $connection->post('statuses/update', $parameters);
print_r($status);
ブラウザを再起動すればはじめに戻りますが、次のようなlogout.phpを作っておいてもいいでしょう。
<?php
session_start();
session_destroy();
?>
<!doctype html>
<html>
<head>
<title>Logout</title>
</head>
<body>
<p><a href="oauth-start.php">start</a></p>
</body>
</html>