Ruby on Railsを使ってTwitterのbotを作ってみた
こんばんは. 絶賛就活中のうるるです.
就活一回戦は見事に敗退してしまい,二回戦に突入しました.研究活動もしながら気長に自分に合った仕事を探していこうかと思います.
さて,今日はTwitterのbotをRuby on Railsで作ってみたお話をしようと思います.というかただのメモです. Rubyは何度か触ったけど,Railsは初めてだったし,TwitterのAPIが変わったし,色々なサイトを廻らないと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の使い方です.
そこで特定ユーザのタイムラインの閲覧をし,それをテキストに記録するタスクを作成しました. 以下のコードは私のアカウント(@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にしようかなと考えています. というか最初からそのつもりで作ってた.
かぺるちゃんに「気合ッ!!入れてッ!!起きろッ!!」って毎朝送るBotを
— うるる@まめぱと (@hsmdlily) 2014, 4月 21
@eclairbyrd_ アルゴリズム的には
・起床時間前10分以内に呟けばリプライを返さない
・起床時間になっても呟かなければリプライが来る
・それでもリプライを返さなければ更に10分後にリプライを返す
など。
— うるる@まめぱと (@hsmdlily) 2014, 4月 21
あとはこんな感じで作って,サーバーにあげて,かぺるちゃんがそれで起きれば,完成です. Rubyでbotを書いている記事(RubyでTwitterBotを簡単(※当社比)につくるRTwBot - 鳥小屋.txt)やRakeを使ったやつもGitHub( mattruzicka/VinosPhilos-twitterbot · GitHub)にあったりするので,それを参考にちょこまかと作っていければと思います.
現実逃避,楽しいですね(白目)