【问题标题】:Issue parsing web page data from twitter for dashing ruby app从 twitter 解析网页数据以获取 ruby​​ 应用程序的问题
【发布时间】:2013-11-15 15:57:33
【问题描述】:

我认为我的问题与Having problems with Ruby file from Dashing 中的问题相同,到目前为止还没有答案。

完全的问题是当我开始冲刺时我得到了。

scheduler caught exception:
undefined method `[]' for nil:NilClass
/home/bhladmin/Shopify-dashing-e672d84/dashboard/jobs/twitter_user.rb:19:in `block in <top (required)>'
/usr/lib64/ruby/gems/1.9.1/gems/rufus-scheduler-2.0.23/lib/rufus/sc/jobs.rb:230:in `call'
/usr/lib64/ruby/gems/1.9.1/gems/rufus-scheduler-2.0.23/lib/rufus/sc/jobs.rb:230:in `trigger_block'
/usr/lib64/ruby/gems/1.9.1/gems/rufus-scheduler-2.0.23/lib/rufus/sc/jobs.rb:204:in `block in trigger'
/usr/lib64/ruby/gems/1.9.1/gems/rufus-scheduler-2.0.23/lib/rufus/sc/scheduler.rb:430:in `call'
/usr/lib64/ruby/gems/1.9.1/gems/rufus-scheduler-2.0.23/lib/rufus/sc/scheduler.rb:430:in `block in trigger_job'

第 19 行有问题,但我不知道是什么...

完整的代码部分如下...

#!/usr/bin/env ruby
require 'net/http'

# Track public available information of a twitter user like follower, follower
# and tweet count by scraping the user profile page.

# Config
# ------
twitter_username = ENV['TWITTER_USERNAME'] || 'foobugs'

SCHEDULER.every '2m', :first_in => 0 do |job|
  http = Net::HTTP.new("twitter.com", Net::HTTP.https_default_port())
  http.use_ssl = true
  response = http.request(Net::HTTP::Get.new("/#{twitter_username}"))
  if response.code != "200"
    puts "twitter communication error (status-code: #{response.code})\n#{response.body}"
  else

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

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

从上一个问题看来,从网页中提取数据的方式是问题所在,但我对 Ruby 的了解不够。我尝试删除 ENV['TWITTER_USERNAME'] 部分以确保正在使用我使用的用户名(不是上面的用户名)。如果我转储原始 html 数据,那么它包含我正在搜索的信息,所以我知道该部分正在工作。

【问题讨论】:

    标签: ruby dashing


    【解决方案1】:

    我想我自己已经通过不同的方式解决了这个问题。我已将代码更改为使用 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-12-11
      • 2019-09-23
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      相关资源
      最近更新 更多