google-adwords-api 0.16.1 → 0.17.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.
Files changed (343) hide show
  1. checksums.yaml +8 -8
  2. data/ChangeLog +6 -1
  3. data/README.md +1 -1
  4. data/examples/v201502/account_management/create_account.rb +1 -1
  5. data/examples/v201502/account_management/get_account_hierarchy.rb +1 -1
  6. data/examples/v201502/reporting/parallel_report_download.rb +1 -1
  7. data/examples/v201506/account_management/create_account.rb +1 -1
  8. data/examples/v201506/account_management/get_account_hierarchy.rb +1 -1
  9. data/examples/v201506/reporting/parallel_report_download.rb +1 -1
  10. data/examples/v201509/account_management/create_account.rb +88 -0
  11. data/examples/v201509/account_management/get_account_changes.rb +139 -0
  12. data/examples/v201509/account_management/get_account_hierarchy.rb +94 -0
  13. data/examples/v201509/advanced_operations/add_ad_customizers.rb +184 -0
  14. data/examples/v201509/advanced_operations/add_ad_group_bid_modifier.rb +101 -0
  15. data/examples/v201509/advanced_operations/add_click_to_download_ad.rb +133 -0
  16. data/examples/v201509/advanced_operations/add_html5_ad.rb +137 -0
  17. data/examples/v201509/advanced_operations/add_text_ad_with_upgraded_urls.rb +134 -0
  18. data/examples/v201509/advanced_operations/create_and_attach_shared_keyword_set.rb +141 -0
  19. data/examples/v201509/advanced_operations/find_and_remove_criteria_from_shared_set.rb +174 -0
  20. data/examples/v201509/advanced_operations/get_ad_group_bid_modifiers.rb +102 -0
  21. data/examples/v201509/advanced_operations/upload_offline_conversions.rb +113 -0
  22. data/examples/v201509/advanced_operations/use_shared_bidding_strategy.rb +147 -0
  23. data/examples/v201509/basic_operations/add_ad_groups.rb +140 -0
  24. data/examples/v201509/basic_operations/add_campaigns.rb +139 -0
  25. data/examples/v201509/basic_operations/add_keywords.rb +114 -0
  26. data/examples/v201509/basic_operations/add_text_ads.rb +109 -0
  27. data/examples/v201509/basic_operations/get_ad_groups.rb +102 -0
  28. data/examples/v201509/basic_operations/get_campaigns.rb +97 -0
  29. data/examples/v201509/basic_operations/get_campaigns_with_awql.rb +89 -0
  30. data/examples/v201509/basic_operations/get_keywords.rb +109 -0
  31. data/examples/v201509/basic_operations/get_text_ads.rb +110 -0
  32. data/examples/v201509/basic_operations/pause_ad.rb +88 -0
  33. data/examples/v201509/basic_operations/remove_ad.rb +89 -0
  34. data/examples/v201509/basic_operations/remove_ad_group.rb +85 -0
  35. data/examples/v201509/basic_operations/remove_campaign.rb +87 -0
  36. data/examples/v201509/basic_operations/remove_keyword.rb +94 -0
  37. data/examples/v201509/basic_operations/update_ad_group.rb +85 -0
  38. data/examples/v201509/basic_operations/update_campaign.rb +86 -0
  39. data/examples/v201509/basic_operations/update_keyword.rb +106 -0
  40. data/examples/v201509/campaign_management/add_campaign_labels.rb +82 -0
  41. data/examples/v201509/campaign_management/add_complete_campaigns_using_batch_job.rb +362 -0
  42. data/examples/v201509/campaign_management/add_experiment.rb +162 -0
  43. data/examples/v201509/campaign_management/add_keywords_in_bulk.rb +153 -0
  44. data/examples/v201509/campaign_management/get_all_disapproved_ads.rb +97 -0
  45. data/examples/v201509/campaign_management/get_all_disapproved_ads_with_awql.rb +89 -0
  46. data/examples/v201509/campaign_management/get_campaigns_by_label.rb +108 -0
  47. data/examples/v201509/campaign_management/promote_experiment.rb +81 -0
  48. data/examples/v201509/campaign_management/set_ad_parameters.rb +118 -0
  49. data/examples/v201509/campaign_management/set_criterion_bid_modifier.rb +104 -0
  50. data/examples/v201509/campaign_management/validate_text_ad.rb +110 -0
  51. data/examples/v201509/error_handling/handle_partial_failures.rb +130 -0
  52. data/examples/v201509/error_handling/handle_policy_violation_error.rb +141 -0
  53. data/examples/v201509/extensions/add_google_my_business_location_extensions.rb +193 -0
  54. data/examples/v201509/extensions/add_site_links.rb +164 -0
  55. data/examples/v201509/extensions/add_site_links_using_feeds.rb +281 -0
  56. data/examples/v201509/migration/migrate_to_extension_settings.rb +386 -0
  57. data/examples/v201509/migration/upgrade_ad_url.rb +93 -0
  58. data/examples/v201509/misc/get_all_images_and_videos.rb +104 -0
  59. data/examples/v201509/misc/setup_oauth2.rb +84 -0
  60. data/examples/v201509/misc/upload_image.rb +93 -0
  61. data/examples/v201509/misc/upload_media_bundle.rb +90 -0
  62. data/examples/v201509/misc/use_oauth2_jwt.rb +93 -0
  63. data/examples/v201509/misc/use_runtime_config.rb +92 -0
  64. data/examples/v201509/optimization/estimate_keyword_traffic.rb +146 -0
  65. data/examples/v201509/optimization/get_keyword_bid_simulations.rb +95 -0
  66. data/examples/v201509/optimization/get_keyword_ideas.rb +126 -0
  67. data/examples/v201509/remarketing/add_audience.rb +118 -0
  68. data/examples/v201509/remarketing/add_conversion_tracker.rb +98 -0
  69. data/examples/v201509/remarketing/add_crm_based_user_list.rb +121 -0
  70. data/examples/v201509/remarketing/add_rule_based_user_lists.rb +167 -0
  71. data/examples/v201509/reporting/download_criteria_report.rb +92 -0
  72. data/examples/v201509/reporting/download_criteria_report_with_awql.rb +93 -0
  73. data/examples/v201509/reporting/get_report_fields.rb +75 -0
  74. data/examples/v201509/reporting/parallel_report_download.rb +166 -0
  75. data/examples/v201509/shopping_campaigns/add_product_partition_tree.rb +267 -0
  76. data/examples/v201509/shopping_campaigns/add_product_scope.rb +129 -0
  77. data/examples/v201509/shopping_campaigns/add_shopping_campaign.rb +129 -0
  78. data/examples/v201509/shopping_campaigns/get_product_category_taxonomy.rb +115 -0
  79. data/examples/v201509/targeting/add_campaign_targeting_criteria.rb +180 -0
  80. data/examples/v201509/targeting/add_demographic_targeting_criteria.rb +112 -0
  81. data/examples/v201509/targeting/get_campaign_targeting_criteria.rb +106 -0
  82. data/examples/v201509/targeting/get_targetable_languages_and_carriers.rb +89 -0
  83. data/examples/v201509/targeting/lookup_location.rb +108 -0
  84. data/lib/adwords_api/api_config.rb +91 -4
  85. data/lib/adwords_api/batch_job_utils.rb +234 -0
  86. data/lib/adwords_api/errors.rb +3 -0
  87. data/lib/adwords_api/report_utils.rb +22 -6
  88. data/lib/adwords_api/v201502/account_label_service.rb +9 -1
  89. data/lib/adwords_api/v201502/account_label_service_registry.rb +1 -1
  90. data/lib/adwords_api/v201502/ad_customizer_feed_service.rb +9 -1
  91. data/lib/adwords_api/v201502/ad_customizer_feed_service_registry.rb +1 -1
  92. data/lib/adwords_api/v201502/ad_group_ad_service.rb +21 -1
  93. data/lib/adwords_api/v201502/ad_group_ad_service_registry.rb +2 -2
  94. data/lib/adwords_api/v201502/ad_group_bid_modifier_service.rb +13 -1
  95. data/lib/adwords_api/v201502/ad_group_bid_modifier_service_registry.rb +1 -1
  96. data/lib/adwords_api/v201502/ad_group_criterion_service.rb +17 -1
  97. data/lib/adwords_api/v201502/ad_group_criterion_service_registry.rb +1 -1
  98. data/lib/adwords_api/v201502/ad_group_extension_setting_service.rb +13 -1
  99. data/lib/adwords_api/v201502/ad_group_extension_setting_service_registry.rb +2 -2
  100. data/lib/adwords_api/v201502/ad_group_feed_service.rb +13 -1
  101. data/lib/adwords_api/v201502/ad_group_feed_service_registry.rb +1 -1
  102. data/lib/adwords_api/v201502/ad_group_service.rb +17 -1
  103. data/lib/adwords_api/v201502/ad_group_service_registry.rb +2 -2
  104. data/lib/adwords_api/v201502/ad_param_service.rb +9 -1
  105. data/lib/adwords_api/v201502/ad_param_service_registry.rb +1 -1
  106. data/lib/adwords_api/v201502/adwords_user_list_service.rb +9 -1
  107. data/lib/adwords_api/v201502/adwords_user_list_service_registry.rb +1 -1
  108. data/lib/adwords_api/v201502/bidding_strategy_service.rb +13 -1
  109. data/lib/adwords_api/v201502/bidding_strategy_service_registry.rb +1 -1
  110. data/lib/adwords_api/v201502/budget_order_service.rb +13 -1
  111. data/lib/adwords_api/v201502/budget_order_service_registry.rb +1 -1
  112. data/lib/adwords_api/v201502/budget_service.rb +13 -1
  113. data/lib/adwords_api/v201502/budget_service_registry.rb +1 -1
  114. data/lib/adwords_api/v201502/campaign_criterion_service.rb +13 -1
  115. data/lib/adwords_api/v201502/campaign_criterion_service_registry.rb +1 -1
  116. data/lib/adwords_api/v201502/campaign_extension_setting_service.rb +13 -1
  117. data/lib/adwords_api/v201502/campaign_extension_setting_service_registry.rb +2 -2
  118. data/lib/adwords_api/v201502/campaign_feed_service.rb +13 -1
  119. data/lib/adwords_api/v201502/campaign_feed_service_registry.rb +1 -1
  120. data/lib/adwords_api/v201502/campaign_service.rb +17 -1
  121. data/lib/adwords_api/v201502/campaign_service_registry.rb +2 -2
  122. data/lib/adwords_api/v201502/campaign_shared_set_service.rb +9 -1
  123. data/lib/adwords_api/v201502/campaign_shared_set_service_registry.rb +1 -1
  124. data/lib/adwords_api/v201502/constant_data_service.rb +37 -1
  125. data/lib/adwords_api/v201502/constant_data_service_registry.rb +1 -1
  126. data/lib/adwords_api/v201502/conversion_tracker_service.rb +13 -1
  127. data/lib/adwords_api/v201502/conversion_tracker_service_registry.rb +1 -1
  128. data/lib/adwords_api/v201502/customer_extension_setting_service.rb +13 -1
  129. data/lib/adwords_api/v201502/customer_extension_setting_service_registry.rb +2 -2
  130. data/lib/adwords_api/v201502/customer_feed_service.rb +13 -1
  131. data/lib/adwords_api/v201502/customer_feed_service_registry.rb +1 -1
  132. data/lib/adwords_api/v201502/customer_service.rb +9 -1
  133. data/lib/adwords_api/v201502/customer_service_registry.rb +1 -1
  134. data/lib/adwords_api/v201502/customer_sync_service.rb +5 -1
  135. data/lib/adwords_api/v201502/customer_sync_service_registry.rb +1 -1
  136. data/lib/adwords_api/v201502/data_service.rb +25 -1
  137. data/lib/adwords_api/v201502/data_service_registry.rb +1 -1
  138. data/lib/adwords_api/v201502/experiment_service.rb +9 -1
  139. data/lib/adwords_api/v201502/experiment_service_registry.rb +1 -1
  140. data/lib/adwords_api/v201502/feed_item_service.rb +13 -1
  141. data/lib/adwords_api/v201502/feed_item_service_registry.rb +1 -1
  142. data/lib/adwords_api/v201502/feed_mapping_service.rb +13 -1
  143. data/lib/adwords_api/v201502/feed_mapping_service_registry.rb +1 -1
  144. data/lib/adwords_api/v201502/feed_service.rb +13 -1
  145. data/lib/adwords_api/v201502/feed_service_registry.rb +1 -1
  146. data/lib/adwords_api/v201502/geo_location_service.rb +5 -1
  147. data/lib/adwords_api/v201502/geo_location_service_registry.rb +1 -1
  148. data/lib/adwords_api/v201502/label_service.rb +13 -1
  149. data/lib/adwords_api/v201502/label_service_registry.rb +1 -1
  150. data/lib/adwords_api/v201502/location_criterion_service.rb +9 -1
  151. data/lib/adwords_api/v201502/location_criterion_service_registry.rb +2 -2
  152. data/lib/adwords_api/v201502/managed_customer_service.rb +25 -1
  153. data/lib/adwords_api/v201502/managed_customer_service_registry.rb +1 -1
  154. data/lib/adwords_api/v201502/media_service.rb +13 -1
  155. data/lib/adwords_api/v201502/media_service_registry.rb +1 -1
  156. data/lib/adwords_api/v201502/mutate_job_service.rb +13 -1
  157. data/lib/adwords_api/v201502/mutate_job_service_registry.rb +2 -2
  158. data/lib/adwords_api/v201502/offline_conversion_feed_service.rb +5 -1
  159. data/lib/adwords_api/v201502/offline_conversion_feed_service_registry.rb +1 -1
  160. data/lib/adwords_api/v201502/report_definition_service.rb +5 -1
  161. data/lib/adwords_api/v201502/report_definition_service_registry.rb +1 -1
  162. data/lib/adwords_api/v201502/shared_criterion_service.rb +9 -1
  163. data/lib/adwords_api/v201502/shared_criterion_service_registry.rb +1 -1
  164. data/lib/adwords_api/v201502/shared_set_service.rb +9 -1
  165. data/lib/adwords_api/v201502/shared_set_service_registry.rb +1 -1
  166. data/lib/adwords_api/v201502/targeting_idea_service.rb +5 -1
  167. data/lib/adwords_api/v201502/targeting_idea_service_registry.rb +2 -2
  168. data/lib/adwords_api/v201502/traffic_estimator_service.rb +5 -1
  169. data/lib/adwords_api/v201502/traffic_estimator_service_registry.rb +2 -2
  170. data/lib/adwords_api/v201506/account_label_service.rb +9 -1
  171. data/lib/adwords_api/v201506/account_label_service_registry.rb +1 -1
  172. data/lib/adwords_api/v201506/ad_customizer_feed_service.rb +9 -1
  173. data/lib/adwords_api/v201506/ad_customizer_feed_service_registry.rb +1 -1
  174. data/lib/adwords_api/v201506/ad_group_ad_service.rb +21 -1
  175. data/lib/adwords_api/v201506/ad_group_ad_service_registry.rb +2 -2
  176. data/lib/adwords_api/v201506/ad_group_bid_modifier_service.rb +13 -1
  177. data/lib/adwords_api/v201506/ad_group_bid_modifier_service_registry.rb +1 -1
  178. data/lib/adwords_api/v201506/ad_group_criterion_service.rb +17 -1
  179. data/lib/adwords_api/v201506/ad_group_criterion_service_registry.rb +1 -1
  180. data/lib/adwords_api/v201506/ad_group_extension_setting_service.rb +13 -1
  181. data/lib/adwords_api/v201506/ad_group_extension_setting_service_registry.rb +2 -2
  182. data/lib/adwords_api/v201506/ad_group_feed_service.rb +13 -1
  183. data/lib/adwords_api/v201506/ad_group_feed_service_registry.rb +1 -1
  184. data/lib/adwords_api/v201506/ad_group_service.rb +17 -1
  185. data/lib/adwords_api/v201506/ad_group_service_registry.rb +2 -2
  186. data/lib/adwords_api/v201506/ad_param_service.rb +9 -1
  187. data/lib/adwords_api/v201506/ad_param_service_registry.rb +1 -1
  188. data/lib/adwords_api/v201506/adwords_user_list_service.rb +9 -1
  189. data/lib/adwords_api/v201506/adwords_user_list_service_registry.rb +1 -1
  190. data/lib/adwords_api/v201506/bidding_strategy_service.rb +13 -1
  191. data/lib/adwords_api/v201506/bidding_strategy_service_registry.rb +1 -1
  192. data/lib/adwords_api/v201506/budget_order_service.rb +13 -1
  193. data/lib/adwords_api/v201506/budget_order_service_registry.rb +1 -1
  194. data/lib/adwords_api/v201506/budget_service.rb +13 -1
  195. data/lib/adwords_api/v201506/budget_service_registry.rb +1 -1
  196. data/lib/adwords_api/v201506/campaign_criterion_service.rb +13 -1
  197. data/lib/adwords_api/v201506/campaign_criterion_service_registry.rb +1 -1
  198. data/lib/adwords_api/v201506/campaign_extension_setting_service.rb +13 -1
  199. data/lib/adwords_api/v201506/campaign_extension_setting_service_registry.rb +2 -2
  200. data/lib/adwords_api/v201506/campaign_feed_service.rb +13 -1
  201. data/lib/adwords_api/v201506/campaign_feed_service_registry.rb +1 -1
  202. data/lib/adwords_api/v201506/campaign_service.rb +17 -1
  203. data/lib/adwords_api/v201506/campaign_service_registry.rb +1 -1
  204. data/lib/adwords_api/v201506/campaign_shared_set_service.rb +13 -1
  205. data/lib/adwords_api/v201506/campaign_shared_set_service_registry.rb +1 -1
  206. data/lib/adwords_api/v201506/constant_data_service.rb +37 -1
  207. data/lib/adwords_api/v201506/constant_data_service_registry.rb +1 -1
  208. data/lib/adwords_api/v201506/conversion_tracker_service.rb +13 -1
  209. data/lib/adwords_api/v201506/conversion_tracker_service_registry.rb +1 -1
  210. data/lib/adwords_api/v201506/customer_extension_setting_service.rb +13 -1
  211. data/lib/adwords_api/v201506/customer_extension_setting_service_registry.rb +2 -2
  212. data/lib/adwords_api/v201506/customer_feed_service.rb +13 -1
  213. data/lib/adwords_api/v201506/customer_feed_service_registry.rb +1 -1
  214. data/lib/adwords_api/v201506/customer_service.rb +9 -1
  215. data/lib/adwords_api/v201506/customer_service_registry.rb +1 -1
  216. data/lib/adwords_api/v201506/customer_sync_service.rb +5 -1
  217. data/lib/adwords_api/v201506/customer_sync_service_registry.rb +1 -1
  218. data/lib/adwords_api/v201506/data_service.rb +25 -1
  219. data/lib/adwords_api/v201506/data_service_registry.rb +1 -1
  220. data/lib/adwords_api/v201506/experiment_service.rb +9 -1
  221. data/lib/adwords_api/v201506/experiment_service_registry.rb +1 -1
  222. data/lib/adwords_api/v201506/feed_item_service.rb +13 -1
  223. data/lib/adwords_api/v201506/feed_item_service_registry.rb +1 -1
  224. data/lib/adwords_api/v201506/feed_mapping_service.rb +13 -1
  225. data/lib/adwords_api/v201506/feed_mapping_service_registry.rb +1 -1
  226. data/lib/adwords_api/v201506/feed_service.rb +13 -1
  227. data/lib/adwords_api/v201506/feed_service_registry.rb +1 -1
  228. data/lib/adwords_api/v201506/geo_location_service.rb +5 -1
  229. data/lib/adwords_api/v201506/geo_location_service_registry.rb +1 -1
  230. data/lib/adwords_api/v201506/label_service.rb +13 -1
  231. data/lib/adwords_api/v201506/label_service_registry.rb +1 -1
  232. data/lib/adwords_api/v201506/location_criterion_service.rb +9 -1
  233. data/lib/adwords_api/v201506/location_criterion_service_registry.rb +2 -2
  234. data/lib/adwords_api/v201506/managed_customer_service.rb +25 -1
  235. data/lib/adwords_api/v201506/managed_customer_service_registry.rb +1 -1
  236. data/lib/adwords_api/v201506/media_service.rb +13 -1
  237. data/lib/adwords_api/v201506/media_service_registry.rb +1 -1
  238. data/lib/adwords_api/v201506/mutate_job_service.rb +13 -1
  239. data/lib/adwords_api/v201506/mutate_job_service_registry.rb +1 -1
  240. data/lib/adwords_api/v201506/offline_conversion_feed_service.rb +5 -1
  241. data/lib/adwords_api/v201506/offline_conversion_feed_service_registry.rb +1 -1
  242. data/lib/adwords_api/v201506/report_definition_service.rb +5 -1
  243. data/lib/adwords_api/v201506/report_definition_service_registry.rb +1 -1
  244. data/lib/adwords_api/v201506/shared_criterion_service.rb +13 -1
  245. data/lib/adwords_api/v201506/shared_criterion_service_registry.rb +1 -1
  246. data/lib/adwords_api/v201506/shared_set_service.rb +13 -1
  247. data/lib/adwords_api/v201506/shared_set_service_registry.rb +1 -1
  248. data/lib/adwords_api/v201506/targeting_idea_service.rb +5 -1
  249. data/lib/adwords_api/v201506/targeting_idea_service_registry.rb +1 -1
  250. data/lib/adwords_api/v201506/traffic_estimator_service.rb +5 -1
  251. data/lib/adwords_api/v201506/traffic_estimator_service_registry.rb +1 -1
  252. data/lib/adwords_api/v201509/account_label_service.rb +46 -0
  253. data/lib/adwords_api/v201509/account_label_service_registry.rb +46 -0
  254. data/lib/adwords_api/v201509/ad_customizer_feed_service.rb +46 -0
  255. data/lib/adwords_api/v201509/ad_customizer_feed_service_registry.rb +46 -0
  256. data/lib/adwords_api/v201509/ad_group_ad_service.rb +70 -0
  257. data/lib/adwords_api/v201509/ad_group_ad_service_registry.rb +46 -0
  258. data/lib/adwords_api/v201509/ad_group_bid_modifier_service.rb +54 -0
  259. data/lib/adwords_api/v201509/ad_group_bid_modifier_service_registry.rb +46 -0
  260. data/lib/adwords_api/v201509/ad_group_criterion_service.rb +62 -0
  261. data/lib/adwords_api/v201509/ad_group_criterion_service_registry.rb +46 -0
  262. data/lib/adwords_api/v201509/ad_group_extension_setting_service.rb +54 -0
  263. data/lib/adwords_api/v201509/ad_group_extension_setting_service_registry.rb +46 -0
  264. data/lib/adwords_api/v201509/ad_group_feed_service.rb +54 -0
  265. data/lib/adwords_api/v201509/ad_group_feed_service_registry.rb +46 -0
  266. data/lib/adwords_api/v201509/ad_group_service.rb +62 -0
  267. data/lib/adwords_api/v201509/ad_group_service_registry.rb +46 -0
  268. data/lib/adwords_api/v201509/ad_param_service.rb +46 -0
  269. data/lib/adwords_api/v201509/ad_param_service_registry.rb +46 -0
  270. data/lib/adwords_api/v201509/adwords_user_list_service.rb +54 -0
  271. data/lib/adwords_api/v201509/adwords_user_list_service_registry.rb +46 -0
  272. data/lib/adwords_api/v201509/batch_job_service.rb +54 -0
  273. data/lib/adwords_api/v201509/batch_job_service_registry.rb +46 -0
  274. data/lib/adwords_api/v201509/bidding_strategy_service.rb +54 -0
  275. data/lib/adwords_api/v201509/bidding_strategy_service_registry.rb +46 -0
  276. data/lib/adwords_api/v201509/budget_order_service.rb +54 -0
  277. data/lib/adwords_api/v201509/budget_order_service_registry.rb +46 -0
  278. data/lib/adwords_api/v201509/budget_service.rb +54 -0
  279. data/lib/adwords_api/v201509/budget_service_registry.rb +46 -0
  280. data/lib/adwords_api/v201509/campaign_criterion_service.rb +54 -0
  281. data/lib/adwords_api/v201509/campaign_criterion_service_registry.rb +46 -0
  282. data/lib/adwords_api/v201509/campaign_extension_setting_service.rb +54 -0
  283. data/lib/adwords_api/v201509/campaign_extension_setting_service_registry.rb +46 -0
  284. data/lib/adwords_api/v201509/campaign_feed_service.rb +54 -0
  285. data/lib/adwords_api/v201509/campaign_feed_service_registry.rb +46 -0
  286. data/lib/adwords_api/v201509/campaign_service.rb +62 -0
  287. data/lib/adwords_api/v201509/campaign_service_registry.rb +46 -0
  288. data/lib/adwords_api/v201509/campaign_shared_set_service.rb +54 -0
  289. data/lib/adwords_api/v201509/campaign_shared_set_service_registry.rb +46 -0
  290. data/lib/adwords_api/v201509/constant_data_service.rb +102 -0
  291. data/lib/adwords_api/v201509/constant_data_service_registry.rb +46 -0
  292. data/lib/adwords_api/v201509/conversion_tracker_service.rb +54 -0
  293. data/lib/adwords_api/v201509/conversion_tracker_service_registry.rb +46 -0
  294. data/lib/adwords_api/v201509/customer_extension_setting_service.rb +54 -0
  295. data/lib/adwords_api/v201509/customer_extension_setting_service_registry.rb +46 -0
  296. data/lib/adwords_api/v201509/customer_feed_service.rb +54 -0
  297. data/lib/adwords_api/v201509/customer_feed_service_registry.rb +46 -0
  298. data/lib/adwords_api/v201509/customer_service.rb +46 -0
  299. data/lib/adwords_api/v201509/customer_service_registry.rb +46 -0
  300. data/lib/adwords_api/v201509/customer_sync_service.rb +38 -0
  301. data/lib/adwords_api/v201509/customer_sync_service_registry.rb +47 -0
  302. data/lib/adwords_api/v201509/data_service.rb +78 -0
  303. data/lib/adwords_api/v201509/data_service_registry.rb +46 -0
  304. data/lib/adwords_api/v201509/experiment_service.rb +46 -0
  305. data/lib/adwords_api/v201509/experiment_service_registry.rb +46 -0
  306. data/lib/adwords_api/v201509/feed_item_service.rb +54 -0
  307. data/lib/adwords_api/v201509/feed_item_service_registry.rb +46 -0
  308. data/lib/adwords_api/v201509/feed_mapping_service.rb +54 -0
  309. data/lib/adwords_api/v201509/feed_mapping_service_registry.rb +46 -0
  310. data/lib/adwords_api/v201509/feed_service.rb +54 -0
  311. data/lib/adwords_api/v201509/feed_service_registry.rb +46 -0
  312. data/lib/adwords_api/v201509/label_service.rb +54 -0
  313. data/lib/adwords_api/v201509/label_service_registry.rb +46 -0
  314. data/lib/adwords_api/v201509/location_criterion_service.rb +46 -0
  315. data/lib/adwords_api/v201509/location_criterion_service_registry.rb +46 -0
  316. data/lib/adwords_api/v201509/managed_customer_service.rb +78 -0
  317. data/lib/adwords_api/v201509/managed_customer_service_registry.rb +46 -0
  318. data/lib/adwords_api/v201509/media_service.rb +54 -0
  319. data/lib/adwords_api/v201509/media_service_registry.rb +46 -0
  320. data/lib/adwords_api/v201509/mutate_job_service.rb +54 -0
  321. data/lib/adwords_api/v201509/mutate_job_service_registry.rb +46 -0
  322. data/lib/adwords_api/v201509/offline_conversion_feed_service.rb +38 -0
  323. data/lib/adwords_api/v201509/offline_conversion_feed_service_registry.rb +46 -0
  324. data/lib/adwords_api/v201509/report_definition_service.rb +38 -0
  325. data/lib/adwords_api/v201509/report_definition_service_registry.rb +46 -0
  326. data/lib/adwords_api/v201509/shared_criterion_service.rb +54 -0
  327. data/lib/adwords_api/v201509/shared_criterion_service_registry.rb +46 -0
  328. data/lib/adwords_api/v201509/shared_set_service.rb +54 -0
  329. data/lib/adwords_api/v201509/shared_set_service_registry.rb +46 -0
  330. data/lib/adwords_api/v201509/targeting_idea_service.rb +38 -0
  331. data/lib/adwords_api/v201509/targeting_idea_service_registry.rb +46 -0
  332. data/lib/adwords_api/v201509/traffic_estimator_service.rb +38 -0
  333. data/lib/adwords_api/v201509/traffic_estimator_service_registry.rb +46 -0
  334. data/lib/adwords_api/version.rb +1 -1
  335. data/lib/adwords_api.rb +16 -0
  336. data/test/adwords_api/test_batch_job_utils.rb +95 -0
  337. data/test/templates/v201502/basic_operations_get_campaigns.def +1 -1
  338. data/test/templates/v201502/misc_use_oauth2_service_account.def +1 -1
  339. data/test/templates/v201506/basic_operations_get_campaigns.def +1 -1
  340. data/test/templates/v201506/misc_use_oauth2_service_account.def +1 -1
  341. data/test/templates/v201509/basic_operations_get_campaigns.def +116 -0
  342. data/test/templates/v201509/misc_use_oauth2_service_account.def +131 -0
  343. metadata +166 -5
@@ -0,0 +1,362 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Copyright:: Copyright 2015, Google Inc. All Rights Reserved.
5
+ #
6
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15
+ # implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This code sample illustrates how to use BatchJobService to create a complete
20
+ # campaign, including ad groups and keywords.
21
+
22
+ require 'adwords_api'
23
+
24
+ def add_complete_campaigns_using_batch_job()
25
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
26
+ # when called without parameters.
27
+ adwords = AdwordsApi::Api.new
28
+
29
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
30
+ # the configuration file or provide your own logger:
31
+ # adwords.logger = Logger.new('adwords_xml.log')
32
+
33
+ batch_job_srv = adwords.service(:BatchJobService, API_VERSION)
34
+ batch_job_utils = adwords.batch_job_utils(API_VERSION)
35
+
36
+ # Create a BatchJob.
37
+ add_op = {
38
+ :operator => 'ADD',
39
+ :operand => {}
40
+ }
41
+
42
+ response = batch_job_srv.mutate([add_op])
43
+ batch_job = response[:value].first
44
+
45
+ # Get the upload URL from the new job.
46
+ upload_url = batch_job[:upload_url][:url]
47
+ puts "Created BatchJob with ID %d, status '%s', and upload URL %s." %
48
+ [batch_job[:id], batch_job[:status], upload_url]
49
+
50
+ # Create a temporary ID generator that will produce a sequence of descending
51
+ # negative numbers.
52
+ temp_id_generator = TempIdGenerator.new()
53
+
54
+ # Create an array of hashed operations generated from the batch_job_utils.
55
+ hashed_operations = []
56
+
57
+ # Create an operation to create a new budget.
58
+ budget_operation = build_budget_operation(temp_id_generator)
59
+ hashed_operations += batch_job_utils.generate_soap_operations(
60
+ [budget_operation])
61
+
62
+ # Create operations to create new campaigns.
63
+ campaign_operations = build_campaign_operations(
64
+ temp_id_generator, budget_operation)
65
+ hashed_operations += batch_job_utils.generate_soap_operations(
66
+ campaign_operations)
67
+
68
+ # Create operations to create new negative keyword criteria for each
69
+ # campaign.
70
+ hashed_operations += batch_job_utils.generate_soap_operations(
71
+ build_campaign_criterion_operations(campaign_operations))
72
+
73
+ # Create operations to create new ad groups.
74
+ ad_group_operations = build_ad_group_operations(
75
+ temp_id_generator, campaign_operations)
76
+ hashed_operations += batch_job_utils.generate_soap_operations(
77
+ ad_group_operations)
78
+
79
+ # Create operations to create new ad group criteria (keywords).
80
+ hashed_operations += batch_job_utils.generate_soap_operations(
81
+ build_ad_group_criterion_operations(ad_group_operations))
82
+
83
+ # Create operations to create new ad group ads (text ads).
84
+ hashed_operations += batch_job_utils.generate_soap_operations(
85
+ build_ad_group_ad_operations(ad_group_operations))
86
+
87
+ # Use the batch_job_utils to upload all operations.
88
+ batch_job_utils.post_soap_operations(hashed_operations, upload_url)
89
+ puts "Uploaded %d operations for batch job with ID %d." %
90
+ [hashed_operations.size, batch_job[:id]]
91
+
92
+ # Poll for completion of the batch job using an exponential back off.
93
+ poll_attempts = 0
94
+ is_pending = true
95
+ selector = {
96
+ :fields => ['Id', 'Status', 'DownloadUrl', 'ProcessingErrors',
97
+ 'ProgressStats'],
98
+ :predicates => [{
99
+ :field => 'Id',
100
+ :operator => 'IN',
101
+ :values => [batch_job[:id]]
102
+ }]
103
+ }
104
+
105
+ begin
106
+ sleep_seconds = 30 * (2 ** poll_attempts)
107
+ puts "Sleeping %d seconds" % sleep_seconds
108
+ sleep(sleep_seconds)
109
+
110
+ batch_job = batch_job_srv.get(selector)[:entries].first
111
+
112
+ puts "Batch job ID %d has status '%s'." %
113
+ [batch_job[:id], batch_job[:status]]
114
+
115
+ poll_attempts += 1
116
+ is_pending = PENDING_STATUSES.include?(batch_job[:status])
117
+ end while is_pending and poll_attempts < MAX_POLL_ATTEMPTS
118
+
119
+ if is_pending
120
+ raise StandardError,
121
+ "Job is still in pending state after polling %d times." %
122
+ MAX_POLL_ATTEMPTS
123
+ end
124
+
125
+ unless batch_job[:processing_errors].nil?
126
+ batch_job[:processing_errors].each_with_index do |processing_error, i|
127
+ puts ("Processing error [%d]: errorType=%s, trigger=%s, errorString=%s" +
128
+ "fieldPath=%s, reason=%s") % [i, processing_error[:api_error_type],
129
+ processing_error[:trigger], processing_error[:error_string],
130
+ processing_error[:field_path], processing_error[:reason]]
131
+ end
132
+ end
133
+
134
+ unless batch_job[:download_url].nil? or batch_job[:download_url][:url].nil?
135
+ mutate_response = batch_job_utils.get_job_results(
136
+ batch_job[:download_url][:url])
137
+ puts "Downloaded results from '%s':" % batch_job[:download_url][:url]
138
+ mutate_response.each do |mutate_result|
139
+ outcome = "FAILURE"
140
+ outcome = "SUCCESS" if mutate_result[:error_list].nil?
141
+ puts " Operation [%d] - %s" % [mutate_result[:index], outcome]
142
+ end
143
+ end
144
+ end
145
+
146
+ # Custom class to generate temporary negative IDs for created entities to
147
+ # reference each other.
148
+ class TempIdGenerator
149
+ def initialize()
150
+ @counter = -1
151
+ end
152
+
153
+ def next()
154
+ ret = @counter
155
+ @counter -= 1
156
+ return ret
157
+ end
158
+ end
159
+
160
+ def get_time_microseconds()
161
+ return (Time.now.to_f * 1000000).to_i
162
+ end
163
+
164
+ def build_budget_operation(temp_id_generator)
165
+ budget = {
166
+ :budget_id => temp_id_generator.next,
167
+ :name => "Interplanetary Cruise %d" % get_time_microseconds(),
168
+ :amount => {
169
+ :micro_amount => 50000000
170
+ },
171
+ :delivery_method => 'STANDARD',
172
+ :period => 'DAILY'
173
+ }
174
+ budget_operation = {
175
+ # The xsi_type of the operation can usually be guessed by the API because
176
+ # a given service only handles one type of operation. However, batch jobs
177
+ # process operations of different types, so the xsi_type must always be
178
+ # explicitly defined for these operations.
179
+ :xsi_type => 'BudgetOperation',
180
+ :operator => 'ADD',
181
+ :operand => budget
182
+ }
183
+ return budget_operation
184
+ end
185
+
186
+ def build_campaign_operations(temp_id_generator, budget_operation)
187
+ budget_id = budget_operation[:operand][:budget_id]
188
+
189
+ operations = []
190
+ NUMBER_OF_CAMPAIGNS_TO_ADD.times do
191
+ campaign = {
192
+ :name => "Batch Campaign %s" % get_time_microseconds(),
193
+ :status => 'PAUSED',
194
+ :id => temp_id_generator.next,
195
+ :advertising_channel_type => 'SEARCH',
196
+ :budget => {
197
+ :budget_id => budget_id
198
+ },
199
+ :bidding_strategy_configuration => {
200
+ :bidding_strategy_type => 'MANUAL_CPC',
201
+ # You can optionally provide a bidding scheme in place of the type.
202
+ :bidding_scheme => {
203
+ :xsi_type => 'ManualCpcBiddingScheme',
204
+ :enhanced_cpc_enabled => false
205
+ }
206
+ }
207
+ }
208
+ operation = {
209
+ :xsi_type => 'CampaignOperation',
210
+ :operator => 'ADD',
211
+ :operand => campaign
212
+ }
213
+ operations << operation
214
+ end
215
+
216
+ return operations
217
+ end
218
+
219
+ def build_campaign_criterion_operations(campaign_operations)
220
+ operations = []
221
+ campaign_operations.each do |campaign_operation|
222
+ keyword = {
223
+ :xsi_type => 'Keyword',
224
+ :match_type => 'BROAD',
225
+ :text => 'venus'
226
+ }
227
+ negative_criterion = {
228
+ :xsi_type => 'NegativeCampaignCriterion',
229
+ :campaign_id => campaign_operation[:operand][:id],
230
+ :criterion => keyword
231
+ }
232
+ operation = {
233
+ :xsi_type => 'CampaignCriterionOperation',
234
+ :operator => 'ADD',
235
+ :operand => negative_criterion
236
+ }
237
+ operations << operation
238
+ end
239
+
240
+ return operations
241
+ end
242
+
243
+ def build_ad_group_operations(temp_id_generator, campaign_operations)
244
+ operations = []
245
+ campaign_operations.each do |campaign_operation|
246
+ NUMBER_OF_ADGROUPS_TO_ADD.times do
247
+ ad_group = {
248
+ :campaign_id => campaign_operation[:operand][:id],
249
+ :id => temp_id_generator.next,
250
+ :name => "Batch Ad Group %s" % get_time_microseconds(),
251
+ :bidding_strategy_configuration => {
252
+ :bids => [
253
+ {
254
+ :xsi_type => 'CpcBid',
255
+ :bid => {:micro_amount => 10000000}
256
+ }
257
+ ]
258
+ }
259
+ }
260
+ operation = {
261
+ :xsi_type => 'AdGroupOperation',
262
+ :operator => 'ADD',
263
+ :operand => ad_group
264
+ }
265
+ operations << operation
266
+ end
267
+ end
268
+
269
+ return operations
270
+ end
271
+
272
+ def build_ad_group_criterion_operations(ad_group_operations)
273
+ operations = []
274
+ ad_group_operations.each do |ad_group_operation|
275
+ NUMBER_OF_KEYWORDS_TO_ADD.times do |i|
276
+ text = "mars%d" % i
277
+
278
+ # Make 50% of keywords invalid to demonstrate error handling.
279
+ text = text + "!!!" if i % 2 == 0
280
+ keyword = {
281
+ :xsi_type => 'Keyword',
282
+ :text => text,
283
+ :match_type => 'BROAD'
284
+ }
285
+ biddable_criterion = {
286
+ :xsi_type => 'BiddableAdGroupCriterion',
287
+ :ad_group_id => ad_group_operation[:operand][:id],
288
+ :criterion => keyword
289
+ }
290
+ operation = {
291
+ :xsi_type => 'AdGroupCriterionOperation',
292
+ :operator => 'ADD',
293
+ :operand => biddable_criterion
294
+ }
295
+ operations << operation
296
+ end
297
+ end
298
+
299
+ return operations
300
+ end
301
+
302
+ def build_ad_group_ad_operations(ad_group_operations)
303
+ operations = []
304
+ ad_group_operations.each do |ad_group_operation|
305
+ text_ad = {
306
+ :xsi_type => 'TextAd',
307
+ :headline => 'Luxury Cruise to Mars',
308
+ :description1 => 'Visit the Red Planet in style.',
309
+ :description2 => 'Low-gravity fun for everyone!',
310
+ :display_url => 'www.example.com',
311
+ :final_urls => ['http://www.example.com/1']
312
+ }
313
+ ad_group_ad = {
314
+ :ad_group_id => ad_group_operation[:operand][:id],
315
+ :ad => text_ad
316
+ }
317
+ operation = {
318
+ :xsi_type => 'AdGroupAdOperation',
319
+ :operator => 'ADD',
320
+ :operand => ad_group_ad
321
+ }
322
+ operations << operation
323
+ end
324
+
325
+ return operations
326
+ end
327
+
328
+ if __FILE__ == $0
329
+ API_VERSION = :v201509
330
+ NUMBER_OF_CAMPAIGNS_TO_ADD = 2
331
+ NUMBER_OF_ADGROUPS_TO_ADD = 2
332
+ NUMBER_OF_KEYWORDS_TO_ADD = 5
333
+ MAX_POLL_ATTEMPTS = 5
334
+ PENDING_STATUSES = ['ACTIVE', 'AWAITING_FILE']
335
+
336
+ begin
337
+ add_complete_campaigns_using_batch_job()
338
+
339
+ # Authorization error.
340
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
341
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
342
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
343
+ "to retrieve and store OAuth2 tokens."
344
+ puts "See this wiki page for more details:\n\n " +
345
+ 'https://github.com/googleads/google-api-ads-ruby/wiki/OAuth2'
346
+
347
+ # HTTP errors.
348
+ rescue AdsCommon::Errors::HttpError => e
349
+ puts "HTTP Error: %s" % e
350
+
351
+ # API errors.
352
+ rescue AdwordsApi::Errors::ApiException => e
353
+ puts "Message: %s" % e.message
354
+ puts 'Errors:'
355
+ e.errors.each_with_index do |error, index|
356
+ puts "\tError [%d]:" % (index + 1)
357
+ error.each do |field, value|
358
+ puts "\t\t%s: %s" % [field, value]
359
+ end
360
+ end
361
+ end
362
+ end
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
5
+ #
6
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15
+ # implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This example creates an experiment using a query percentage of 10, which
20
+ # defines what fraction of auctions should go to the control split (90%) vs.
21
+ # the experiment split (10%), then adds experimental bid changes for criteria
22
+ # and ad groups. To get campaigns, run get_campaigns.rb. To get ad groups,
23
+ # run get_ad_groups.rb. To get keywords, run get_keywords.rb.
24
+
25
+ require 'adwords_api'
26
+ require 'date'
27
+
28
+ def add_experiment(campaign_id, ad_group_id, criterion_id)
29
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
30
+ # when called without parameters.
31
+ adwords = AdwordsApi::Api.new
32
+
33
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
34
+ # the configuration file or provide your own logger:
35
+ # adwords.logger = Logger.new('adwords_xml.log')
36
+
37
+ experiment_srv = adwords.service(:ExperimentService, API_VERSION)
38
+ ad_group_srv = adwords.service(:AdGroupService, API_VERSION)
39
+ ad_group_criterion_srv =
40
+ adwords.service(:AdGroupCriterionService, API_VERSION)
41
+
42
+ # Prepare for adding experiment.
43
+ operation = {
44
+ :operator => 'ADD',
45
+ :operand => {
46
+ :campaign_id => campaign_id,
47
+ :name => "Interplanetary Experiment #%d" % (Time.new.to_f * 1000).to_i,
48
+ :query_percentage => 10,
49
+ :start_date_time => Time.now.strftime('%Y%m%d %H%M%S'),
50
+ # Optional fields:
51
+ :status => 'ENABLED',
52
+ :end_date_time =>
53
+ DateTime.parse((Date.today + 30).to_s).strftime('%Y%m%d %H%M%S')
54
+ }
55
+ }
56
+
57
+ # Add experiment.
58
+ response = experiment_srv.mutate([operation])
59
+ experiment = response[:value].first
60
+ puts "Experiment with name '%s' and ID %d was added." %
61
+ [experiment[:name], experiment[:id]]
62
+
63
+ experiment_id = experiment[:id]
64
+
65
+ # Setup ad group for the experiment.
66
+ ad_group = {
67
+ :id => ad_group_id,
68
+ # Set experiment data for the ad group.
69
+ :experiment_data => {
70
+ :experiment_id => experiment_id,
71
+ :experiment_delta_status => 'MODIFIED',
72
+ # Bid multiplier rule that will modify ad group bid for the experiment.
73
+ :experiment_bid_multipliers => {
74
+ :xsi_type => 'ManualCPCAdGroupExperimentBidMultipliers',
75
+ :max_cpc_multiplier => {
76
+ :multiplier => 1.5
77
+ }
78
+ }
79
+ }
80
+ }
81
+
82
+ # Prepare for updating ad group.
83
+ operation = {
84
+ :operator => 'SET',
85
+ :operand => ad_group
86
+ }
87
+
88
+ # Update ad group.
89
+ response = ad_group_srv.mutate([operation])
90
+ ad_group = response[:value].first
91
+ puts "Ad group ID %d was updated for the experiment." % ad_group[:id]
92
+
93
+ # Setup ad group criterion for the experiment.
94
+ ad_group_criterion = {
95
+ :xsi_type => 'BiddableAdGroupCriterion',
96
+ :ad_group_id => ad_group_id,
97
+ :criterion => {
98
+ :id => criterion_id
99
+ },
100
+ # Set experiment data for the criterion.
101
+ :experiment_data => {
102
+ :xsi_type => 'BiddableAdGroupCriterionExperimentData',
103
+ :experiment_id => experiment_id,
104
+ :experiment_delta_status => 'MODIFIED',
105
+ # Bid multiplier rule that will modify criterion bid for the experiment.
106
+ :experiment_bid_multiplier => {
107
+ :xsi_type => 'ManualCPCAdGroupCriterionExperimentBidMultiplier',
108
+ :max_cpc_multiplier => {
109
+ :multiplier => 1.5
110
+ }
111
+ }
112
+ }
113
+ }
114
+
115
+ # Prepare for updating ad group criterion.
116
+ operation = {
117
+ :operator => 'SET',
118
+ :operand => ad_group_criterion
119
+ }
120
+
121
+ # Update criterion.
122
+ response = ad_group_criterion_srv.mutate([operation])
123
+ criterion = response[:value].first
124
+ puts "Criterion ID %d was successfully updated for the experiment." %
125
+ [criterion[:criterion][:id]]
126
+
127
+ end
128
+
129
+ if __FILE__ == $0
130
+ API_VERSION = :v201509
131
+
132
+ begin
133
+ # IDs of the required objects.
134
+ campaign_id = 'INSERT_CAMPAIGN_ID_HERE'.to_i
135
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
136
+ criterion_id = 'INSERT_CRITERION_ID_HERE'.to_i
137
+ add_experiment(campaign_id, ad_group_id, criterion_id)
138
+
139
+ # Authorization error.
140
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
141
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
142
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
143
+ "to retrieve and store OAuth2 tokens."
144
+ puts "See this wiki page for more details:\n\n " +
145
+ 'https://github.com/googleads/google-api-ads-ruby/wiki/OAuth2'
146
+
147
+ # HTTP errors.
148
+ rescue AdsCommon::Errors::HttpError => e
149
+ puts "HTTP Error: %s" % e
150
+
151
+ # API errors.
152
+ rescue AdwordsApi::Errors::ApiException => e
153
+ puts "Message: %s" % e.message
154
+ puts 'Errors:'
155
+ e.errors.each_with_index do |error, index|
156
+ puts "\tError [%d]:" % (index + 1)
157
+ error.each do |field, value|
158
+ puts "\t\t%s: %s" % [field, value]
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
5
+ #
6
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15
+ # implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # This code sample illustrates how to add many keywords using asynchronous
20
+ # requests and MutateJobService.
21
+
22
+ require 'adwords_api'
23
+
24
+ def add_keywords_in_bulk()
25
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
26
+ # when called without parameters.
27
+ adwords = AdwordsApi::Api.new
28
+
29
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
30
+ # the configuration file or provide your own logger:
31
+ # adwords.logger = Logger.new('adwords_xml.log')
32
+
33
+ mutate_job_srv = adwords.service(:MutateJobService, API_VERSION)
34
+
35
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
36
+
37
+ # Create AdGroupCriterionOperations to add keywords.
38
+ operations = (1..KEYWORD_NUMBER).map do |index|
39
+ {:xsi_type => 'AdGroupCriterionOperation',
40
+ :operator => 'ADD',
41
+ :operand => {
42
+ :xsi_type => 'BiddableAdGroupCriterion',
43
+ :ad_group_id => ad_group_id,
44
+ :criterion => {
45
+ :xsi_type => 'Keyword',
46
+ :match_type => 'BROAD',
47
+ :text => "mars%d" % index}}}
48
+ end
49
+
50
+ # You can specify up to 3 job IDs that must successfully complete before
51
+ # this job can be processed.
52
+ policy = {:prerequisite_job_ids => []}
53
+
54
+ # Call mutate to create a new job.
55
+ response = mutate_job_srv.mutate(operations, policy)
56
+
57
+ raise StandardError, 'Failed to submit a job; aborting.' unless response
58
+
59
+ job_id = response[:id]
60
+ puts "Job ID %d was successfully created." % job_id
61
+
62
+ # Creating selector to retrive hob status and wait for it to complete.
63
+ selector = {
64
+ :xsi_type => 'BulkMutateJobSelector',
65
+ :job_ids => [job_id]
66
+ }
67
+
68
+ status = nil
69
+
70
+ # Poll for job status until it's finished.
71
+ puts 'Retrieving job status...'
72
+ RETRIES_COUNT.times do |retry_attempt|
73
+ job_status_response = mutate_job_srv.get(selector)
74
+ if job_status_response
75
+ status = job_status_response.first[:status]
76
+ case status
77
+ when 'FAILED'
78
+ raise StandardError, "Job failed with reason: '%s'" %
79
+ job_status_response.first[:failure_reason]
80
+ when 'COMPLETED'
81
+ puts "[%d] Job finished with status '%s'" % [retry_attempt, status]
82
+ break
83
+ else
84
+ puts "[%d] Current status is '%s', waiting %d seconds to retry..." %
85
+ [retry_attempt, status, RETRY_INTERVAL]
86
+ sleep(RETRY_INTERVAL)
87
+ end
88
+ else
89
+ raise StandardError, 'Error retrieving job status; aborting.'
90
+ end
91
+ end
92
+
93
+ if status == 'COMPLETED'
94
+ # Get the job result. Here we re-use the same selector.
95
+ result_response = mutate_job_srv.get_result(selector)
96
+
97
+ if result_response and result_response[:simple_mutate_result]
98
+ results = result_response[:simple_mutate_result][:results]
99
+ if results
100
+ results.each_with_index do |result, index|
101
+ result_message = result.include?(:place_holder) ?
102
+ 'FAILED' : 'SUCCEEDED'
103
+ puts "Operation [%d] - %s" % [index, result_message]
104
+ end
105
+ end
106
+ errors = result_response[:simple_mutate_result][:errors]
107
+ if errors
108
+ errors.each do |error|
109
+ puts "Error, reason: '%s', trigger: '%s', field path: '%s'" %
110
+ [error[:reason], error[:trigger], error[:field_path]]
111
+ end
112
+ end
113
+ else
114
+ raise StandardError, 'Error retrieving job results; aborting.'
115
+ end
116
+ else
117
+ puts "Job failed to complete after %d retries." % RETRY_COUNT
118
+ end
119
+ end
120
+
121
+ if __FILE__ == $0
122
+ API_VERSION = :v201509
123
+ RETRY_INTERVAL = 30
124
+ RETRIES_COUNT = 30
125
+ KEYWORD_NUMBER = 100
126
+
127
+ begin
128
+ add_keywords_in_bulk()
129
+
130
+ # Authorization error.
131
+ rescue AdsCommon::Errors::OAuth2VerificationRequired => e
132
+ puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
133
+ "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
134
+ "to retrieve and store OAuth2 tokens."
135
+ puts "See this wiki page for more details:\n\n " +
136
+ 'https://github.com/googleads/google-api-ads-ruby/wiki/OAuth2'
137
+
138
+ # HTTP errors.
139
+ rescue AdsCommon::Errors::HttpError => e
140
+ puts "HTTP Error: %s" % e
141
+
142
+ # API errors.
143
+ rescue AdwordsApi::Errors::ApiException => e
144
+ puts "Message: %s" % e.message
145
+ puts 'Errors:'
146
+ e.errors.each_with_index do |error, index|
147
+ puts "\tError [%d]:" % (index + 1)
148
+ error.each do |field, value|
149
+ puts "\t\t%s: %s" % [field, value]
150
+ end
151
+ end
152
+ end
153
+ end