息抜きにちょっとした自分向けアプリケーションを作りました。仕様はこんな感じ。

  • 「1日1ニコ」ブログのアカウント @__1nico__ に投稿しているブログの更新情報を拾って
  • メインアカウント @nobodyplace でリツイートする

ただそれだけ。

いちいち確認してリツイートするの面倒くさいってことなんだけども、Twitter API 1.1向けの課題としては軽くて面白いかなってことでさくっとこしらえました。使用言語は例によってPHPです。

大体の流れはこんな感じ。

  1. PEAR::Services_Twitterを読み込み
  2. OAuthアクセス
  3. GET statuses/user_timeline」を使ってユーザー「@__1nico__」のツイートを取得する
  4. リツイートしてなければ「POST statuses/retweet/:id」でユーザー「@nobodyplace」としてリツイート


最初の構想では、3と4の間に、

  • GET statuses/retweets/:id」を使ってリツイート一覧を取得して自分がリツイート済みかどうかチェックする

という工程も入っていたのですけど、実際に使ってみると、「GET statuses/user_timeline」「POST statuses/retweet/:id」のリクエスト制限が15分当たり180であるのに対して、「GET statuses/retweets/:id」の制限が15分当たり15でボトルネックになってしまうことが解ったので、除外しました。

Twitterへのリツイートのリクエストは、重複している場合は無視される(ただしエラーは返ってきて今回なら、Services_Twitter_Exceptionが投げられる)そうなので、まあそれでいいかなという。

追記

こんなことをしなくても自分がリツイートしているかどうかは、「retweeted」という要素を確認することでチェックできるのですね。「retweeted」は、そのツイートがリツイートされているかどうかを示していると勘違いしていたのですが、実際にはそのリクエストを送ったユーザー(この場合なら@nobodyplace)がリツイートしているかどうかをあらわしていました。trueならリツイート済み、falseなら未リツイートと。そもそもツイートがリツイートされたかどうかは、「retweet_count」で判断できますもんね。そうかー


PEAR::Services_TwitterでTwitter API 1.1対応

本題。

「PEAR::Services_Twitter」というのは、TwitterAPIの利用を簡単にしてくれるPEARパッケージです。

Services_Twitter

解りやすくてよいのですがbeta版のまま更新されていませんし、Twitter API 1.1にも対応していません。
でも次のように書けば、Twitter API 1.1に対してリクエストを送ることが出来ます。

Services_Twitter::$uri = 'http://api.twitter.com/1.1';


今のところわかっている制限事項

Twitter API 1.0でなかったリソースにはアクセスできないみたいです。

例えば次のようなコードを書いたら、そんなんしらねーと怒られました。

$twitter->application->rate_limit_status()


HTTPSを使うときはオプションの指定が必要

これはエラーが出ます。

$twitter = new Services_Twitter();
Services_Twitter::$uri = 'https://api.twitter.com/1.1';

次のようにすればOK。

$twitter = new Services_Twitter(null, null, array('use_ssl' => true));
Services_Twitter::$uri = 'http://api.twitter.com/1.1';

これでももちろんOK。

$twitter = new Services_Twitter(null, null, array('use_ssl' => true));
Services_Twitter::$uri = 'https://api.twitter.com/1.1';


あとは普通に処理を行えばいいだけです。
例えば、ユーザー「@__1nico__」のツイートを取得するにはこんな感じ。

$twitter = new Services_Twitter(null, null, array('use_ssl' => true));
Services_Twitter::$uri = 'http://api.twitter.com/1.1';
$twitter->setOAuth($oauth);
$tweets = $twitter->statuses->user_timeline(array('screen_name' => '__1nico__'));



補足

Twitter API 1.1から全てでAuthenticationが必要になります。上でしれっとコードに書いていますが、このソースでは、AccessTokenおよびAccessTokenSecretは固定した上で、PEAR::HTTP_OAuth_Consumerをつかって処理しています。

$oauth = new HTTP_OAuth_Consumer($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
$twitter->setOAuth($oauth);

……どこかで見掛けたServices_Twitterのサンプルコードの真似っこです。
実際にはこの辺をまとめてラッパーにしてます。


この辺は他にもやり方がたくさんあるでしょうし、そもそもServices_Twitterがやれよということかも知れませんけれども、とりあえずPEARパッケージだけでもやりようはあるよということで。

問題は、Services_Twitterがbeta、HTTP_OAuthがalphaってことかなあ……