cablegator 0.9.2 → 0.9.9
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +29 -0
- data/README.md +16 -8
- data/TODO +5 -0
- data/bin/download_cables +10 -16
- data/bin/tweet_cables +26 -0
- data/bin/tweet_cables_format +31 -0
- data/cablegator.gemspec +3 -0
- data/lib/cablegator.rb +18 -8
- data/lib/cablegator/twitter.rb +35 -0
- data/lib/cablegator/version.rb +1 -1
- data/lib/cablegator/wikileaks.rb +56 -2
- metadata +48 -3
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,14 +1,43 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://gemcutter.org/
|
3
3
|
specs:
|
4
|
+
addressable (2.2.2)
|
5
|
+
configuration (1.2.0)
|
4
6
|
crack (0.1.8)
|
7
|
+
faraday (0.5.3)
|
8
|
+
addressable (~> 2.2.2)
|
9
|
+
multipart-post (~> 1.0.1)
|
10
|
+
rack (>= 1.1.0, < 2)
|
11
|
+
faraday_middleware (0.3.1)
|
12
|
+
faraday (~> 0.5.3)
|
13
|
+
hashie (0.4.0)
|
5
14
|
httparty (0.6.1)
|
6
15
|
crack (= 0.1.8)
|
16
|
+
launchy (0.3.7)
|
17
|
+
configuration (>= 0.0.5)
|
18
|
+
rake (>= 0.8.1)
|
19
|
+
multi_json (0.0.5)
|
20
|
+
multi_xml (0.2.0)
|
21
|
+
multipart-post (1.0.1)
|
7
22
|
nokogiri (1.4.4)
|
23
|
+
oauth (0.4.4)
|
24
|
+
rack (1.2.1)
|
25
|
+
rake (0.8.7)
|
26
|
+
simple_oauth (0.1.3)
|
27
|
+
twitter (1.0.0)
|
28
|
+
faraday (~> 0.5.3)
|
29
|
+
faraday_middleware (~> 0.3.0)
|
30
|
+
hashie (~> 0.4.0)
|
31
|
+
multi_json (~> 0.0.5)
|
32
|
+
multi_xml (~> 0.2.0)
|
33
|
+
simple_oauth (~> 0.1.2)
|
8
34
|
|
9
35
|
PLATFORMS
|
10
36
|
ruby
|
11
37
|
|
12
38
|
DEPENDENCIES
|
13
39
|
httparty
|
40
|
+
launchy
|
14
41
|
nokogiri
|
42
|
+
oauth
|
43
|
+
twitter
|
data/README.md
CHANGED
@@ -1,20 +1,28 @@
|
|
1
1
|
# cablegator
|
2
2
|
Downloads WikiLeaks CableGate cables for offline viewing and archiving
|
3
|
+
Tweets link to Wikileaks CableGate cables- making the information within easy reach of the twitterverse.
|
3
4
|
|
4
5
|
Install via:
|
5
6
|
<code>
|
6
7
|
> gem install cablegator
|
7
8
|
</code>
|
8
9
|
|
9
|
-
|
10
10
|
Run Via:
|
11
11
|
<code>
|
12
|
-
|
13
|
-
|
14
|
-
You already have 66BUENOSAIRES2481 in /Users/csquared/projects/cablegator/cable/1966/12/66BUENOSAIRES2481.html
|
15
|
-
You already have 72TEHRAN1164 in /Users/csquared/projects/cablegator/cable/1972/02/72TEHRAN1164.html
|
16
|
-
You already have 72TEHRAN5055 in /Users/csquared/projects/cablegator/cable/1972/08/72TEHRAN5055.htm
|
17
|
-
Downloading cable 75TEHRAN2069 to /Users/csquared/projects/cablegator//cable/1975/03/75TEHRAN2069.html
|
18
|
-
...
|
12
|
+
> download_cables <path>
|
13
|
+
</code>
|
19
14
|
|
15
|
+
And
|
16
|
+
<code>
|
17
|
+
> tweet_cables <delay in seconds>
|
20
18
|
</code>
|
19
|
+
You will then be prompted to login to Twitter from the cmd line.
|
20
|
+
From here the program tweets links to all the cables, waiting between posts. Default delay is 1 second.
|
21
|
+
|
22
|
+
#TODO:
|
23
|
+
* DONE - Don't tweet if already tweeted
|
24
|
+
* Allow tweet customization
|
25
|
+
* Create webapp to run this
|
26
|
+
|
27
|
+
#Features:
|
28
|
+
* Disqualifies you from employment at various federal agencies.
|
data/TODO
ADDED
data/bin/download_cables
CHANGED
@@ -1,25 +1,19 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
require 'cablegator'
|
3
|
-
require '
|
3
|
+
require 'fileutils'
|
4
4
|
|
5
5
|
dir_prefix = ARGV[0] || Dir.pwd
|
6
6
|
|
7
7
|
puts "Downloading cables to #{File.expand_path(dir_prefix)}"
|
8
|
-
|
8
|
+
Wikileaks.with_each_cable do |cable_url|
|
9
|
+
file_location = File.expand_path(dir_prefix + cable_url)
|
10
|
+
reference_id = Wikileaks.reference_id(cable_url)
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
reference_id
|
16
|
-
|
17
|
-
if !File.exist?(file_location)
|
18
|
-
FileUtils.mkdir_p(File.dirname(file_location))
|
19
|
-
STDOUT.puts "Downloading cable #{reference_id} to #{file_location}"
|
20
|
-
File.open(file_location, 'w') { |f| f << WikiLeaks.get(cable_url) }
|
21
|
-
else
|
22
|
-
STDOUT.puts "You already have #{reference_id} in #{file_location}"
|
23
|
-
end
|
12
|
+
if !File.exist?(file_location)
|
13
|
+
FileUtils.mkdir_p(File.dirname(file_location))
|
14
|
+
STDOUT.puts "Downloading cable #{reference_id} to #{file_location}"
|
15
|
+
File.open(file_location, 'w') { |f| f << WikiLeaks.get(cable_url) }
|
16
|
+
else
|
17
|
+
STDOUT.puts "You already have #{reference_id} in #{file_location}"
|
24
18
|
end
|
25
19
|
end
|
data/bin/tweet_cables
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
require 'twitter'
|
3
|
+
require 'cablegator'
|
4
|
+
require 'cablegator/twitter'
|
5
|
+
|
6
|
+
Twitter.command_line_login
|
7
|
+
tweeted = CableGator.save_file("~/.cablegator/tweeted")
|
8
|
+
|
9
|
+
puts "Tweeting cables"
|
10
|
+
WikiLeaks.with_each_cable do |cable_url|
|
11
|
+
reference_id = WikiLeaks.reference_id(cable_url)
|
12
|
+
if tweeted.include?(reference_id)
|
13
|
+
puts "Already tweeted #{reference_id}"
|
14
|
+
else
|
15
|
+
tweet = "#cablegate ##{reference_id} #{WikiLeaks.base_uri + cable_url}"
|
16
|
+
puts "Tweeting: #{tweet}"
|
17
|
+
begin
|
18
|
+
Twitter.update(tweet)
|
19
|
+
tweeted << reference_id
|
20
|
+
delay = ARGV[0].to_i rescue nil
|
21
|
+
sleep(delay || 1)
|
22
|
+
rescue
|
23
|
+
"Tweet #{reference_id} failed"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
require 'twitter'
|
3
|
+
require 'cablegator'
|
4
|
+
require 'cablegator/twitter'
|
5
|
+
|
6
|
+
Twitter.command_line_login
|
7
|
+
tweeted = CableGator.save_file("~/.cablegator/tweeted_fmt_#{ARGV[0].to_s.gsub(/:| /,'')}")
|
8
|
+
|
9
|
+
puts "Tweeting cables"
|
10
|
+
WikiLeaks.with_each_cable_data do |cable_data|
|
11
|
+
reference_id = cable_data['reference_id']
|
12
|
+
|
13
|
+
if tweeted.include?(reference_id)
|
14
|
+
puts "Already tweeted #{reference_id}"
|
15
|
+
else
|
16
|
+
format_string = ARGV[0].to_s.dup
|
17
|
+
cable_data.each { |k,v| format_string.gsub!(/\:#{k}/,v) }
|
18
|
+
|
19
|
+
tweet = "#cablegate ##{reference_id} #{format_string}"
|
20
|
+
|
21
|
+
puts "Tweeting: #{tweet}"
|
22
|
+
begin
|
23
|
+
Twitter.update(tweet)
|
24
|
+
tweeted << reference_id
|
25
|
+
delay = ARGV[1].to_i rescue nil
|
26
|
+
sleep(delay || 10)
|
27
|
+
rescue
|
28
|
+
"Tweet #{reference_id} failed"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/cablegator.gemspec
CHANGED
@@ -16,6 +16,9 @@ Gem::Specification.new do |s|
|
|
16
16
|
|
17
17
|
s.add_dependency('nokogiri')
|
18
18
|
s.add_dependency('httparty')
|
19
|
+
s.add_dependency('twitter')
|
20
|
+
s.add_dependency('oauth')
|
21
|
+
s.add_dependency('launchy')
|
19
22
|
|
20
23
|
s.files = `git ls-files`.split("\n")
|
21
24
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/lib/cablegator.rb
CHANGED
@@ -1,12 +1,22 @@
|
|
1
1
|
# library loader
|
2
|
-
require 'rubygems'
|
3
|
-
#require 'bundler'
|
4
|
-
#Bundler.setup
|
2
|
+
# require 'rubygems'
|
3
|
+
# require 'bundler'
|
4
|
+
# Bundler.setup
|
5
5
|
|
6
6
|
$LOAD_PATH.unshift(File.dirname(__FILE__)) unless $LOAD_PATH.include?(File.dirname(__FILE__))
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
require 'fileutils'
|
8
|
+
require 'cablegator/wikileaks'
|
9
|
+
|
10
|
+
module CableGator
|
11
|
+
def self.save_file(pathname)
|
12
|
+
require 'fileutils'
|
13
|
+
save_file = File.expand_path(pathname)
|
14
|
+
FileUtils.mkdir_p(File.dirname(save_file))
|
15
|
+
|
16
|
+
tweeted = File.read(save_file).split(',') rescue []
|
17
|
+
at_exit do
|
18
|
+
File.open(save_file, 'w') { |f| f << tweeted.join(',') }
|
19
|
+
end
|
20
|
+
tweeted
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'oauth'
|
2
|
+
require 'launchy'
|
3
|
+
|
4
|
+
module Twitter
|
5
|
+
def self.command_line_login
|
6
|
+
consumer_key = 'ddxhhHSHys7210VR8lhYag'
|
7
|
+
consumer_secret = 'FN5kIDAvwWU4jb54JMfWWTbtpI30JKeEmRWMYSMYk'
|
8
|
+
|
9
|
+
oauth_client = OAuth::Consumer.new(consumer_key, consumer_secret,
|
10
|
+
:site => 'http://api.twitter.com',
|
11
|
+
:request_endpoint => 'http://api.twitter.com',
|
12
|
+
:sign_in => true)
|
13
|
+
|
14
|
+
req_token = oauth_client.get_request_token
|
15
|
+
Launchy.open(req_token.authorize_url)
|
16
|
+
|
17
|
+
puts "\nAllow access to get pin\n"
|
18
|
+
|
19
|
+
puts "Enter Pin: "
|
20
|
+
pin = STDIN.gets.strip
|
21
|
+
|
22
|
+
begin
|
23
|
+
access_token = req_token.get_access_token(:oauth_verifier => pin)
|
24
|
+
|
25
|
+
Twitter.configure do |config|
|
26
|
+
config.consumer_key = access_token.consumer.key
|
27
|
+
config.consumer_secret = access_token.consumer.secret
|
28
|
+
config.oauth_token = access_token.token
|
29
|
+
config.oauth_token_secret = access_token.secret
|
30
|
+
end
|
31
|
+
rescue
|
32
|
+
STDOUT.puts "Twitter Authentication failed - please try again"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/cablegator/version.rb
CHANGED
data/lib/cablegator/wikileaks.rb
CHANGED
@@ -1,12 +1,66 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'timeout'
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'httparty'
|
5
|
+
|
1
6
|
class WikiLeaks
|
2
7
|
include HTTParty
|
8
|
+
PROXY_URL = 'localhost'
|
9
|
+
PROXY_PORT = 8118
|
3
10
|
base_uri 'http://wikileaks.ch'
|
4
11
|
|
12
|
+
#let's check for tor on privoxy
|
13
|
+
Timeout::timeout(1) do
|
14
|
+
TCPSocket.new(PROXY_URL, PROXY_PORT).close
|
15
|
+
http_proxy 'localhost', 8118
|
16
|
+
puts "Using TOR!"
|
17
|
+
end rescue nil
|
18
|
+
|
5
19
|
HOME = '/cablegate.html'
|
6
20
|
|
7
21
|
class << self
|
8
|
-
def
|
9
|
-
|
22
|
+
def reference_id(cable_url)
|
23
|
+
File.basename(cable_url).gsub(File.extname(cable_url),'')
|
24
|
+
end
|
25
|
+
|
26
|
+
def with_each_cable
|
27
|
+
doc = Nokogiri::HTML(self.get(HOME))
|
28
|
+
doc.css(%{a[href^='/date']}).each do |link|
|
29
|
+
cable_url = link.attributes['href'].value
|
30
|
+
begin
|
31
|
+
page_with_cables = Nokogiri::HTML(WikiLeaks.get(cable_url))
|
32
|
+
page_with_cables.css(%{a[href^='/cable']}).each do |cable|
|
33
|
+
cable_url = cable.attributes['href'].value
|
34
|
+
yield cable_url
|
35
|
+
end
|
36
|
+
rescue
|
37
|
+
STDOUT.puts "error GETtin page #{cable_url}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def with_each_cable_data
|
43
|
+
doc = Nokogiri::HTML(self.get(HOME))
|
44
|
+
doc.css(%{a[href^='/date']}).each do |link|
|
45
|
+
cable_url = link.attributes['href'].value
|
46
|
+
begin
|
47
|
+
page_with_cables = Nokogiri::HTML(WikiLeaks.get(cable_url))
|
48
|
+
page_with_cables.css(%{table.cable tr:has(td)}).each do |cable|
|
49
|
+
cable_hash = {}
|
50
|
+
#cable_hash['cable_url'] = cable.css(%{a[href='/cable']}).first.attributes['href'].value
|
51
|
+
children = cable.element_children.map{ |x| x.text.strip }
|
52
|
+
cable_hash['reference_id'] = children[0]
|
53
|
+
cable_hash['subject'] = children[1]
|
54
|
+
cable_hash['origin_date'] = children[2]
|
55
|
+
cable_hash['release_date'] = children[3]
|
56
|
+
cable_hash['classification'] = children[4]
|
57
|
+
cable_hash['location'] = children[5]
|
58
|
+
yield cable_hash
|
59
|
+
end
|
60
|
+
rescue
|
61
|
+
STDOUT.puts "error GETtin page #{cable_url}"
|
62
|
+
end
|
63
|
+
end
|
10
64
|
end
|
11
65
|
end
|
12
66
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 9
|
8
|
-
-
|
9
|
-
version: 0.9.
|
8
|
+
- 9
|
9
|
+
version: 0.9.9
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- csquared
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-13 00:00:00 -06:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -43,11 +43,52 @@ dependencies:
|
|
43
43
|
version: "0"
|
44
44
|
type: :runtime
|
45
45
|
version_requirements: *id002
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: twitter
|
48
|
+
prerelease: false
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
version: "0"
|
57
|
+
type: :runtime
|
58
|
+
version_requirements: *id003
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: oauth
|
61
|
+
prerelease: false
|
62
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
version: "0"
|
70
|
+
type: :runtime
|
71
|
+
version_requirements: *id004
|
72
|
+
- !ruby/object:Gem::Dependency
|
73
|
+
name: launchy
|
74
|
+
prerelease: false
|
75
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
version: "0"
|
83
|
+
type: :runtime
|
84
|
+
version_requirements: *id005
|
46
85
|
description: Downloads Wikileaks Cables to current directory
|
47
86
|
email:
|
48
87
|
- christopher.continanza@gmail.com
|
49
88
|
executables:
|
50
89
|
- download_cables
|
90
|
+
- tweet_cables
|
91
|
+
- tweet_cables_format
|
51
92
|
extensions: []
|
52
93
|
|
53
94
|
extra_rdoc_files: []
|
@@ -58,9 +99,13 @@ files:
|
|
58
99
|
- Gemfile.lock
|
59
100
|
- README.md
|
60
101
|
- Rakefile
|
102
|
+
- TODO
|
61
103
|
- bin/download_cables
|
104
|
+
- bin/tweet_cables
|
105
|
+
- bin/tweet_cables_format
|
62
106
|
- cablegator.gemspec
|
63
107
|
- lib/cablegator.rb
|
108
|
+
- lib/cablegator/twitter.rb
|
64
109
|
- lib/cablegator/version.rb
|
65
110
|
- lib/cablegator/wikileaks.rb
|
66
111
|
has_rdoc: true
|