0

我在使用twitter_user.rb时遇到问题,它应该获取给定 Twitter 用户名的推文、关注者和关注的数量。

我假设我应该用TWITTER_USERNAME我感兴趣的 Twitter 用户名替换第 9 行。我这样做并开始冲刺,但我得到了:

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

4 回答 4

1

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

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

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

twitter_username = 'myusername'
于 2013-11-11T17:48:23.107 回答
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
于 2013-11-15T08:14:24.803 回答
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
于 2014-03-03T13:03:59.880 回答
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。使用这些类型的文件中的任何一种都可以很容易地打破模式。

于 2013-11-11T16:41:58.620 回答