PHPでTwitter APIのOAuthを使う方法まとめ

この記事以降 Twitter API の仕様が変わっており、このままでは正しく機能しない場合があると思います。近いうちに今のやり方を書くので、それまで参考程度にご覧ください。

Twitter API の OAuth でひととおりやってみた。
忘れないようにメモ。

大雑把な流れ

  1. Twitter にアプリケーションを登録する。
  2. Consumer Key と Consumer secret を取得する。
  3. リクエストトークンを取得する。
  4. 認証用 URL を取得する。
  5. ユーザーから承認を受ける(bot の場合は自分でやる)。
  6. アクセストークンを取得する。
  7. API にアクセスする。

以下、やった作業の手順です。

事前準備

HTTP_OAuth を使えるようにする

OAuth の通信部分そのものは
PEAR の HTTP_OAuth を使うことにしたので
これをインストールする。
一番めんどくさい部分を受け持ってくれるので助かります。

HTTP_OAuth は HTTP_Request2 に、
HTTP_Request2 は Net_URL2 に依存しているので、
入ってない場合はそれらも。

これを書いている時点ではいずれも安定版がないので
バージョン指定でインストール。
以下はこれを書いている時点での最新バージョンです。
実際にはその時点での最新版を入れるのがいいと思います。

$ pear install Net_URL2-0.3.0
$ pear install HTTP_Request2-0.5.1
$ pear install HTTP_OAuth-0.1.6

レンタルサーバなんかで pear コマンドが使えない場合は
それぞれをダウンロードしてきて解凍して
FTP でサーバに置きますか。

Twitter にアプリケーションを登録する

ユーザー用のアプリケーションを作るときだけじゃなくて
bot に投稿させるときもそれ用のアプリケーションを使うことになる。

  1. アプリケーション制作者(要するに自分)のアカウントで Twitter にログインする。
  2. https://twitter.com/apps にアクセスする。
  3. Register a new application » に進む。
  4. 必要な情報を入力する。
    Application Icon
    このアプリケーションのアイコン。ユーザーがこのアプリケーションにアクセス権を与えるため Twitter へ来たときなんかに表示される。JPG, GIF, PNG で700 KB まで。
    Application Name
    これ大事。実際に Twitter に投稿されたときに出る「from API」とかいうやつの「API」の部分を指定できる。日本語もOK。
    Description
    アプリケーションの説明文。
    Application Website
    アプリケーションのウェブサイト。さっきの Application Name のところからリンクが張られる。
    Organization
    アプリケーションを管理する組織名。個人名でも何でもいいと思う。
    Website
    上記のウェブサイト。
    Application Type
    クライアントソフトを作るのか、ブラウザを利用するサービスなのかを指定する。Browser にしておくと、ユーザーがアクセス権を承認したあと後述の Callbak URL にリダイレクトされる。Client の場合は「クライアントソフトに戻ってこのコードを入力してね」と表示される。
    Callback URL
    Application Type を Browser にした場合に入力する。ユーザーがアクセス権を承認したあとこの URL にリダイレクトされる。まだサービスの URL が確定してない場合は仮で入れておくか Application Type をとりあえず Client にしておいて、後で設定してもいい。
    Default Access type
    アプリケーションに与えられる権限。Read & Write か Read-only か。
    Use Twitter for login
    自分のアプリケーションで「Sign in with Twitter(Twitter でログイン)」を利用する場合はチェックを入れる。この機能についてはまた今度やるので、今回はチェックしなくていい。
  5. Save を押す。

これでアプリケーションの登録は完了。

Cunsumer Key と Consumer secret を取得する

さっきの手順でアプリケーションを登録すると
Application Details というページに移動するので、
そこで表示される Cunsumer key と Consumer secret を
どこかにメモしておく。メモっていうかコピペ。

PHP で処理する部分

要するに OAuth どうすればいいのさ、という話なので
その部分だけ書きます。表示部分なんかは各自で。

手元のテストでは1つの PHP ファイルにまとめたけど、
認証前と認証後とテスト投稿に分けた方がわかりやすいかなと思うので
ここでは分けときます。

共通する部分

HTTP_OAuth のインスタンス生成と設定は
どの段階でも共通して使うのでまとめときます。
別ファイルに書いといて include | require しますかね。

$consumer_key = '[さっき取得した Consumer key]';
$consumer_secret = '[さっき取得した Consumer secret]';
include 'HTTP/OAuth/Consumer.php';
$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);

これで $consumer のメソッドにアクセスすれば
OAuth の通信はうまいことやってくれる。はず。

あとトークンの保持にセッションを使うので

session_start();

も忘れないように。

【SSL 通信について】

SSL 使わないでいいやっていう人はこの項目は飛ばしてください。
どうも SSL だと API との通信エラーが起きやすいようなので
SSL なしでやってる人も多いみたいです。

OAuth はシークレットキーを表に出さないという性質上
SSL 通信じゃなくてもまあ BASIC 認証ほど危険ではないんだけど、
それでもやっておいた方がより安心だから、という場合は

日本時間の2014年1月15日から、暗号化通信が必須となりました。

上記で HTTP_OAuth_Consumer のインスタンスを作った後に
次の設定も必要になると思います。

$http_request = new HTTP_Request2();
$http_request->setConfig('ssl_verify_peer', false);
$consumer_request = new HTTP_OAuth_Consumer_Request;
$consumer_request->accept($http_request);
$consumer->accept($consumer_request);

HTTP_OAuth が利用する HTTP_Request2 は
デフォルトで ssl_verify_peer が true になっていて
このまま使うと Twitter と SSL 通信するときに
Unable to connect to ssl://twitter.com:443
のエラーになってしまうので、
これを false にして accept するということ。

あわせて以下に出てくるリクエスト URL の
“http” の部分をすべて “https” にしてください。

リクエストトークン、認証用 URL を取得

Twitter にリクエストを出すためのトークンと、
ユーザーにアクセスを承認してもらうための URL を取得。

$callback = '[Twitter に登録した Callback URL]';
$consumer->getRequestToken('http://twitter.com/oauth/request_token', $callback);
$_SESSION['request_token'] = $consumer->getToken();
$_SESSION['request_token_secret'] = $consumer->getTokenSecret();
$auth_url = $consumer->getAuthorizeUrl('http://twitter.com/oauth/authorize');

request_token と request_token_secret をセッションに保存するのは
あとでユーザーが Twitter から帰ってきたときに使うから。

この時点ではリクエストトークンはまだ未承認の状態。
これからユーザーに Twitter へ行って
承認キーを持ってきてもらう。

認証用 URL(この場合は $auth_url に入るやつ)は
Twitter の場合
http://twitter.com/oauth/authorize?oauth_token=[request_token]
という格好。

この URL へのリンクを表示するなどして
ユーザーに いったん Twitter へ行ってもらう。

ユーザーによる承認

行った先でユーザーは Twitter にこんなことを聞かれるので

An application would like to connect to your account

The application [アプリケーション名] by [アプリケーション作者名] would like the ability to access and update your data on Twitter. Sign out if you want to connect to an account other than [ユーザー名].

Allow [アプリケーション名] access?

“Allow” または「許可する」をクリックしてもらう。

すると Twitter はユーザーを
Callback URL にリダイレクトしてくれる。
おかえり。

アクセストークンを取得する

ユーザーが Callback URL に戻ってくるとき
oauth_verifier という名前の認証キーを連れてきてくれるので
これと先ほど保存しておいたリクエストトークンを組み合わせることで
アクセストークンが取れるようになる。

$verifier = $_GET['oauth_verifier'];
$consumer->setToken($_SESSION['request_token']);
$consumer->setTokenSecret($_SESSION['request_token_secret']);
$consumer->getAccessToken('http://twitter.com/oauth/access_token', $verifier);
$_SESSION['access_token'] = $consumer->getToken();
$_SESSION['access_token_secret'] = $consumer->getTokenSecret();

access_token と access_token_secret をセッションに入れたのは
あとでテスト投稿に使うからで、
通常はこれらをユーザー名と一緒にデータベースなどへ保存。

以後はこれらのトークンを使って
Twitter API と通信することになる。

API にアクセスしてみる

とりあえずテスト投稿してみますか。

$consumer->setToken($_SESSION['access_token']);
$consumer->setTokenSecret($_SESSION['access_token_secret']);
$status = 'あーあーあー。テストテスト。';
$response = $consumer->sendRequest("http://twitter.com/statuses/update.xml", array('status' => $status), "POST");
echo htmlspecialchars($response->getBody());

echo してるのは Twitter からのレスポンス。
もうここのところは BASIC 認証でやって返ってくるのと同じなので
あとは好きなように処理したらいいんじゃないかな。

できた。
あーあーあー。テストテスト。

ついでに。Twitter API の各メソッドはこちらを参照。

PEAR の Services_Twitter も
バージョン0.4.0以降は OAuth に対応してるみたいなので
こっから先はこちらを使ってもいいかも。

補足

実際にサービスを作るときは
例外が発生した場合の処理も要るので

try {
  //ここに通常の処理
} catch (Exception $e) {
  //ここに例外が発生した場合の処理
  //エラーメッセージを $e->getMessage() で取得するなどして何かいい具合に。
}

とでもしといた方がいいですね。

Sign in With Twitter

続き書いた。

追記

ログインに使うならこちらが便利かもしれません。

参考サイト

関連エントリ

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

5 Responses to “PHPでTwitter APIのOAuthを使う方法まとめ”

  • 2010/01/12 21:13

    凄く参考になりました。
    ありがとうございます。
    なお、PEAR の Services_Twitterは先日0.5.0がつい先日リリースされています。

  • ラギル

    2010/01/16 19:19

    大変参考になりました。ありがとうございました。
    初歩的な質問で申し訳ないですが、getTokenなどと同じ形で、ユーザーのscreen nameや画像のデータを同時に持ってくる事は出来ないのでしょうか。
    それともリクエストは別に行わないといけないでしょうか。
    参考になるコードが見付けることができず、
    教えて頂けますと幸いです。宜しくお願いします。

  • 2010/02/02 23:57

    TwitterでOAuth認証した後どうするか

    色々Twitter連携するにはOAuth認証を扱えるようにしておかないと、というわけで以前やりかけて放置していたOAuthをイチからやり直してみました。 …

  • 2010/08/31 15:08

    > ラギルさん
    ものすごく遅くなってすみません。
    もう見られてないかとは思いますが一応。
    認証の時点でそのまま screen_name をもらうことはできないようですが、account/verify_credentials で認証ユーザーの情報が取れるのでそれを使うのが一般的なんじゃないかと思います。
    http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-account%C2%A0verify_credentials

  • 2011/04/06 11:02

    […] くくなりますので、ポイントを押さえて説明していきますので読んでみてください。今回メインで参考にさせて頂いた記事は以下です。 PHPでTwitter APIのOAuthを使う方法まとめ – 頭ん中 […]