Hatena::ブログ(Diary)

Android開発-fs随筆- RSSフィード

2009-11-04 RubyでTwitterで動くBOTをつくる

RubyTwitterで動くBOTをつくる

1,Rubyインストールする

WindowsなどでRubyインストールされていない場合は,下記サイトからダウンロードしてインストールします.

http://rubyforge.org/projects/rubyinstaller/

MacOSXなどは最初からインストールされているので必要ありません.

2,RubyGemsバージョンをあげる

One-ClickインストーラだとGemsが古くて遅いので,下記サイトから最新版をダウンロードします.(ただし「gem -v」をして「1.2.0」以上なら最新版にする必要はないかもしれません)

http://rubyforge.org/projects/rubygems/

落としたrubygemszip解凍して,コマンドプロンプトなどから中に入っている,「setup.rb」を実行すれば数分で最新版になります.

3,twitterインストールする

コマンドプロンプトなどで

gem install twitter

と実行して,RubyGems経由でtwitterインストールします.

もし,コンピュータプロキシー内で実行してるときは,環境変数プロキシの設定をしましょう.Windowsだったらたぶん次のようにします.

set http_proxy=http://hostname:port
hostnameにプロキシサーバアドレスなどportにポート番号を入れてね!

4,もちろんTwitterアカウントをとる

http://www.google.co.jp/search?q=twitter

BOT用のTwitterアカウントとります.ログイン用のユーザ名とパスワードプログラム中に書く事になるのでメモっとくといいでしょう.

5,開発する

ログインして,「HelloWorld」と発言するBOTを作りましょう.

require 'rubygems'
require 'twitter'

User = 'ユーザ名をここに'
Pass = 'パスワードをここに'

t = Twitter::Base.new( Twitter::HTTPAuth.new( User, Pass ) )
t.update( 'HelloWorld' )

上記コードの定数UserとPassに「4」で取得したアカウントユーザ名を代入してあげるといいですよ.

ログインにはTwitter::HTTPAuthを使います.ちなみにプロキシ環境下ではTwitter::Base.new()をする前に,

Twitter::HTTPAuth.http_proxy( "hostname", port )
hostnameにプロキシアドレス,portにポート番号を入れてね!

をやるといいですよ.

6,日本語を投稿するときの注意点

Twitterは発言するときに2byte文字はUTF8である事を期待しているようです.従って,次のようなコードWindowsXPなどでは文字化ける可能性が高い.

t.update( 'こんにちは!' )

はっきり言えば,WindowsXPの存在自体が悪いのだけど.

解決策としては次のように日本語を送るときはUTF8に変換して送ればいい.

t.update( Kconv.kconv( 'こんにちは!', Kconv::UTF8 )
または
t.update( Kconv.toutf8( 'こんにちは!' )

注意してね!

7,辞書からランダムに発言させよう.

たくさん文章を登録しておいてそこから適当に発言させるにはこうする.

…省略…
t = Twitter::Base.new( Twitter::HTTPAuth.new( User, Pass ) )
…これより上記は今までと同じ…
s = [ '勘違いしないでよ!義理に決まってるでしょ!',
      'そっそんなこと私にいう必要は無いでしょう!勝手にしなさいよ!',
      'な、何!?私じゃ不満っていうの!?',
      '痛いじゃないのっ。きーっ。ホント痛かったのよっ、馬鹿!']
t.update( s[ rand(s.size)] )

などとしておけばツンデレBOTの完成です.

8,まとめ

あみんBOT作ればいいと思うよ!

9,follow返しをする

require 'rubygems'
require 'twitter'

User = 'ユーザ名をここに'
Pass = 'パスワードをここに'

t = Twitter::Base.new( Twitter::HTTPAuth.new( User, Pass ) )
followers = t.follower_ids
following = t.friend_ids
newbie = followers - following

newbie.each do |i|
  t.friendship_create(i)
end

t.follower_idsでフォローしてくれてる人のidがもらえます.t.friend_idsでフォローしてる人のidがもらえます.

上記のコードではRuby配列を集合演算できるので,二つの差分をとり,フォローしてくれてるけどまだフォローしてない人を取り出します.

フォローしてない人をeachを使って繰り返して,フォロー申請しています.

らくちんらくちん!

ちなみにこれはあんまりやるとたぶんAPI制限とかに引っかかるのでうまく回数を分けてやるなどしましょう.

10,参考にしたページ

Rubyコードhttp://d.hatena.ne.jp/takahirox/20090523/1243086497

Rubyコードhttp://d.hatena.ne.jp/kkawamura/20090821/1250815267

つんでれ:http://www.geocities.jp/tundere2ch/tu1.html