zuck 0.1.0 → 0.2.0
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.
- data/CHANGELOG.markdown +4 -0
- data/README.markdown +35 -0
- data/VERSION +1 -1
- data/lib/zuck/facebook/ad_account.rb +8 -5
- data/lib/zuck/facebook/ad_campaign.rb +0 -1
- data/lib/zuck/facebook/ad_creative.rb +11 -10
- data/lib/zuck/facebook/ad_group.rb +5 -7
- data/lib/zuck/fb_object/hash_delegator.rb +5 -1
- data/lib/zuck/fb_object/helpers.rb +1 -1
- data/lib/zuck/fb_object/read.rb +0 -35
- data/spec/fixtures/a_single_account.yml +32 -57
- data/spec/fixtures/a_single_campaign.yml +12 -12
- data/spec/fixtures/a_single_group.yml +48 -0
- data/spec/fixtures/ad_keyword_search_disney.yml +12 -12
- data/spec/fixtures/{ad_keyword_search_steve_carell.yml → ad_keyword_search_moviepilot.yml} +8 -9
- data/spec/fixtures/ad_keyword_search_nonexistant.yml +5 -5
- data/spec/fixtures/create_ad_campaign.yml +12 -15
- data/spec/fixtures/create_ad_group.yml +15 -14
- data/spec/fixtures/delete_ad_group.yml +11 -15
- data/spec/fixtures/find_a_single_group_and_update_it.yml +224 -0
- data/spec/fixtures/list_of_ad_accounts.yml +26 -23
- data/spec/fixtures/list_of_ad_campaigns.yml +23 -24
- data/spec/fixtures/list_of_ad_creatives.yml +13 -15
- data/spec/fixtures/list_of_ad_groups.yml +62 -31
- data/spec/fixtures/list_of_all_ad_creatives_of_account.yml +41 -34
- data/spec/fixtures/reach_for_invalid_keyword.yml +9 -56
- data/spec/fixtures/reach_for_valid_keywords.yml +11 -56
- data/spec/fixtures/reach_for_valid_keywords_male_young.yml +11 -56
- data/spec/lib/zuck/facebook/ad_keyword_spec.rb +3 -3
- data/spec/lib/zuck/facebook/targeting_spec_spec.rb +4 -4
- data/spec/lib/zuck/fb_object/helpers_spec.rb +3 -2
- data/spec/lib/zuck_spec.rb +17 -24
- data/spec/spec_helper.rb +3 -0
- data/zuck.gemspec +5 -4
- metadata +6 -5
- data/spec/fixtures/find_a_single_campaign_and_update_it.yml +0 -247
data/CHANGELOG.markdown
CHANGED
data/README.markdown
CHANGED
@@ -88,6 +88,41 @@ group.ad_status
|
|
88
88
|
=> 3
|
89
89
|
```
|
90
90
|
|
91
|
+
AdKeyword convenience methods
|
92
|
+
--------
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
graph = Zuck.graph
|
96
|
+
|
97
|
+
# Search for keywords (to auto complete, for example) (yes, facebook sometimes returns ids as string and sometimes as numbers)
|
98
|
+
Zuck::AdKeyword.search(graph, "Auto")
|
99
|
+
=> [
|
100
|
+
{:keyword=>"Auto", :id=>"6003156165433", :audience=>nil},
|
101
|
+
{:keyword=>"#Automobile", :id=>6003176678152, :audience=>97900000},
|
102
|
+
{:keyword=>"#Auto racing", :id=>6003146718552, :audience=>21800000},
|
103
|
+
{:keyword=>"#Auto mechanic", :id=>6003109384433, :audience=>14600000}
|
104
|
+
]
|
105
|
+
|
106
|
+
# Quickly check if a keyword is valid
|
107
|
+
Zuck::AdKeyword.validate(graph, '#Eminem')
|
108
|
+
=> {"#Eminem" => true}
|
109
|
+
|
110
|
+
# Quickly check a couple of keywords
|
111
|
+
Zuck::AdKeyword.validate(graph, ['#Eminem', 'Wil Ferel', 'Bronson'])
|
112
|
+
=> {"#Eminem"=>true, "Bronson"=>true, "Wil Ferel"=>false}
|
113
|
+
|
114
|
+
# Make a best guess on how a keyword is called on Facebook
|
115
|
+
Zuck::AdKeyword.best_guess(graph, 'Disney')
|
116
|
+
=> {:keyword=>"#The Walt Disney Company", :id=>6003270522085, :audience=>72500000}
|
117
|
+
|
118
|
+
# Sometimes a best guess does not return a keyword with a # prefix, and that
|
119
|
+
# means that we don't know the audience of that keyword:
|
120
|
+
Zuck::AdKeyword.best_guess(graph, 'Moviepilot')
|
121
|
+
=> {:keyword=>"Moviepilot", :id=>6003327847780, :audience=>nil}
|
122
|
+
|
123
|
+
```
|
124
|
+
|
125
|
+
|
91
126
|
Supported objects
|
92
127
|
-----------------
|
93
128
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -4,28 +4,31 @@ module Zuck
|
|
4
4
|
# The [fb docs](https://developers.facebook.com/docs/reference/ads-api/adaccount/)
|
5
5
|
# were incomplete, so I added here what the graph explorer
|
6
6
|
# actually returned.
|
7
|
-
known_keys :
|
7
|
+
known_keys :account_groups,
|
8
|
+
:account_id,
|
8
9
|
:account_status,
|
10
|
+
:age,
|
11
|
+
:agency_client_declaration,
|
12
|
+
:amount_spent,
|
9
13
|
:balance,
|
10
14
|
:business_city,
|
11
15
|
:business_country_code,
|
12
16
|
:business_name,
|
13
17
|
:business_state,
|
14
|
-
:business_street,
|
15
18
|
:business_street2,
|
19
|
+
:business_street,
|
16
20
|
:business_zip,
|
17
21
|
:capabilities,
|
18
22
|
:currency,
|
19
23
|
:daily_spend_limit,
|
20
24
|
:id,
|
21
25
|
:is_personal,
|
22
|
-
:moo_default_bid,
|
23
|
-
:moo_default_conversion_bid,
|
24
26
|
:name,
|
25
|
-
:
|
27
|
+
:spend_cap,
|
26
28
|
:timezone_id,
|
27
29
|
:timezone_name,
|
28
30
|
:timezone_offset_hours_utc,
|
31
|
+
:tos_accepted,
|
29
32
|
:users,
|
30
33
|
:vat_status
|
31
34
|
|
@@ -7,21 +7,22 @@ module Zuck
|
|
7
7
|
# The [fb docs](https://developers.facebook.com/docs/reference/ads-api/adaccount/)
|
8
8
|
# were incomplete, so I added here what the graph explorer
|
9
9
|
# actually returned.
|
10
|
-
known_keys :
|
10
|
+
known_keys :name,
|
11
|
+
:type,
|
12
|
+
:object_id,
|
11
13
|
:body,
|
12
|
-
:count_current_adgroups,
|
13
|
-
:creative_id,
|
14
|
-
:id,
|
15
14
|
:image_hash,
|
16
15
|
:image_url,
|
16
|
+
:id,
|
17
|
+
:title,
|
17
18
|
:link_url,
|
18
|
-
:
|
19
|
-
:object_id,
|
19
|
+
:url_tags,
|
20
20
|
:preview_url,
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
24
|
-
:
|
21
|
+
:related_fan_page,
|
22
|
+
:follow_redirect,
|
23
|
+
:auto_update,
|
24
|
+
:story_id,
|
25
|
+
:action_spec
|
25
26
|
|
26
27
|
parent_object :ad_group
|
27
28
|
list_path :adcreatives
|
@@ -7,9 +7,6 @@ module Zuck
|
|
7
7
|
# were incomplete, so I added here what the graph explorer
|
8
8
|
# actually returned.
|
9
9
|
known_keys :account_id,
|
10
|
-
:ad_id,
|
11
|
-
:ad_status,
|
12
|
-
:adgroup_id,
|
13
10
|
:adgroup_status,
|
14
11
|
:bid_info,
|
15
12
|
:bid_type,
|
@@ -17,13 +14,14 @@ module Zuck
|
|
17
14
|
:conversion_specs,
|
18
15
|
:created_time,
|
19
16
|
:creative_ids,
|
20
|
-
:end_time,
|
21
17
|
:id,
|
22
|
-
:
|
18
|
+
:disapprove_reason_descriptions,
|
19
|
+
:last_updated_by_app_id,
|
23
20
|
:name,
|
24
|
-
:start_time,
|
25
21
|
:targeting,
|
26
|
-
:
|
22
|
+
:tracking_specs,
|
23
|
+
:updated_time,
|
24
|
+
:view_tags
|
27
25
|
|
28
26
|
parent_object :ad_campaign
|
29
27
|
list_path :adgroups
|
@@ -50,6 +50,11 @@ module Zuck
|
|
50
50
|
def known_keys(*args)
|
51
51
|
args.each do |key|
|
52
52
|
|
53
|
+
# Define list of known keys
|
54
|
+
self.send(:define_method, :known_keys) do
|
55
|
+
args || []
|
56
|
+
end
|
57
|
+
|
53
58
|
# Define getter
|
54
59
|
self.send(:define_method, key) do
|
55
60
|
init_hash
|
@@ -106,6 +111,5 @@ module Zuck
|
|
106
111
|
def init_hash
|
107
112
|
@hash_delegator_hash ||= {}
|
108
113
|
end
|
109
|
-
|
110
114
|
end
|
111
115
|
end
|
data/lib/zuck/fb_object/read.rb
CHANGED
@@ -24,7 +24,6 @@ module Zuck
|
|
24
24
|
# Refetches the data from façeboko
|
25
25
|
def reload
|
26
26
|
data = get(graph, path)
|
27
|
-
validate_data(data)
|
28
27
|
set_data(data)
|
29
28
|
self
|
30
29
|
end
|
@@ -41,40 +40,6 @@ module Zuck
|
|
41
40
|
@parent_object = parent
|
42
41
|
end
|
43
42
|
|
44
|
-
# Makes sure that the data passed comes from a facebook
|
45
|
-
# object of the same type. We check this by comparing
|
46
|
-
# the 'group_id' value or the 'ad_group_id' value
|
47
|
-
# with the 'id' value, when this
|
48
|
-
# is called on a {Zuck::AdGroup} for example.
|
49
|
-
#
|
50
|
-
# Facebook omits the "ad" prefix sometimes, so we check
|
51
|
-
# for both.
|
52
|
-
def validate_data(data)
|
53
|
-
singular_list_path = self.class.list_path.to_s.singularize
|
54
|
-
|
55
|
-
# This is a special case for ad accounts (they have weird ids
|
56
|
-
# that begin with act: "act_12345" instead of "12345"
|
57
|
-
return if data['account_id'] and "act_#{data['account_id']}" == data['id'].to_s
|
58
|
-
|
59
|
-
# This is the case for all other objects
|
60
|
-
long_id_key = "#{singular_list_path}_id"
|
61
|
-
short_id_key = "#{singular_list_path[2..-1]}_id"
|
62
|
-
return if data[long_id_key] and data[long_id_key].to_s == data["id"].to_s
|
63
|
-
return if data[short_id_key] and data[short_id_key].to_s == data["id"].to_s
|
64
|
-
|
65
|
-
# Something went wrong. Either the data provided by the user is
|
66
|
-
# not consistent, or a wrong object type was belongs to this id on facebook
|
67
|
-
# (an ad group instead of an ad campaign, for example).
|
68
|
-
#
|
69
|
-
# Maybe we can make somebody's life easier by raising a verbose exception.
|
70
|
-
error = "Invalid type.\n\nExpected data['id']=#{data['id'].inspect} to be equal to one of these:\n"
|
71
|
-
error += " * data['account_id']=#{data['account_id'].inspect}\n"
|
72
|
-
error += " * data['#{short_id_key}']=#{data[short_id_key].inspect}\n"
|
73
|
-
error += " * data['#{long_id_key}']=#{data[long_id_key].inspect}\n"
|
74
|
-
|
75
|
-
raise error
|
76
|
-
end
|
77
|
-
|
78
43
|
module ClassMethods
|
79
44
|
|
80
45
|
# Finds by object id and checks type
|
@@ -2,74 +2,49 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: get
|
5
|
-
uri: https://graph.facebook.com/act_10150585630710217?access_token=
|
5
|
+
uri: https://graph.facebook.com/act_10150585630710217?access_token=CAAEvJ5vzhl8BAH8aCPOx0Ft9uNB147TF8weJ8hK0g7YVDRWU4eEih7tEKdJgmfk0vABZClZACJbEzyhSMbiShL6RpsfkZASfX1C9nv1AlFvjJajflqkyYZAlpE2edT0FJHjdh4NFg0ZCt0sBgq0kZABtKsjuU18aMURLE7rjKHR4X8NkXBUafg1T4uZARRNqboZD&fields=account_groups,account_id,account_status,age,agency_client_declaration,amount_spent,balance,business_city,business_country_code,business_name,business_state,business_street2,business_street,business_zip,capabilities,currency,daily_spend_limit,id,is_personal,name,spend_cap,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,users,vat_status
|
6
6
|
body:
|
7
7
|
encoding: US-ASCII
|
8
8
|
string: ''
|
9
9
|
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.7
|
10
12
|
Accept-Encoding:
|
11
13
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
14
|
Accept:
|
13
15
|
- ! '*/*'
|
14
|
-
User-Agent:
|
15
|
-
- Ruby
|
16
16
|
response:
|
17
17
|
status:
|
18
18
|
code: 200
|
19
|
-
message:
|
20
|
-
T0s=
|
19
|
+
message: OK
|
21
20
|
headers:
|
22
|
-
|
23
|
-
- !
|
24
|
-
|
25
|
-
|
26
|
-
-
|
27
|
-
|
28
|
-
|
29
|
-
- !
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
-
|
42
|
-
|
43
|
-
|
44
|
-
- !binary |-
|
45
|
-
Z3ppcA==
|
46
|
-
!binary "WC1GYi1EZWJ1Zw==":
|
47
|
-
- !binary |-
|
48
|
-
L3l3UTJxVWc2L0toZVhhTnFXY21lVFFsSW0vVkFEV09tUFIvQVkzVWsxTT0=
|
49
|
-
!binary "RGF0ZQ==":
|
50
|
-
- !binary |-
|
51
|
-
VHVlLCAyMSBBdWcgMjAxMiAxNDo1MjoyNCBHTVQ=
|
52
|
-
!binary "Q29ubmVjdGlvbg==":
|
53
|
-
- !binary |-
|
54
|
-
a2VlcC1hbGl2ZQ==
|
55
|
-
!binary "Q29udGVudC1MZW5ndGg=":
|
56
|
-
- !binary |-
|
57
|
-
NTA1
|
21
|
+
Access-Control-Allow-Origin:
|
22
|
+
- ! '*'
|
23
|
+
Cache-Control:
|
24
|
+
- private, no-cache, no-store, must-revalidate
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=UTF-8
|
27
|
+
Etag:
|
28
|
+
- ! '"3974cd2e1bd6adde467a920e740351a73e2d5889"'
|
29
|
+
Expires:
|
30
|
+
- Sat, 01 Jan 2000 00:00:00 GMT
|
31
|
+
Pragma:
|
32
|
+
- no-cache
|
33
|
+
X-Fb-Rev:
|
34
|
+
- '934677'
|
35
|
+
X-Fb-Debug:
|
36
|
+
- X2mEeMJUPl6v6oa677ct5KWrnQJIEqYykFRDw7P1OOE=
|
37
|
+
Date:
|
38
|
+
- Thu, 12 Sep 2013 13:21:40 GMT
|
39
|
+
Connection:
|
40
|
+
- keep-alive
|
41
|
+
Content-Length:
|
42
|
+
- '697'
|
58
43
|
body:
|
59
|
-
encoding: ASCII
|
60
|
-
string: !
|
61
|
-
|
62
|
-
|
63
|
-
cRGtCYwcND7NpD7IED2pOSUqOqeNOqLg4fcdagIM+sUafcm32c6I1zz30dlR
|
64
|
-
P3671a4HM4+wXed1EAcbnRcxKFLnlIAXo3beGtmTmlHSRA9Gey9e093CPvsF
|
65
|
-
Tzr73jvYH0L28CP7cpBdiGbvG+3VwT1GxvTGPIWvWG2K98FpHdD3JzPkmOLn
|
66
|
-
tcReO9Na12mX/dHQ66zi84oKQprT1PjMigxpxB9fXmBMW8lztltkShtzR6Fs
|
67
|
-
m+Lu7vHxWQbxtpiCklZCfxR+1KYVPQyAneYlYzjB6HGepP57IjHtqGR8W+At
|
68
|
-
VJTgoAfwHqxJ75zmtKAbWtLtP0qc7bEUZ4yfERkboAMlA2oFLi0ATpvUJzJl
|
69
|
-
SwDV7PLFwDNNEP/mEGd3hZTgb8WuomKV3SxDyyWslnC3gHzpgs9d5DOP7y6Q
|
70
|
-
nUQL9uL4zSuqVrwiO3ldxE6W39litTqyK9WRXVRHvFI97XjWfPUBzpvfrZa/
|
71
|
-
WWHPuBolR9lADwF0uo8c76CRvTQKDwPvarBWtLqTsQ94mOYZryxdR5OOLF3C
|
72
|
-
+T90T7SjiQQAAA==
|
44
|
+
encoding: US-ASCII
|
45
|
+
string: ! '{"account_id":"10150585630710217","account_status":1,"age":590.89847222222,"amount_spent":4093,"balance":0,"business_city":"Berlin","business_country_code":"DE","business_name":"Big
|
46
|
+
Mike Alright UG (haftungsbeschr\u00e4nkt)","business_state":"Berlin","business_street2":"J\u00e4gerndorfer
|
47
|
+
Zeile 61","business_street":"Big Mike Alright UG (haftungsbeschr\u00e4nkt)","business_zip":"12209","capabilities":[2,6,15,11,16],"currency":"USD","daily_spend_limit":150000,"id":"act_10150585630710217","is_personal":0,"name":"","spend_cap":5000,"timezone_id":47,"timezone_name":"Europe\/Berlin","timezone_offset_hours_utc":2,"users":[{"uid":501730216,"permissions":[1,2,3,4,5,7],"role":1001}],"vat_status":3}'
|
73
48
|
http_version:
|
74
|
-
recorded_at:
|
75
|
-
recorded_with: VCR 2.
|
49
|
+
recorded_at: Thu, 12 Sep 2013 13:21:40 GMT
|
50
|
+
recorded_with: VCR 2.3.0
|
@@ -2,17 +2,17 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: get
|
5
|
-
uri: https://graph.facebook.com/6005950787751?access_token=
|
5
|
+
uri: https://graph.facebook.com/6005950787751?access_token=CAAEvJ5vzhl8BAH8aCPOx0Ft9uNB147TF8weJ8hK0g7YVDRWU4eEih7tEKdJgmfk0vABZClZACJbEzyhSMbiShL6RpsfkZASfX1C9nv1AlFvjJajflqkyYZAlpE2edT0FJHjdh4NFg0ZCt0sBgq0kZABtKsjuU18aMURLE7rjKHR4X8NkXBUafg1T4uZARRNqboZD&fields=account_id,campaign_status,created_time,daily_imps,end_time,id,lifetime_budget,name,start_time,updated_time
|
6
6
|
body:
|
7
7
|
encoding: US-ASCII
|
8
8
|
string: ''
|
9
9
|
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.7
|
10
12
|
Accept-Encoding:
|
11
13
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
14
|
Accept:
|
13
15
|
- ! '*/*'
|
14
|
-
User-Agent:
|
15
|
-
- Ruby
|
16
16
|
response:
|
17
17
|
status:
|
18
18
|
code: 200
|
@@ -23,26 +23,26 @@ http_interactions:
|
|
23
23
|
Cache-Control:
|
24
24
|
- private, no-cache, no-store, must-revalidate
|
25
25
|
Content-Type:
|
26
|
-
-
|
26
|
+
- application/json; charset=UTF-8
|
27
27
|
Etag:
|
28
|
-
- ! '"
|
28
|
+
- ! '"e86bfdbd29a6618779f20e958e1dfe705bb806de"'
|
29
29
|
Expires:
|
30
30
|
- Sat, 01 Jan 2000 00:00:00 GMT
|
31
31
|
Pragma:
|
32
32
|
- no-cache
|
33
33
|
X-Fb-Rev:
|
34
|
-
- '
|
34
|
+
- '934677'
|
35
35
|
X-Fb-Debug:
|
36
|
-
-
|
36
|
+
- i6CJnwde2dK30oFKSKB+yrtbjQtBwOx7j7wbo7jQdwQ=
|
37
37
|
Date:
|
38
|
-
-
|
38
|
+
- Thu, 12 Sep 2013 13:21:40 GMT
|
39
39
|
Connection:
|
40
40
|
- keep-alive
|
41
41
|
Content-Length:
|
42
|
-
- '
|
42
|
+
- '230'
|
43
43
|
body:
|
44
44
|
encoding: US-ASCII
|
45
|
-
string: ! '{"account_id":"10150585630710217","
|
45
|
+
string: ! '{"account_id":"10150585630710217","campaign_status":3,"created_time":"2012-08-21T16:04:13+0200","daily_imps":0,"id":"6005950787751","name":"bloody","start_time":"2012-08-21T16:04:13+0200","updated_time":"2013-03-25T12:40:29+0100"}'
|
46
46
|
http_version:
|
47
|
-
recorded_at:
|
48
|
-
recorded_with: VCR 2.
|
47
|
+
recorded_at: Thu, 12 Sep 2013 13:21:40 GMT
|
48
|
+
recorded_with: VCR 2.3.0
|
@@ -0,0 +1,48 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://graph.facebook.com/6010889111951?access_token=CAAEvJ5vzhl8BAH8aCPOx0Ft9uNB147TF8weJ8hK0g7YVDRWU4eEih7tEKdJgmfk0vABZClZACJbEzyhSMbiShL6RpsfkZASfX1C9nv1AlFvjJajflqkyYZAlpE2edT0FJHjdh4NFg0ZCt0sBgq0kZABtKsjuU18aMURLE7rjKHR4X8NkXBUafg1T4uZARRNqboZD&fields=account_id,adgroup_status,bid_info,bid_type,campaign_id,conversion_specs,created_time,creative_ids,id,disapprove_reason_descriptions,last_updated_by_app_id,name,targeting,tracking_specs,updated_time,view_tags
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.7
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- ! '*/*'
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 400
|
19
|
+
message: Bad Request
|
20
|
+
headers:
|
21
|
+
Access-Control-Allow-Origin:
|
22
|
+
- ! '*'
|
23
|
+
Cache-Control:
|
24
|
+
- no-store
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=UTF-8
|
27
|
+
Expires:
|
28
|
+
- Sat, 01 Jan 2000 00:00:00 GMT
|
29
|
+
Pragma:
|
30
|
+
- no-cache
|
31
|
+
Www-Authenticate:
|
32
|
+
- ! 'OAuth "Facebook Platform" "invalid_request" "(#100) Unknown fields: adgroup_status,bid_info,bid_type,conversion_specs,creative_ids,disapprove_reason_descriptions,last_updated_by_app_id,targeting,tracking_specs,view_tags."'
|
33
|
+
X-Fb-Rev:
|
34
|
+
- '934677'
|
35
|
+
X-Fb-Debug:
|
36
|
+
- Gks1Vwa18J2bq9/Zxb9ya6ywWnVPynwEDSmFjSxKc9k=
|
37
|
+
Date:
|
38
|
+
- Thu, 12 Sep 2013 13:21:40 GMT
|
39
|
+
Connection:
|
40
|
+
- keep-alive
|
41
|
+
Content-Length:
|
42
|
+
- '234'
|
43
|
+
body:
|
44
|
+
encoding: US-ASCII
|
45
|
+
string: ! '{"error":{"message":"(#100) Unknown fields: adgroup_status,bid_info,bid_type,conversion_specs,creative_ids,disapprove_reason_descriptions,last_updated_by_app_id,targeting,tracking_specs,view_tags.","type":"OAuthException","code":100}}'
|
46
|
+
http_version:
|
47
|
+
recorded_at: Thu, 12 Sep 2013 13:21:41 GMT
|
48
|
+
recorded_with: VCR 2.3.0
|