rails - ruby server
escribir en la base de datos con daemon tweetstream (3)
Intento escribir todos los tweets que coinciden con una palabra clave en mi base de datos. He configurado lo siguiente en tracker.rb
:
require ''rubygems''
require ''tweetstream''
TweetStream::Daemon.new(''Bill Gates'',''money'',''Twitter Tracker'').track(''ladygaga'') do |status|
Tweet.new(:content => status.text)
end
Pero nada pasa. ¿Qué estoy haciendo mal aquí?
Gracias por adelantado
Actualización: Puse todo en un archivo .rake
llamado twitter.rake
y .rake
el demonio con $ rake scrap
:
task :scrap => :environment do
desc "Run Twitter Scraper"
TweetStream::Client.new(''TWITTER_USER'',''TWITTER_PASS'').track(''ladygaga'') do |status|
Tweet.create(:user_id => status.user.id, :user_screen_name => status.user.screen_name, :user_profile_image_url => status.user.profile_image_url, :status_text => status.text, :status_id => status.id)
puts "[#{status.user.screen_name}] #{status.text}"
end
end
¿Cómo llamas al Daemon?
Debe proporcionar un comando (inicio / parada ...)
Por ejemplo:
rails runner "TweetStream::Daemon.new(''tracker'').track(''ladygaga'') { |status| do_something }" start
Esto comenzaría el trabajo en el fondo
Su primer acercamiento fue el mejor, necesita ejecutar "deamon" desde la línea de comandos, pero dado que desea utilizar los raíles y el registro activo, necesita iniciar el entorno de raíles en el script.
Debes hacer algo como esto:
#!/usr/bin/env ruby
# encoding: utf-8
ENV["RAILS_ENV"] ||= "development"
root = File.expand_path(File.join(File.dirname(__FILE__), ''..''))
require File.join(root, "config", "environment")
require ''tweetstream''
p "Initializing daemon..."
TweetStream.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''
config.auth_method = :oauth
end
terms = [''ladygaga'']
daemon = TweetStream::Daemon.new(''tracker'',
:log_output => true,
:backtrace => true,
)
daemon.on_inited do
ActiveRecord::Base.connection.reconnect!
p "Listening..."
end
daemon.on_error do |message|
puts "on_error: #{message}"
end
daemon.on_reconnect do |timeout, retries|
puts "on_reconnect: #{timeout}, #{retries}"
end
daemon.on_limit do |discarded_count|
puts "on_limit: #{skip_count}"
end
daemon.track(terms) do |status|
# put here your model.create code!
# Tweet.create!( :uid => status.id, ... )
end
Para ejecutar el script simplemente escriba:
ruby scrip-name.rb run
Asumo que esto es parte de una aplicación de rieles más grande. Si es así, el problema 1 es que Tweet.new
no persistirá en la base de datos si es un objeto activerecord estándar. Pruebe Tweet.create
En segundo lugar, no estoy seguro de si el script necesariamente sabrá sobre el Tweet si es un registro activo sin tener que usar la aplicación Rails, posiblemente incluyendo el archivo environment.rb.
Algo como:
ENV["RAILS_ENV"] ||= "production"
require File.dirname(__FILE__) + "/../../config/application"
Rails.application.require_environment!
Si eso no funciona, intente simplemente incluir el registro activo. Aquí hay una pregunta y respuesta que lo describe:
¿Cómo usar ActiveRecord en un script de ruby fuera de Rails?