tweet_watch 0.2.1.pre → 0.2.2.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d74bc0d2d02588fbfac1ef6b5531997844e8e350
4
- data.tar.gz: bddd89e90b54464df74c7d07b3c3a186f56affa6
3
+ metadata.gz: 135cdd71414f49d5d20d43045756999d72663523
4
+ data.tar.gz: b37e262046f535e2a3837e6e3c00b1857bd8d6c9
5
5
  SHA512:
6
- metadata.gz: 4ab9c6739f914f3d8b0d319953e7fb481c159da299bdd30616b8c359cc7489b8abbc97e02a2c3f67c3dd425b80630fdcfd18c39643f54375d82bd15ed769d5e7
7
- data.tar.gz: facc27d954fc5773c5531777a4b5b74bdf1a761fada7a270401244a7f282a6b312662ea36c4c79a48a864b6faedd2dff17cb88e966c1c7119d298abcf71d4fb5
6
+ metadata.gz: df719fbcba7108cf2e4098771e3654ffc487747c3c23b38d09ee504a2d3a70efc326dd1264036e933c442f499cb5e982436b33cbc915cd26a710444ae6e6b1ee
7
+ data.tar.gz: 2237e7a3a4ec298b422d2749e5ac3ac5be4bfca71f5ae242bfc7a1c69aa986cdf4b353b551898650a1c554a16deec81627044271ed3d1404bb72834b8a4da14f
data/config.yml CHANGED
@@ -19,10 +19,15 @@ accounts:
19
19
  consumer_secret: YOUR_CONSUMER_SECRET
20
20
 
21
21
  # When using the watch command you can choose
22
- # tweets from cerntail users to be recorded as CSV
23
- # The following tweeters will be recorded
22
+ # tweets from certain users to be recorded as CSV
23
+ # The following tweeters will be recorded. Remove
24
+ # this if you want all tweets to be recorded.
24
25
  tweeters:
25
26
  - scottadamsays
26
27
  - jaketapper
27
28
  - lodr_io
28
- - newsycombinator
29
+ - newsycombinator
30
+
31
+ monitor:
32
+ interval: 10
33
+ account_timeline_history: 100
@@ -1,4 +1,6 @@
1
1
  require 'colorize'
2
+ require 'csv'
3
+ require 'tweet_watch/monitor'
2
4
 
3
5
  module TweetWatch
4
6
 
@@ -30,7 +32,7 @@ module TweetWatch
30
32
  desc "timeline", "Prints out an accounts timeline"
31
33
  option :stream, aliases: "-s",
32
34
  desc: "Will stream a tweets as they come in instead of printing the latest timeline."
33
- option :count, aliases: "-c", default: 50, type: :numeric,
35
+ option :count, aliases: "-n", default: 50, type: :numeric,
34
36
  desc: "Number of past tweets to print out. Max history is 200"
35
37
  def timeline
36
38
  load_config(options)
@@ -46,7 +48,8 @@ module TweetWatch
46
48
  end
47
49
  end
48
50
  else
49
- client(options).home_timeline.each do |tw|
51
+ opts = {count: options[:count]}
52
+ client(options).home_timeline(opts).each do |tw|
50
53
  print_tweet(tw)
51
54
  end
52
55
  end
@@ -64,13 +67,13 @@ module TweetWatch
64
67
  load_config(options)
65
68
 
66
69
  sc = streaming_client(options)
67
- file = File.open(options[:output], "a+")
70
+ file = CSV.open(options[:output], "wb")
68
71
  tw_config = TweetWatch.config
69
72
 
70
73
  tweeters = options[:tweeters] ? options[:tweeters] : tw_config.tweeters
71
74
 
72
- unless file.size > 0
73
- file.puts "timelined_at, tweet_id, screen_name, text, tweet_created_at, is_reply, is_quote"
75
+ unless File.size(options[:output]) > 0
76
+ file << %W(timelined_at tweet_id screen_name text tweet_created_at is_reply is_quote)
74
77
  end
75
78
 
76
79
  puts "Starting stream...".colorize(:light_cyan)
@@ -82,9 +85,10 @@ module TweetWatch
82
85
  print_tweet obj
83
86
  end
84
87
 
85
- if tw_config.tweeters.empty? || tweeters.include?(obj.user.screen_name)
88
+ if tw_config.tweeters.empty? || tw_config.has_tweeter?(obj.user.screen_name)
86
89
  puts "recording tweet data".colorize(:red)
87
- file.puts "#{time.utc}, #{obj.id}, \"#{escape_str(obj.user.screen_name)}\", \"#{escape_str(obj.text)}\", #{obj.created_at.getutc},\"#{escape_str(obj.user.screen_name)}\", #{obj.reply?}, #{obj.quote?}"
90
+ file << [time.utc, obj.id, obj.user.screen_name, obj.text,obj.created_at.getutc,obj.user.screen_name, obj.reply?, obj.quote?]
91
+ file.flush
88
92
  end
89
93
  elsif obj.class == Twitter::DirectMessage
90
94
  print_dm obj
@@ -97,6 +101,13 @@ module TweetWatch
97
101
  end
98
102
  end
99
103
 
104
+ desc "monitor", "Monitors target tweeters tweets and provided account timelines."
105
+ def monitor
106
+ load_config(options)
107
+ m = TweetWatch::Monitor.new
108
+ m.run
109
+ end
110
+
100
111
  end
101
112
 
102
113
  end
@@ -1,10 +1,12 @@
1
1
  module TweetWatch
2
2
  module Client
3
3
 
4
- def client(options)
4
+ def client(options = {})
5
+ return @client if options.nil? && @client
6
+
5
7
  account = TweetWatch.config.get_account(options[:screen_name])
6
8
 
7
- @client ||= Twitter::REST::Client.new do |config|
9
+ @client = Twitter::REST::Client.new do |config|
8
10
  config.consumer_key = account.consumer_key
9
11
  config.consumer_secret = account.consumer_secret
10
12
  config.access_token = account.access_token
@@ -12,10 +14,12 @@ module TweetWatch
12
14
  end
13
15
  end
14
16
 
15
- def streaming_client(options)
17
+ def streaming_client(options = {})
18
+ return @client if options.nil? && @client
19
+
16
20
  account = TweetWatch.config.get_account(options[:screen_name])
17
21
 
18
- @client ||= Twitter::Streaming::Client.new do |config|
22
+ @client = Twitter::Streaming::Client.new do |config|
19
23
  config.consumer_key = account.consumer_key
20
24
  config.consumer_secret = account.consumer_secret
21
25
  config.access_token = account.access_token
@@ -29,13 +29,18 @@ module TweetWatch
29
29
 
30
30
  unless c["tweeters"].nil?
31
31
  c["tweeters"].each do |t|
32
- self.tweeters << t
32
+ self.tweeters << t unless has_tweeter?(t)
33
33
  end
34
34
  end
35
35
 
36
36
  self
37
37
  end
38
38
 
39
+ def has_tweeter?(tweeter)
40
+ res = @tweeters.find{|t| t.downcase.strip == tweeter.downcase.strip }
41
+ res != nil
42
+ end
43
+
39
44
  def valid?
40
45
  @error_message = ""
41
46
  @error_message += "There should be at least one account" if accounts.size ==0
@@ -0,0 +1,93 @@
1
+ require 'csv'
2
+ require 'tweet_watch/utils'
3
+ require 'tweet_watch/client'
4
+
5
+ module TweetWatch
6
+
7
+ class Monitor
8
+
9
+ include TweetWatch::Client
10
+ include TweetWatch::Utils
11
+
12
+ def initialize
13
+ @new_tweeter_tweets = 0
14
+
15
+ if TweetWatch.config.tweeters.empty?
16
+ raise ArgumentError.new("Monitor requires list of target tweeters. Please update config")
17
+ end
18
+
19
+ if TweetWatch.config.accounts.empty?
20
+ raise ArgumentError.new("Monitor requires at least one account. Please update config")
21
+ end
22
+
23
+ @tweeter_state = {}
24
+ end
25
+
26
+ def run
27
+ TweetWatch.config.tweeters.each do |tweeter|
28
+ record_user_tweets(tweeter)
29
+ sleep(1)
30
+ end
31
+
32
+ if @new_tweeter_tweets > 0
33
+ TweetWatch.config.accounts.each do |account|
34
+ record_timeline(account)
35
+ end
36
+ end
37
+
38
+ @new_tweeter_tweets = 0
39
+
40
+ sleep(20)
41
+ self.run
42
+ end
43
+
44
+ private
45
+
46
+ def record_timeline(account)
47
+ puts "recording timeline for @#{account.screen_name}..."
48
+
49
+ c = client({screen_name: account.screen_name})
50
+ time = Time.now.utc
51
+ timeline = c.home_timeline({count: 200})
52
+
53
+ file = CSV.open("account_timeline.csv", "a+")
54
+ unless File.size("account_timeline.csv") > 0
55
+ file << %W(recorded_at tweet_id screen_name text tweet_created_at timeline_account is_reply is_quote)
56
+ end
57
+
58
+ timeline.each do |obj|
59
+ file << [time, obj.id, obj.user.screen_name, obj.text,obj.created_at.getutc,account.screen_name, obj.reply?, obj.quote?]
60
+ end
61
+
62
+ file.close
63
+ end
64
+
65
+ def record_user_tweets(tweeter)
66
+ puts "collecting @#{tweeter} tweets..."
67
+ time = Time.now.utc
68
+
69
+ opts = {count: 200}
70
+ if @tweeter_state[tweeter]
71
+ opts[:since_id] = @tweeter_state[tweeter]
72
+ end
73
+
74
+ timeline = client.user_timeline(tweeter,opts)
75
+
76
+ file = CSV.open("tweeter_tweets.csv", "a+")
77
+ unless File.size("tweeter_tweets.csv") > 0
78
+ file << %W(recorded_at tweet_id screen_name text tweet_created_at is_reply is_quote)
79
+ end
80
+
81
+ @new_tweeter_tweets += timeline.size
82
+ timeline.each do |obj|
83
+ file << [time, obj.id, obj.user.screen_name, obj.text,obj.created_at.getutc, obj.reply?, obj.quote?]
84
+ end
85
+
86
+ @tweeter_state[tweeter] = timeline.first.id if timeline.size > 0
87
+ puts "New tweets since last checking? : #{@new_tweeter_tweets}"
88
+ file.close
89
+ end
90
+
91
+ end
92
+
93
+ end
@@ -1,3 +1,3 @@
1
1
  module TweetWatch
2
- VERSION = "0.2.1.pre"
2
+ VERSION = "0.2.2.pre"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tweet_watch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1.pre
4
+ version: 0.2.2.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ajo Abraham
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-20 00:00:00.000000000 Z
11
+ date: 2017-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -118,6 +118,7 @@ files:
118
118
  - lib/tweet_watch/cli.rb
119
119
  - lib/tweet_watch/client.rb
120
120
  - lib/tweet_watch/config.rb
121
+ - lib/tweet_watch/monitor.rb
121
122
  - lib/tweet_watch/utils.rb
122
123
  - lib/tweet_watch/version.rb
123
124
  - tweet_watch.gemspec