Tweetstream

Hi, I want to use the TweetStream gem
http://github.com/intridea/tweetstreamin my Rails app

I can’t seem to figure out how to do it, because it opens a connection
and
then won’t move on.

I got it to work in a Ruby script with

---------- start code ----------
require ‘rubygems’
require ‘tweetstream’

user = ‘blinkdev’
password = secret
keyword = ‘#ROCKPIC

Thread.new do
TweetStream::Client.new(user,password).track(keyword) do |status|
puts “[#{status.created_at}-#{status.user.screen_name}]
#{status.text}”
end
end

loop do
sleep 10
puts “other stuff happening”
end

---------- end code ----------

Which gives the output:
other stuff happening
other stuff happening
[Mon Mar 01 20:30:59 +0000 2010-blinkdev] test #ROCKPIC 7
other stuff happening

So I tried to replicate that in my Rails app in the file
config/initializers/twitter_stream.rb
---------- start code ----------
require ‘rubygems’
require ‘tweetstream’

Thread.new do
logger.info “started tweetstream”

TweetStream::Client.new(‘blinkdev’,secret).track(‘#ROCKPIC’) do
|status|
message = “[#{status.created_at}-#{status.user.screen_name}]
#{status.text}”
logger.info message
logger.info Rockpic.new( :message => message ).save!
end

end
---------- end code ----------

But it didn’t work. I couldn’t get it to log anything either. So I went
and
tried it in the console:

---------- start code ----------
$script/console
Loading development environment (Rails 2.3.3)

require ‘rubygems’
=> []
require ‘tweetstream’
=> []

?> Thread.new do
?> logger.info “started tweetstream”

?> TweetStream::Client.new(‘blinkdev’,secret).track(‘#ROCKPIC’) do
|status|
?> message = “[#{status.created_at}-#{status.user.screen_name}]
#{status.text}”

logger.info message
logger.info Rockpic.new( :message => message ).save!

end

?> end
=> #<Thread:0x24ba60c dead>
---------- end code ----------

It doesn’t seem to do anything. I tried playing with daemons, but I
can’t
figure out how to use them either.
If someone can show me how to use daemons, I’ll give that a try (I have
the
daemons gem installed daemons | RubyGems.org | your community gem host) and it looks
like
TweetStream has their own version with Daemons,
http://rdoc.info/rdoc/intridea/tweetstream/blob/e5ecb9ef125ebce038d24f816973bbb4644445a8/TweetStream/Daemon.htmlbut
I can’t seem to get it to do anything:

---------- start code ----------
ARGV << ‘start’
require ‘rubygems’
require ‘tweetstream’

user = ‘blinkdev’
password = secret
keyword = ‘#ROCKPIC

TweetStream::Daemon.new(user,password, ‘tracker’).track(keyword) do
|status|
puts “[#{status.created_at}-#{status.user.screen_name}]
#{status.text}”
end
---------- end code ----------

It runs, but it doesn’t respond to anything, and I think I need it to
run in
the Rails environment, because I want to host it on Heroku. Anyway, I’m
not
sure where to go with it, I just want my Rails app to have a stream to
twitter to watch for a given hash tag, and a particular user’s tweets.

Any help would be appreciated.

Based on their example, I got this to work:
---------- start code ----------
require ‘rubygems’
require ‘tweetstream’
require ‘ruby-growl’

username = ‘blinkdev’
password = secret
tracks = [’#ROCKPIC’]
puts “Starting a GrowlTweet to track: #{tracks.inspect}”

TweetStream::Daemon.new(username,password).track(*tracks) do |status|
g = Growl.new ‘localhost’, ‘growltweet’, [‘tweet’]
g.notify ‘tweet’, status.user.screen_name, status.text
end
---------- end code ----------

And run it from the command line like
$ruby test.rb start
$ruby test.rb stop

So I want to pull that into my rails app, I wrote this file to load the
environment, and save the statuses
---------- start code ----------

file: RAILS_ROOT/jobs/twitter_stream.rb

ENV[‘RAILS_ENV’] = ARGV.shift
require File.expand_path(File.dirname(FILE) +
“/…/config/environment”)

require ‘rubygems’
require ‘tweetstream’

username = ‘blinkdev’
password = secret
tracks = [’#ROCKPIC’]

TweetStream::Daemon.new(username,password).track(*tracks) do |status|
Rockpic.new( :message =>
“[#{status.created_at}-#{status.user.screen_name}] #{status.text}”
).save!
end
---------- end code ----------

and then to load it, I created

---------- start code ----------

file: RAILS_ROOT/config/initializers/twitter_stream.rb

puts ‘pre’
system “#{%x(which ruby).chomp}
#{File.join(RAILS_ROOT,‘jobs’,‘twitter_stream.rb’)} #{ENV[‘RAILS_ENV’]}
restart”
puts ‘post’
---------- end code ----------

But it never finishes that command, when I start my server it just keeps
writing ‘pre’ over and over, implying to me that it is recursively
calling
itself. ie the initializer starts the daemon, which requires the
environment, which runs the initializer, which starts the daemon, etc.

I figure if I can get it to realize that it is already running, then I
should be good, but I’m not very experienced with this, and don’t know
how
to check for that. Api doesn’t look like it offers a way, but looking at
the
code shows that it uses Daemons underneath of it. Not sure how to do it,
still, though. Any help is appreciated.

Hi Josh,

If your overall goal is to run it as a background task on Heroku, I
think you want this: http://docs.heroku.com/background-jobs.

I don’t think that there’s any other way to run background jobs on
Heroku.

Regards
Ritchie

On Mon, Mar 1, 2010 at 6:43 PM, Ritchie [email protected] wrote:

Hi Josh,

If your overall goal is to run it as a background task on Heroku, I
think you want this: http://docs.heroku.com/background-jobs.

I don’t think that there’s any other way to run background jobs on
Heroku.

Regards
Ritchie

Thanks, Ritchie, I figured the TweetStream should be fine since it runs
on
Daemons, which is listed in heroku’s installed gems at
http://installed-gems.heroku.com
But I’ll read through that and see if a background task makes more
sense, I
appreciate it.