resque-scheduler使ってブログの新着情報をTwitterへ投稿

25th Jan, 2010 | ruby resque twitter

前々回前回に引き続き、もうちょっとResqueの練習。試しに、このブログの更新情報をTwitterに流す仕組を作ってみた。twitterfeed的なことをする感じで、ブログに投稿したら、Twitterにリンクをポスト、またN時間後にポスト、という感じで。うざそうなので実際には使わないかも。

追記: resque-schdulerのcron的な使い方について別のエントリで書いた。

このN時間後に投稿の部分にresque-schedulerを使ってみた。

Twitterへ投稿するライブラリは、grackleを使ってみた。特に深い理由はない。単純にポストするだけだから何でもいいかな、という感じで、簡単そうに使えそうなのを選んだ。

とりあえずインストール。

gem install grackle
gem install resque
gem install resque-scheduler

Twitterにポストするためのクラスを作成する。このクラスは、 performメソッドを実装する。その中でtwitterに投稿するコードを書く。performの引数としてPostしたい文字列を渡すことにする。

class MyTwitter
  @queue = :normal

  def self.perform(status)
    options = Sinatra::Application.options
    client = Grackle::Client.new(:auth=>
                                 {:type=>:basic,
                                   :username=>options.twitter_username,
                                   :password=>options.twitter_password})
    client.statuses.update! :status=>status
  end
end

Rakefileにschedulerのタスクを追加:

require 'resque/tasks'
require 'resque_scheduler/tasks'

これで、準備完了。

scheulderを起動する。

rake resque:scheduler

後はTwitterに投稿したいところで、

# すぐに投稿したい場合 (resque標準)
Resque.enqueue(MyTwitter, "post post post")

# 10時間後に (resuque-scheduler)
Resque.enqueue_in(10.hours, MyTwitter, "post post post")

# 投稿したい日付が決まっている (resuque-scheduler)
Resque.enqueue_at(Time.local(2010, 1, 31, 10, 30), MyTwitter, "post post post")

と言った感じ。とても簡単。

正確には、実行される時間ではなくて、Queueに入る時間なので実際には少し後に実行される。