tomatomax.net

Every rule has its exception.

Archive for the Ruby Category

twitter4r その2


例のBotがFollowされるたびに、手動でFollowをする必要があった*1ので、twitter4rのfriend関連の機能を使って、自動Followを実装してみた。

def follow(friend_name)
config_file = File::join(File.dirname(__FILE__), "conf_m.yaml")
twitter = Twitter::Client.from_config(config_file, "prod")
fri = twitter.my(:friends)
fri.each { |user|
return if user.screen_name == friend_name
}
twitter.friend(:add, friend_name)
end

ログインしているところは前と同じ。my(:friends)でログインユーザのFollowing一覧を取得して、既に登録している人は弾く。friend(:add, ユーザ名)で指定したユーザをFollowする。

メールサーバを動かしていないので、一定間隔でGMailを見て新規Followerを取得してます。こっちは毎分動かしているわけではないのですぐにFollow返しはできません><

*1:大変けまらしい勢いでした


twitter/Hinnyu


Twitter / Hinnyu

Followingの特定の言葉に激しく反応します。手動Botと言われてる人に対抗するために作ってみました。現在自動Followを行っていないので登録まで時間がかかります。自動Followのテスト中です。登録まで大体1時間ほどかかります。

胸板が厚いのでPicture書いてくれる人募集中。

以下、実装の詳細とか。

反応するのは以下の正規表現。

reg = /(貧乳|ひんにゅう|ひんぬー|ひんにゅー|ペチャパイ|まな板|胸ぺったん|ベニア板|洗濯板)/

語尾のパターンはこんだけ。あんまりパターンがないのでこれも案募集中。

message = ["と申されたか!", "と申されたな!", "は正義!", "はステータスだ 希少価値だ", "と申しましたな!?", "はいいものだ"]

以下の2つには反応しない。

  • マッチする正規表現+”bot” (大文字小文字無視)
  • /^@w+s/

2番目のように、今のところBot本体に@投げられても無視します。

あと、同じ発言に何回も反応しないように、最新の発言のidを記録しておいて、それ以上昔の発言は追わないようになってます。

元ネタの手動Botから引き継いだ機能として、一部の人にはまったく違う反応をします。下のコメント欄とかtwitterで@やDMいただければ一部の人に追加する対応もします(Botの名前とは全然関係なくなりますが)。


twitter4r


ruby用twitterライブラリ。Botを作るのに使ってみた。

詳細はTwitter4R v0.3.0: Open Source Ruby Client Library for the Twitter REST APIを参照。

まとめ

  • “gem install twitter4r”でインストール
  • YAMLファイルにログインユーザ名、パスワードを記述
  • Twitter::Client.timeline_forでタイムライン取得。パラメータに:friendを指定するとFollowing込みのタイムラインを取得できる
  • Twitter::Client.statusで発言する

インストール

gem install twitter4r

公式には上のコマンドになっているけど、うちのマシンでやると”Bulk updating Gem source index for: http://gems.rubyforge.org“で止まったままになるので直接gemをダウンロードしてきてインストール。jsonが必要なので先にインストール。

gem install json-1.1.2.gem
gem install twitter4r-0.3.0.gem

ユーザ認証

YAMLファイルを作成してそこにユーザ名とパスワードを書く。

test:
login: hoge
password: hogehoge
prod:
login: foo
password: bar

作成したファイルは以下のように読み込む。同時にtwitterクライアントのインスタンスを取得。

twitter = Twitter::Client.from_config(config_file, "prod")

この例では”prod”を指定しているので”foo”の方でログインする。

必ずファイルに生パスワード書かないといけないのかどうかがよくわからんかった。irb用のHelperとは書いてあるのだけれども、他にログイン用のメソッドがあるのかな?

タイムラインの読み込み

timeline_forでタイムラインを取得。引数に:friendを指定するとログインユーザのFollowingを含めたタイムラインを取得ができる。他には:publicでパブリックタイムライン、:meで自分の発言のタイムラインを取得可能。引数を追加すると発言を絞り込める(id, since等)。当然twitter APIの制限を受けるので1時間に70回しか使えない。

twitter.timeline_for(:friend).each { |friend|
if /@foo/ =~ friend.text
twitter.status(:post, "@" + friend.user.screen_name + " " + message)
end
}

取得したタイムラインから各ユーザの発言を取り出す時は、friend.textが各ユーザの発言、friend.user.screen_nameがユーザ名になる。

発言

statusの引数に:postを指定して第二引数に発言内容を指定する。

twitter.status(:post, "@" + friend.user.screen_name + " " + message)

感想

JavascriptでAPI直叩きのときよりはるかに簡単で使いやすい。Botの基本動作作るのに2時間もかからなかったのは満足。一番時間がかかってたのが”gem install twitter4r”だからなぁ。