wheels rails official last framework app ruby ruby-on-rails-3 twitter

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?