2013-05-19 18 views
0

运行以下ruby脚本时,我不断收到以下错误消息。如果任何人都可以帮助我解决这个问题,将不胜感激。我已经删除了任何敏感数据,例如API密钥。Ruby Tweetstreamstream MongoDB错误

代码:

#!/usr/bin/env ruby 
require "tweetstream" 
require "mongo" 
require "time" 

TweetStream.configure do |config| 
    config.consumer_key  = 'KEY' 
    config.consumer_secret = 'SECRET' 
    config.oauth_token  = 'TOKEN' 
    config.oauth_token_secret = 'TOKEN_SECRET' 
    config.auth_method  = :oauth 
end 

db = Mongo::Connection.new("ds045037.mongolab.com", 45037).db("tweets") 
auth = db.authenticate("DB_USERNAME", "DB_PASSWORD") 
tweets = db.collection("tweetdata") 

TweetStream::Daemon.new("TWITTER_USERNAME", "TWITTER_PASSWORD").track("TERM") do |status| 
    # Do things when nothing's wrong 
    data = {"created_at" => Time.parse(status.created_at), "text" => status.text, "geo" => status.geo, "coordinates" => status.coordinates, "id" => status.id, "id_str" => status.id_str} 
    tweets.insert({"data" => data}); 
end 

命令启动脚本:

ruby tweetscrape.rb 

的Ruby版本:

ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-linux] 

红宝石-c tweetscrape.rb生产:

Syntax OK 

错误消息:

/usr/local/rvm/gems/ruby-1.9.3-p429/gems/daemons-1.1.9/lib/daemons.rb:184:in `[]=': can't convert Symbol into Integer (TypeError) 
    from /usr/local/rvm/gems/ruby-1.9.3-p429/gems/daemons-1.1.9/lib/daemons.rb:184:in `run_proc' 
    from /usr/local/rvm/gems/ruby-1.9.3-p429/gems/tweetstream-2.5.0/lib/tweetstream/daemon.rb:48:in `start' 
    from /usr/local/rvm/gems/ruby-1.9.3-p429/gems/tweetstream-2.5.0/lib/tweetstream/client.rb:131:in `filter' 
    from /usr/local/rvm/gems/ruby-1.9.3-p429/gems/tweetstream-2.5.0/lib/tweetstream/client.rb:98:in `track' 
    from tweetscrape.rb:19:in `<main>' 

编辑:我现在使用没有错误的,但下面输入没有到MongoDB的:

#!/usr/bin/env ruby 
require "tweetstream" 
require "mongo" 
require "time" 

TweetStream.configure do |config| 
    config.consumer_key  = 'gfdsgfdsgfdsgfdsgfdsgfds' 
    config.consumer_secret = 'gfsdgfdsgfdsgfdsgfsdgfd' 
    config.oauth_token  = 'gfdgfdsgfsdgfdsgfsdgf' 
    config.oauth_token_secret = 'hsgfsdgfsdgfsdgfds' 
    config.auth_method  = :oauth 
end 

db = Mongo::Connection.new("ds045037.mongolab.com", 45037).db("tweets") 
auth = db.authenticate("gfsdgfdsgfsd", "gfdsgfdsgfdsgfsd") 
tweets = db.collection("tweetdata") 

TweetStream::Client.new.track('TERM') do |status| 
    puts status.text 
    data = {"created_at" => Time.parse(status.created_at), "text" => status.text, "geo" => status.geo, "coordinates" => status.coordinates, "id" => status.id, "id_str" => status.id_str} 
    tweets.insert({"data" => data}) 
end 

鸣叫在屏幕上显示通过看跌期权,但...

+0

我发现本教程对于开始使用ruby和mongodb很有帮助:http://api.mongodb.org/ruby/current/在你的代码中,你不会错误地检查对mongodb驱动程序的任何调用,可能会添加一些人看到回报值将有助于找到核心问题。 – TeTeT

回答

0

您使用守护程序类获得的初始错误是因为您未将正确的参数传递给构造函数。 contructor接受一个字符串和一个散列。

从移动上,插入失败,因为:

  1. 解析status.datetime抛出异常(它已经是一个Time对象)。
  2. 如果没有坐标,status.coordinate会抛出异常。

下面的代码对我的作品(注:我添加咆哮,所以你可以看到微博):

#!/usr/bin/env ruby 
require "tweetstream" 
require "mongo" 
require "time" 
require 'growl' 

DESIRED = %w{created_at text geo coordinates id id_str} 
host= ENV["MONGO_HOST"] || 'localhost' 
port = ENV["MONGO_PORT"] || 27017 
username = ENV["MONGO_USERNAME"] 
password = ENV["MONGO_PASSWORD"] 

term = ARGV[1] || 'TERM' 

begin 
    TweetStream.configure do |config| 
    config.consumer_key  = ENV["TWEET_CONSUMER_KEY"] 
    config.consumer_secret = ENV["TWEET_CONSUMER_SECRET"] 
    config.oauth_token  = ENV["TWEET_OAUTH_TOKEN"] 
    config.oauth_token_secret = ENV["TWEET_OAUTH_TOKEN_SECRET"] 
    config.auth_method  = :oauth 
    end 

    db = Mongo::Connection.new(host, port).db("tweets") 
    db.authenticate(username, password) 
    tweets = db.collection("tweetdata") 

    puts "about to start tracking term #{term}" 
    TweetStream::Daemon.new('tracker').track(term) do |status| 
    Growl.notify status.text, :title => status.user.screen_name 

    # 
    # filter out nil values 
    # filter out all keys not in the desired array 
    # 
    data = status.attrs.select{|k,v| !v.nil? && DESIRED.include?(k.to_s)} 
    tweets.insert({"data" => data}); 
    end 

rescue Mongo::ConnectionFailure 
    puts "Connection Error : #{$!}" 
rescue Mongo::AuthenticationError 
    puts "Auth Error : #{$!}" 
rescue Mongo::MongoDBError 
    puts "Unexpected Error : #{$!}" 
end 

你需要设置与下面的正确值环境:

export MONGO_USERNAME="..." 
export MONGO_PASSWORD="..." 
export TWEET_CONSUMER_KEY="..." 
export TWEET_CONSUMER_SECRET="..." 
export TWEET_OAUTH_TOKEN="..." 
export TWEET_OAUTH_TOKEN_SECRET="..." 

然后就可以开始使用类似的守护进程(在这种情况下,我们会寻找洋基队):

ruby tweetscrape.rb start yankees