Ruby で Twitter の bot を、つくってみた

1.8 の本を片手に 1.9 を使っているので理解度が低い。
こういうふうに残しておかないと何がなんだか分からなくなるしね!\(^o^)/

※鍵垢ふぉろーの処理追加。

bot 用の twitter アカウントをつくります。んで、 Twitter Developers に bot のアカウントでログイン。このへん適当。Application Type は、つぶやくだけなので Read and Write で。あと bot の認証につかうので、OAuth tool の

  • Consumer key
  • Consumer secret
  • Access token
  • Access token secret

これが必要です。

サーバー側のほうをいじります。

# gem install twitter

Twitter のライブラリをインストール。ライブラリってなんですかレベルだったので、ライブラリ is 何 からのスタート。便利だなーすげー。あとOAuthのライブラリも。

# gem install OAuth

OAuth って「なんかすごい認証」くらいにしか分かってない。分かってないけど、使えるんだからライブラリってすげぇ。さっきからすげぇしか言えてないですね。

インストール済みかどうかは

# gem list

で確認できます。

肝心の bot のなかみ。わかりやすく bot.rb とかにしておきます。

#!/usr/bin/ruby
# coding: utf-8

require 'rubygems'  #1.9では不要だそうです
require 'twitter'

USER_NAME = 'スクリーン名'

Twitter.configure do |config|
  config.consumer_key = YOUR_CONSUMER_KEY
  config.consumer_secret = YOUR_CONSUMER_SECRET
  config.oauth_token = YOUR_OAUTH_TOKEN
  config.oauth_token_secret = YOUR_OAUTH_TOKEN_SECRET
end

Twitter.update('Hello World!')

これを実行すると「Hello World!」と、つぶやいてくれるわけです。やったね!

が、これではおもしろくない(というか何の役にもたたない)ので、つぶやきリストをつくります。
中身はなんでもいいんですが

だるい
ねむい
おそよう
おなかすいた
かえりたい

など。我ながらひどい。
とりあえず tweet.txt とかそんなんで保存しておきます。

Ruby って、先頭の文字が小文字だと変数で、大文字だと定数になるんだそうで。だもんで一度定義したらもうアレなわけなんですけれども、最初それ知らなくて

warning: already initialized constant

てきなエラーがドバアアアアアアアアアアアアアアアアアアアア(無限ループにしてるから

いちおう本持ってるんだから読んどけよバカかお前っていうお話でした。
それは置いといて。

a = File.read('./tweet.txt').split("\n")
Twitter.update(a.sample)

テキストファイルを読み込んで改行コード(\n)で区切って要素にして配列に格納します(言葉の意味がちょっとあやふや)。で、sample を使って要素からランダムに 1 個取得してつぶやきます。これでランダム投稿ができます。という流れ。

ちなみに

a.sample(3)

とかやると 3 個選べます。サンプルを無作為に n 個取り出すというかんじなんですかね。sample は 1.9 からのアレだそうで、choice が sample になったそうです。でもその前とか知らんから知らんけど知らんから知らん。はい。

次の問題。二重投稿。

無作為に選んでいてもつぶやきがかぶっちゃったらもうどうにもならない。つぶやけない。心で叫ぶしか無い。ということで、既につぶやいたやつを取得してその差を取ります。

b = Array.new
Twitter.user_timeline(USER_NAME, :count => 20).each do |t|
b << "#{t.text}"
end

最初に空の配列(b)をつくります。USER_NAME はいらなくてもよさげだけど一応。規制にひっかからなくても直近のつぶやきとかぶるのも嫌なのでちょっと幅を多めにしてます。で、つぶやきを取得して要素として配列(b)にどんどん追加。空の配列をつくってないとここで怒られる。そして配列同士で引き算をします。

Twitter.update((a - b).sample)

はい。おわり。あとは自動的に投稿してくれるように無限ループと投稿間隔の設定と、エラーはいたときの挙動を足してみました。

while 0 < 1
begin

b = Array.new
Twitter.user_timeline(USER_NAME, :count => 20).each do |t|
b << "#{t.text}"
end

Twitter.update((a - b).sample)
rescue Twitter::Error               #投稿エラー時の処理
Twitter.update(Error)               #エラーだよってつぶやけ
sleep 5                             #5秒休め
retry                               #beginに戻って再チャレンジ
sleep_time = 300 + rand(7200)       #5分 + ランダムで2時間(5分〜2時間に一回つぶやく
end                                 #おわり

sleep sleep_time                    #休め

end                                 #loopおわり

ついでにフォロー返し。フォロワーでさえ引き算でいいのか。すげえ。でも鍵垢とかアレみたいなので調べ直さないといかんようです。めんどくさい。めんどくさいけどやるしかない。
めんどくさいけどやったよ!ていうか足したの一行だけでそんなめんどくさくなかったよ!

aaa = Twitter.follower_ids(USER_NAME).ids #フォロワー
bbb = Twitter.friend_ids(USER_NAME).ids   #フォロー
ccc = Twitter.friendships_outgoing        #鍵垢へのリクエスト
fan = aaa - bbb - ccc                     #引き算して差分を
fan.each do |f|                           #フォローandリクエストしてないひとを順繰り取得して
Twitter.follow(f)                         #フォローします
end                                       #おわり

では起動。nohup を、添えて。

# nohup ruby bot.rb

これでログアウトしても走っててくれます。とめたいときは ps x で確認して kill してます。sleep 忘れるとえらいことになります。ちなみに VPS の CPU が 2.0k いっちゃって一回止まりました。わらえねぇ。

しばらくは bot で遊びつつ、Chromebook をもっと快適にしつつ、Chromebook で VPS をごにょごにょできるような設定をさがして遊んでます。

結局2週間かかって未完成
一ヶ月たっても未だ止まったりアレ

Time.now.hour

で、時間帯で条件分岐しておはようからおやすみから寝言までやってるけど2~3日に一回は止まってる。だめじゃん。精進しましょう。

Be the first to comment on "Ruby で Twitter の bot を、つくってみた"

Leave a comment

Your email address will not be published.


*