我遇到了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
有人可以告诉我发生了什么以及如何解决这个问题吗?
答案 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":[\d]+/.match(response.body)
followers = /[\d]+/.match(followers_count_metadata.to_s).to_s