渋谷凛ちゃんツイート自動ふぁぼシステム

#はじめに
2015年1月より放送開始された[アイドルマスターシンデレラガールズ](http://imas-cinderella.com/)
その中に登場するキャラクター、[渋谷凛ちゃん](https://www.google.co.jp/search?q=%E6%B8%8B%E8%B0%B7%E5%87%9B&espv=2&biw=1494&bih=974&source=lnms&tbm=isch&sa=X&ei=jnXpVJ6cMsLk8AWEwIHQBA&ved=0CAYQ_AUoAQ)がとにかく可愛い
 ~~慣れないこのピンヒールで踏まれたい~~

プロデューサーの思いは共通なのか
Twitterでは渋谷凛ちゃん（通称：しぶりん）への[愛](https://twitter.com/search?f=realtime&q=%E3%81%97%E3%81%B6%E3%82%8A%E3%82%93%20%E3%83%9A%E3%83%AD%E3%83%9A%E3%83%AD&src=typd)で溢れている

そんな渋谷凛ちゃんに関するツイートを自動でふぁぼりたい
だから自動でふぁぼってくれるシステムを作った

#準備
* PCにRubyをインストール
* Ruby Twitter Gemをインストール

※上記はRuby初心者の私が書くより他の方のサイトの方が確実に分かり易いと思うので
　[この辺](http://route477.net/w/RubyTwitterJa.html)とか[この辺](http://www.rubylife.jp/install/install/index1.html)もしくは[頑張って探して下さい](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#q=ruby+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

* ふぁぼ用アカウント（今回は[@Ponyo1127](https://twitter.com/Ponyo1127)）
* 実行結果表示用アカウント（今回は[@Ponyo1127_Fav](https://twitter.com/Ponyo1127_Fav)）

※ふぁぼ用アカウントは普段から使ってるアカウントで、実行結果を
　垂れ流すと迷惑だと思ったので実行結果表示用アカウントは新規に作成
#コード
```rb:auto_favorite.rb
require 'twitter'

# おまじない
# Windowsで実行するときはこれ書かないとエラー出る
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

# ふぁぼ用アカウント
@fav_client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "アプリのatoken"
  config.consumer_secret     = "アプリのsecret"
  config.access_token        = "ユーザのatoken"
  config.access_token_secret = "ユーザのsecret"
end

# 実行結果つぶやき用アカウント
@update_client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "アプリのatoken"
  config.consumer_secret     = "アプリのsecret"
  config.access_token        = "ユーザのatoken"
  config.access_token_secret = "ユーザのsecret"
end

# 検索数
SEARCH_COUNT = 100
# ふぁぼり済み配列
favorited_tweet_id = []
# ふぁぼった回数（200回ふぁぼったら配列初期化）
favorite_count = 0
# ふぁぼ済み配列と一致するかどうかのフラグ
favorite_flag = true
# 通常待機時間（秒）
# 何度も連続してふぁぼると規制されてしまうため
wait_time = 120
# エラーが起きた時の待機時間（秒）
error_wait_time = 1800
# 検索キーワード配列
search_word_array = ["しぶりん","渋谷凛"]
# 出力結果を表示する文字列を格納する変数
update_word = ""

# 無限ループ
while true
  begin
    # ふぁぼれたらここまで戻ってくる
    catch(:out) do
      # 出力結果表示文字列を初期化
      update_word = ""
      
      # 検索キーワード配列の順に検索
      # ふぁぼれたらループ終了
      search_word_array.each do |search_word|
        favorite_flag = true
        
        # SEARCH_COUNTの数だけ検索
        @update_client.search(search_word).take(SEARCH_COUNT).each do |tweet|
          # 検索した結果のidを保存
          # tweet.idをそのまま使ってたらAPI切れが頻繁に起こった
          # 気のせいかもしれないけど…
          current_tweet_id = tweet.id
          
          # RTは除く
          if tweet.text.index("RT")
            next
          else
            favorited_tweet_id.each do |tweet_id|
              # ふぁぼり済み配列と一致するデータがあったらふぁぼらない
              if tweet_id == current_tweet_id
                favorite_flag = false
              end
            end
            # ふぁぼり済み配列と一致するものがなかったらふぁぼる
            if favorite_flag
              # ツイートをふぁぼる
              @fav_client.favorite(current_tweet_id)
              # 出力結果表示文字列にふぁぼ時間を追加
              update_word += "ふぁぼ時間：#{Time.now}\nツイートをふぁぼ\n"
              # ふぁぼったツイートのidをふぁぼり済み配列に追加
              favorited_tweet_id.push(current_tweet_id)
              # 出力結果表示文字列にふぁぼったツイートのid
              update_word += "ツイートID：#{current_tweet_id}\n"
              
              # ふぁぼった回数を記録
              favorite_count = favorite_count + 1
              # 200回ふぁぼったらふぁぼ回数リセット、ふぁぼり済み配列初期化
              if favorite_count > 200
                favorite_count = 0
                favorited_tweet_id.clear
              end

              # 出力結果表示文字列に次回検索数と待機時間を追加
              update_word += "#{wait_time}秒待機"
              
              # 出力結果を表示
              @update_client.update(update_word)
              
              # 1回ふぁぼったら待つ
              sleep(wait_time)
              throw :out
            end
          end
        end
      end
    end
    
    # ツイートをふぁぼらなかった時
    unless favorite_flag
      # 出力結果表示文字列にふぁぼ時間を追加
      update_word += "ふぁぼ時間：#{Time.now}\nツイートをふぁぼ\n"
      
      # 出力結果表示文字列に次回検索数と待機時間を追加
      update_word += "#{wait_time}秒待機"
      
      # 出力結果を表示
      @update_client.update(update_word)
      
    # 出力結果表示文字列を初期化
    update_word = ""

      # wait_timeの時間だけ待機
      sleep(wait_time)      
    end
  
  # TooManyRequestsのエラー（多分API切れ）
  rescue Twitter::Error::TooManyRequests => error
    # 出力結果表示文字列にエラー時間を追加
    update_word += "#{error.message}：#{Time.now}\n"
    
    # 出力結果表示文字列に規制解除までの時間を追加
    # error.rate_limit.reset_inで規制解除までの時間（多分）
    # ぴったり同じだと上手くいかないから5秒足す
    update_word += "#{error.rate_limit.reset_in + 5}秒待機"
    
    # 出力結果を表示
    @update_client.update(update_word)
    
    # 規制解除までの時間待機
    sleep(error.rate_limit.reset_in + 5)
    
  # その他のエラー
  rescue => error
    # 出力結果表示文字列にエラー時間を追加
    update_word += "#{error.message}：#{Time.now}\n"
    
    # 出力結果表示文字列に待機時間を追加
    update_word += "#{error_wait_time}秒待機"
    
    # 出力結果を表示
    @update_client.update(update_word)
    
    # 出力結果表示文字列を初期化
    update_word = ""

    # error_wait_timeの時間だけ待機
    sleep (error_wait_time)
  end
end
```

#結果
こんな感じ
![daccas.PNG](https://qiita-image-store.s3.amazonaws.com/0/68592/7124632a-7496-9ae6-2d9b-77e4ac8ba5c3.png)

[@Ponyo1127のふぁぼ欄](https://twitter.com/Ponyo1127/favorites)が分かり易いかも
※えっちぃツイートもあるかもしれないので時間ト場所ヲワキマ(ry