首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby Tweetstream MongoDB错误

Ruby Tweetstream MongoDB错误
EN

Stack Overflow用户
提问于 2013-05-19 19:51:29
回答 1查看 403关注 0票数 0

在运行下面的ruby脚本时,我一直收到以下错误。如果有人能帮我解决这个问题,我将不胜感激。我已经删除了所有敏感数据,如API密钥。

代码:

代码语言:javascript
复制
#!/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

启动脚本的命令:

代码语言:javascript
复制
ruby tweetscrape.rb

Ruby版本:

代码语言:javascript
复制
ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-linux]

ruby -c tweetscrape.rb产生:

代码语言:javascript
复制
Syntax OK

错误消息:

代码语言:javascript
复制
/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中:

代码语言:javascript
复制
#!/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

推文在屏幕上显示通过puts。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-20 20:51:25

使用Daemon类得到的初始错误是因为您没有将正确的参数传递给构造函数。contructor接受一个字符串和一个散列。

接下来,插入失败了,原因是:

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

下面的代码适用于我(注意:我添加了growl,这样您就可以看到tweet):

代码语言:javascript
复制
#!/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

您需要使用以下正确的值设置您的环境:

代码语言:javascript
复制
export MONGO_USERNAME="..."
export MONGO_PASSWORD="..."
export TWEET_CONSUMER_KEY="..."
export TWEET_CONSUMER_SECRET="..."
export TWEET_OAUTH_TOKEN="..."
export TWEET_OAUTH_TOKEN_SECRET="..."

然后你可以像这样启动守护进程(在本例中我们将搜索yankees):

代码语言:javascript
复制
ruby tweetscrape.rb start yankees
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16634369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档