LoginSignup
24
24

More than 5 years have passed since last update.

Ruby を用いて userstream に対応した Twitter bot を作る

Last updated at Posted at 2013-07-31

動作環境

  • OS: FreeBSD 10.0-RELEASE-p7 GENERIC (uname -sri)
  • ruby: 2.1.2 (rbenv install 2.1.2)
  • rbenv: 0.4.0-98-g13a474c (rbenv --version)
  • ruby-build: 20140702 (rbenv install --version)
  • 使う gem: sferik/twitter - Github (5.11.0)

前提

sstephenson/rbenv, sstephenson/ruby-build
を用いて Ruby を入れていますが、システムの Ruby を用いて gem を入れる方法でも適用できると思います。

FreeBSD で動作の確認を行っていますが、その他の OS でもこの方法は適用できると思います。
FreeBSD でやる場合は devel/git, devel/gmake が必要なので、入れておいてください。

rbenv, ruby-build, ruby, gem のインストール

公式のドキュメント (rbenv, ruby-build) 通りに従ってインストールを行います。

% git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
% git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
% echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc #=> 使用している shell によって変えてください
% echo 'eval "$(rbenv init -)"' >> ~/.zshrc
% source ~/.zshrc
% rbenv install 2.1.2 #=> FreeBSD の場合は gmake がないとここでコケる
% rbenv global 2.1.2
% gem install twitter

ルート証明書のインストール

SSL 証明書をインストールして Ruby が分かるようにしてあげないと例外を吐いて死ぬので、
http://curl.haxx.se/docs/caextract.html のリンクにある、証明書を設置し、
そのファイルへのパスを環境変数の SSL_CERT_FILE に設定します。
(もしくは Ruby プログラム内で ENV["SSL_CERT_FILE"] = "/path/to/ssl" と書く。)
# そもそも何でこのようなエラーが出るのか、探してもあまり無いようなので、教えていただきたいです。

% wget http://curl.haxx.se/ca/cacert.pem -O /path/to/ssl
#=> or https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt
% echo 'export SSL_CERT_FILE="/path/to/ssl"' >> ~/.zshrc

実際に使ってみる

基本的に README とか rdoc とか読めば API の扱い方が分かると思います。
どんな API があるかは Twitter Developers の API 系のドキュメントを読めば分かると思います。

require "twitter"
ENV["SSL_CERT_FILE"] = "/path/to/ssl"

CONSUMER_KEY       = '<Your Consumer Key>'
CONSUMER_SECRET    = '<Your Consumer Secret>'
OAUTH_TOKEN        = '<Your OAuth Token>'
OAUTH_TOKEN_SECRET = '<Your OAuth Token Secret>'

client_rest = Twitter::REST::Client.new do |config|
  config.consumer_key        = CONSUMER_KEY
  config.consumer_secret     = CONSUMER_SECRET
  config.access_token        = OAUTH_TOKEN
  config.access_token_secret = OAUTH_TOKEN_SECRET
end

client_stream = Twitter::Streaming::Client.new do |config|
  config.consumer_key        = CONSUMER_KEY
  config.consumer_secret     = CONSUMER_SECRET
  config.access_token        = OAUTH_TOKEN
  config.access_token_secret = OAUTH_TOKEN_SECRET
end

client_stream.user do |object|
  # ここに userstream が流れてくる
end

サンプルコード

userstream で流れてくるツイートを取得してその情報を表示する

client_stream.user do |object|
  if object.is_a?(Twitter::Tweet)
    puts object.user.screen_name
      #=> ツイートしたユーザの screen name (e.g.: owatan_)
    puts object.text
      #=> ツイート本文 (e.g.: うさちゃん、うさちゃん、ぴょんぴょんぴょーん♪)
    puts object.id
      #=> ツイートの ID (e.g.: 497366451490021376)
    puts object.user.name
      #=> ツイートしたユーザの名前 (e.g.: おわたん)
    puts object.source
      #=> ツイートしたクライアント
      #=> e.g.: <a href="http://sites.google.com/site/yorufukurou/" rel="nofollow">YoruFukurou</a>
      #=> a 要素が入っているので、クライアント名だけを抽出したい時は以下のように #gsub を使うと良い
    puts object.source.gsub(/(<a href=".*" rel=".*">)(.*)(<\/a>)/, '\2')
      #=> ツイートしたクライアント名(e.g.: YoruFukurou)
  end
end

正規表現にマッチしたツイートに対して reply, favorite, retweet をする

client_stream.user do |object|
  if object.is_a?(Twitter::Tweet)
    if object.text =~ /おはよう/
      client_rest.update("@#{object.user.screen_name} おはようございます", options = {in_reply_to_status_id: object.id})
        #=> "おはよう" という文字列が含まれているツイートに対して "おはようございます" と reply をする
    end

    if object.text =~ /ふぁぼ/
      client_rest.favorite(object.id)
        #=> "ふぁぼ" という文字列が含まれているツイートをお気に入りに追加する
    end

    if object.text =~ /りついーと/
      client_rest.retweet(object.id)
      #=> "りついーと" という文字列が含まれているツイートをリツイートする
    end
  end
end

サンプルコードは随時追加していきます ... 。

24
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
24