naver-searchad-api 0.0.4 → 0.0.6
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 +4 -4
- data/.gitignore +1 -0
- data/README.md +6 -0
- data/lib/naver/searchad/api/adgroup/service.rb +5 -0
- data/lib/naver/searchad/api/business-channel/service.rb +21 -0
- data/lib/naver/searchad/api/campaign/service.rb +5 -0
- data/lib/naver/searchad/api/core/api_command.rb +8 -1
- data/lib/naver/searchad/api/core/base_service.rb +10 -0
- data/lib/naver/searchad/api/core/download_command.rb +79 -0
- data/lib/naver/searchad/api/core/http_command.rb +37 -17
- data/lib/naver/searchad/api/label/service.rb +21 -0
- data/lib/naver/searchad/api/related-keyword-stat/service.rb +21 -0
- data/lib/naver/searchad/api/stat-report/service.rb +57 -0
- data/lib/naver/searchad/api/stat/service.rb +40 -0
- data/lib/naver/searchad/api/version.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d573b3637886b895a912c269f9a1f4278418abd0
|
4
|
+
data.tar.gz: 49e9456fd4cf5796c7a28250a6fed8497aaa007e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 274955fab04a7135c408a446193371107396b22e0c6ffaad18fa9bb6153bb011a897562adfa5ecb93f28e5f3301e27eb169ade5b8f244c95a6691585f7f107a8
|
7
|
+
data.tar.gz: f135af9db867879e88223646a8fda75ec3160bd176df3df69989fe85fa92263225c75334d13ac9346b64b4160914e09aa508d25d0cab97665473dea7fbd3a611
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -40,11 +40,17 @@ To use an API, instantiate the service. For example to use the Campaign API:
|
|
40
40
|
|
41
41
|
```ruby
|
42
42
|
require 'naver/searchad/api/campaign/service'
|
43
|
+
require 'naver/searchad/api/auth'
|
43
44
|
|
44
45
|
Campaign = Naver::Searchad::Api::Campaign # Alias the module
|
45
46
|
campaign = Campaign::Service.new
|
46
47
|
campaign.authorization = Naver::Searchad::Api::Auth.get_application_default # See Below Authorization
|
47
48
|
|
49
|
+
# Read all campaigns (with camelCase response)
|
50
|
+
campaign.list_campaigns(options: { decode_snake_case: false }) do |res, err|
|
51
|
+
puts res
|
52
|
+
end
|
53
|
+
|
48
54
|
# Read campaigns by ids
|
49
55
|
campaign.list_campaigns_by_ids(['campaign_id_1', 'campaign_id_2']) do |res, err|
|
50
56
|
puts res
|
@@ -10,6 +10,11 @@ module Naver
|
|
10
10
|
super('https://api.naver.com/', 'ncc/')
|
11
11
|
end
|
12
12
|
|
13
|
+
def list_adgroups(options: nil, &block)
|
14
|
+
command = make_command(:get, 'adgroups', options)
|
15
|
+
execute_command(command, &block)
|
16
|
+
end
|
17
|
+
|
13
18
|
def list_adgroups_by_ids(adgroup_ids, options: nil, &block)
|
14
19
|
command = make_command(:get, 'adgroups', options)
|
15
20
|
command.query['ids'] = adgroup_ids.join(',')
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative '../core/base_service'
|
2
|
+
|
3
|
+
module Naver
|
4
|
+
module Searchad
|
5
|
+
module Api
|
6
|
+
module BusinessChannel
|
7
|
+
class Service < Naver::Searchad::Api::Core::BaseService
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
super('https://api.naver.com/', 'ncc/')
|
11
|
+
end
|
12
|
+
|
13
|
+
def list_channels(options: nil, &block)
|
14
|
+
command = make_command(:get, 'channels', options)
|
15
|
+
execute_command(command, &block)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -10,6 +10,11 @@ module Naver
|
|
10
10
|
super('https://api.naver.com/', 'ncc/')
|
11
11
|
end
|
12
12
|
|
13
|
+
def list_campaigns(options: nil, &block)
|
14
|
+
command = make_command(:get, 'campaigns', options)
|
15
|
+
execute_command(command, &block)
|
16
|
+
end
|
17
|
+
|
13
18
|
def list_campaigns_by_ids(campaign_ids, options: nil, &block)
|
14
19
|
command = make_command(:get, 'campaigns/', options)
|
15
20
|
command.query['ids'] = campaign_ids.join(',')
|
@@ -18,6 +18,13 @@ module Naver
|
|
18
18
|
}
|
19
19
|
|
20
20
|
attr_accessor :request_object
|
21
|
+
attr_accessor :decode_snake_case
|
22
|
+
|
23
|
+
def initialize(method, url, body: nil, decode_snake_case: true)
|
24
|
+
super(method, url, body: body)
|
25
|
+
|
26
|
+
@decode_snake_case = decode_snake_case
|
27
|
+
end
|
21
28
|
|
22
29
|
def prepare!
|
23
30
|
if request_object
|
@@ -32,7 +39,7 @@ module Naver
|
|
32
39
|
return nil unless content_type.start_with?(JSON_CONTENT_TYPE)
|
33
40
|
|
34
41
|
decoded_response = JSON.parse(body)
|
35
|
-
deep_snake_case_params!(decoded_response)
|
42
|
+
deep_snake_case_params!(decoded_response) if @decode_snake_case
|
36
43
|
if decoded_response.kind_of?(Hash)
|
37
44
|
OpenStruct.new(decoded_response)
|
38
45
|
elsif decoded_response.kind_of?(Array)
|
@@ -4,6 +4,7 @@ require 'httpclient'
|
|
4
4
|
require_relative '../options'
|
5
5
|
require_relative '../version'
|
6
6
|
require_relative 'api_command'
|
7
|
+
require_relative 'download_command'
|
7
8
|
require_relative 'logging'
|
8
9
|
|
9
10
|
module Naver
|
@@ -42,6 +43,15 @@ module Naver
|
|
42
43
|
def make_command(method, path, options = {})
|
43
44
|
template = Addressable::Template.new(url + base_path + path)
|
44
45
|
command = ApiCommand.new(method, template)
|
46
|
+
command.decode_snake_case = options.fetch(:decode_snake_case, true) if options
|
47
|
+
command.options = request_options.merge(options)
|
48
|
+
apply_command_defaults(command)
|
49
|
+
command
|
50
|
+
end
|
51
|
+
|
52
|
+
def make_download_command(method, path, options = {})
|
53
|
+
template = Addressable::Template.new(url + base_path + path)
|
54
|
+
command = DownloadCommand.new(method, template)
|
45
55
|
command.options = request_options.merge(options)
|
46
56
|
apply_command_defaults(command)
|
47
57
|
command
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require_relative 'api_command'
|
2
|
+
require 'addressable/uri'
|
3
|
+
|
4
|
+
module Naver
|
5
|
+
module Searchad
|
6
|
+
module Api
|
7
|
+
module Core
|
8
|
+
class DownloadCommand < ApiCommand
|
9
|
+
OK_STATUSES = [200, 201, 206]
|
10
|
+
|
11
|
+
attr_accessor :download_dest
|
12
|
+
|
13
|
+
def prepare!
|
14
|
+
@state = :start
|
15
|
+
@download_url = nil
|
16
|
+
@offset = 0
|
17
|
+
|
18
|
+
if download_dest.is_a?(String)
|
19
|
+
@download_io = File.open(download_dest, 'wb')
|
20
|
+
@close_io_on_finish = true
|
21
|
+
else
|
22
|
+
@download_io = StringIO.new('', 'wb')
|
23
|
+
@close_io_on_finish = false
|
24
|
+
end
|
25
|
+
|
26
|
+
super
|
27
|
+
end
|
28
|
+
|
29
|
+
def release!
|
30
|
+
@download_io.close if @close_io_on_finish
|
31
|
+
end
|
32
|
+
|
33
|
+
def _execute(client)
|
34
|
+
request_header = {}
|
35
|
+
apply_request_options(request_header)
|
36
|
+
download_offset = nil
|
37
|
+
|
38
|
+
http_res = client.get(url.to_s,
|
39
|
+
query: nil,
|
40
|
+
header: request_header,
|
41
|
+
follow_redirect: true) do |res, chunk|
|
42
|
+
status = res.http_header.status_code.to_i
|
43
|
+
next unless OK_STATUSES.include?(status)
|
44
|
+
|
45
|
+
download_offset ||= (status == 206 ? @offset : 0)
|
46
|
+
download_offset += chunk.bytesize
|
47
|
+
|
48
|
+
if download_offset - chunk.bytesize == @offset
|
49
|
+
next_chunk = chunk
|
50
|
+
else
|
51
|
+
chunk_index = @offset - (download_offset - chunk.bytesize)
|
52
|
+
next_chunk = chunk.byteslice(chunk_index..-1)
|
53
|
+
next if next_chunk.nil?
|
54
|
+
end
|
55
|
+
|
56
|
+
@download_io.write(next_chunk)
|
57
|
+
@offset += next_chunk.bytesize
|
58
|
+
end
|
59
|
+
|
60
|
+
@download_io.flush
|
61
|
+
|
62
|
+
if @close_io_on_finish
|
63
|
+
result = nil
|
64
|
+
else
|
65
|
+
result = @download_io
|
66
|
+
end
|
67
|
+
check_status(http_res.status.to_i, http_res.header, http_res.body)
|
68
|
+
logger.debug("DownloadCommand: Success")
|
69
|
+
success(result)
|
70
|
+
rescue => e
|
71
|
+
@download_io.flush
|
72
|
+
logger.debug("DownloadCommand: Error - #{e.inspect}")
|
73
|
+
error(e)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -32,25 +32,20 @@ module Naver
|
|
32
32
|
def execute(client, &block)
|
33
33
|
prepare!
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
url.to_s,
|
41
|
-
query: nil,
|
42
|
-
body: body,
|
43
|
-
header: request_header,
|
44
|
-
follow_redirect: true)
|
45
|
-
|
46
|
-
logger.debug("Returned status(#{http_res.status}) and #{http_res.inspect}")
|
47
|
-
response = process_response(http_res.status.to_i, http_res.header, http_res.body)
|
35
|
+
_execute(client).tap do |result|
|
36
|
+
if block_given?
|
37
|
+
yield result, nil
|
38
|
+
end
|
39
|
+
end
|
48
40
|
|
49
|
-
logger.debug("Success - #{response}")
|
50
|
-
success(response, &block)
|
51
41
|
rescue => e
|
52
|
-
|
53
|
-
|
42
|
+
if block_given?
|
43
|
+
yield nil, e
|
44
|
+
else
|
45
|
+
raise e
|
46
|
+
end
|
47
|
+
ensure
|
48
|
+
release!
|
54
49
|
end
|
55
50
|
|
56
51
|
def prepare!
|
@@ -68,6 +63,31 @@ module Naver
|
|
68
63
|
@body = '' unless body
|
69
64
|
end
|
70
65
|
|
66
|
+
def release!
|
67
|
+
end
|
68
|
+
|
69
|
+
def _execute(client)
|
70
|
+
logger.debug("Executing HTTP #{method} #{url}")
|
71
|
+
request_header = {}
|
72
|
+
apply_request_options(request_header)
|
73
|
+
|
74
|
+
http_res = client.request(method.to_s.upcase,
|
75
|
+
url.to_s,
|
76
|
+
query: nil,
|
77
|
+
body: body,
|
78
|
+
header: request_header,
|
79
|
+
follow_redirect: true)
|
80
|
+
|
81
|
+
logger.debug("Returned status(#{http_res.status}) and #{http_res.inspect}")
|
82
|
+
response = process_response(http_res.status.to_i, http_res.header, http_res.body)
|
83
|
+
|
84
|
+
logger.debug("Success - #{response}")
|
85
|
+
success(response)
|
86
|
+
rescue => e
|
87
|
+
logger.debug("Error - #{e.inspect}")
|
88
|
+
error(e)
|
89
|
+
end
|
90
|
+
|
71
91
|
def process_response(status, header, body)
|
72
92
|
check_status(status, header, body)
|
73
93
|
decode_response_body(header['Content-Type'].first, body)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative '../core/base_service'
|
2
|
+
|
3
|
+
module Naver
|
4
|
+
module Searchad
|
5
|
+
module Api
|
6
|
+
module Label
|
7
|
+
class Service < Naver::Searchad::Api::Core::BaseService
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
super('https://api.naver.com/', 'ncc/')
|
11
|
+
end
|
12
|
+
|
13
|
+
def list_labels(options: nil, &block)
|
14
|
+
command = make_command(:get, 'labels', options)
|
15
|
+
execute_command(command, &block)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative '../core/base_service'
|
2
|
+
|
3
|
+
module Naver
|
4
|
+
module Searchad
|
5
|
+
module Api
|
6
|
+
module RelatedKeywordStat
|
7
|
+
class Service < Naver::Searchad::Api::Core::BaseService
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
super('https://api.naver.com/', '')
|
11
|
+
end
|
12
|
+
|
13
|
+
def list_stats(options: nil, &block)
|
14
|
+
command = make_command(:get, 'keywordstool', options)
|
15
|
+
execute_command(command, &block)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative '../core/base_service'
|
2
|
+
require 'addressable/uri'
|
3
|
+
|
4
|
+
module Naver
|
5
|
+
module Searchad
|
6
|
+
module Api
|
7
|
+
module StatReport
|
8
|
+
class Service < Naver::Searchad::Api::Core::BaseService
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
super('https://api.naver.com/', '')
|
12
|
+
end
|
13
|
+
|
14
|
+
def download_report(download_url, file_path, options: {}, &block)
|
15
|
+
uri = Addressable::URI.parse(download_url)
|
16
|
+
|
17
|
+
command = make_download_command(:get, uri.path, options)
|
18
|
+
command.query['authtoken'] = uri.query_values['authtoken']
|
19
|
+
command.download_dest = file_path
|
20
|
+
execute_command(command, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_stat_report(report_job_id, options: {}, &block)
|
24
|
+
command = make_command(:get, '/stat-reports/{report_job_id}', options)
|
25
|
+
command.params['report_job_id'] = report_job_id
|
26
|
+
execute_command(command, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def list_stat_reports(options: {}, &block)
|
30
|
+
command = make_command(:get, '/stat-reports', options)
|
31
|
+
execute_command(command, &block)
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_stat_report(type, date, options: {}, &block)
|
35
|
+
command = make_command(:post, '/stat-reports', options)
|
36
|
+
command.request_object = {
|
37
|
+
'reportTp' => type,
|
38
|
+
'statDt' => date
|
39
|
+
}
|
40
|
+
execute_command(command, &block)
|
41
|
+
end
|
42
|
+
|
43
|
+
def delete_stat_reports(options: {}, &block)
|
44
|
+
command = make_command(:delete, '/stat-reports', options)
|
45
|
+
execute_command(command, &block)
|
46
|
+
end
|
47
|
+
|
48
|
+
def delete_stat_report(report_job_id, options: {}, &block)
|
49
|
+
command = make_command(:delete, '/stat-reports/{report_job_id}', options)
|
50
|
+
command.params['report_job_id'] = report_job_id
|
51
|
+
execute_command(command, &block)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require_relative '../core/base_service'
|
2
|
+
|
3
|
+
module Naver
|
4
|
+
module Searchad
|
5
|
+
module Api
|
6
|
+
module Stat
|
7
|
+
class Service < Naver::Searchad::Api::Core::BaseService
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
super('https://api.naver.com/', '')
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_stat_by_id(id, fields, time_range, options: {}, &block)
|
14
|
+
command = make_command(:get, 'stats', options)
|
15
|
+
command.query['id'] = id
|
16
|
+
command.query['fields'] = fields.to_json
|
17
|
+
command.query['timeRange'] = time_range.to_json
|
18
|
+
command.query['datePreset'] = options[:date_preset] if options[:date_preset]
|
19
|
+
command.query['timeIncrement'] = options[:time_increment] if options[:time_increment]
|
20
|
+
command.query['breakdown'] = options[:breakdown] if options[:breakdown]
|
21
|
+
|
22
|
+
execute_command(command, &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_stat_by_ids(ids, fields, time_range, options: {}, &block)
|
26
|
+
command = make_command(:get, 'stats', options)
|
27
|
+
command.query['ids'] = ids
|
28
|
+
command.query['fields'] = fields.to_json
|
29
|
+
command.query['timeRange'] = time_range.to_json
|
30
|
+
command.query['datePreset'] = options[:date_preset] if options[:date_preset]
|
31
|
+
command.query['timeIncrement'] = options[:time_increment] if options[:time_increment]
|
32
|
+
command.query['breakdown'] = options[:breakdown] if options[:breakdown]
|
33
|
+
|
34
|
+
execute_command(command, &block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: naver-searchad-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Min Kim
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpclient
|
@@ -136,13 +136,19 @@ files:
|
|
136
136
|
- lib/naver/searchad/api/ad/service.rb
|
137
137
|
- lib/naver/searchad/api/adgroup/service.rb
|
138
138
|
- lib/naver/searchad/api/auth.rb
|
139
|
+
- lib/naver/searchad/api/business-channel/service.rb
|
139
140
|
- lib/naver/searchad/api/campaign/service.rb
|
140
141
|
- lib/naver/searchad/api/core/api_command.rb
|
141
142
|
- lib/naver/searchad/api/core/base_service.rb
|
143
|
+
- lib/naver/searchad/api/core/download_command.rb
|
142
144
|
- lib/naver/searchad/api/core/http_command.rb
|
143
145
|
- lib/naver/searchad/api/core/logging.rb
|
144
146
|
- lib/naver/searchad/api/errors.rb
|
147
|
+
- lib/naver/searchad/api/label/service.rb
|
145
148
|
- lib/naver/searchad/api/options.rb
|
149
|
+
- lib/naver/searchad/api/related-keyword-stat/service.rb
|
150
|
+
- lib/naver/searchad/api/stat-report/service.rb
|
151
|
+
- lib/naver/searchad/api/stat/service.rb
|
146
152
|
- lib/naver/searchad/api/version.rb
|
147
153
|
- naver-searchad-api.gemspec
|
148
154
|
homepage: https://github.com/forward3d/naver-searchad-api
|