yandex-direct-api 1.0.1 → 1.0.2
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/Rakefile +1 -1
- data/lib/yandex_direct_api.rb +11 -6
- metadata +44 -13
- data/README.md +0 -10
- data/lib/live/live.rb +0 -62
- data/lib/services/ad_group.rb +0 -80
- data/lib/services/add.rb +0 -162
- data/lib/services/bid.rb +0 -27
- data/lib/services/campaign.rb +0 -140
- data/lib/services/dictionaries.rb +0 -7
- data/lib/services/keyword.rb +0 -37
- data/lib/services/sitelink.rb +0 -20
- data/lib/services/vcard.rb +0 -33
- data/lib/tasks/install.rake +0 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 26c798c4819002b33bc619170e11bfbaa56b9058
|
|
4
|
+
data.tar.gz: 4d924d7840de15ba947371a08239bd8de74d415a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 13a421456aa0d1c0a5048f6c7aa4a61a11ca80dda572dd7d3cc25c3903c551000d04e67c24d3a6247a3901dde8249e9a816aada5dd7c2b6660b36199c991b29f
|
|
7
|
+
data.tar.gz: a493fe4206c66913521d32c111c35e80f531d7a819c3a54f7b954ede3284567f7f9489453e4a7824fae536dfd40fbb7c9a2d86ea3aeb69a4e4fd6e545f79150e
|
data/Rakefile
CHANGED
data/lib/yandex_direct_api.rb
CHANGED
|
@@ -35,20 +35,18 @@ module YandexDirect
|
|
|
35
35
|
@configuration = defined?(@environment) ? config[@environment] : config
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
def self.request(service, method, params = {})
|
|
38
|
+
def self.request(service, method, params = {}, units = false)
|
|
39
39
|
uri = URI(url + service)
|
|
40
40
|
body = {
|
|
41
41
|
method: method,
|
|
42
42
|
params: params
|
|
43
43
|
}
|
|
44
|
-
if configuration['verbose']
|
|
45
|
-
puts "\t\033[32mYandexDirect:\033[0m #{service}.#{method}(#{body[:params]})"
|
|
46
|
-
end
|
|
44
|
+
puts "\t\033[32mYandexDirect:\033[0m #{service}.#{method}(#{body[:params]})" if configuration['verbose'] && !units
|
|
47
45
|
|
|
48
46
|
http = Net::HTTP.new(uri.host, uri.port)
|
|
49
47
|
http.use_ssl = true
|
|
50
48
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
51
|
-
|
|
49
|
+
# http.set_debug_output($stdout)
|
|
52
50
|
request = Net::HTTP::Post.new(uri.path)
|
|
53
51
|
request['Authorization'] = "Bearer #{configuration['token']}"
|
|
54
52
|
request['Accept-Language'] = configuration['locale']
|
|
@@ -59,7 +57,9 @@ module YandexDirect
|
|
|
59
57
|
http.request(request)
|
|
60
58
|
end
|
|
61
59
|
|
|
62
|
-
raise
|
|
60
|
+
raise YandexDirect::RuntimeError.new("#{response.code} - #{response.message}") unless response.code.to_i == 200
|
|
61
|
+
|
|
62
|
+
return response['Units'] if units
|
|
63
63
|
|
|
64
64
|
json = parse_json(response.body)
|
|
65
65
|
messages = []
|
|
@@ -77,6 +77,11 @@ module YandexDirect
|
|
|
77
77
|
raise RuntimeError.new(messages.join("\n")) if messages.any?
|
|
78
78
|
return json['result']
|
|
79
79
|
end
|
|
80
|
+
|
|
81
|
+
def self.get_units
|
|
82
|
+
units = request('dictionaries', 'get', {"DictionaryNames": ["AdCategories"]}, true)
|
|
83
|
+
units.split('/')[1].to_i
|
|
84
|
+
end
|
|
80
85
|
end
|
|
81
86
|
|
|
82
87
|
require 'services/campaign.rb'
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: yandex-direct-api
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- AliceO
|
|
@@ -9,25 +9,56 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
date: 2016-07-21 00:00:00.000000000 Z
|
|
12
|
-
dependencies:
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bundler
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.13'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.13'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: 11.2.2
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: 11.2.2
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rspec
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: 3.5.0
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 3.5.0
|
|
13
55
|
description: Gem for interaction with Yandex Direct API version 5
|
|
14
56
|
email: aliceo.jjm@gmail.com
|
|
15
57
|
executables: []
|
|
16
58
|
extensions: []
|
|
17
59
|
extra_rdoc_files: []
|
|
18
60
|
files:
|
|
19
|
-
- README.md
|
|
20
61
|
- Rakefile
|
|
21
|
-
- lib/live/live.rb
|
|
22
|
-
- lib/services/ad_group.rb
|
|
23
|
-
- lib/services/add.rb
|
|
24
|
-
- lib/services/bid.rb
|
|
25
|
-
- lib/services/campaign.rb
|
|
26
|
-
- lib/services/dictionaries.rb
|
|
27
|
-
- lib/services/keyword.rb
|
|
28
|
-
- lib/services/sitelink.rb
|
|
29
|
-
- lib/services/vcard.rb
|
|
30
|
-
- lib/tasks/install.rake
|
|
31
62
|
- lib/yandex_direct_api.rb
|
|
32
63
|
homepage: https://github.com/aliceojjm/yandex-direct-api
|
|
33
64
|
licenses: []
|
data/README.md
DELETED
data/lib/live/live.rb
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
module YandexDirect::Live
|
|
2
|
-
def self.configuration
|
|
3
|
-
YandexDirect.configuration
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
def self.request (method, params = {})
|
|
7
|
-
body = {
|
|
8
|
-
locale: configuration['locale'],
|
|
9
|
-
token: configuration['token'],
|
|
10
|
-
method: method,
|
|
11
|
-
param: params
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
url = URI((configuration['sandbox'] ? 'https://api-sandbox.direct.yandex.ru/live/v4/json/' : 'https://api.direct.yandex.ru/live/v4/json/'))
|
|
15
|
-
|
|
16
|
-
if configuration['verbose']
|
|
17
|
-
puts "\t\033[32mYandex.Direct:\033[0m #{method}(#{body[:param]})"
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
http = Net::HTTP.new(url.host, url.port)
|
|
21
|
-
http.use_ssl = true
|
|
22
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
23
|
-
response = http.post(url.path, JSON.generate(body))
|
|
24
|
-
|
|
25
|
-
raise YandexDirect::RuntimeError.new("#{response.code} - #{response.message}") unless response.code.to_i == 200
|
|
26
|
-
|
|
27
|
-
json = YandexDirect.parse_json(response.body)
|
|
28
|
-
|
|
29
|
-
if json.has_key?('error_code') and json.has_key?('error_str')
|
|
30
|
-
code = json['error_code'].to_i
|
|
31
|
-
error = json['error_detail'].length > 0 ? json['error_detail'] : json['error_str']
|
|
32
|
-
raise YandexDirect::RuntimeError.new "#{code} - #{error}"
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
return json['data']
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def self.upload_image (url, name)
|
|
39
|
-
result = YandexDirect::Live.request('AdImage', {'Action': 'Upload', 'AdImageURLData': [{'Login': configuration['login'], 'URL': url, 'Name': name}]})
|
|
40
|
-
result['ActionsResult'].first['AdImageUploadTaskID']
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def self.get_image_hash(upload_task_ids)
|
|
44
|
-
result = YandexDirect::Live.request('AdImage', {'Action': 'CheckUploadStatus', 'SelectionCriteria': {'AdImageUploadTaskIDS': upload_task_ids}})
|
|
45
|
-
result["AdImageUploads"]
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def self.get_uploaded_image_hashes(params)
|
|
49
|
-
upload_task_ids = params.map{|p| p[:image_upload_task_id]}
|
|
50
|
-
if upload_task_ids.any?
|
|
51
|
-
image_hashes = YandexDirect::Live.get_image_hash(upload_task_ids)
|
|
52
|
-
associations = []
|
|
53
|
-
image_hashes.each do |result|
|
|
54
|
-
unless result['Status'] == 'Pending'
|
|
55
|
-
add = params.find{|p| p.image_upload_task_id == result['AdImageUploadTaskID']}
|
|
56
|
-
associations.push({add_id: add.add_id, ad_image_hash: result['AdImageHash']}) unless result['Status'] == 'Error'
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
associations
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
data/lib/services/ad_group.rb
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
class YandexDirect::AdGroup
|
|
2
|
-
SERVICE = 'adgroups'
|
|
3
|
-
attr_accessor :name, :campaign_id, :id, :status, :region_ids, :negative_keywords, :tracking_params
|
|
4
|
-
|
|
5
|
-
def initialize(params)
|
|
6
|
-
@name = params[:name]
|
|
7
|
-
@id = params[:id]
|
|
8
|
-
@status = params[:status]
|
|
9
|
-
@campaign_id = params[:campaign_id]
|
|
10
|
-
@region_ids = params[:region_ids]
|
|
11
|
-
@negative_keywords = {"Items": params[:negative_keywords]} if params[:negative_keywords].present?
|
|
12
|
-
@tracking_params = params[:tracking_params]
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def self.list(params)
|
|
16
|
-
selection_criteria = {"Types": ["TEXT_AD_GROUP"]}
|
|
17
|
-
selection_criteria["CampaignIds"] = params[:campaign_ids] if params[:campaign_ids].present?
|
|
18
|
-
selection_criteria["Ids"] = params[:ids] if params[:ids].present?
|
|
19
|
-
ad_groups = YandexDirect.request(SERVICE, 'get', {
|
|
20
|
-
"SelectionCriteria": selection_criteria,
|
|
21
|
-
"FieldNames": ['Id', 'Name', 'CampaignId', 'Status', 'RegionIds', 'TrackingParams', 'NegativeKeywords']
|
|
22
|
-
})["AdGroups"]
|
|
23
|
-
(ad_groups || []).map{|c| new({ name: c["Name"], id: c["Id"], status: c["Status"], campaign_id: c["CampaignId"],
|
|
24
|
-
region_ids: c["RegionIds"], tracking_params: c["TrackingParams"], negative_keywords: c["NegativeKeywords"]})}
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def self.add(params)
|
|
28
|
-
if params.kind_of?(Array)
|
|
29
|
-
batch_add(params)
|
|
30
|
-
else
|
|
31
|
-
params.id = YandexDirect.request(SERVICE, 'add', {"AdGroups": [params.parameters]})["AddResults"].first["Id"]
|
|
32
|
-
params
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def self.update(params)
|
|
37
|
-
if params.kind_of?(Array)
|
|
38
|
-
batch_update(params)
|
|
39
|
-
else
|
|
40
|
-
params.id = YandexDirect.request(SERVICE, 'update', {"AdGroups": [params.update_parameters]})["UpdateResults"].first["Id"]
|
|
41
|
-
params
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def parameters
|
|
46
|
-
hash = {"Name": @name,
|
|
47
|
-
"CampaignId": @campaign_id,
|
|
48
|
-
"RegionIds": @region_ids || [0],
|
|
49
|
-
"TrackingParams": @tracking_params
|
|
50
|
-
}
|
|
51
|
-
hash["NegativeKeywords"] = @negative_keywords if @negative_keywords.present?
|
|
52
|
-
hash
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def update_parameters
|
|
56
|
-
hash = {"Name": @name,
|
|
57
|
-
"RegionIds": @region_ids || [0],
|
|
58
|
-
"TrackingParams": @tracking_params,
|
|
59
|
-
"Id": @id
|
|
60
|
-
}
|
|
61
|
-
hash["NegativeKeywords"] = @negative_keywords if @negative_keywords.present?
|
|
62
|
-
hash
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
private
|
|
66
|
-
|
|
67
|
-
def self.batch_update(ad_groups)
|
|
68
|
-
params = ad_groups.map(&:update_parameters)
|
|
69
|
-
params.each_slice(100) do |add_parameters|
|
|
70
|
-
YandexDirect.request(SERVICE, 'update', {"AdGroups": add_parameters.compact})["UpdateResults"]
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def self.batch_add(ad_groups)
|
|
75
|
-
params = ad_groups.map(&:parameters)
|
|
76
|
-
params.each_slice(100) do |add_parameters|
|
|
77
|
-
YandexDirect.request(SERVICE, 'add', {"AdGroups": add_parameters.compact})["AddResults"]
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
data/lib/services/add.rb
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
class YandexDirect::Add
|
|
2
|
-
SERVICE = 'ads'
|
|
3
|
-
attr_accessor :ad_group_id, :campaign_id, :id, :status, :state, :type, :status_clarification, :text, :title, :href,
|
|
4
|
-
:display_url_path, :ad_image_hash, :extension_ids, :mobile, :v_card_id, :sitelink_set_id
|
|
5
|
-
|
|
6
|
-
def initialize(params)
|
|
7
|
-
@ad_group_id = params[:ad_group_id]
|
|
8
|
-
@id = params[:id]
|
|
9
|
-
@status = params[:status]
|
|
10
|
-
@campaign_id = params[:campaign_id]
|
|
11
|
-
@negative_keywords = params[:negative_keywords]
|
|
12
|
-
@utm_tags = params[:utm_tags]
|
|
13
|
-
@state = params[:state]
|
|
14
|
-
@type = params[:type] || "TEXT_AD"
|
|
15
|
-
@status_clarification = params[:status_clarification]
|
|
16
|
-
@text = params[:text]
|
|
17
|
-
@title = params[:title]
|
|
18
|
-
@href = params[:href]
|
|
19
|
-
@display_url_path = params[:display_url_path]
|
|
20
|
-
@ad_image_hash = params[:ad_image_hash]
|
|
21
|
-
@extension_ids = params[:extension_ids]
|
|
22
|
-
@mobile = params[:mobile]
|
|
23
|
-
@v_card_id = params[:v_card_id]
|
|
24
|
-
@extension_ids = params[:extension_ids]
|
|
25
|
-
@mobile = params[:mobile]
|
|
26
|
-
@sitelink_set_id = params[:sitelink_set_id]
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def self.list(params)
|
|
30
|
-
selection_criteria = {"Types": ["TEXT_AD"]}
|
|
31
|
-
selection_criteria["CampaignIds"] = params[:campaign_ids] if params[:campaign_ids].present?
|
|
32
|
-
selection_criteria["AdGroupIds"] = params[:ad_group_ids] if params[:ad_group_ids].present?
|
|
33
|
-
selection_criteria["Ids"] = params[:ids] if params[:ids].present?
|
|
34
|
-
ads = YandexDirect.request(SERVICE, 'get', {
|
|
35
|
-
"SelectionCriteria": selection_criteria,
|
|
36
|
-
"FieldNames": ['AdGroupId', 'CampaignId', 'State', 'Status', 'StatusClarification', 'Type', 'Id'],
|
|
37
|
-
"TextAdFieldNames": ['SitelinkSetId', 'Text', 'Title', 'Href']
|
|
38
|
-
})["Ads"]
|
|
39
|
-
(ads || []).map{|c| new({ ad_group_id: c["AdGroupId"], id: c["Id"], status: c["Status"], campaign_id: c["CampaignId"],
|
|
40
|
-
state: c["State"], type: c["Type"], status_clarification: c["StatusClarification"],
|
|
41
|
-
sitelink_set_id: c["TextAd"]["SitelinkSetId"], text: c["TextAd"]["Text"], title: c["TextAd"]["Title"], href: c["TextAd"]["Href"]})}
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def self.add(params)
|
|
45
|
-
if params.kind_of?(Array)
|
|
46
|
-
batch_add(params)
|
|
47
|
-
else
|
|
48
|
-
special_parameters = params.new_text_add_parameters if params.type == "TEXT_AD"
|
|
49
|
-
params.id = YandexDirect.request(SERVICE, 'add', {"Ads": [params.add_parameters(special_parameters)]})["AddResults"].first["Id"]
|
|
50
|
-
params
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def self.update(params)
|
|
55
|
-
if params.kind_of?(Array)
|
|
56
|
-
batch_update(params)
|
|
57
|
-
else
|
|
58
|
-
special_parameters = params.text_add_parameters if params.type == "TEXT_AD"
|
|
59
|
-
params.id = YandexDirect.request(SERVICE, 'update', {"Ads": [params.update_parameters(special_parameters)]})["UpdateResults"].first["Id"]
|
|
60
|
-
params
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def self.unarchive(ids)
|
|
65
|
-
ids = [ids] unless params.kind_of?(Array)
|
|
66
|
-
action('unarchieve', ids)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def self.archive(ids)
|
|
70
|
-
ids = [ids] unless params.kind_of?(Array)
|
|
71
|
-
action('archieve', ids)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def self.stop(ids)
|
|
75
|
-
ids = [ids] unless params.kind_of?(Array)
|
|
76
|
-
action('suspend', ids)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def self.resume(ids)
|
|
80
|
-
ids = [ids] unless params.kind_of?(Array)
|
|
81
|
-
action('resume', ids)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def self.moderate(ids)
|
|
85
|
-
ids = [ids] unless params.kind_of?(Array)
|
|
86
|
-
action('moderate', ids)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def self.delete(ids)
|
|
90
|
-
ids = [ids] unless params.kind_of?(Array)
|
|
91
|
-
action('delete', ids)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def add_parameters(add_type)
|
|
95
|
-
hash = {"AdGroupId": @ad_group_id}
|
|
96
|
-
hash[add_type.first] = add_type.last
|
|
97
|
-
hash
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
def update_parameters(add_type)
|
|
101
|
-
hash = {"Id": @id}
|
|
102
|
-
hash[add_type.first] = add_type.last
|
|
103
|
-
hash
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def new_text_add_parameters
|
|
107
|
-
hash = {"Text": @text,
|
|
108
|
-
"Title": @title,
|
|
109
|
-
"Href": @href,
|
|
110
|
-
"Mobile": @mobile || "NO",
|
|
111
|
-
"AdExtensionIds": @extension_ids || []
|
|
112
|
-
}
|
|
113
|
-
hash["DisplayUrlPath"] = @display_url_path if @display_url_path.present?
|
|
114
|
-
hash["VCardId"] = @v_card_id if @v_card_id.present?
|
|
115
|
-
hash["AdImageHash"] = @ad_image_hash if @ad_image_hash.present?
|
|
116
|
-
hash["SitelinkSetId"] = @sitelink_set_id if @sitelink_set_id.present?
|
|
117
|
-
["TextAd", hash]
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def text_add_parameters
|
|
121
|
-
hash = {"Text": @text,
|
|
122
|
-
"Title": @title,
|
|
123
|
-
"Href": @href,
|
|
124
|
-
}
|
|
125
|
-
hash["DisplayUrlPath"] = @display_url_path if @display_url_path.present?
|
|
126
|
-
hash["AdImageHash"] = @ad_image_hash if @ad_image_hash.present?
|
|
127
|
-
hash["CalloutSetting"]["AdExtensions"] = @extension_ids.map{|e| {"AdExtensionId": e, "Operation": "SET"}} if @extension_ids.present?
|
|
128
|
-
hash["VCardId"] = @v_card_id if @v_card_id.present?
|
|
129
|
-
hash["SitelinkSetId"] = @sitelink_set_id if @sitelink_set_id.present?
|
|
130
|
-
["TextAd", hash]
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
private
|
|
134
|
-
|
|
135
|
-
def self.batch_update(adds)
|
|
136
|
-
params = adds.map do |add|
|
|
137
|
-
special_parameters = add.text_add_parameters if add.type == "TEXT_AD"
|
|
138
|
-
add.update_parameters(special_parameters)
|
|
139
|
-
end
|
|
140
|
-
params.each_slice(100) do |add_parameters|
|
|
141
|
-
YandexDirect.request(SERVICE, 'update', {"Ads": add_parameters.compact})["UpdateResults"]
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
def self.batch_add(adds)
|
|
146
|
-
params = adds.map do |add|
|
|
147
|
-
special_parameters = add.new_text_add_parameters if add.type == "TEXT_AD"
|
|
148
|
-
add.add_parameters(special_parameters)
|
|
149
|
-
end
|
|
150
|
-
params.each_slice(100) do |add_parameters|
|
|
151
|
-
YandexDirect.request(SERVICE, 'add', {"Ads": add_parameters.compact})["AddResults"]
|
|
152
|
-
end
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
def action(action_name, params)
|
|
156
|
-
selection_criteria = {}
|
|
157
|
-
selection_criteria["CampaignIds"] = params[:campaign_ids] if params[:campaign_ids].present?
|
|
158
|
-
selection_criteria["AdGroupIds"] = params[:ad_group_ids] if params[:ad_group_ids].present?
|
|
159
|
-
selection_criteria["Ids"] = params[:ids] if params[:ids].present?
|
|
160
|
-
YandexDirect.request(SERVICE, 'action_name', {"SelectionCriteria": selection_criteria}) if @id.present? && @id != 0
|
|
161
|
-
end
|
|
162
|
-
end
|
data/lib/services/bid.rb
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
class YandexDirect::Bid
|
|
2
|
-
SERVICE = 'bids'
|
|
3
|
-
|
|
4
|
-
def self.list(params)
|
|
5
|
-
selection_criteria = {}
|
|
6
|
-
selection_criteria["CampaignIds"] = params[:campaign_ids] if params[:campaign_ids].present?
|
|
7
|
-
selection_criteria["Ids"] = params[:ids] if params[:ids].present?
|
|
8
|
-
selection_criteria["AdGroupIds"] = params[:ad_group_ids] if params[:ad_group_ids].present?
|
|
9
|
-
selection_criteria["KeywordIds"] = params[:keyword_ids] if params[:keyword_ids].present?
|
|
10
|
-
YandexDirect.request(SERVICE, 'get', {
|
|
11
|
-
"SelectionCriteria": selection_criteria,
|
|
12
|
-
"FieldNames": ["KeywordId", "AdGroupId", "CampaignId", "Bid", "ContextBid", "StrategyPriority", "CompetitorsBids", "SearchPrices", "ContextCoverage", "MinSearchPrice", "CurrentSearchPrice", "AuctionBids"]
|
|
13
|
-
})["Bids"] || []
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def self.set(bids)
|
|
17
|
-
bids.map! do |bid|
|
|
18
|
-
params = {"Bid": bid[:bid] * 1000000, "StrategyPriority": bid[:StrategyPriority] || "NORMAL"}
|
|
19
|
-
params["CampaignId"] = bid[:campaign_id] if bid[:campaign_id].present?
|
|
20
|
-
params["AdGroupId"] = bid[:ad_group_id] if bid[:ad_group_id].present?
|
|
21
|
-
params["KeywordId"] = bid[:keyword_id] if bid[:keyword_id].present?
|
|
22
|
-
params["ContextBid"] = bid[:context_bid] * 1000000 if bid[:context_bid].present?
|
|
23
|
-
params
|
|
24
|
-
end
|
|
25
|
-
YandexDirect.request(SERVICE, 'set', {"Bids": bids})["SetResults"]
|
|
26
|
-
end
|
|
27
|
-
end
|
data/lib/services/campaign.rb
DELETED
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
class YandexDirect::Campaign
|
|
2
|
-
SERVICE = 'campaigns'
|
|
3
|
-
attr_accessor :name, :start_date, :time_zone, :id, :status, :state, :negative_keywords, :email, :owner_name,
|
|
4
|
-
:search_strategy, :network_strategy, :limit_percent, :bid_percent, :end_date, :daily_budget_amount,
|
|
5
|
-
:daily_budget_mode, :blocked_ips, :excluded_sites, :type, :target_hours
|
|
6
|
-
|
|
7
|
-
def initialize(params)
|
|
8
|
-
@name = params[:name]
|
|
9
|
-
@id = params[:id]
|
|
10
|
-
@status = params[:status]
|
|
11
|
-
@state = params[:state]
|
|
12
|
-
@start_date = params[:start_date]
|
|
13
|
-
@time_zone = params[:time_zone]
|
|
14
|
-
@negative_keywords = {"Items": params[:negative_keywords]} if params[:negative_keywords].present?
|
|
15
|
-
@email = params[:email]
|
|
16
|
-
@owner_name = params[:owner_name]
|
|
17
|
-
@limit_percent = params[:limit_percent]
|
|
18
|
-
@bid_percent = params[:bid_percent]
|
|
19
|
-
@end_date = params[:end_date]
|
|
20
|
-
@daily_budget_amount = params[:daily_budget_amount]
|
|
21
|
-
@daily_budget_mode = params[:daily_budget_mode]
|
|
22
|
-
@blocked_ips = params[:blocked_ips]
|
|
23
|
-
@excluded_sites = params[:excluded_sites]
|
|
24
|
-
@search_strategy = params[:search_strategy]
|
|
25
|
-
@network_strategy = params[:network_strategy]
|
|
26
|
-
@target_hours = params[:target_hours]
|
|
27
|
-
@type == params[:type] || "TEXT_CAMPAIGN"
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def self.list
|
|
31
|
-
YandexDirect.request(SERVICE, 'get', {
|
|
32
|
-
"SelectionCriteria": {
|
|
33
|
-
"Types": ["TEXT_CAMPAIGN"],
|
|
34
|
-
"States": ["OFF", "ON"],
|
|
35
|
-
"Statuses": ["ACCEPTED", "DRAFT", "MODERATION"]
|
|
36
|
-
},
|
|
37
|
-
"FieldNames": ['Id', 'Name', 'State', 'Status', 'TimeTargeting', 'NegativeKeywords', 'ClientInfo', 'Type'],
|
|
38
|
-
"TextCampaignFieldNames": ["BiddingStrategy"]
|
|
39
|
-
})["Campaigns"].map{|c| new({ name: c["Name"], id: c["Id"], status: c["Status"], state: c["State"], type: c["Type"],
|
|
40
|
-
target_hours: c["TimeTargeting"]["Schedule"]["Items"], owner_name: c["ClientInfo"],
|
|
41
|
-
negative_keywords: (c["NegativeKeywords"].present? ? c["NegativeKeywords"]["Items"] : nil), search_strategy: c["TextCampaign"]["BiddingStrategy"]["Search"]["BiddingStrategyType"],
|
|
42
|
-
network_strategy: c["TextCampaign"]["BiddingStrategy"]["Network"]["BiddingStrategyType"]})}
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def self.add(params)
|
|
46
|
-
if params.kind_of?(Array)
|
|
47
|
-
batch_add(params)
|
|
48
|
-
else
|
|
49
|
-
special_parameters = params.text_campaign_parameters if params.type.blank? || params.type == "TEXT_CAMPAIGN"
|
|
50
|
-
params.id = YandexDirect.request(SERVICE, 'add', {"Campaigns": [params.parameters(special_parameters)]})["AddResults"].first["Id"]
|
|
51
|
-
params
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def self.update(params)
|
|
56
|
-
if params.kind_of?(Array)
|
|
57
|
-
batch_update(params)
|
|
58
|
-
else
|
|
59
|
-
special_parameters = params.text_campaign_parameters if params.type.blank? || params.type == "TEXT_CAMPAIGN"
|
|
60
|
-
params.id = YandexDirect.request(SERVICE, 'update', {"Campaigns": [params.parameters(special_parameters)]})["UpdateResults"].first["Id"]
|
|
61
|
-
params
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def parameters(campaign_type)
|
|
66
|
-
hash = {"Name": @name,
|
|
67
|
-
"ClientInfo": @owner_name,
|
|
68
|
-
"Notification": {
|
|
69
|
-
"EmailSettings": {
|
|
70
|
-
"Email": @email,
|
|
71
|
-
"SendAccountNews": "YES",
|
|
72
|
-
"SendWarnings": "YES"
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
"TimeTargeting": {
|
|
76
|
-
"Schedule": {
|
|
77
|
-
"Items": @target_hours
|
|
78
|
-
},
|
|
79
|
-
"ConsiderWorkingWeekends": "YES",
|
|
80
|
-
"HolidaysSchedule": {
|
|
81
|
-
"SuspendOnHolidays": "NO",
|
|
82
|
-
"BidPercent": 100,
|
|
83
|
-
"StartHour": 0,
|
|
84
|
-
"EndHour": 24
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
"TimeZone": @time_zone
|
|
88
|
-
}
|
|
89
|
-
hash["NegativeKeywords"] = @negative_keywords if @negative_keywords.present?
|
|
90
|
-
hash["DailyBudget"] = {"Amount": @daily_budget_amount, "Mode": @daily_budget_mode} if @daily_budget_mode.present? && @daily_budget_amount.present?
|
|
91
|
-
hash["BlockedIps"] = {"Items": @blocked_ips} if @blocked_ips.present?
|
|
92
|
-
hash["ExcludedSites"] = {"Items": @excluded_sites} if @excluded_sites.present?
|
|
93
|
-
hash["Id"] = @id if @id.present? && @id != 0
|
|
94
|
-
hash["StartDate"] = @start_date if @start_date.present?
|
|
95
|
-
hash["EndDate"] = @end_date if @end_date.present?
|
|
96
|
-
hash[campaign_type.first] = campaign_type.last
|
|
97
|
-
hash
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
def text_campaign_parameters
|
|
101
|
-
["TextCampaign", {"BiddingStrategy": {
|
|
102
|
-
"Search": {
|
|
103
|
-
"BiddingStrategyType": @search_strategy
|
|
104
|
-
},
|
|
105
|
-
"Network": {
|
|
106
|
-
"BiddingStrategyType": @network_strategy,
|
|
107
|
-
"NetworkDefault": {
|
|
108
|
-
"LimitPercent": @limit_percent,
|
|
109
|
-
"BidPercent": @bid_percent
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
]
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
private
|
|
118
|
-
|
|
119
|
-
def self.batch_add(campaigns)
|
|
120
|
-
params = []
|
|
121
|
-
campaigns.each do |campaign|
|
|
122
|
-
special_parameters = campaign.text_campaign_parameters if campaign.type.blank? || campaign.type == "TEXT_CAMPAIGN"
|
|
123
|
-
params.push(campaign.parameters(special_parameters))
|
|
124
|
-
end
|
|
125
|
-
params.each_slice(10) do |add_parameters|
|
|
126
|
-
YandexDirect.request(SERVICE, 'add', {"Campaigns": add_parameters.compact})["AddResults"].map{|r| r["Id"]}
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def self.batch_update(campaigns)
|
|
131
|
-
params = []
|
|
132
|
-
campaigns.each do |campaign|
|
|
133
|
-
special_parameters = campaign.text_campaign_parameters if campaign.type.blank? || campaign.type == "TEXT_CAMPAIGN"
|
|
134
|
-
params.push(campaign.parameters(special_parameters))
|
|
135
|
-
end
|
|
136
|
-
params.each_slice(10) do |add_parameters|
|
|
137
|
-
YandexDirect.request(SERVICE, 'update', {"Campaigns": add_parameters.compact})["UpdateResults"].map{|r| r["Id"]}
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
end
|
data/lib/services/keyword.rb
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
class YandexDirect::Keyword
|
|
2
|
-
SERVICE = 'keywords'
|
|
3
|
-
|
|
4
|
-
def self.add(params)
|
|
5
|
-
words = params[:words]
|
|
6
|
-
ad_group_id = params[:ad_group_id]
|
|
7
|
-
keywords = words.map do |word|
|
|
8
|
-
{ "Keyword": word[:word],
|
|
9
|
-
"AdGroupId": ad_group_id,
|
|
10
|
-
"Bid": word[:bid],
|
|
11
|
-
"ContextBid": word[:context_bid],
|
|
12
|
-
"StrategyPriority": word[:strategy_priority] || "NORMAL"
|
|
13
|
-
}
|
|
14
|
-
end
|
|
15
|
-
YandexDirect.request(SERVICE, 'add', {"Keywords": keywords})["AddResults"]
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def self.list(params)
|
|
19
|
-
selection_criteria = {"States": ["ON"], "Statuses": ["ACCEPTED", "DRAFT"]}
|
|
20
|
-
selection_criteria["CampaignIds"] = params[:campaign_ids] if params[:campaign_ids].present?
|
|
21
|
-
selection_criteria["Ids"] = params[:ids] if params[:ids].present?
|
|
22
|
-
selection_criteria["AdGroupIds"] = params[:ad_group_ids] if params[:ad_group_ids].present?
|
|
23
|
-
YandexDirect.request(SERVICE, 'get', {
|
|
24
|
-
"SelectionCriteria": selection_criteria,
|
|
25
|
-
"FieldNames": ["Id", "Keyword", "State", "Status", "AdGroupId", "CampaignId", "Bid", "ContextBid"]
|
|
26
|
-
})["Keywords"] || []
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def self.update(keywords)
|
|
30
|
-
keywords.map! do |word|
|
|
31
|
-
{ "Id": word[:id],
|
|
32
|
-
"Keyword": word[:word]
|
|
33
|
-
}
|
|
34
|
-
end
|
|
35
|
-
YandexDirect.request(SERVICE, 'update', {"Keywords": keywords})["AddResults"]
|
|
36
|
-
end
|
|
37
|
-
end
|
data/lib/services/sitelink.rb
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
class YandexDirect::Sitelink
|
|
2
|
-
SERVICE = 'sitelinks'
|
|
3
|
-
|
|
4
|
-
def self.add_set(params)
|
|
5
|
-
sitelinks = params.map do |link|
|
|
6
|
-
hash = {"Title": link[:title], "Href": link[:href]}
|
|
7
|
-
hash["Description"] = link[:description] if link[:description].present?
|
|
8
|
-
hash
|
|
9
|
-
end
|
|
10
|
-
YandexDirect.request(SERVICE, 'add', {"SitelinksSets": [{"Sitelinks": sitelinks}]})["AddResults"].first["Id"]
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def self.get(ids)
|
|
14
|
-
YandexDirect.request(SERVICE, 'get', {"SelectionCriteria": {"Ids": ids}, "FieldNames": ["Id", "Sitelinks"]})["SitelinksSets"] || []
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def self.delete(ids)
|
|
18
|
-
YandexDirect.request(SERVICE, 'delete', {"SelectionCriteria": {"Ids": ids}})
|
|
19
|
-
end
|
|
20
|
-
end
|
data/lib/services/vcard.rb
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
class YandexDirect::VCard
|
|
2
|
-
SERVICE = 'vcards'
|
|
3
|
-
|
|
4
|
-
def self.get(ids = nil)
|
|
5
|
-
params = {"FieldNames": ["Id", "Country", "City", "Street", "House", "Building", "Apartment", "CompanyName", "ExtraMessage", "ContactPerson", "ContactEmail", "MetroStationId", "CampaignId", "Ogrn", "WorkTime", "InstantMessenger", "Phone", "PointOnMap"]}
|
|
6
|
-
params["SelectionCriteria"] = {"Ids": ids} if ids.present?
|
|
7
|
-
YandexDirect.request(SERVICE, 'get', params)["VCards"] || []
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def self.add(params)
|
|
11
|
-
vcard = { "CampaignId": params[:campaign_id],
|
|
12
|
-
"Country": params[:country],
|
|
13
|
-
"City": params[:city],
|
|
14
|
-
"CompanyName": params[:company_name],
|
|
15
|
-
"WorkTime": params[:work_time],
|
|
16
|
-
"Phone": {
|
|
17
|
-
"CountryCode": params[:country_code],
|
|
18
|
-
"CityCode": params[:city_code],
|
|
19
|
-
"PhoneNumber": params[:phone_number],
|
|
20
|
-
"Extension": params[:phone_extension],
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
%w(Street House Building Apartment ExtraMessage Ogrn ContactEmail MetroStationId ContactPerson).each do |key|
|
|
24
|
-
vcard[key] = params[key.underscore.to_sym] if params[key.underscore.to_sym].present?
|
|
25
|
-
end
|
|
26
|
-
vcard["InstantMessenger"] = {"MessengerClient": params[:messenger_client], "MessengerLogin": params[:messenger_login]} if params[:messenger_client].present? && params[:messenger_login].present?
|
|
27
|
-
YandexDirect.request(SERVICE, 'add', {"VCards": [vcard]})["AddResults"].first["Id"]
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def self.delete(ids)
|
|
31
|
-
YandexDirect.request(SERVICE, 'delete', {"SelectionCriteria": {"Ids": ids}})
|
|
32
|
-
end
|
|
33
|
-
end
|
data/lib/tasks/install.rake
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
require 'yaml'
|
|
2
|
-
|
|
3
|
-
namespace :yandex_direct_api do
|
|
4
|
-
desc "Create yandex-direct-api configuration file"
|
|
5
|
-
task install: :environment do
|
|
6
|
-
File.open(Rails.root.join('config', 'yandex_direct_api.yml'), 'w') do |config|
|
|
7
|
-
settings = {'development' => {'token' => '', 'login' => '', 'locale' => 'ru', 'verbose' => true, 'sandbox' => true},
|
|
8
|
-
'test' => {'token' => '', 'login' => '', 'locale' => 'ru', 'verbose' => 'false', 'sandbox' => true},
|
|
9
|
-
'production' => {'token' => '', 'login' => '', 'locale' => 'ru', 'verbose' => false, 'sandbox' => false}}
|
|
10
|
-
config.write(settings.to_yaml)
|
|
11
|
-
end
|
|
12
|
-
File.open(Rails.root.join('config', 'initializers', 'yandex_direct_api.rb'), 'w') do |config|
|
|
13
|
-
config.write "require 'yandex_direct_api'\nYandexDirect.load File.join(Rails.root, 'config','yandex_direct_api.yml'), Rails.env"
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|