【问题标题】:write to database with tweetstream daemon使用 tweetstream 守护进程写入数据库
【发布时间】:2011-08-28 22:41:56
【问题描述】:

我正在尝试将与关键字匹配的所有推文写入我的数据库。我在tracker.rb中设置了以下内容:

require 'rubygems'
require 'tweetstream'

TweetStream::Daemon.new('Bill Gates','money','Twitter Tracker').track('ladygaga') do |status|
  Tweet.new(:content => status.text)
end

但是什么也没发生。我在这里做错了什么?

提前致谢

更新: 我把所有东西都放在一个名为twitter.rake.rake 文件中,然后用$ 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

【问题讨论】:

  • 我遇到了与 Mongoid 完全相同的问题。当我使用 ::Client 时,一切正常。只有当我尝试守护它时,我既没有错误也没有响应。你解决问题了吗?
  • 嗨,迈克,我将所有内容都放在了 .rake 文件中(请参阅更新),因此您不必担心加载 rails 环境。

标签: ruby ruby-on-rails-3 twitter


【解决方案1】:

你如何调用守护进程?

您需要提供一个命令(启动/停止..)

例如:

rails runner "TweetStream::Daemon.new('tracker').track('ladygaga') { |status| do_something }" start

这将在后台启动作业

【讨论】:

    【解决方案2】:

    您的第一种方法是最好的方法,您需要从命令行运行“deamon”,但由于您想要使用 rails 和 activerecord,您需要将 rails 环境引导到脚本中。

    你需要做这样的事情:

    #!/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
    

    要运行脚本,只需键入:

    ruby scrip-name.rb run
    

    【讨论】:

      【解决方案3】:

      我假设这是一个更大的 rails 应用程序的一部分。如果是这样,问题 1 是 Tweet.new 如果它是标准的 activerecord 对象,它将不会将任何内容持久化到数据库中。试试Tweet.create 其次,我不确定脚本是否一定会知道 Tweet 如果它是一个活动记录而不拉入 rails 应用程序,可能包括 environment.rb 文件。

      类似:

      ENV["RAILS_ENV"] ||= "production"
      
      require File.dirname(__FILE__) + "/../../config/application"
      Rails.application.require_environment!
      

      如果这不起作用,您可以尝试仅包含活动记录,这里有一个问题和答案来描述它:

      How to use ActiveRecord in a ruby script outside Rails?

      【讨论】:

      • 我试过ENV["RAILS_ENV"] ||= "development"require ::File.expand_path('../config/environment', __FILE__) 来加载environment.rb,但它似乎不起作用。这是加载 den rails 环境的正确方法吗?
      • 有几种方法可以做到这一点,我对 EventMachine 或 Tweetstream 没有太多经验,但是使用我通常使用的守护进程 gem,您可以包含以下环境:ENV["RAILS_ENV"] || = "生产" 需要 File.dirname(FILE) + "/../../config/application" Rails.application.require_environment!
      猜你喜欢
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      相关资源
      最近更新 更多