日本語自由帳

分かりやすく、伝わりやすく。

Ruby on Railsを使ってTwitterのbotを作ってみた

f:id:hsmdlily:20140502004535p:plain

こんばんは. 絶賛就活中のうるるです.

就活一回戦は見事に敗退してしまい,二回戦に突入しました.研究活動もしながら気長に自分に合った仕事を探していこうかと思います.

さて,今日はTwitterbotRuby on Railsで作ってみたお話をしようと思います.というかただのメモです. Rubyは何度か触ったけど,Railsは初めてだったし,TwitterAPIが変わったし,色々なサイトを廻らないと10分でbotとか完成しなかったし,大変でした.なのでもし,これからbotを作るぞ!という方がいらしたら参考になればいいな,程度に書きます.

Twitteのbotをとりあえず作る・ツイートする

まずはここから参照して作り始めました.

10分でできるTwitter bot @ Ruby - 酒と泪とRubyとRailsと

10分でできませんでした.ごめんなさい. 「Twitterにアプリを登録する」は簡単にできたんだ.「Twitter Botプログラムを記述」で詰まった.でもそもそもRails入ってなかったよ.

$ gem install rails
$ rbenv rehash

はい.まずはRailsを入れます.おまじないもかけておこうねー. それができたら,新しくRailsを作ります.

$ rails new twitter-bot

ここまでできて,ようやくGemfileやらbundle installの話に戻ってきます.コードも書ける,Rakeも実行できる.やりました. ただ,コードが一部古いので新しいのに書き換えましょう.

equire 'twitter'

namespace :twitter do
    desc "ツイートする"
    task :tweet => :environment do
        ## アプリ登録時に取得したCONSUMER_KEY/CONSUMER_SECRET
        CONSUMER_KEY = 'xxxxx'
        CONSUMER_SECRET = 'xxxxx'
        ## irbで取得したAccess Token/Access Secret
        ACCESS_TOKEN = 'xxxxx'
        ACCESS_TOKEN_SECRET = 'xxxxx'

        client = Twitter::REST::Client.new do |config|
          config.consumer_key       = CONSUMER_KEY
          config.consumer_secret    = CONSUMER_SECRET
          config.access_token        = ACCESS_TOKEN
          config.access_token_secret = ACCESS_TOKEN_SECRET
        end

        tweet = "テストツイート"
        client.update(tweet)
    end

    def update(tweet)
        begin
            tweet = (tweet.length > 140) ? tweet[0..139].to_s : tweet
            Twitter.update(tweet.chomp)
        rescue => e
            Rails.logger.error "<<twitter.rake::tweet.update ERROR : #{e.message}>>"
        end
    end

(参考:10分でできるTwitter Bot@Rubyに6時間かかった話 - 女子小学生と××したい

あと

$ [DEPRECATION] #oauth_token_secret= is deprecated. Use #access_token_secret= instead.

と怒られたので微妙に名前も変えました.これで,

$ rake twitter:tweet

と実行すると見事成功しました.ここまでで3,4時間かかったかな.もしbundleのインストールが上手くいかない人は

Ruby - 【メモ】rbenv, bundlerトラブル - Qiita

こちらを参考にするといいかもしれません.

タイムラインを見る・記録する

Rakeは「:tweet」でツイートするタスクに割り振られているので,同じようにタスクを増やしていきましょう. ただ,お仕事を増やすと先ほど設定した「client」の部分をnamespace直下に置くことにしました.以下のリンクがちょっとしたRakeの使い方です.

Rakeの基本的な使い方まとめ - うなの日記

そこで特定ユーザのタイムラインの閲覧をし,それをテキストに記録するタスクを作成しました. 以下のコードは私のアカウント(@hsmdlily)の直近のツイートを20個拾ってそれを「test.txt」に記録するタスクです.

task :timeline => :environment do
    tl = client.user_timeline("hsmdlily", count:20)
    tl .each do |tweet|
        tweet_time = Time.parse(tweet.created_at.to_s)
        text =  "(#{tweet_time.strftime("%Y-%m-%d %H:%M")})(#{tweet.user.screen_name})(#{tweet.text})"
        File.open("text.txt","a") do |file|
            file.puts text
        end
    end
end

時間も記録したかったのでTimeを使いました.「strftime」が投稿時間,「user.screen_name」がID,「text」がツイート内容になります. その他のリファレンスは以下のGistに詳しく載っているので参考にしてください.

Ruby Twitter Gem cheat sheet (ja) v2.1.0

目覚ましbotにするために

ツイート時間を見たり,ツイートできることが分かったので目覚ましbotにしようかなと考えています. というか最初からそのつもりで作ってた.

あとはこんな感じで作って,サーバーにあげて,かぺるちゃんがそれで起きれば,完成です. Rubybotを書いている記事(RubyでTwitterBotを簡単(※当社比)につくるRTwBot - 鳥小屋.txt)やRakeを使ったやつもGitHubmattruzicka/VinosPhilos-twitterbot · GitHub)にあったりするので,それを参考にちょこまかと作っていければと思います.

現実逃避,楽しいですね(白目)