hello-world.jp.net
webエンジニアのメモ。とりあえずやってみる。

Rails4でTwitterStreamingAPIを使う その1

公開日時

Ruby2.0, Rails4で確認

tweetstream gemを使用してTwitterStreamingAPIを試してみました。

今回は

目標:ハッシュタグがyoutubeとなっているtweetを取得してlogに表示する

という所までやってみたいと思います。

Twitterアプリケーションの作成

  • Twitter Developers にログイン

  • ヘッダーの右端にあるアイコンをクリックして「My applications」クリック

tweet_dev1

  • 「Create a new application」をクリックしてアプリ作成画面へ

  • 必要項目を入力してアプリケーションを作成

tweet_dev2

  • アプリケーション作成後、ページ下部にある「Create my access token」をクリック

tweet_dev3

  • しばらくしてページをリロードするとアクセストークンが表示されるので「Consumer key」、「Consumer secret」、「Access token」、「Access token secret」をメモしておきます

Railsアプリケーションの作成

  • アプリ名はstreaming_sampleとします。

``bash rails new streaming_sample ```

  • Gemfileにtweetstreamを追加。
# Gemfile

gem 'tweetstream'
  • initializerにtweetstream設定を追加
# config/initializers/tweetstream.rb

TweetStream.configure do |config|
  config.consumer_key       = 'YOUR KEY'
  config.consumer_secret    = 'YOUR SECRET'
  config.oauth_token        = 'YOUR ACCESS TOKEN'
  config.oauth_token_secret = 'YOUR SECRET TOKEN'
  config.auth_method        = :oauth
end

tweet収集の部分をdaemon化

  • script/twitter_streaming.rbを作成
# mkdir script
# script/twitter_streaming.rb

ENV["RAILS_ENV"] ||= "development"

root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
require File.join(root, "config", "environment")

daemon = TweetStream::Daemon.new('twitter_streaming', :log_output => true)
daemon.on_inited do
  ActiveRecord::Base.connection.reconnect!
  daemon_logger = Logger.new(File.join(Rails.root, "log", "stream.log"))
  Rails.logger = ActiveRecord::Base.logger = daemon_logger
  Rails.logger.debug "Listening..."
end
daemon.on_error do |message|
  Rails.logger.error message
end
daemon.track('#youtube') do |tweet|
  Rails.logger.debug tweet.text
end

daemonスクリプトに関しては公式ドキュメントに書かれていたものを参考にしつつ、logファイルにうまく書き込めなかったので少しいじりました。

  • daemonを起動
RAILS_ENV=development ./bin/rails runner script/twitter_streaming.rb start
  • ログを確認すると#youtubeを含むtweetが記録されていきます
tail -f log/stream.log
# #youtubeに関するtweetが随時記録されていく
  • daemonの停止はstopでできます
RAILS_ENV=development ./bin/rails runner script/twitter_streaming.rb stop
  • その他のdaemon用オプションは以下
RAILS_ENV=development ./bin/rails runner script/twitter_streaming.rb
ERROR: no command given

Usage: twitter_streaming   -- 

* where  is one of:
  start         start an instance of the application
  stop          stop all instances of the application
  restart       stop all instances and restart them afterwards
  reload        send a SIGHUP to all instances of the application
  run           start the application and stay on top
  zap           set the application to a stopped state
  status        show status (PID) of application instances

* and where  may contain several of the following:

    -t, --ontop                      Stay on top (does not daemonize)
    -f, --force                      Force operation
    -n, --no_wait                    Do not wait for processes to stop

Common options:
    -h, --help                       Show this message
        --version                    Show version

今回は「#youtube」を検索条件としましたが、どういうキーワードを検索条件に指定すべきか迷ったときは、 Streaming API keyword matchingでいろいろ試してみるといいと思います。

tweetstreamのその他の機能に関しては、 tweetstreamのドキュメントとTwitterの公式ドキュメントを参照ください。

次回は取得したtweetをMongoDBに保存するようにしてみたいと思います。

参考


Related #Rails

railsとsinatraの使い分け

sinatraでアプリを作っていたら、色々機能が足りなかったので継ぎ足し継ぎ足しで色々増やしていったら結局railsのようなもの、になってしまいました。

[mysql][rails]Character set 'utf8mb4' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file

mysql5.1が動いていた環境をmysql5.6にアップデートした後、rake db:createで utf8mb4のDBを作成しようとしたところ以下のエラーが発生

[rails]omniauth-twitterで大きいサイズ(bigger)のプロフィール画像を取得する

ruby2.1, rails4.1.1で確認 omniauth-twitterを使ってtwitter認証を行った際にプロフィール画像を取得したかったのですが、デフォルト設定だと、`auth['info']['image']` に入ってくる画像URLの画像サイズが小さいので、大きい画像を取得するようにしました。

[rails]erbとunderscore.jsを一緒に使ったらundefined local variables in templatesエラーが発生

erbのテンプレート内にunderscore.js用のテンプレートを記述していたら