来自Dashing的Ruby文件有问题

时间:2013-11-11 16:24:26

标签: ruby twitter dashing

我遇到了twitter_user.rb的问题,这应该会获得推特,关注者和关注给定Twitter用户名的数量。

我认为我应该使用我感兴趣的Twitter用户名替换第9行中的TWITTER_USERNAME。我这样做并开始潇洒但我得到了:

scheduler caught exception:
undefined method '[]' for nil:NilClass
/.../jobs/twitter_user.rb:19:in 'block in <top (required)>'

看起来问题出在第19行,即:

tweets = /profile["']>[\n\t\s]*<strong>([\d.,]+)/.match(response.body)[1].delete('.,').to_i

有人可以告诉我发生了什么以及如何解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

您的假设不正确。该程序正在寻找一个名为TWITTER_USERNAME环境变量,它被设置为相关的用户名。如果该变量不存在,则代码使用foobugs代替。

如果您希望修改代码而不是设置环境变量,请更改

twitter_username = ENV['TWITTER_USERNAME'] || 'foobugs'

twitter_username = 'myusername'

答案 1 :(得分:0)

这是未经测试的代码,但它应该是如何编写的。如果您在原始页面上克隆源代码,则可以根据自己的需要对其进行调整(即修复它):

require 'nokogiri'

doc = Nokogiri::XML(content)

tweets = doc.at('profile strong').text.delete('.,').to_i
following = doc.at('following strong').text.delete('.,').to_i
followers = doc.at('followers strong').text.delete('.,').to_i

以上三行可以简化为:

tweets, following, followers = %w[profile following followers].map{ |tag|
  doc.at("#{ tag } strong").text.delete(',.').to_i
}

同样,如果没有可用的XML / HTML示例,我就无法做更多,但作为一种实践,我们(程序员)不应该使用正则表达式来尝试解析XML或HTML。使用这些类型的文件中断模式很容易。

答案 2 :(得分:0)

我设法通过使用twitter API来解决相同的问题,而不是提取相关信息。看起来这个网页已经改变了太多,无法进行刮擦工作,它也可能会再次停止工作,因为不同人已经说过......

这是我使用的解决方案。

#### Get your twitter keys & secrets:
#### https://dev.twitter.com/docs/auth/tokens-devtwittercom
Twitter.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_SECRET'

end

twitter_username = 'foobugs'

MAX_USER_ATTEMPTS = 10
user_attempts = 0

SCHEDULER.every '10m', :first_in => 0 do |job|
  begin
    tw_user = Twitter.user("#{twitter_username}")
    if tw_user
        tweets = tw_user.statuses_count
        followers = tw_user.followers_count
        following = tw_user.friends_count

        send_event('twitter_user_tweets', current: tweets)
        send_event('twitter_user_followers', current: followers)
        send_event('twitter_user_following', current: following)

    end
  rescue Twitter::Error => e
    user_attempts = user_attempts +1
    puts "Twitter error #{e}"
    puts "\e[33mFor the twitter_user widget to work, you need to put in your twitter API keys in the jobs/twitter_user.rb file.\e[0m"
    sleep 5
    retry if(user_attempts < MAX_USER_ATTEMPTS)
  end
end

答案 3 :(得分:0)

我已经通过替换这一行来解决:

followers = /<strong>([\d.]+)<\/strong> Follower/.match(response.body)[0].delete('.,').to_i

这两个:

followers_count_metadata = /followers_count&quot;:[\d]+/.match(response.body)
followers = /[\d]+/.match(followers_count_metadata.to_s).to_s