google_api 1.0.3 → 1.1.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +8 -0
- data/README.md +8 -6
- data/google_api.gemspec +2 -2
- data/lib/google_api.rb +10 -9
- data/lib/google_api/configuration.rb +19 -5
- data/lib/google_api/ga/data.rb +154 -173
- data/lib/google_api/{ga.rb → ga/ga.rb} +0 -12
- data/lib/google_api/ga/session.rb +3 -143
- data/lib/google_api/session/session.rb +202 -0
- data/lib/google_api/session/session_methods.rb +41 -0
- data/lib/google_api/shorten/session.rb +16 -0
- data/lib/google_api/shorten/shorten.rb +28 -0
- data/lib/google_api/shorten/url/get.rb +32 -0
- data/lib/google_api/shorten/url/insert.rb +28 -0
- data/lib/google_api/shorten/url/list.rb +26 -0
- data/lib/google_api/shorten/url/url.rb +11 -0
- data/lib/google_api/version.rb +1 -1
- data/spec/lib/google_api_ga_data_spec.rb +0 -8
- metadata +16 -10
- data/lib/google_api/date.rb +0 -58
- data/lib/google_api/ga/helper.rb +0 -41
@@ -2,13 +2,6 @@ module GoogleApi
|
|
2
2
|
module Ga
|
3
3
|
|
4
4
|
CONFIGURATION = {
|
5
|
-
client_id: nil,
|
6
|
-
client_secret: nil,
|
7
|
-
client_developer_email: nil,
|
8
|
-
client_cert_file: nil,
|
9
|
-
key_secret: 'notasecret',
|
10
|
-
redirect_uri: nil,
|
11
|
-
|
12
5
|
cache: GoogleApi::Cache.new
|
13
6
|
}
|
14
7
|
|
@@ -23,17 +16,12 @@ module GoogleApi
|
|
23
16
|
autoload :Goal, 'google_api/ga/management/goal'
|
24
17
|
autoload :Segment, 'google_api/ga/management/segment'
|
25
18
|
|
26
|
-
# Helper
|
27
|
-
autoload :Helper, 'google_api/ga/helper'
|
28
|
-
|
29
19
|
# Data
|
30
20
|
autoload :Data, 'google_api/ga/data'
|
31
21
|
autoload :DataDsl, 'google_api/ga/data/data_dsl'
|
32
22
|
autoload :FiltersDsl, 'google_api/ga/data/filters_dsl'
|
33
23
|
autoload :SegmentDsl, 'google_api/ga/data/segment_dsl'
|
34
24
|
|
35
|
-
extend GoogleApi::Ga::Helper
|
36
|
-
|
37
25
|
@@id = 0
|
38
26
|
|
39
27
|
def self.id(id=nil)
|
@@ -1,155 +1,15 @@
|
|
1
|
-
require "google_api/core_ext/string"
|
2
|
-
|
3
1
|
module GoogleApi
|
4
2
|
module Ga
|
5
|
-
|
6
|
-
class Session
|
3
|
+
class Session < GoogleApi::SessionMethods
|
7
4
|
|
8
5
|
SCOPE = "https://www.googleapis.com/auth/analytics.readonly"
|
9
6
|
NAME_API = "analytics"
|
10
7
|
VERSION_API = "v3"
|
11
8
|
|
12
|
-
|
13
|
-
@@client = nil
|
14
|
-
|
15
|
-
# Config --------------------------------------------------------------------------------
|
16
|
-
|
17
|
-
def self._config
|
18
|
-
GoogleApi.config
|
19
|
-
end
|
20
|
-
|
21
|
-
[:client_id, :client_secret, :redirect_uri, :client_cert_file, :client_developer_email, :key_secret].each do |key|
|
22
|
-
eval <<-METHOD
|
23
|
-
def self.#{key}
|
24
|
-
to_return = _config.ga.#{key} ? _config.ga.#{key} : _config.#{key}
|
25
|
-
|
26
|
-
if to_return.nil?
|
27
|
-
raise GoogleApi::CanBeNilError, "#{key} can be nil."
|
28
|
-
end
|
29
|
-
|
30
|
-
to_return
|
31
|
-
end
|
32
|
-
METHOD
|
33
|
-
end
|
34
|
-
|
35
|
-
# ---------------------------------------------------------------------------------------
|
36
|
-
|
37
|
-
def self.login_by_cert
|
38
|
-
@@client = Google::APIClient.new
|
39
|
-
|
40
|
-
key = Google::APIClient::PKCS12.load_key(client_cert_file, key_secret)
|
41
|
-
asserter = Google::APIClient::JWTAsserter.new(client_developer_email, SCOPE, key)
|
42
|
-
|
43
|
-
begin
|
44
|
-
@@client.authorization = asserter.authorize()
|
45
|
-
@@api = @@client.discovered_api(NAME_API, VERSION_API)
|
46
|
-
rescue
|
47
|
-
return false
|
48
|
-
end
|
49
|
-
|
50
|
-
return true
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.login_by_cert!
|
54
|
-
i = 0
|
55
|
-
while !login_by_cert
|
56
|
-
print "\r[#{Time.now.strftime("%H:%M:%S")}] ##{i += 1} ... \r".bold
|
57
|
-
sleep(1)
|
58
|
-
end
|
59
|
-
|
60
|
-
return true
|
61
|
-
end
|
62
|
-
|
63
|
-
def self.login(code = nil)
|
64
|
-
@@client = Google::APIClient.new
|
65
|
-
@@client.authorization.client_id = client_id
|
66
|
-
@@client.authorization.client_secret = client_secret
|
67
|
-
@@client.authorization.scope = SCOPE
|
68
|
-
@@client.authorization.redirect_uri = redirect_uri
|
69
|
-
|
70
|
-
@@api = @@client.discovered_api(NAME_API, VERSION_API)
|
71
|
-
|
72
|
-
if code
|
73
|
-
@@client.authorization.code = code
|
74
|
-
|
75
|
-
begin
|
76
|
-
@@client.authorization.fetch_access_token!
|
77
|
-
rescue
|
78
|
-
return false
|
79
|
-
end
|
80
|
-
|
81
|
-
return true
|
82
|
-
else
|
83
|
-
@@client.authorization.authorization_uri.to_s
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def self.login_by_line(server = 'http://localhost/oauth2callback', port = 0)
|
88
|
-
require "launchy" # open browser
|
89
|
-
require "socket" # make tcp server
|
90
|
-
require "uri" # parse uri
|
9
|
+
CONFIG_NAME = "ga"
|
91
10
|
|
92
|
-
|
93
|
-
|
94
|
-
# Start webserver.
|
95
|
-
webserver = TCPServer.new(uri.host, port)
|
96
|
-
|
97
|
-
# By default port is 0. It means that TCPServer will get first free port.
|
98
|
-
# Port is required for redirect_uri.
|
99
|
-
uri.port = webserver.addr[1]
|
100
|
-
|
101
|
-
# Add redirect_uri for google oauth 2 callback.
|
102
|
-
GoogleApi.config.ga.redirect_uri = uri.to_s
|
103
|
-
|
104
|
-
# Open browser.
|
105
|
-
Launchy.open(login)
|
106
|
-
|
107
|
-
# Wait for new session.
|
108
|
-
session = webserver.accept
|
109
|
-
|
110
|
-
# Parse header for query.
|
111
|
-
request = session.gets.gsub(/GET\ \//, '').gsub(/\ HTTP.*/, '')
|
112
|
-
request = Hash[URI.decode_www_form(URI(request).query)]
|
113
|
-
|
114
|
-
code = request['code']
|
115
|
-
|
116
|
-
# Close session and webserver.
|
117
|
-
session.close
|
118
|
-
|
119
|
-
if login(code)
|
120
|
-
session.write("You have been successfully logged. Now you can close the browser.")
|
121
|
-
|
122
|
-
return true
|
123
|
-
end
|
124
|
-
|
125
|
-
session.write("You have not been logged. Please try again.")
|
126
|
-
|
127
|
-
return false
|
128
|
-
end
|
129
|
-
|
130
|
-
def self.check_session!
|
131
|
-
if @@api.nil? || @@client.nil?
|
132
|
-
raise GoogleApi::SessionError, "You are not log in."
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
def self.api
|
137
|
-
check_session!
|
138
|
-
|
139
|
-
@@api
|
140
|
-
end
|
141
|
-
|
142
|
-
def self.client
|
143
|
-
check_session!
|
144
|
-
|
145
|
-
if @@client.authorization.refresh_token && @@client.authorization.expired?
|
146
|
-
@@client.authorization.fetch_access_token!
|
147
|
-
end
|
148
|
-
|
149
|
-
@@client
|
150
|
-
end
|
11
|
+
@@session = GoogleApi::Session.new(CONFIG_NAME, SCOPE, NAME_API, VERSION_API)
|
151
12
|
|
152
13
|
end
|
153
|
-
|
154
14
|
end
|
155
15
|
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
require "google_api/core_ext/string"
|
2
|
+
|
3
|
+
module GoogleApi
|
4
|
+
class Session
|
5
|
+
|
6
|
+
attr_reader :scope
|
7
|
+
|
8
|
+
def initialize(config_name, scope, name_api, version_api)
|
9
|
+
@config_name = config_name
|
10
|
+
@scope = scope
|
11
|
+
@name_api = name_api
|
12
|
+
@version_api = version_api
|
13
|
+
|
14
|
+
@client = nil
|
15
|
+
@api = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
# Login using cert file (Service account)
|
19
|
+
#
|
20
|
+
# Required: client_cert_file, client_developer_email, key_secret
|
21
|
+
#
|
22
|
+
# Success: return true
|
23
|
+
# Failure: return false
|
24
|
+
#
|
25
|
+
def login_by_cert
|
26
|
+
@client = Google::APIClient.new
|
27
|
+
|
28
|
+
key = Google::APIClient::PKCS12.load_key(c('client_cert_file'), c('key_secret'))
|
29
|
+
asserter = Google::APIClient::JWTAsserter.new(c('client_developer_email'), @scope, key)
|
30
|
+
|
31
|
+
begin
|
32
|
+
@client.authorization = asserter.authorize()
|
33
|
+
@api = @client.discovered_api(@name_api, @version_api)
|
34
|
+
rescue
|
35
|
+
return false
|
36
|
+
end
|
37
|
+
|
38
|
+
return true
|
39
|
+
end
|
40
|
+
|
41
|
+
# In loop call login_by_cert
|
42
|
+
#
|
43
|
+
# return true after successful login
|
44
|
+
# loop can be stopped with ctr+c - return false
|
45
|
+
#
|
46
|
+
def login_by_cert!
|
47
|
+
trap("INT"){ return false }
|
48
|
+
|
49
|
+
i = 0
|
50
|
+
until login_by_cert
|
51
|
+
progress_log(i+=1)
|
52
|
+
sleep(1)
|
53
|
+
end
|
54
|
+
|
55
|
+
return true
|
56
|
+
end
|
57
|
+
|
58
|
+
# Classic oauth 2 login
|
59
|
+
#
|
60
|
+
# login() -> return autorization url
|
61
|
+
# login(code) -> try login, return true false
|
62
|
+
#
|
63
|
+
def login(code = nil)
|
64
|
+
@client = Google::APIClient.new
|
65
|
+
@client.authorization.client_id = c('client_id')
|
66
|
+
@client.authorization.client_secret = c('client_secret')
|
67
|
+
@client.authorization.scope = @scope
|
68
|
+
@client.authorization.redirect_uri = c('redirect_uri')
|
69
|
+
|
70
|
+
@api = @client.discovered_api(@name_api, @version_api)
|
71
|
+
|
72
|
+
unless code
|
73
|
+
return @client.authorization.authorization_uri.to_s
|
74
|
+
end
|
75
|
+
|
76
|
+
begin
|
77
|
+
@client.authorization.code = code
|
78
|
+
@client.authorization.fetch_access_token!
|
79
|
+
rescue
|
80
|
+
return false
|
81
|
+
end
|
82
|
+
|
83
|
+
return true
|
84
|
+
end
|
85
|
+
|
86
|
+
# Automaticaly open autorization url a waiting for callback.
|
87
|
+
# Launchy gem is required
|
88
|
+
#
|
89
|
+
# Parameters:
|
90
|
+
# server:: server will be on this addres, its alson address for oatuh 2 callback
|
91
|
+
# port:: listening port for server
|
92
|
+
# port=0:: server will be on first free port
|
93
|
+
#
|
94
|
+
# Steps:
|
95
|
+
# 1) create server
|
96
|
+
# 2) launch browser and redirect to google api
|
97
|
+
# 3) confirm and google api redirect to localhost
|
98
|
+
# 4) server get code and start session
|
99
|
+
# 5) close server - you are login
|
100
|
+
#
|
101
|
+
def login_by_line(server = 'http://localhost/oauth2callback', port = 0)
|
102
|
+
begin
|
103
|
+
require "launchy" # open browser
|
104
|
+
rescue
|
105
|
+
raise GoogleApi::RequireError, "You don't have launchy gem. Firt install it: gem install launchy."
|
106
|
+
end
|
107
|
+
|
108
|
+
require "socket" # make tcp server
|
109
|
+
require "uri" # parse uri
|
110
|
+
|
111
|
+
uri = URI(server)
|
112
|
+
|
113
|
+
# Start webserver.
|
114
|
+
webserver = TCPServer.new(uri.host, port)
|
115
|
+
|
116
|
+
# By default port is 0. It means that TCPServer will get first free port.
|
117
|
+
# Port is required for redirect_uri.
|
118
|
+
uri.port = webserver.addr[1]
|
119
|
+
|
120
|
+
# Add redirect_uri for google oauth 2 callback.
|
121
|
+
_config.send(@config_name).redirect_uri = uri.to_s
|
122
|
+
|
123
|
+
# Open browser.
|
124
|
+
Launchy.open(login)
|
125
|
+
|
126
|
+
# Wait for new session.
|
127
|
+
session = webserver.accept
|
128
|
+
|
129
|
+
# Parse header for query.
|
130
|
+
request = session.gets.gsub(/GET\ \//, '').gsub(/\ HTTP.*/, '')
|
131
|
+
request = Hash[URI.decode_www_form(URI(request).query)]
|
132
|
+
|
133
|
+
# Failure login
|
134
|
+
to_return = false
|
135
|
+
message = "You have not been logged. Please try again."
|
136
|
+
|
137
|
+
if login(request['code'])
|
138
|
+
message = "You have been successfully logged. Now you can close the browser."
|
139
|
+
|
140
|
+
to_return = true
|
141
|
+
end
|
142
|
+
|
143
|
+
session.write(message)
|
144
|
+
|
145
|
+
# Close session and webserver.
|
146
|
+
session.close
|
147
|
+
|
148
|
+
return to_return
|
149
|
+
end
|
150
|
+
|
151
|
+
# Check session
|
152
|
+
def check_session
|
153
|
+
if @api.nil? || @client.nil?
|
154
|
+
return false
|
155
|
+
end
|
156
|
+
|
157
|
+
return true
|
158
|
+
end
|
159
|
+
|
160
|
+
# Check session with error
|
161
|
+
def check_session!
|
162
|
+
if @api.nil? || @client.nil?
|
163
|
+
raise GoogleApi::SessionError, "You are not log in."
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def client
|
168
|
+
check_session!
|
169
|
+
|
170
|
+
if @client.authorization.refresh_token && @client.authorization.expired?
|
171
|
+
@client.authorization.fetch_access_token!
|
172
|
+
end
|
173
|
+
|
174
|
+
@client
|
175
|
+
end
|
176
|
+
|
177
|
+
def api
|
178
|
+
check_session!
|
179
|
+
|
180
|
+
@api
|
181
|
+
end
|
182
|
+
|
183
|
+
private
|
184
|
+
|
185
|
+
def progress_log(i)
|
186
|
+
print("\r[#{Time.now.strftime("%H:%M:%S")}] ##{i} ... \r".bold)
|
187
|
+
end
|
188
|
+
|
189
|
+
def _config
|
190
|
+
GoogleApi.config
|
191
|
+
end
|
192
|
+
|
193
|
+
def c(key)
|
194
|
+
if _config.send(@config_name).send(key)
|
195
|
+
_config.send(@config_name).send(key)
|
196
|
+
else
|
197
|
+
_config.send(key)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module GoogleApi
|
2
|
+
class SessionMethods
|
3
|
+
|
4
|
+
def self._session
|
5
|
+
self.class_variable_get(:@@session)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.login_by_cert
|
9
|
+
_session.login_by_cert
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.login_by_cert!
|
13
|
+
_session.login_by_cert!
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.login(code = nil)
|
17
|
+
_session.login(code)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.login_by_line(server = 'http://localhost/oauth2callback', port = 0)
|
21
|
+
_session.login_by_line(server, port)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.check_session
|
25
|
+
_session.check_session
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.check_session!
|
29
|
+
_session.check_session!
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.api
|
33
|
+
_session.api
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.client
|
37
|
+
_session.client
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module GoogleApi
|
2
|
+
module Shorten
|
3
|
+
class Session < GoogleApi::SessionMethods
|
4
|
+
|
5
|
+
SCOPE = "https://www.googleapis.com/auth/urlshortener"
|
6
|
+
NAME_API = "urlshortener"
|
7
|
+
VERSION_API = "v1"
|
8
|
+
|
9
|
+
CONFIG_NAME = "shorten"
|
10
|
+
|
11
|
+
@@session = GoogleApi::Session.new(CONFIG_NAME, SCOPE, NAME_API, VERSION_API)
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|