grailbird_updater 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/grailbird_updater +1 -3
- data/lib/grailbird_updater/version.rb +1 -1
- data/lib/grailbird_updater.rb +41 -13
- metadata +2 -2
data/bin/grailbird_updater
CHANGED
@@ -20,7 +20,6 @@ Usage: updater [options] [path to archive]
|
|
20
20
|
EOS
|
21
21
|
opt :verbose, "Verbose mode"
|
22
22
|
opt :prune, "Prune all but necessary user data from tweets", :default => true
|
23
|
-
opt :limit, "How many tweets to look back at (max: 3200)", :default => 1000
|
24
23
|
opt :directory, "Twitter archive directory", :type => :string
|
25
24
|
end
|
26
25
|
|
@@ -29,6 +28,5 @@ dir ||= opts[:directory]
|
|
29
28
|
dir ||= ARGV.first
|
30
29
|
dir ||= "."
|
31
30
|
raise ArgumentError, "Must specify a directory" unless File.directory?(dir)
|
32
|
-
raise ArgumentError, "Cannot look back further than 3200 tweets" if opts[:limit] > 3200
|
33
31
|
|
34
|
-
GrailbirdUpdater.new(dir, opts[:
|
32
|
+
GrailbirdUpdater.new(dir, opts[:verbose], opts[:prune]).update_tweets
|
data/lib/grailbird_updater.rb
CHANGED
@@ -3,6 +3,7 @@ require "grailbird_updater/version"
|
|
3
3
|
class GrailbirdUpdater
|
4
4
|
|
5
5
|
KEEP_FIELDS = {'user' => ['name', 'screen_name', 'protected', 'id_str', 'profile_image_url_https', 'id', 'verified']}
|
6
|
+
MAX_REQUEST_SIZE = 200
|
6
7
|
|
7
8
|
class JsFile
|
8
9
|
# Read UTF-8 file and return hash of contents (files being read contain JS arrays)
|
@@ -34,15 +35,15 @@ class GrailbirdUpdater
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
37
|
-
def initialize(dir,
|
38
|
+
def initialize(dir, verbose, prune)
|
38
39
|
@base_dir = dir
|
39
40
|
data_path = dir + "/data"
|
40
41
|
@js_path = data_path + "/js"
|
41
42
|
@csv_path = data_path + "/csv"
|
42
43
|
|
43
|
-
@count = count
|
44
44
|
@verbose = verbose
|
45
45
|
@prune = prune
|
46
|
+
@access_token = nil
|
46
47
|
end
|
47
48
|
|
48
49
|
def update_tweets
|
@@ -66,7 +67,7 @@ class GrailbirdUpdater
|
|
66
67
|
|
67
68
|
vputs "Last tweet in archive is\n\t" + display_tweet(last_tweet)
|
68
69
|
|
69
|
-
tweets =
|
70
|
+
tweets = get_twitter_user_timeline_response(screen_name, user_id, last_tweet_id)
|
70
71
|
|
71
72
|
vputs "There have been #{tweets.length} tweets since the archive" + (archive_details.has_key?('updated_at') ? " was last updated on #{archive_details['updated_at']}" : " was created")
|
72
73
|
|
@@ -105,31 +106,58 @@ class GrailbirdUpdater
|
|
105
106
|
GrailbirdUpdater::JsFile.write_with_heading(archive_details, "#{@js_path}/payload_details.js", "var payload_details")
|
106
107
|
end
|
107
108
|
|
108
|
-
def get_twitter_user_timeline_response(screen_name, user_id, last_tweet_id
|
109
|
+
def get_twitter_user_timeline_response(screen_name, user_id, last_tweet_id)
|
109
110
|
twitter_url = "http://api.twitter.com/1/statuses/user_timeline.json"
|
110
111
|
twitter_uri = URI(twitter_url)
|
112
|
+
|
111
113
|
params = {
|
112
|
-
:count =>
|
114
|
+
:count => MAX_REQUEST_SIZE,
|
113
115
|
:user_id => user_id,
|
114
116
|
:since_id => last_tweet_id,
|
115
117
|
:include_rts => true,
|
116
118
|
:include_entities => true}
|
117
119
|
twitter_uri.query = URI.encode_www_form(params)
|
118
120
|
|
121
|
+
response = make_twitter_request(twitter_uri, screen_name)
|
122
|
+
|
123
|
+
response_tweets = JSON.parse(response.body)
|
124
|
+
|
125
|
+
total_tweets = Array.new
|
126
|
+
|
127
|
+
while response_tweets.length > 0
|
128
|
+
total_tweets += response_tweets
|
129
|
+
last_tweet_returned = response_tweets.last
|
130
|
+
params[:max_id] = last_tweet_returned['id'] - 1 # this way the response doesn't include the last tweet from the previous one
|
131
|
+
twitter_uri.query = URI.encode_www_form(params)
|
132
|
+
|
133
|
+
response = make_twitter_request(twitter_uri, screen_name)
|
134
|
+
response_tweets = JSON.parse(response.body)
|
135
|
+
end
|
136
|
+
|
137
|
+
return total_tweets
|
138
|
+
end
|
139
|
+
|
140
|
+
def make_twitter_request(twitter_uri, screen_name)
|
119
141
|
vputs "\nMaking request to #{twitter_uri}\n"
|
120
|
-
response = Net::HTTP.get_response(twitter_uri)
|
121
142
|
|
122
|
-
if
|
123
|
-
|
124
|
-
|
143
|
+
if !@access_token.nil?
|
144
|
+
response = @access_token.request(:get, twitter_uri.to_s)
|
145
|
+
else
|
146
|
+
response = Net::HTTP.get_response(twitter_uri)
|
147
|
+
|
125
148
|
if response.is_a?(Net::HTTPUnauthorized)
|
126
|
-
|
127
|
-
|
128
|
-
exit
|
149
|
+
@access_token = do_oauth_dance(screen_name)
|
150
|
+
response = @access_token.request(:get, twitter_uri.to_s)
|
129
151
|
end
|
130
152
|
end
|
131
153
|
|
132
|
-
|
154
|
+
if response.is_a?(Net::HTTPUnauthorized)
|
155
|
+
puts "\nSomething went wrong trying to authorize grailbird_updater with the account: " + "@#{screen_name}".blue
|
156
|
+
puts "Please delete #{@base_dir}/#{screen_name}_keys.yaml and follow the authorize steps again."
|
157
|
+
exit
|
158
|
+
end
|
159
|
+
|
160
|
+
return response
|
133
161
|
end
|
134
162
|
|
135
163
|
def do_oauth_dance(screen_name)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grailbird_updater
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: oauth
|