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


## 動作環境
* 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](https://github.com/sferik/twitter) (5.11.0)

## 前提
[sstephenson/rbenv](https://github.com/sstephenson/rbenv), [sstephenson/ruby-build
](https://github.com/sstephenson/ruby-build) を用いて Ruby を入れていますが、システムの Ruby を用いて gem を入れる方法でも適用できると思います。

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

## rbenv, ruby-build, ruby, gem のインストール
公式のドキュメント ([rbenv](https://github.com/sstephenson/rbenv#basic-github-checkout), [ruby-build](https://github.com/sstephenson/ruby-build#installing-as-an-rbenv-plugin-recommended)) 通りに従ってインストールを行います。

```shell
% 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"` と書く。)
\# そもそも何でこのようなエラーが出るのか、探してもあまり無いようなので、教えていただきたいです。

```shell
% 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](https://github.com/sferik/twitter#the-twitter-ruby-gem) とか [rdoc](http://rdoc.info/gems/twitter) とか読めば API の扱い方が分かると思います。
どんな API があるかは [Twitter Developers](https://dev.twitter.com/) の API 系のドキュメントを読めば分かると思います。

```ruby
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 で流れてくるツイートを取得してその情報を表示する

```ruby
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 をする
```ruby
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

```

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