Skip to content

Instantly share code, notes, and snippets.

@cantlin
Created March 30, 2015 22:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cantlin/234213fa732a4dfa8390 to your computer and use it in GitHub Desktop.
Save cantlin/234213fa732a4dfa8390 to your computer and use it in GitHub Desktop.
require "twitter"
require "curb"
require "pp"
require "json"
require "opengraph_parser"
puts "Authenticating..."
client = Twitter::REST::Client.new do |config|
config.consumer_key = "foo"
config.consumer_secret = "bar"
config.access_token = "baz"
config.access_token_secret = "foo"
end
SORT_BY_FOLLOWERS = true
ONE_TWEET_PER_USER = true
puts "Grabbing timeline..."
begin
timeline = client.home_timeline(include_entities: true, count: 200)
rescue Twitter::Error::TooManyRequests => e
abort "rate limited for #{e.rate_limit.reset_at} more seconds"
end
puts "Collected #{timeline.length}/800 tweets..."
3.times do
max_id = timeline.map {|t| t.id }.sort.first
max_id = max_id - 1
timeline += client.home_timeline(count: 200, max_id: max_id)
puts "Collected #{timeline.length}/800 tweets..."
end
urls = {}
timeline.each do |tweet|
tweet.urls.each do |u|
url_key = u.expanded_url.to_s
# todo: pndo.ly/econ.st have multiple redirects
if url_key.match /(nie\.mn\/)|(goo\.gl\/)|(bit\.ly\/)|(nyti\.ms\/)|(tcrn\.ch\/)|(n\.pr\/)|(bloom\.bg\/)|(ow\.ly\/)|(cjr\.bz\/)|(buff\.ly\/)|(kng\.ht\/)|(vox\.com\/e\/)/
r = Curl.get url_key
resolved = r.header_str.match(/Location\: (.*)\r/)[1] rescue url_key
puts "resolved #{url_key} => #{resolved}"
url_key = resolved
end
url_key = url_key.split('#')[0].gsub(/\/$/, '')
unless url_key.match /youtube\.com/
url_key = url_key.split('?')[0]
end
urls[url_key] ||= {}
urls[url_key][:tweets] ||= []
urls[url_key][:tweets].push tweet
end
end
scored = urls.map do |k, v|
tweets = v[:tweets]
score = tweets.length
if ONE_TWEET_PER_USER
tweets = v[:tweets].uniq {|t| t.user.id}
end
if SORT_BY_FOLLOWERS
scores = tweets.map do |t|
tweet_score = 1
tweet_score += (t.user.followers_count < 200000 ? (t.user.followers_count.to_f / 100000) : 0)
puts "tweet from #{t.user.name} scored #{tweet_score}"
tweet_score
end
score = scores.reduce(:+)
end
[k, score]
end
sorted = scored.sort_by {|a| a[1] * -1}
hydrated = sorted[(0..9)].map do |a|
puts "grokking #{a[0]}..."
a.unshift OpenGraph.new(a[0]).title
end
pp hydrated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment