概要
Rubyのtwitter gem Version 1.7.2を前提に書いていたコードを5.11.0向けに書き直したという話。
経緯
2011年ごろ、Twitterの自分のタイムラインを定期的に取得して保存するロガー的スクリプトをrubyとtwitter gemで書いて使っていました。
そのスクリプトは2013年のAPI変更で使えなくなってしまいました。この時には「過去のツイートを取得する」機能がTwitter側から用意されていたので、じゃあそれでいいやと思い、運用を止めました。
しかし、実際に取得できる情報は自分のツイートのみで、自分のタイムラインそのものではありませんでした。現状のTwitter検索は過去の内容を探すのも難しいので、「以前書いたスクリプトを直して再度自力でログを取ろう」と思い立ったので、そのために実施した修正についての記録をここに残しておきます。
修正点
クライアントインスタンスの取得と認証情報の設定
twitter 1.7.2では、Twitterモジュールのモジュール関数を呼び出して処理を行うことができたので、その方法を使って実装していました。5.11.0ではその手段が提供されなくなったので、REST APIを使う方法をとりました。
# 旧コード require 'twitter' Twitter.configure do |config| config.consumer_key = 'xxxxxxxxx' config.consumer_secret = 'zzzzzzzzzzzzzzzzzzzz' config.oauth_token = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' config.oauth_token_secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyy' end
# 新コード require 'twitter' client = Twitter::REST::Client.new do |config| config.consumer_key = 'xxxxxxxxx' config.consumer_secret = 'zzzzzzzzzzzzzzzzzzzz' config.access_token = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' config.access_token_secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyy' end
oauth_tokenとoauth_token_secretというアクセサは5.11.0でも使えますが、deprecated扱いなので警告が出ます。
タイムラインの取得
取得方法は単純で、今までTwitter.user_timeline()を読んでいたところをクラスメソッドuser_timelineに変えるだけです。
# 古い書き方 x = Twitter.user_timeline({:since_id => id) # 新しい書き方 x = client.user_timeline({:since_id => id)
created_atの扱い
1.7.2ではツイートの作成時刻created_atは文字列で返されていたのでDateTime.parseで処理していましたが、5.11.0ではTime型を返すようになっています。
- d = DateTime.parse(x.created_at) + d = DateTime.parse(x.created_at.to_s)
既存のコードをいじるのが面倒だったので、to_sした結果をDateTime.parseに渡しています。無駄ですがコードの変更は少なくてすみます。
結果
これらの修正で、自分のコードは無事動くようになりました。その後以下のような機能拡張を施して今にいたります。
- 自分だけでなくフォロワーのツイートも取得する(user_timelineの代わりにhome_timelineを使う)
- 各ツイートにscreen nameを付加する(x.user.screen_nameを参照)
- 自分がつけたfavoriteも記録する(client.favorites()メソッドを使う)
UserStreamについて
今回、あえてUserStreamを使う方法は採用しませんでした。どうも同一ユーザーによるサードパーティアプリから接続できるUserStreamの数に制限があるようで、現状制限いっぱいいっぱいだからです。
しかし今回自作ロガーを再度稼働させたことで、UserStreamを貼りっぱなしのクライアントを立ち上げておく必要性は大きく下がったので、今後はUserStreamの利用も考えてみたいところです。
参考
関連書籍
[amazonjs asin=”4862670849″ locale=”JP” title=”Twitter API プログラミング”]