запись в базу данных с помощью демона tweetstream - PullRequest
4 голосов
/ 19 мая 2011

Я пытаюсь написать все твиты, которые соответствуют ключевому слову в моей базе данных. Я настроил следующее в tracker.rb:

require 'rubygems'
require 'tweetstream'

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

Но ничего не происходит. Что я тут не так делаю?

Заранее спасибо

Обновление: Я помещаю все в .rake файл с именем twitter.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

Ответы [ 3 ]

1 голос
/ 08 января 2013

Как вы называете Демон?

Вам необходимо ввести команду (запуск / останов ..)

Например:

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

Это запустит работу в фоновом режиме

1 голос
/ 25 сентября 2013

Ваш первый подход был лучшим, вам нужно запустить «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
0 голосов
/ 29 мая 2011

Я предполагаю, что это часть более крупного приложения рельсов. Если это так, проблема 1 заключается в том, что Tweet.new не будет ничего сохранять в базе данных, если это стандартный объект activerecord. Попробуйте Tweet.create Во-вторых, я не уверен, что сценарий обязательно будет знать о твите, если он является активной записью, без добавления в приложение rails, возможно, путем включения файла environment.rb.

Что-то вроде:

ENV["RAILS_ENV"] ||= "production"

require File.dirname(__FILE__) + "/../../config/application"
Rails.application.require_environment!

Если это не сработает, вы можете просто включить активную запись, здесь есть вопрос и ответ, который описывает это:

Как использовать ActiveRecord в скрипте ruby ​​вне Rails?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...