SDN ProjectPHP+OAuthでTwitter

トップ > 研究室 > PHP+OAuthでTwitter

2010/04/29

PHP+OAuthでTwitter

旧方法での説明はこちら
バージョン0.1.0での説明はこちら

Twitterで最近よく見る「OAuth」、オース or オーオースって多分読むのでしょうが、これは簡単に言うとTwitterの新たな認証方式といえます。
今まではBasic認証が一般的でしたが、将来的にセキュリティ面で非推奨とのことで、TwitterはBasic認証を2010年8月までとし、OAuth認証に切り替わります
TwitterのアプリケーションやBotを作っている人は切り替えなければなりません。

ただ、Basic認証は手軽に出来るものでしたが、OAuthはちょいと手間がかかったりするのですぐに切り替えようにも出来ません。

OAuthについては、しばさんが詳しく書かれているのでそちらを参照していただくと早いかもしれないです。
内容はRuby+OAuthですが、プログラム部分以外は共通しています。

TwitterのbotをOAuthに対応させる - しばそんノート

■OAuthの魅力?

しばさんの方にもリンクしましたが、こちらでも一応説明いたします。

「Basic認証が廃止になるのはわかったけど、OAuthになって何が変わるの?」という疑問もあるかと思います。OAuthで出来る事のほんの一部を例にとります。
例えば、Webで呟けば「Webで」、クライアントのTweenで呟けば「Tweenで」、APIで呟けば「APIで」となるわけですが、これが自分の好きなように変更する事ができるのです。

例えば、私が作ったBotになってしまいますが、東風谷早苗(@Kochiya_Sanae)犬走椛(@Momiji_bot)があります。
これらの呟きの下の方を見るとそれぞれ「守矢の神社で」、「妖怪の山の見張り台で」となっており、それぞれBotの説明ページにリンクが貼られています。
せっかくのBotなのだから、「APIで」はさすがに嫌ですよね。
こういうところにもちょっとしたアピールやアクセントがあったほうが面白いかと。

そして、APIの取得上限がこれまで150くらいまでだったのが二倍以上の350(Twitterの状況によっては大きく変動する)になっています。
なので、処理時間に余裕があればhome_timelineとmentionsを一気に取得して、なんてことも出来ます。

■TwitterへOAuthクライアントの登録

TwitterにOAuthアプリケーション情報を登録します。
以下のページにクライアントの製作者のアカウントでログインしている状態でアクセスします。

Twitter Applications | dev.twitter.com

私の場合はBotでOAuthを使うので、Botのアカウントでログインしている状態でアクセスしています。

「新しいアプリケーションを登録する」のリンクをクリックするとクライアント登録ページが出てきます。
しばさんによると、最低限「アプリケーション名」「アプリケーションの説明」「アプリケーションのウェブサイトURL」が入力されていれば大丈夫のようです。

入力には日本語も使えます。
一番大事なのは「アプリケーション名」です。ここが「○○で」と表示される部分なのです。
「アプリケーションの説明」は適当に説明(30字以上)を記入し、「アプリケーションのウェブサイトURL」はそのアプリケーションの説明ページのURL(私の場合はBot説明ページのURL)を入れます。
「所属会社/団体」は個人なので空欄のままでOK。企業や団体なら記入。
「アプリケーションの種類」はBotやクライアントとして使うので「クライアントアプリケーション」を選択します(TwitterのWebアプリならば「ブラウザアプリケーション」になります)。
"Default Access type""Read & Write"を選択("Read-only"は意味の通り、読むだけ)。
「アプリケーションのアイコン」は無くてもいいし、好きなアイコンでも構いません。私はBotのアイコンです。
そして画像認証の文字列を入力して終わり。

登録が完了したら"Consumer key""Consumer secret"の不規則な文字列をメモしておいてください。
ちなみにこのページには Twitter Applications | dev.twitter.com からいつでも確認できます。
登録情報の変更もこちらからできます。

■"Access Token"と"Access Token Secret"の取得

先ほどの"Consumer key""Consumer secret"は、所謂アプリケーションの識別IDのようなものです。
そのアプリケーションを使うには更にそのアプリケーションを使う識別IDが必要ということになります。
それが"Access Token""Access Token Secret"です。

再び Twitter Applications | dev.twitter.com にアクセスします。するとアプリケーションの一覧が表示されます。
先ほど登録したアプリケーションのアイコン又はアプリケーション名をクリックしたら右のメニューより"My Access Token"をクリックします。
すると、"Access Token""Access Token Secret"の2つの不規則な文字列が表示されます。これをメモしてください。

※ひとつのアプリケーションを複数のアカウント使いたいなどの理由で、アカウントごとに"Access Token"と"Access Token Secret"の取得を行いたい場合はこちらの旧方法が多少面倒ですがやりやすいです。
旧方法での説明

■PHPでOAuthを使う準備

それでは、PHPの準備です。環境はPHP5以上で、curlが使えれば大丈夫です。
ここでは Twitter API Wiki / OAuth Examples にある abraham's twitteroauth at master - GitHub を使わせていただきます。
ちょうど真ん中あたりりにある「Download」からバージョン0.2.0以降を選んでダウンロードし、解凍します。この説明でやる場合は、バージョン 0.2.0より前のものは使わないでください
その中の「twitteroauth」フォルダ内の「OAuth.php」と「twitteroauth.php」を使います。

合計2つのPHPファイルを同じフォルダに入れて、サーバーの適当な場所にアップロードしておきます。

これで、ほぼ準備は整いました。

■実際にPHP+OAuthでTwitterにPOSTする

POSTするプログラムを簡単に作ってみましょう。
文字コードはわかっているとは思いますが、UTF-8です。

<?php
// twitteroauth.phpを読み込む。パスはあなたが置いた適切な場所に変更してください
require_once("twitteroauth.php");

// Consumer keyの値
$consumer_key = "consumer_key";
// Consumer secretの値
$consumer_secret = "consumer_secret";
// Access Tokenの値
$access_token = "access_token";
// Access Token Secretの値
$access_token_secret = "access_token_secret";

// OAuthオブジェクト生成
$to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);

// TwitterへPOSTする。パラメーターは配列に格納する
// in_reply_to_status_idを指定するのならば array("status"=>"@hogehoge reply","in_reply_to_status_id"=>"0000000000"); とする。

$req = $to->OAuthRequest("https://twitter.com/statuses/update.xml","POST",array("status"=>"OAuth経由のポストテスト"));
// TwitterへPOSTするときのパラメーターなど詳しい情報はTwitterのAPI仕様書を参照してください

header("Content-Type: application/xml");
echo $req;
?>

凄く簡単ですが、こんなのでPOST出来ます。URLエンコードは不要です。
$req にはTwitterからの何かしらの返り値(この場合はxml形式)が入ります。他にもJSON形式も。
そして、しっかりと「(クライアント名)で」となっているのを確認できたら成功です。やったね。

POSTする他に、タイムライン取得やお気に入りに追加するといったことも

$req = $to->OAuthRequest("APIのURL","メソッド",array(何かしらのパラメーター));

で、できます。
メソッドにはPOSTGETDELETEが使えます。

これを応用すればBotなどの他にWebクライアントやTwitter向けのサービスなどに使えます。他にも様々な事ができますが割愛。
このOAuthを使っていろいろ夢広がる?
詳しくは英語ですがTwitter-OAuth-PHPなどを参照してください。

■タイムラインを取得してみる

POSTは出来ました。それでは次はTLの取得方法です。
以下は一例です。

<?php
// twitteroauth.phpを読み込む
require_once("twitteroauth.php");

// Consumer keyの値
$consumer_key = "consumer_key";
// Consumer secretの値
$consumer_secret = "consumer_secret";
// Access Tokenの値
$access_token = "access_token";
// Access Token Secretの値
$access_token_secret = "access_token_secret";

// OAuthオブジェクト生成
$to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);

// home_timelineの取得。TwitterからXML形式が返ってくる
$req = $to->OAuthRequest("https://twitter.com/statuses/home_timeline.xml","GET",array("count"=>"50"));

// XML文字列をオブジェクトに代入する
$xml = simplexml_load_string($req);

// foreachで呟きの分だけループする
foreach($xml->status as $status){
      $status_id = $status->id;  // 呟きのステータスID
      $text = $status->text;  // 呟き
      $user_id = $status->user->id;  // ユーザーナンバー(数字の方は絶対に変わらない)
      $screen_name = $status->user->screen_name;  // ユーザーID(いわゆる普通のTwitterのID)
      $name = $status->user->name;  // ユーザーの名前(HNなど)
      echo "<p><b>".$screen_name." / ".$name."</b> <a href=\"http://twitter.com/".$screen_name."/status/".$status_id."\">この呟きのパーマリンク</a><br />\n".$text."</p>\n";
}
?>

このようにBasic認証の頃からBotなどを作っていた人なら分かるかと思いますが、OAuthでXMLを取得した後は今までのBasic認証でやってきた処理をすればいいのです。
XMLやJSON形式でタイムラインを取得してBotに反応させる方法は割愛します。こちらよりも詳しいサイトがたくさんあると思いますので。

これを利用したBotのサンプルなどはこちらで解説しています。
PHP+OAuthでTwitterのBotを作ってみる

▼連絡先

何か御用がある場合は以下のメールアドレスにてお願いします。
メールアドレス

Presented by トメ