SDN Project

"SDN" doesn't have a deep meaning...

2012.09.14 新API仕様(Ver 1.1)へ更新

PHP+OAuthでTwitter

このエントリーをはてなブックマークに追加

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

TwitterにてクライアントやBotなどを使ったり運営していく際、OAuth認証が必要になります。
今まではBasic認証でしたが、様々なTwitterサービスを使う時にセキュリティ面で非推奨であり、TwitterはBasic認証を廃止してOAuth認証に切り替わりました。

OAuth認証はBasic認証と比べると少し手間がかかったりするので、ある程度の知識がないとなかなか手を出せないものでした。
そこで、少しでも皆さんの助けになればとこのページを作りました。
後半は主にBotやTL取得プログラム等を作りたい人向けでの解説です。アプリケーション登録だけしたい人も前半だけ読めばわかるかと。

OAuth認証って何だどういう仕組みなのか、については下記のページで詳しく書かれています。
別に文章を読まなくても、OAuthの仕組みがわからなくても簡単に出来るので大丈夫です。

特集:ゼロから学ぶOAuth

プログラム・アプリからTwitterを利用するにはOAuth認証が必要

Twitterといえば、twitter.com(Web)から直接ツイートしている人もいればiPhoneやAndroidのアプリからツイートしている人もいます。後はTogetterやFavstarなどでTLやお気に入りなどを取得したりもしているはずです。
iPhoneなどでのTwitterアプリ、TogetterなどのTwitter連携サービスは全てOAuth認証にて動いています。プログラム作っただけではTwitterで呟ける訳ではありません。

twitter.comからではもう見れなくなってしまいましたが、ユーザーのツイートで「from YoruFukurou」や「from Tween」など、クライアントの名前を見かけた人もいると思います。そのツイートがTwitterに登録されたクライアントからツイートされた証拠です。
Botも同じです。Botのツイートも独自の名前のものが多いでしょう。Twitterにアプリとして登録すれば誰でも好きな名前をつけられます。
例えば、私が作ったBotになってしまいますが東風谷早苗(@Kochiya_Sanae)などがあります。
これらの呟きを見ると「from 守矢の神社」となっており、Botの説明ページにリンクが貼られています。
せっかくのBotなのだから、こういうところにもちょっとしたアクセントがあったほうが面白いですよね。

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

ここでは主にTwitterのBotを作る、という方向で話を進めています。OAuthクライアントの登録だけをしたい場合も同じです。
Botとは別のTwitter関連サービスの場合はこちらの方が認証関係などでわかる人にはわかるかと思われます。

TwitterにOAuthアプリケーション情報を登録します。
以下のページにBotのアカウント(今から登録するアプリを使いたいアカウント)でログインします。

Twitter Applications | dev.twitter.com

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

右側の "Create a new application" をクリックするとクライアント登録ページへ行きます。
最低限 "Name""Description""WebSite" が入力されていれば大丈夫のようです。

Name
アプリケーションの名前です。日本語も使えます。
一番大事な部分で、ここが「○○から」と表示される部分になります。TweenやYoruFukurouといったクライアントの名前ですね。
このアプリケーション名は、既に他の人が登録している場合は登録する事ができません。早い者勝ちなのです。
Description
アプリケーションの説明です。
適当に説明(30字以上)を記入します。
WebSite
アプリケーションの説明ページのURL(私の場合はBot説明ページのURL)を記入します。
これは、「(アプリケーション名)から」の部分にリンクとして貼られます。
Callback URL
Botとして使うので、ここは空欄で構いません。
Twitter関連サービス(Webアプリケーション)としてOAuthを利用する際に、認証後に飛ばされるURLを指定します。詳しくはここでは説明いたしません。

Twitterのアプリケーションに関する規約を読み(英語ですが)、同意なら "Yes, I agree" にチェックを入れます。
そして、間違えないように画像認証の文字列を入力して "Create your Twitter application" をクリック。
これにて登録完了ですが、まだこのままではTwitterにツイート出来ません

登録完了画面に様々な情報が載っているかと思います。
"OAuth settings" の項の "Consumer key""Consumer secret" の値をメモしておきます。
この二つが、それぞれアプリケーションのIDとパスワードのようなものです。他の人に教えないようにしましょう。

次に、上の "Settings" タブをクリックします。
先ほど登録した情報が載っています。ここから情報の編集が可能です。
そして、登録画面には無かった項目が増えているかと思います。ここも編集しないといけません。

Application Icon
アプリケーションのアイコンです。
そのままデフォルトのアイコンでも大丈夫です。自分の好きなアイコンにしても構いません。
Application Type
重要な部分です。このアプリケーションの権限です。
"Read and Write" または、"Read, Write and Access direct messages"を選択します。後者はDMを送信する場合にチェックして下さい。使わない場合は前者で大丈夫です。
"Read only"は意味の通り、読み込みのみで書き込みの権限が与えられないので注意が必要です。
Organization
個人なので空欄のままでも構いません。企業や団体なら記入します。

"Update this Twitter application's settings" をクリックします。
これで、アプリケーションの登録は完了です。
ちなみにアプリケーションは Twitter Applications | dev.twitter.com からいつでも確認できます。
アプリケーションの情報の変更もこちらから行います。

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

アプリケーションを登録しただけでは使うことが出来ません。
そのアプリケーションを使うには、更にそのアプリケーションを使うためのIDとパスワードが必要ということになります。
それが "Access Token""Access Token Secret" です。

先ほどの Twitter Applications | dev.twitter.com にアクセスします。すると先ほど登録したアプリケーションがあると思います。
そのアプリケーション名かアイコンをクリックし、アプリケーションの情報ページに行きます。
下のほうに "Create My Access Token" という項があるのでそれをクリックします。
すると、ページが更新されて "Create My Access Token" という項がなくなり、"Your access token" という項に変わっているかと思います(変わっていない場合はリロードして下さい)。
その項の "Access Token""Access Token Secret" の2つの値をメモしておきます。他人には教えないようにしましょう。
新たにAccess TokenとAccess Token Secretを取り直す場合は、"Recreate My Access Token" をクリックしてください。

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

PHPでOAuthを使う準備

それでは、PHPの準備です。環境はPHP5以上で、curlが使えれば大丈夫です。
ここでは、abraham氏が提供しているOAuthライブラリ"twitteroauth"を使わせていただきます。
ライブラリのダウンロードは abraham/twitteroauth - GitHub にアクセスし、真ん中から右あたりりにある「Download」からバージョン0.2.0以降を選んでダウンロードします。
この説明でやる場合は、バージョン 0.2.0より前のものは使わないでください
zipを解凍し、その中の"twitteroauth"フォルダ内の"OAuth.php""twitteroauth.php"を使います。それ以外のファイルは使いません。
合計2つのPHPファイルを同じフォルダに入れて、サーバーの適当な場所にアップロードしておきます。

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

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

Twitterにツイートするプログラムを簡単に作ってみましょう。
文字コードはわかっているとは思いますが、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://api.twitter.com/1.1/statuses/update.json","POST",array("status"=>"OAuth経由のツイートテスト"));
// TwitterへPOSTするときのパラメーターなど詳しい情報はTwitterのAPI仕様書を参照してください

// Twitterから返されたJSONをデコードする
$result = json_decode($req);
// JSONの配列(結果)を表示する
echo "<pre>";
var_dump($result);

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

ツイートする他に、タイムライン取得やお気に入りに追加するといった処理をAPIのURL部やパラメーターを変える事により行えます。基本は以下の形です。

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

メソッドにはPOSTGETDELETEが使えます。APIについてはTwitterのAPIを参照して下さい。

これを応用すればBotなどの他にWebクライアントやTwitter向けのサービスなどに使えます。他にも様々な事ができますが割愛。

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

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://api.twitter.com/1.1/statuses/home_timeline.json","GET",array("count"=>"50"));

// Twitterから返されたJSONをデコードする
$result = json_decode($req);

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

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

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