opengraph_transporter 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +45 -0
- data/Rakefile +12 -0
- data/bin/opengraph_transporter +21 -0
- data/lib/.DS_Store +0 -0
- data/lib/opengraph_transporter/.DS_Store +0 -0
- data/lib/opengraph_transporter/base.rb +214 -0
- data/lib/opengraph_transporter/browser.rb +99 -0
- data/lib/opengraph_transporter/common.rb +159 -0
- data/lib/opengraph_transporter/gracefulquit.rb +33 -0
- data/lib/opengraph_transporter/resources/FacebookLocales.xml +850 -0
- data/lib/opengraph_transporter/scraper.rb +136 -0
- data/lib/opengraph_transporter/version.rb +3 -0
- data/lib/opengraph_transporter.rb +22 -0
- data/opengraph_transporter.gemspec +31 -0
- data/test/.DS_Store +0 -0
- data/test/lib/.DS_Store +0 -0
- data/test/lib/opengraph_transporter/version_test.rb +8 -0
- data/test/test_helper.rb +3 -0
- metadata +210 -0
@@ -0,0 +1,136 @@
|
|
1
|
+
module OpengraphTransporter
|
2
|
+
class Scraper
|
3
|
+
|
4
|
+
MAX_FB_LOGIN_ATTEMPTS = 3
|
5
|
+
MAX_TRANSLATION_PAGE_LIMIT = 30
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
def ingest_app_translations(app_id, locale)
|
10
|
+
@agent = Mechanize.new
|
11
|
+
# Defaulting to en_US native locale
|
12
|
+
source_app_uri = "https://www.facebook.com/translations/admin/browse.php?search&sloc=en_US&aloc=#{locale}&app=#{app_id}"
|
13
|
+
@agent.get(source_app_uri)
|
14
|
+
login_attempt = 1
|
15
|
+
login(login_attempt) do |continue|
|
16
|
+
if continue
|
17
|
+
puts ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> login current_url >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
18
|
+
puts @agent.page.uri.to_s
|
19
|
+
puts ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
20
|
+
translations_page_index = 0
|
21
|
+
translations_arr = Array.new
|
22
|
+
GracefulQuit.enable
|
23
|
+
recurse_translations(translations_page_index, translations_arr) do |complete_translation_arr, idx|
|
24
|
+
logout
|
25
|
+
return complete_translation_arr
|
26
|
+
end
|
27
|
+
else
|
28
|
+
return []
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def update_display_names!(translations_arr, src_display_name, dst_display_name)
|
34
|
+
say(".....swapping app translation tokens")
|
35
|
+
translation_src_name = "{" << src_display_name << "}"
|
36
|
+
translation_dst_name = "{" << dst_display_name << "}"
|
37
|
+
translations_arr.each_with_index do |el, index|
|
38
|
+
|
39
|
+
if el['native'] =~ /(#{Regexp.escape(translation_src_name)})/i
|
40
|
+
app_name = "#{$1}".strip
|
41
|
+
unless app_name.eql?("application")
|
42
|
+
el['native'].gsub!(/(#{Regexp.escape(translation_src_name)})/i , "#{translation_dst_name}")
|
43
|
+
el['translation'].gsub!(/(#{Regexp.escape(translation_src_name)})/i, "#{translation_dst_name}")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
return translations_arr
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def recurse_translations(translations_page_index, translations_arr, &block)
|
54
|
+
GracefulQuit.check do
|
55
|
+
logout
|
56
|
+
end
|
57
|
+
next_button = @agent.page.link_with(:text => "Next")
|
58
|
+
say(".....processing translations page: " << (translations_page_index + 1).to_s)
|
59
|
+
bundle_translations(translations_arr, translations_page_index)
|
60
|
+
translations_page_index += 1
|
61
|
+
|
62
|
+
if next_button.nil? || translations_page_index > MAX_TRANSLATION_PAGE_LIMIT
|
63
|
+
say(".....completed application translations ingest.")
|
64
|
+
block.call(translations_arr, translations_page_index) if block_given?
|
65
|
+
else
|
66
|
+
next_button.click
|
67
|
+
recurse_translations(translations_page_index, translations_arr, &block) if block_given?
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def bundle_translations(translations_arr, translations_page_index)
|
72
|
+
form = @agent.page
|
73
|
+
form.search('*').select{|e| e[:class] =~ /all_variations/}.each_with_index { |item, index|
|
74
|
+
native = item.search('*').select{|f| f[:class] =~ /native/}.first.text
|
75
|
+
translation = item.search('*').select{|f| f[:class] =~ /s_trans/}.first.text
|
76
|
+
say("#{native} : #{translation}")
|
77
|
+
|
78
|
+
unless native.empty?
|
79
|
+
native_hash = item.attributes['id'].text.sub("variants:","")
|
80
|
+
translations_arr.push({:native_hash => native_hash, :native => native, :translation => translation})
|
81
|
+
end
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
def login(login_attempt, &block)
|
86
|
+
|
87
|
+
if login_attempt <= MAX_FB_LOGIN_ATTEMPTS
|
88
|
+
get_user_credentials
|
89
|
+
say("\n.....logging in to Facebook")
|
90
|
+
form = @agent.page.forms.first
|
91
|
+
form.email = Base.user[:fb_username]
|
92
|
+
form.pass = Base.user[:fb_password]
|
93
|
+
@agent.submit(form, form.buttons.first)
|
94
|
+
|
95
|
+
if @agent.page.uri.to_s =~ /login_attempt/
|
96
|
+
# FB Login error
|
97
|
+
choose do |menu|
|
98
|
+
menu.prompt = "Facebook Login failed..... attempt #{login_attempt}. Would you like to try again? "
|
99
|
+
menu.choice(:Yes) {
|
100
|
+
login_attempt += 1
|
101
|
+
login(login_attempt, &block) if block_given?
|
102
|
+
}
|
103
|
+
menu.choices(:No) {
|
104
|
+
say("...exiting Exporter!")
|
105
|
+
block.call(false) if block_given?
|
106
|
+
}
|
107
|
+
end
|
108
|
+
else
|
109
|
+
block.call(true) if block_given?
|
110
|
+
end
|
111
|
+
else
|
112
|
+
block.call(false) if block_given?
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def logout
|
117
|
+
say(".....logging out of Facebook \n")
|
118
|
+
puts ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> logout current_url >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
119
|
+
puts @agent.page.uri.to_s
|
120
|
+
puts ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
121
|
+
form = @agent.page.form_with(:id => 'logout_form')
|
122
|
+
@agent.submit(form, form.buttons.first)
|
123
|
+
end
|
124
|
+
|
125
|
+
def get_user_credentials
|
126
|
+
Base.user[:fb_username] = ask("Facebook Username: ", lambda { |u| u.to_s.strip } ) do |q|
|
127
|
+
q.validate = lambda { |p| (p =~ /^.+@.+$/) != nil }
|
128
|
+
q.responses[:not_valid] = "Please enter a valid email address."
|
129
|
+
end
|
130
|
+
Base.user[:fb_password] = ask("Password: ") { |q| q.echo = "*" }
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'net/https'
|
3
|
+
require 'addressable/uri'
|
4
|
+
require 'httpclient'
|
5
|
+
require 'highline/import'
|
6
|
+
require 'json'
|
7
|
+
require 'watir'
|
8
|
+
require 'watir-webdriver'
|
9
|
+
require 'nokogiri'
|
10
|
+
require 'mechanize'
|
11
|
+
require 'console_splash'
|
12
|
+
|
13
|
+
module OpengraphTransporter
|
14
|
+
class Error < Exception; end
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'opengraph_transporter/version'
|
18
|
+
require 'opengraph_transporter/base'
|
19
|
+
require 'opengraph_transporter/browser'
|
20
|
+
require 'opengraph_transporter/common'
|
21
|
+
require 'opengraph_transporter/scraper'
|
22
|
+
require 'opengraph_transporter/gracefulquit'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'opengraph_transporter/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = 'opengraph_transporter'
|
8
|
+
gem.version = OpengraphTransporter::VERSION
|
9
|
+
gem.authors = ['Barry Quigley']
|
10
|
+
gem.email = ['barryquigley@yahoo.com']
|
11
|
+
gem.description = %q{Open Graph Translations Exporter.}
|
12
|
+
gem.summary = %q{Transporter provides a quick way of exporting Facebook Open Graph Translations between applications.}
|
13
|
+
gem.homepage = ''
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = ['opengraph_transporter']
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ['lib']
|
19
|
+
|
20
|
+
|
21
|
+
gem.add_dependency 'watir', ['~> 4.0.2']
|
22
|
+
gem.add_dependency 'watir-webdriver', ['~> 0.6.4']
|
23
|
+
gem.add_dependency 'nokogiri', ['~> 1.6.0']
|
24
|
+
gem.add_dependency 'mechanize', ['~> 2.7.1']
|
25
|
+
gem.add_dependency 'httpclient', ['~> 2.3.3']
|
26
|
+
gem.add_dependency 'json', ['~> 1.8.0']
|
27
|
+
gem.add_dependency 'addressable', ['~> 2.2.6']
|
28
|
+
gem.add_dependency 'httpclient', ['~> 2.3.3']
|
29
|
+
gem.add_dependency 'highline', ['~> 1.6.13']
|
30
|
+
gem.add_dependency 'console_splash', ['~> 2.0.1']
|
31
|
+
end
|
data/test/.DS_Store
ADDED
Binary file
|
data/test/lib/.DS_Store
ADDED
Binary file
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: opengraph_transporter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Barry Quigley
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: watir
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.0.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: watir-webdriver
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.6.4
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.6.4
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: nokogiri
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.6.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.6.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: mechanize
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.7.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.7.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: httpclient
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.3.3
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.3.3
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: json
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.8.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.8.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: addressable
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 2.2.6
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 2.2.6
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: httpclient
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.3.3
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ~>
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 2.3.3
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: highline
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ~>
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 1.6.13
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ~>
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 1.6.13
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: console_splash
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ~>
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 2.0.1
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ~>
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 2.0.1
|
153
|
+
description: Open Graph Translations Exporter.
|
154
|
+
email:
|
155
|
+
- barryquigley@yahoo.com
|
156
|
+
executables:
|
157
|
+
- opengraph_transporter
|
158
|
+
extensions: []
|
159
|
+
extra_rdoc_files: []
|
160
|
+
files:
|
161
|
+
- .gitignore
|
162
|
+
- Gemfile
|
163
|
+
- LICENSE.txt
|
164
|
+
- README.md
|
165
|
+
- Rakefile
|
166
|
+
- bin/opengraph_transporter
|
167
|
+
- lib/.DS_Store
|
168
|
+
- lib/opengraph_transporter.rb
|
169
|
+
- lib/opengraph_transporter/.DS_Store
|
170
|
+
- lib/opengraph_transporter/base.rb
|
171
|
+
- lib/opengraph_transporter/browser.rb
|
172
|
+
- lib/opengraph_transporter/common.rb
|
173
|
+
- lib/opengraph_transporter/gracefulquit.rb
|
174
|
+
- lib/opengraph_transporter/resources/FacebookLocales.xml
|
175
|
+
- lib/opengraph_transporter/scraper.rb
|
176
|
+
- lib/opengraph_transporter/version.rb
|
177
|
+
- opengraph_transporter.gemspec
|
178
|
+
- test/.DS_Store
|
179
|
+
- test/lib/.DS_Store
|
180
|
+
- test/lib/opengraph_transporter/version_test.rb
|
181
|
+
- test/test_helper.rb
|
182
|
+
homepage: ''
|
183
|
+
licenses: []
|
184
|
+
metadata: {}
|
185
|
+
post_install_message:
|
186
|
+
rdoc_options: []
|
187
|
+
require_paths:
|
188
|
+
- lib
|
189
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
190
|
+
requirements:
|
191
|
+
- - '>='
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: '0'
|
194
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
195
|
+
requirements:
|
196
|
+
- - '>='
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: '0'
|
199
|
+
requirements: []
|
200
|
+
rubyforge_project:
|
201
|
+
rubygems_version: 2.0.3
|
202
|
+
signing_key:
|
203
|
+
specification_version: 4
|
204
|
+
summary: Transporter provides a quick way of exporting Facebook Open Graph Translations
|
205
|
+
between applications.
|
206
|
+
test_files:
|
207
|
+
- test/.DS_Store
|
208
|
+
- test/lib/.DS_Store
|
209
|
+
- test/lib/opengraph_transporter/version_test.rb
|
210
|
+
- test/test_helper.rb
|