From fd7526e6c16d7f7e4270cdfa1ba4546ed585b797 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Fri, 7 Dec 2018 13:51:18 +0200 Subject: [PATCH 01/24] change api to v2 --- AmazonAdvertisingApi/Client.php | 143 ++++++++++++----- AmazonAdvertisingApi/Versions.php | 4 +- README.md | 250 ++++++++++++++++++++++++++++++ 3 files changed, 353 insertions(+), 44 deletions(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index 3e567df..c873128 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -116,39 +116,60 @@ public function updateProfiles($data) public function getCampaign($campaignId) { - return $this->_operation("campaigns/{$campaignId}"); + return $this->_operation("sp/campaigns/{$campaignId}"); } public function getCampaignEx($campaignId) { - return $this->_operation("campaigns/extended/{$campaignId}"); + return $this->_operation("sp/campaigns/extended/{$campaignId}"); } public function createCampaigns($data) { - return $this->_operation("campaigns", $data, "POST"); + return $this->_operation("sp/campaigns", $data, "POST"); } public function updateCampaigns($data) { - return $this->_operation("campaigns", $data, "PUT"); + return $this->_operation("sp/campaigns", $data, "PUT"); } public function archiveCampaign($campaignId) { - return $this->_operation("campaigns/{$campaignId}", null, "DELETE"); + return $this->_operation("sp/campaigns/{$campaignId}", null, "DELETE"); } public function listCampaigns($data = null) { - return $this->_operation("campaigns", $data); + return $this->_operation("sp/campaigns", $data); } public function listCampaignsEx($data = null) { - return $this->_operation("campaigns/extended", $data); + return $this->_operation("sp/campaigns/extended", $data); } + public function getCampaignBrand($campaignId) + { + return $this->_operation("hsa/campaigns/{$campaignId}"); + } + + public function updateCampaignsBrand($data) + { + return $this->_operation("hsa/campaigns", $data, "PUT"); + } + + public function archiveCampaignBrand($campaignId) + { + return $this->_operation("hsa/campaigns/{$campaignId}", null, "DELETE"); + } + + public function listCampaignsBrand($data = null) + { + return $this->_operation("hsa/campaigns", $data); + } + + public function getAdGroup($adGroupId) { return $this->_operation("adGroups/{$adGroupId}"); @@ -186,152 +207,172 @@ public function listAdGroupsEx($data = null) public function getBiddableKeyword($keywordId) { - return $this->_operation("keywords/{$keywordId}"); + return $this->_operation("sp/keywords/{$keywordId}"); } public function getBiddableKeywordEx($keywordId) { - return $this->_operation("keywords/extended/{$keywordId}"); + return $this->_operation("sp/keywords/extended/{$keywordId}"); } public function createBiddableKeywords($data) { - return $this->_operation("keywords", $data, "POST"); + return $this->_operation("sp/keywords", $data, "POST"); } public function updateBiddableKeywords($data) { - return $this->_operation("keywords", $data, "PUT"); + return $this->_operation("sp/keywords", $data, "PUT"); } public function archiveBiddableKeyword($keywordId) { - return $this->_operation("keywords/{$keywordId}", null, "DELETE"); + return $this->_operation("sp/keywords/{$keywordId}", null, "DELETE"); } public function listBiddableKeywords($data = null) { - return $this->_operation("keywords", $data); + return $this->_operation("sp/keywords", $data); } public function listBiddableKeywordsEx($data = null) { - return $this->_operation("keywords/extended", $data); + return $this->_operation("sp/keywords/extended", $data); + } + + public function getBiddableKeywordBrand($keywordId) + { + return $this->_operation("hsa/keywords/{$keywordId}"); + } + + public function createBiddableKeywordsBrand($data) + { + return $this->_operation("hsa/keywords", $data, "POST"); + } + + public function updateBiddableKeywordsBrand($data) + { + return $this->_operation("hsa/keywords", $data, "PUT"); + } + + public function archiveBiddableKeywordBrand($keywordId) + { + return $this->_operation("hsa/keywords/{$keywordId}", null, "DELETE"); } public function getNegativeKeyword($keywordId) { - return $this->_operation("negativeKeywords/{$keywordId}"); + return $this->_operation("sp/negativeKeywords/{$keywordId}"); } public function getNegativeKeywordEx($keywordId) { - return $this->_operation("negativeKeywords/extended/{$keywordId}"); + return $this->_operation("sp/negativeKeywords/extended/{$keywordId}"); } public function createNegativeKeywords($data) { - return $this->_operation("negativeKeywords", $data, "POST"); + return $this->_operation("sp/negativeKeywords", $data, "POST"); } public function updateNegativeKeywords($data) { - return $this->_operation("negativeKeywords", $data, "PUT"); + return $this->_operation("sp/negativeKeywords", $data, "PUT"); } public function archiveNegativeKeyword($keywordId) { - return $this->_operation("negativeKeywords/{$keywordId}", null, "DELETE"); + return $this->_operation("sp/negativeKeywords/{$keywordId}", null, "DELETE"); } public function listNegativeKeywords($data = null) { - return $this->_operation("negativeKeywords", $data); + return $this->_operation("sp/negativeKeywords", $data); } public function listNegativeKeywordsEx($data = null) { - return $this->_operation("negativeKeywords/extended", $data); + return $this->_operation("sp/negativeKeywords/extended", $data); } public function getCampaignNegativeKeyword($keywordId) { - return $this->_operation("campaignNegativeKeywords/{$keywordId}"); + return $this->_operation("sp/campaignNegativeKeywords/{$keywordId}"); } public function getCampaignNegativeKeywordEx($keywordId) { - return $this->_operation("campaignNegativeKeywords/extended/{$keywordId}"); + return $this->_operation("sp/campaignNegativeKeywords/extended/{$keywordId}"); } public function createCampaignNegativeKeywords($data) { - return $this->_operation("campaignNegativeKeywords", $data, "POST"); + return $this->_operation("sp/campaignNegativeKeywords", $data, "POST"); } public function updateCampaignNegativeKeywords($data) { - return $this->_operation("campaignNegativeKeywords", $data, "PUT"); + return $this->_operation("sp/campaignNegativeKeywords", $data, "PUT"); } public function removeCampaignNegativeKeyword($keywordId) { - return $this->_operation("campaignNegativeKeywords/{$keywordId}", null, "DELETE"); + return $this->_operation("sp/campaignNegativeKeywords/{$keywordId}", null, "DELETE"); } public function listCampaignNegativeKeywords($data = null) { - return $this->_operation("campaignNegativeKeywords", $data); + return $this->_operation("sp/campaignNegativeKeywords", $data); } public function listCampaignNegativeKeywordsEx($data = null) { - return $this->_operation("campaignNegativeKeywords/extended", $data); + return $this->_operation("sp/campaignNegativeKeywords/extended", $data); } public function getProductAd($productAdId) { - return $this->_operation("productAds/{$productAdId}"); + return $this->_operation("sp/productAds/{$productAdId}"); } public function getProductAdEx($productAdId) { - return $this->_operation("productAds/extended/{$productAdId}"); + return $this->_operation("sp/productAds/extended/{$productAdId}"); } public function createProductAds($data) { - return $this->_operation("productAds", $data, "POST"); + return $this->_operation("sp/productAds", $data, "POST"); } public function updateProductAds($data) { - return $this->_operation("productAds", $data, "PUT"); + return $this->_operation("sp/productAds", $data, "PUT"); } public function archiveProductAd($productAdId) { - return $this->_operation("productAds/{$productAdId}", null, "DELETE"); + return $this->_operation("sp/productAds/{$productAdId}", null, "DELETE"); } public function listProductAds($data = null) { - return $this->_operation("productAds", $data); + return $this->_operation("sp/productAds", $data); } public function listProductAdsEx($data = null) { - return $this->_operation("productAds/extended", $data); + return $this->_operation("sp/productAds/extended", $data); } public function getAdGroupBidRecommendations($adGroupId) { - return $this->_operation("adGroups/{$adGroupId}/bidRecommendations"); + return $this->_operation("sp/adGroups/{$adGroupId}/bidRecommendations"); } public function getKeywordBidRecommendations($keywordId) { - return $this->_operation("keywords/{$keywordId}/bidRecommendations"); + return $this->_operation("sp/keywords/{$keywordId}/bidRecommendations"); } public function bulkGetKeywordBidRecommendations($adGroupId, $data) @@ -339,21 +380,21 @@ public function bulkGetKeywordBidRecommendations($adGroupId, $data) $data = array( "adGroupId" => $adGroupId, "keywords" => $data); - return $this->_operation("keywords/bidRecommendations", $data, "POST"); + return $this->_operation("sp/keywords/bidRecommendations", $data, "POST"); } public function getAdGroupKeywordSuggestions($data) { $adGroupId = $data["adGroupId"]; unset($data["adGroupId"]); - return $this->_operation("adGroups/{$adGroupId}/suggested/keywords", $data); + return $this->_operation("sp/AdGroups/{$adGroupId}/suggested/keywords", $data); } public function getAdGroupKeywordSuggestionsEx($data) { $adGroupId = $data["adGroupId"]; unset($data["adGroupId"]); - return $this->_operation("adGroups/{$adGroupId}/suggested/keywords/extended", $data); + return $this->_operation("sp/AdGroups/{$adGroupId}/suggested/keywords/extended", $data); } public function getAsinKeywordSuggestions($data) @@ -370,7 +411,12 @@ public function bulkGetAsinKeywordSuggestions($data) public function requestSnapshot($recordType, $data = null) { - return $this->_operation("{$recordType}/snapshot", $data, "POST"); + return $this->_operation("sp/{$recordType}/snapshot", $data, "POST"); + } + + public function requestSnapshotBrand($recordType, $data = null) + { + return $this->_operation("hsa/{$recordType}/snapshot", $data, "POST"); } public function getSnapshot($snapshotId) @@ -387,7 +433,12 @@ public function getSnapshot($snapshotId) public function requestReport($recordType, $data = null) { - return $this->_operation("{$recordType}/report", $data, "POST"); + return $this->_operation("sp/{$recordType}/report", $data, "POST"); + } + + public function requestReportBrand($recordType, $data = null) + { + return $this->_operation("hsa/{$recordType}/report", $data, "POST"); } public function getReport($reportId) @@ -415,6 +466,10 @@ private function _download($location, $gunzip = false) array_push($headers, "Amazon-Advertising-API-Scope: {$this->profileId}"); } + if (!is_null($this->config['clientId'])) { + array_push($headers, "Amazon-Advertising-API-ClientId: {$this->config['clientId']}"); + } + $request = new CurlRequest(); $request->setOption(CURLOPT_URL, $location); $request->setOption(CURLOPT_HTTPHEADER, $headers); @@ -441,6 +496,10 @@ private function _operation($interface, $params = array(), $method = "GET") array_push($headers, "Amazon-Advertising-API-Scope: {$this->profileId}"); } + if (!is_null($this->config['clientId'])) { + array_push($headers, "Amazon-Advertising-API-ClientId: {$this->config['clientId']}"); + } + $request = new CurlRequest(); $url = "{$this->endpoint}/{$interface}"; $this->requestId = null; diff --git a/AmazonAdvertisingApi/Versions.php b/AmazonAdvertisingApi/Versions.php index 35a699d..e03b232 100755 --- a/AmazonAdvertisingApi/Versions.php +++ b/AmazonAdvertisingApi/Versions.php @@ -4,7 +4,7 @@ class Versions { public $versionStrings = array( - "apiVersion" => "v1", - "applicationVersion" => "1.2" + "apiVersion" => "v2", + "applicationVersion" => "1.3" ); } diff --git a/README.md b/README.md index d704e75..f6adbf0 100755 --- a/README.md +++ b/README.md @@ -100,6 +100,11 @@ $client->profileId = "1234567890"; * [createCampaigns](#createcampaigns) * [updateCampaigns](#updatecampaigns) * [archiveCampaign](#archivecampaign) + * [listCampaigns Sponsored Brands](#listcampaignsBrand) + * [getCampaign Sponsored Brands](#getcampaignBrand) + * [updateCampaigns Sponsored Brands](#updatecampaignsBrand) + * [archiveCampaign Sponsored Brands](#archivecampaignBrand) + * Ad Groups * [listAdGroups](#listadgroups) * [getAdGroup](#getadgroup) @@ -112,6 +117,10 @@ $client->profileId = "1234567890"; * [createBiddableKeywords](#createbiddablekeywords) * [updateBiddableKeywords](#updatebiddablekeywords) * [archiveBiddableKeyword](#archivebiddablekeyword) + * [getBiddableKeyword Sponsored Brands](#getbiddablekeywordBrand) + * [createBiddableKeywords Sponsored Brands](#createbiddablekeywordsBrand) + * [updateBiddableKeywords Sponsored Brands](#updatebiddablekeywordsBrand) + * [archiveBiddableKeyword Sponsored Brands](#archivebiddablekeywordBrand) * Negative Keywords * [listNegativeKeywords](#listnegativekeywords) * [getNegativeKeyword](#getnegativekeyword) @@ -133,9 +142,11 @@ $client->profileId = "1234567890"; * Snapshots * [requestSnapshot](#requestsnapshot) * [getSnapshot](#getsnapshot) + * [requestSnapshot Sponsored Brands](#requestsnapshotBrand) * Reports * [requestReport](#requestreport) * [getReport](#getreport) + * [requestReport Sponsored Brands](#requestreportBrand) * Bid Recommendations * [getAdGroupBidRecommendations](#getadgroupbidrecommendations) * [getKeywordBidRecommendations](#getkeywordbidrecommendations) @@ -327,6 +338,103 @@ $client->archiveCampaign(1234567890); } ``` + +--- +#### listCampaignsBrand +> Retrieves a list of campaigns satisfying optional criteria. Used for Sponsored Brands. + +```PHP +$client->listCampaignsBrand(array("stateFilter" => "enabled")); +``` +> +``` +[ + { + "campaignId": 59836775211065, + "name": "CampaignOne", + "campaignType": "sponsoredProducts", + "targetingType": "manual", + "dailyBudget": 15.0, + "startDate": "20160330", + "state": "enabled" + }, + { + "campaignId": 254238342004647, + "name": "CampaignTwo", + "campaignType": "sponsoredProducts", + "targetingType": "manual", + "dailyBudget": 5.0, + "startDate": "20160510", + "state": "enabled" + } +] +``` + +--- +#### getCampaignBrand +> Retrieves a campaign by Id. Used for Sponsored Brands. + +```PHP +$client->getCampaignBrand(1234567890); +``` +> +``` +{ + "campaignId": 1234567890, + "name": "CampaignOne", + "campaignType": "sponsoredProducts", + "targetingType": "manual", + "dailyBudget": 15.0, + "startDate": "20160330", + "state": "enabled" +} +``` + +--- +#### updateCampaignsBrand +> Updates one or more campaigns. Campaigns are identified using their `campaignId`s. Used for Sponsored Brands. + +```PHP +$client->updateCampaignsBrand( + array( + array("campaignId" => 173284463890123, + "name" => "Update Campaign One", + "state" => "enabled", + "dailyBudget" => 10.99), + array("campaignId" => 27074907785456, + "name" => "Update Campaign Two", + "state" => "enabled", + "dailyBudget" => 99.99))); +``` +> +``` +[ + { + "code": "SUCCESS", + "campaignId": 173284463890123 + }, + { + "code": "SUCCESS", + "campaignId": 27074907785456 + } +] +``` + +--- +#### archiveCampaignBrand +> Sets the campaign status to archived. This same operation can be performed via an update, but is included for completeness. Used for Sponsored Brands. + +```PHP +$client->archiveCampaignBrand(1234567890); +``` +> +``` +{ + "code": "SUCCESS", + "campaignId": 1234567890 +} +``` + --- #### listAdGroups > Retrieves a list of ad groups satisfying optional criteria. @@ -576,6 +684,105 @@ $client->archiveBiddableKeyword(112210768353976); } ``` +--- +#### getBiddableKeywordBrand +> Retrieves a keyword by Id. Note that this call returns the minimal set of keyword fields, but is more efficient than getBiddableKeywordEx. Used for Sponsored Brands. + +```PHP +$client->getBiddableKeywordBrand(174140697976855); +``` +> +``` +{ + "keywordId": 174140697976855, + "adGroupId": 52169162825843, + "campaignId": 250040549047739, + "keywordText": "KeywordOne", + "matchType": "exact", + "state": "enabled" +} +``` + +--- +#### createBiddableKeywordsBrand +> Creates one or more keywords. Successfully created keywords will be assigned unique `keywordId`s. Used for Sponsored Brands. + +```PHP +$client->createBiddableKeywordsBrand( + array( + array( + "campaignId" => 250040549047739, + "adGroupId" => 52169162825843, + "keywordText" => "AnotherKeyword", + "matchType" => "exact", + "state" => "enabled"), + array( + "campaignId" => 250040549047739, + "adGroupId" => 52169162825843, + "keywordText" => "YetAnotherKeyword", + "matchType" => "exact", + "state" => "enabled"))); +``` +> +``` +[ + { + "code": "SUCCESS", + "keywordId": 112210768353976 + }, + { + "code": "SUCCESS", + "keywordId": 249490346605943 + } +] +``` + +--- +#### updateBiddableKeywordsBrand +> Updates one or more keywords. Keywords are identified using their `keywordId`s. Used for Sponsored Brands. + +```PHP +$client->updateBiddableKeywordsBrand( + array( + array( + "keywordId" => 112210768353976, + "bid" => 100.0, + "state" => "archived"), + array( + "keywordId" => 249490346605943, + "bid" => 50.0, + "state" => "archived"))); +``` +> +``` +[ + { + "code": "SUCCESS", + "keywordId": 112210768353976 + }, + { + "code": "SUCCESS", + "keywordId": 249490346605943 + } +] +``` + +--- +#### archiveBiddableKeywordBrand +> Sets the keyword status to archived. This same operation can be performed via an update, but is included for completeness. Used for Sponsored Brands. + +```PHP +$client->archiveBiddableKeywordBrand(112210768353976); +``` +> +``` +{ + "code": "200", + "requestId": "0TR95PJD6Z16FFCZDXD0" +} +``` + + --- #### listNegativeKeywords > Retrieves a list of negative keywords satisfying optional criteria. @@ -936,6 +1143,27 @@ $client->requestSnapshot( } ``` + +--- +#### requestSnapshotBrand +> Request a snapshot report for all entities of a single type. Used for Sponsored Brands. + +```PHP +$client->requestSnapshotBrand( + "campaigns", + array("stateFilter" => "enabled,paused,archived", + "campaignType" => "sponsoredProducts")); +``` +> +``` +{ + "snapshotId": "amzn1.clicksAPI.v1.p1.573A0477.ec41773a-1659-4013-8eb9-fa18c87ef5df", + "recordType": "campaign", + "status": "IN_PROGRESS" +} +``` + + --- #### getSnapshot > Retrieve a previously requested report. @@ -997,6 +1225,28 @@ $client->requestReport( } ``` + +--- +#### requestReportBrand +> Request a customized performance report for all entities of a single type which have performance data to report. + +```PHP +$client->requestReportBrand( + "campaigns", + array("reportDate" => "20160515", + "campaignType" => "sponsoredProducts", + "metrics" => "impressions,clicks,cost")); +``` +> +``` +{ + "reportId": "amzn1.clicksAPI.v1.m1.573A0808.32908def-66a1-4ce2-8f12-780dc4ae1d43", + "recordType": "campaign", + "status": "IN_PROGRESS", + "statusDetails": "Report is submitted" +} +``` + --- #### getReport > Retrieve a previously requested report. From c64384555e7328634989ca9097a92cfa378cd324 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Fri, 7 Dec 2018 16:48:47 +0200 Subject: [PATCH 02/24] Add new request type. Searchterm for autotargeting campaigns --- AmazonAdvertisingApi/Client.php | 5 +++++ README.md | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index c873128..ec3bca0 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -441,6 +441,11 @@ public function requestReportBrand($recordType, $data = null) return $this->_operation("hsa/{$recordType}/report", $data, "POST"); } + public function requestReportSearchTerm( $data = null) + { + return $this->_operation("sp/targets/report", $data, "POST"); + } + public function getReport($reportId) { $req = $this->_operation("reports/{$reportId}"); diff --git a/README.md b/README.md index f6adbf0..be4e484 100755 --- a/README.md +++ b/README.md @@ -147,6 +147,7 @@ $client->profileId = "1234567890"; * [requestReport](#requestreport) * [getReport](#getreport) * [requestReport Sponsored Brands](#requestreportBrand) + * [requestReport Searchterm in Auto campaigns](#requestReportSearchTerm) * Bid Recommendations * [getAdGroupBidRecommendations](#getadgroupbidrecommendations) * [getKeywordBidRecommendations](#getkeywordbidrecommendations) @@ -1247,6 +1248,29 @@ $client->requestReportBrand( } ``` + +--- +#### requestReportSearchTerm +> Search-terms report for auto-targeted campaigns generated before 11/14/2018 can be accessed from the endpoint: /v2/sp/keywords/report Search-terms report for auto-targeted campaigns generated on-and-after 11/14/2018 can be accessed from the endpoint: /v2/sp/targets/report Use query-segmentation to retrieve a search-terms report. + +```PHP +$client->requestReportSearchTerm( + array("reportDate" => "20160515", + "campaignType" => "sponsoredProducts", + "segment" => "query", + "metrics" => "impressions,clicks,cost")); +``` +> +``` +{ + "reportId": "amzn1.clicksAPI.v1.m1.573A0808.32908def-66a1-4ce2-8f12-780dc4ae1d43", + "recordType": "keywords", + "status": "IN_PROGRESS", + "statusDetails": "Report is submitted" +} +``` + + --- #### getReport > Retrieve a previously requested report. From 6083842a52cddbb9790941f9f80aa516bcd8fbe3 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Fri, 5 Apr 2019 14:37:54 +0300 Subject: [PATCH 03/24] add negative targets --- AmazonAdvertisingApi/Client.php | 111 +++++++++++++++++-- README.md | 191 ++++++++++++++++++++++++++++++++ 2 files changed, 291 insertions(+), 11 deletions(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index ec3bca0..d1f064c 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -65,7 +65,7 @@ public function doRefreshToken() $data = ""; foreach ($params as $k => $v) { - $data .= "{$k}=".rawurlencode($v)."&"; + $data .= "{$k}=" . rawurlencode($v) . "&"; } $url = "https://{$this->tokenUrl}"; @@ -83,7 +83,7 @@ public function doRefreshToken() if (array_key_exists("access_token", $response_array)) { $this->config["accessToken"] = $response_array["access_token"]; } else { - $this->_logAndThrow("Unable to refresh token. 'access_token' not found in response. ". print_r($response, true)); + $this->_logAndThrow("Unable to refresh token. 'access_token' not found in response. " . print_r($response, true)); } return $response; @@ -441,7 +441,7 @@ public function requestReportBrand($recordType, $data = null) return $this->_operation("hsa/{$recordType}/report", $data, "POST"); } - public function requestReportSearchTerm( $data = null) + public function requestReportSearchTerm($data = null) { return $this->_operation("sp/targets/report", $data, "POST"); } @@ -458,6 +458,91 @@ public function getReport($reportId) return $req; } + public function getTargetingClause($targetId) + { + return $this->_operation("sp/targets/{$targetId}"); + } + + public function listTargetingClauses($data = null) + { + return $this->_operation("sp/targets", $data); + } + + public function getTargetingClauseEx($targetId) + { + return $this->_operation("sp/targets/extended/{$targetId}"); + } + + public function listTargetingClausesEx($data = null) + { + return $this->_operation("sp/targets/extended", $data); + } + + public function createTargetingClauses($data) + { + return $this->_operation("sp/targets", $data, "POST"); + } + + public function updateTargetingClauses($data) + { + return $this->_operation("sp/keywords", $data, "PUT"); + } + + public function archiveTargetingClause($targetId) + { + return $this->_operation("sp/targets/" . $targetId, 'DELETE'); + } + + public function generateTargetsProductRecommendations($data) + { + return $this->_operation("sp/targets/productRecommendations", $data, 'POST'); + } + + public function getTargetingCategories($data) + { + return $this->_operation("sp/targets/categories", $data); + } + + public function getBrandRecommendations($data) + { + return $this->_operation("sp/targets/brands", $data); + } + + public function getNegativeTargetingClause($targetId) + { + return $this->_operation("sp/negativeTargets/" . $targetId); + } + + public function getNegativeTargetingClauseEx($targetId) + { + return $this->_operation("sp/negativeTargets/extended/" . $targetId); + } + + public function listNegativeTargetingClauses($data = null) + { + return $this->_operation("sp/negativeTargets", $data); + } + + public function listNegativeTargetingClausesEx($data = null) + { + return $this->_operation("sp/negativeTargets/extended", $data); + } + + public function createNegativeTargetingClauses($data) + { + return $this->_operation("sp/negativeTargets", $data, 'POST'); + } + + public function updateNegativeTargetingClauses($data) + { + return $this->_operation("sp/negativeTargets", $data, 'PUT'); + } + + public function archiveNegativeTargetingClause($targetId) + { + return $this->_operation("sp/negativeTargets/" . $targetId, 'DELETE'); + } + private function _download($location, $gunzip = false) { $headers = array(); @@ -482,7 +567,11 @@ private function _download($location, $gunzip = false) if ($gunzip) { $response = $this->_executeRequest($request); - $response["response"] = gzdecode($response["response"]); + try { + $response["response"] = gzdecode($response["response"]); + } catch (\Exception $e) { + + } return $response; } @@ -515,7 +604,7 @@ private function _operation($interface, $params = array(), $method = "GET") if (!empty($params)) { $url .= "?"; foreach ($params as $k => $v) { - $url .= "{$k}=".rawurlencode($v)."&"; + $url .= "{$k}=" . rawurlencode($v) . "&"; } $url = rtrim($url, "&"); } @@ -561,14 +650,14 @@ protected function _executeRequest($request) } } return array("success" => false, - "code" => $response_info["http_code"], - "response" => $response, - "requestId" => $requestId); + "code" => $response_info["http_code"], + "response" => $response, + "requestId" => $requestId); } else { return array("success" => true, - "code" => $response_info["http_code"], - "response" => $response, - "requestId" => $this->requestId); + "code" => $response_info["http_code"], + "response" => $response, + "requestId" => $this->requestId); } } diff --git a/README.md b/README.md index be4e484..f934022 100755 --- a/README.md +++ b/README.md @@ -158,6 +158,25 @@ $client->profileId = "1234567890"; * [getAsinKeywordSuggestions](#getasinkeywordsuggestions) * [bulkGetAsinKeywordSuggestions](#bulkgetasinkeywordsuggestions) +* Product attribute targeting + * [getTargetingClause](#getTargetingClause) + * [listTargetingClauses](#listTargetingClauses) + * [getTargetingClauseEx](#getTargetingClauseEx) + * [listTargetingClausesEx](#listTargetingClausesEx) + * [createTargetingClauses](#createTargetingClauses) + * [updateTargetingClauses](#updateTargetingClauses) + * [archiveTargetingClause](#archiveTargetingClause) + * [getTargetingCategories](#getTargetingCategories) + * [getBrandRecommendations](#getBrandRecommendations) + * [getNegativeTargetingClause](#getNegativeTargetingClause) + * [getNegativeTargetingClauseEx](#getNegativeTargetingClauseEx) + * [createNegativeTargetingClauses](#createNegativeTargetingClauses) + * [listNegativeTargetingClauses](#listNegativeTargetingClauses) + * [listNegativeTargetingClausesEx](#listNegativeTargetingClausesEx) + * [archiveNegativeTargetingClause](#archiveNegativeTargetingClause) + * [updateNegativeTargetingClauses](#updateNegativeTargetingClauses) + + #### getProfile > Retrieves a single profile by Id. @@ -1497,3 +1516,175 @@ $client->bulkGetAsinKeywordSuggestions( } ] ``` + + +--- +#### getTargetingClause +> Retrieve a targeting clause with a specific target ID. + +```PHP +$client->getTargetingClause(123456789); +``` + +--- +#### listTargetingClauses +> Retrieves a list of targeting clauses. + +```PHP +$client->listTargetingClauses(array('stateFilter'=>'enabled')); +``` + +--- +#### getTargetingClauseEx +> Retrieve a targeting clause with additional attributes using a specific target ID. + +```PHP +$client->getTargetingClauseEx(123456789); +``` + +--- +#### listTargetingClausesEx +> Retrieve a list of targeting clauses with extended properties. + +```PHP +$client->listTargetingClausesEx(array('stateFilter'=>'enabled')); +``` + +--- +#### createTargetingClauses +> Creates one or more targeting expressions. + +```PHP +$client->createTargetingClauses(array(array( +"campaignId"=> 127985268700344, + "adGroupId"=> 456789012345, + "expressionType"=> "manual", + "expression"=> array( + "type"=> "asinCategorySameAs", + "value"=> "12345567" + ), + "bid"=> 10, + "state"=> "enabled" +))); +``` + +--- +#### updateTargetingClauses +> Update one or more targeting clauses. + +```PHP +$client->updateTargetingClauses(array(array( +"campaignId"=> 127985268700344, + "adGroupId"=> 456789012345, + "targetId"=> 123452234567, + "expressionType"=> "manual", + "expression"=> array( + "type"=> "asinCategorySameAs", + "value"=> "12345567" + ), + "bid"=> 10, + "state"=> "enabled" +))); +``` + +--- +#### archiveTargetingClause +> Set the status of targeting clauses to archived. This same operation can also be performed via an update (PUT method), but is included for completeness. Archived entities cannot be made active again. + +```PHP +$client->archiveTargetingClause(123456789); +``` + +--- +#### getTargetingCategories +> Get list of targeting categories. + +```PHP +$client->getTargetingCategories(array('asins'=>'ASDF,EFGH,DSFDSK')); +``` + +--- +#### getBrandRecommendations +> Get recommended brands for Sponsored Products. Only one parameter (keyword or categoryId) per request is allowed. + +```PHP +$client->getBrandRecommendations(array('categoryId'=>123456789)); +``` + +--- +#### getNegativeTargetingClause +> Get a specific negative targeting clause by targetId. + +```PHP +$client->getNegativeTargetingClause(123456789); +``` + +--- +#### getNegativeTargetingClauseEx +> Retrieve a negative targeting clause with additional attributes using a specific target ID. + +```PHP +$client->getNegativeTargetingClauseEx(123456789); +``` + +--- +#### createNegativeTargetingClauses +> Create negative targeting clauses at the campaign level. + +```PHP +$client->createNegativeTargetingClauses(array(array( + "campaignId"=> 127985268700344, + "adGroupId"=> 456789012345, + "targetId"=> 123452234567, + "expressionType"=> "manual", + "expression"=> array( + "type"=> "asinCategorySameAs", + "value"=> "12345567" + ), + "bid"=> 10, + "state"=> "enabled" + ))); +``` + +--- +#### listNegativeTargetingClauses +> Retrieves a list of negative targeting clauses. + +```PHP +$client->listNegativeTargetingClauses(array('stateFilter'=>'enabled')); +``` + +--- +#### listNegativeTargetingClausesEx +> Retrieve a list of targeting clauses with extended properties. + +```PHP +$client->listNegativeTargetingClausesEx(array('stateFilter'=>'enabled')); +``` + +--- +#### archiveNegativeTargetingClause +> Archive negative targeting clauses. + +```PHP +$client->archiveNegativeTargetingClause(123456789); +``` + +--- +#### updateNegativeTargetingClauses +> Update negative targeting clauses. + +```PHP +$client->updateNegativeTargetingClauses(array(array( + "campaignId"=> 127985268700344, + "adGroupId"=> 456789012345, + "targetId"=> 123452234567, + "expressionType"=> "manual", + "expression"=> array( + "type"=> "asinCategorySameAs", + "value"=> "12345567" + ), + "bid"=> 10, + "state"=> "enabled" + ))); +``` From d25ad50e106503d646523fe65b97301a2cd4a0ff Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Mon, 22 Jul 2019 12:27:22 +0300 Subject: [PATCH 04/24] add target recomendations and asin reports --- AmazonAdvertisingApi/Client.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index d1f064c..353ad6a 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -436,6 +436,12 @@ public function requestReport($recordType, $data = null) return $this->_operation("sp/{$recordType}/report", $data, "POST"); } + public function requestAsinReport($data = null) + { + return $this->_operation("asins/report", $data, "POST"); + } + + public function requestReportBrand($recordType, $data = null) { return $this->_operation("hsa/{$recordType}/report", $data, "POST"); @@ -490,7 +496,7 @@ public function updateTargetingClauses($data) public function archiveTargetingClause($targetId) { - return $this->_operation("sp/targets/" . $targetId, 'DELETE'); + return $this->_operation("sp/targets/" . $targetId, [], 'DELETE'); } public function generateTargetsProductRecommendations($data) @@ -543,6 +549,11 @@ public function archiveNegativeTargetingClause($targetId) return $this->_operation("sp/negativeTargets/" . $targetId, 'DELETE'); } + public function getTargetBidRecommendations($data) + { + return $this->_operation("sp/targets/bidRecommendations", $data, "POST"); + } + private function _download($location, $gunzip = false) { $headers = array(); From 303a03ec9a564faa73a7a9305b9805e3351cb2fc Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Mon, 29 Jul 2019 15:24:40 +0300 Subject: [PATCH 05/24] fix update targeting clauses --- AmazonAdvertisingApi/Client.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index 353ad6a..4ae358b 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -491,7 +491,7 @@ public function createTargetingClauses($data) public function updateTargetingClauses($data) { - return $this->_operation("sp/keywords", $data, "PUT"); + return $this->_operation("sp/targets", $data, "PUT"); } public function archiveTargetingClause($targetId) From 3d62a1f312f436eeaae431538c21dae3df631112 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Mon, 5 Aug 2019 15:40:00 +0300 Subject: [PATCH 06/24] add portfolio methods --- AmazonAdvertisingApi/Client.php | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index 4ae358b..87f836f 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -554,6 +554,36 @@ public function getTargetBidRecommendations($data) return $this->_operation("sp/targets/bidRecommendations", $data, "POST"); } + public function listPortfolios($data = null) + { + return $this->_operation("sp/portfolios", $data); + } + + public function listPortfoliosEx($data = null) + { + return $this->_operation("sp/portfolios/extended", $data); + } + + public function getPortfolio($portfolioId) + { + return $this->_operation("sp/portfolios/{$portfolioId}"); + } + + public function getPortfolioEx($portfolioId) + { + return $this->_operation("sp/portfolios/extended/{$portfolioId}"); + } + + public function createPortfolios($data) + { + return $this->_operation("sp/portfolios", $data, "POST"); + } + + public function updatePortfolios($data) + { + return $this->_operation("sp/portfolios", $data, "PUT"); + } + private function _download($location, $gunzip = false) { $headers = array(); From 1fbb86a91601557460f56573e25180c3a1ecf93c Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Mon, 5 Aug 2019 16:28:41 +0300 Subject: [PATCH 07/24] fix porfolios endpoint --- AmazonAdvertisingApi/Client.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index 87f836f..ae1d685 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -556,32 +556,32 @@ public function getTargetBidRecommendations($data) public function listPortfolios($data = null) { - return $this->_operation("sp/portfolios", $data); + return $this->_operation("portfolios", $data); } public function listPortfoliosEx($data = null) { - return $this->_operation("sp/portfolios/extended", $data); + return $this->_operation("portfolios/extended", $data); } public function getPortfolio($portfolioId) { - return $this->_operation("sp/portfolios/{$portfolioId}"); + return $this->_operation("portfolios/{$portfolioId}"); } public function getPortfolioEx($portfolioId) { - return $this->_operation("sp/portfolios/extended/{$portfolioId}"); + return $this->_operation("portfolios/extended/{$portfolioId}"); } public function createPortfolios($data) { - return $this->_operation("sp/portfolios", $data, "POST"); + return $this->_operation("portfolios", $data, "POST"); } public function updatePortfolios($data) { - return $this->_operation("sp/portfolios", $data, "PUT"); + return $this->_operation("portfolios", $data, "PUT"); } private function _download($location, $gunzip = false) From b1149471b05af0b607864cbed54eb70c44292b33 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Tue, 3 Sep 2019 11:22:17 +0300 Subject: [PATCH 08/24] add adgroup suggested keywords --- AmazonAdvertisingApi/Client.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index ae1d685..368a0b2 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -584,6 +584,11 @@ public function updatePortfolios($data) return $this->_operation("portfolios", $data, "PUT"); } + public function getAdGroupSuggestedKeywords($adGroupId) + { + return $this->_operation("sp/adGroups/" . $adGroupId . "/suggested/keywords"); + } + private function _download($location, $gunzip = false) { $headers = array(); From 55c1c6f60c5711bd411eb0dc1805ef32877e9b06 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Wed, 12 Feb 2020 15:04:27 +0200 Subject: [PATCH 09/24] add sponsoredDisplay methods --- .idea/.gitignore | 2 + .idea/amazon-advertising-api-php-sdk.iml | 12 ++++++ .idea/modules.xml | 8 ++++ .idea/php.xml | 4 ++ .idea/vcs.xml | 6 +++ AmazonAdvertisingApi/Client.php | 48 ++++++++++++++++++++++++ 6 files changed, 80 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/amazon-advertising-api-php-sdk.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/php.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5c98b42 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/.idea/amazon-advertising-api-php-sdk.iml b/.idea/amazon-advertising-api-php-sdk.iml new file mode 100644 index 0000000..716046f --- /dev/null +++ b/.idea/amazon-advertising-api-php-sdk.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..d6f3a08 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..0151495 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index 368a0b2..a29b05d 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -124,10 +124,29 @@ public function getCampaignEx($campaignId) return $this->_operation("sp/campaigns/extended/{$campaignId}"); } + public function getCampaignExSponsoredDisplay($campaignId) + { + return $this->_operation("sd/campaigns/extended/{$campaignId}"); + } + + public function getCampaignExBrand($campaignId) + { + return $this->_operation("hsa/campaigns/extended/{$campaignId}"); + } + + public function getCampaignSponsoredDisplay($campaignId) + { + return $this->_operation("sd/campaigns/{$campaignId}"); + } + public function createCampaigns($data) { return $this->_operation("sp/campaigns", $data, "POST"); } + public function createCampaignsSponsoredDisplay($data) + { + return $this->_operation("sd/campaigns", $data, "POST"); + } public function updateCampaigns($data) { @@ -139,6 +158,11 @@ public function archiveCampaign($campaignId) return $this->_operation("sp/campaigns/{$campaignId}", null, "DELETE"); } + public function archiveCampaignSponsoredDisplay($campaignId) + { + return $this->_operation("sd/campaigns/{$campaignId}", null, "DELETE"); + } + public function listCampaigns($data = null) { return $this->_operation("sp/campaigns", $data); @@ -149,6 +173,11 @@ public function listCampaignsEx($data = null) return $this->_operation("sp/campaigns/extended", $data); } + public function listCampaignsExSponsoredDisplay($data = null) + { + return $this->_operation("sd/campaigns/extended", $data); + } + public function getCampaignBrand($campaignId) { return $this->_operation("hsa/campaigns/{$campaignId}"); @@ -159,6 +188,11 @@ public function updateCampaignsBrand($data) return $this->_operation("hsa/campaigns", $data, "PUT"); } + public function updateCampaignsSponsoredDisplay($data) + { + return $this->_operation("sd/campaigns", $data, "PUT"); + } + public function archiveCampaignBrand($campaignId) { return $this->_operation("hsa/campaigns/{$campaignId}", null, "DELETE"); @@ -169,6 +203,10 @@ public function listCampaignsBrand($data = null) return $this->_operation("hsa/campaigns", $data); } + public function listCampaignsSponsoredDisplay($data = null) + { + return $this->_operation("sd/campaigns", $data); + } public function getAdGroup($adGroupId) { @@ -589,6 +627,16 @@ public function getAdGroupSuggestedKeywords($adGroupId) return $this->_operation("sp/adGroups/" . $adGroupId . "/suggested/keywords"); } + public function getAsinSuggestedKeywords($asinValue) + { + return $this->_operation("sp/asins/" . $asinValue . "/suggested/keywords"); + } + + public function bulkGetAsinSuggestedKeywords($data) + { + return $this->_operation("sp/asins/suggested/keywords", $data, "POST"); + } + private function _download($location, $gunzip = false) { $headers = array(); From 5af0a118958e4c9e92036b68396d6f7dcff22d06 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Tue, 31 Mar 2020 08:01:45 +0300 Subject: [PATCH 10/24] add methods for sponsoreddisplay adgroups --- AmazonAdvertisingApi/Client.php | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index a29b05d..6499944 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -213,36 +213,69 @@ public function getAdGroup($adGroupId) return $this->_operation("adGroups/{$adGroupId}"); } + public function getAdGroupSponsoredDisplay($adGroupId) + { + return $this->_operation("sd/adGroups/{$adGroupId}"); + } + public function getAdGroupEx($adGroupId) { return $this->_operation("adGroups/extended/{$adGroupId}"); } + public function getAdGroupExSponsoredDisplay($adGroupId) + { + return $this->_operation("sd/adGroups/extended/{$adGroupId}"); + } + public function createAdGroups($data) { return $this->_operation("adGroups", $data, "POST"); } + public function createAdGroupsSponsoredDisplay($data) + { + return $this->_operation("sd/adGroups", $data, "POST"); + } public function updateAdGroups($data) { return $this->_operation("adGroups", $data, "PUT"); } + public function updateAdGroupsSponsoredDisplay($data) + { + return $this->_operation("sd/adGroups", $data, "PUT"); + } + public function archiveAdGroup($adGroupId) { return $this->_operation("adGroups/{$adGroupId}", null, "DELETE"); } + public function archiveAdGroupSponsoredDisplay($adGroupId) + { + return $this->_operation("sd/adGroups/{$adGroupId}", null, "DELETE"); + } + public function listAdGroups($data = null) { return $this->_operation("adGroups", $data); } + public function listAdGroupsSponsoredDisplay($data = null) + { + return $this->_operation("sd/adGroups", $data); + } public function listAdGroupsEx($data = null) { return $this->_operation("adGroups/extended", $data); } + public function listAdGroupsExSponsoredDisplay($data = null) + { + return $this->_operation("sd/adGroups/extended", $data); + } + public function getBiddableKeyword($keywordId) { return $this->_operation("sp/keywords/{$keywordId}"); From cec3f2e2465df3053ac95f13521793b4c06efe88 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Tue, 31 Mar 2020 08:57:36 +0300 Subject: [PATCH 11/24] add methods for sponsoreddisplay product ads --- AmazonAdvertisingApi/Client.php | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index 6499944..06c86cf 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -406,36 +406,71 @@ public function getProductAd($productAdId) return $this->_operation("sp/productAds/{$productAdId}"); } + public function getProductAdSponsoredDisplay($productAdId) + { + return $this->_operation("sd/productAds/{$productAdId}"); + } + public function getProductAdEx($productAdId) { return $this->_operation("sp/productAds/extended/{$productAdId}"); } + public function getProductAdExSponsoredDisplay($productAdId) + { + return $this->_operation("sd/productAds/extended/{$productAdId}"); + } + public function createProductAds($data) { return $this->_operation("sp/productAds", $data, "POST"); } + public function createProductAdsSponsoredDisplay($data) + { + return $this->_operation("sd/productAds", $data, "POST"); + } + public function updateProductAds($data) { return $this->_operation("sp/productAds", $data, "PUT"); } + public function updateProductAdsSponsoredDisplay($data) + { + return $this->_operation("sd/productAds", $data, "PUT"); + } + public function archiveProductAd($productAdId) { return $this->_operation("sp/productAds/{$productAdId}", null, "DELETE"); } + public function archiveProductAdSponsoredDisplay($productAdId) + { + return $this->_operation("sd/productAds/{$productAdId}", null, "DELETE"); + } + public function listProductAds($data = null) { return $this->_operation("sp/productAds", $data); } + public function listProductAdsSponsoredDisplay($data = null) + { + return $this->_operation("sd/productAds", $data); + } + public function listProductAdsEx($data = null) { return $this->_operation("sp/productAds/extended", $data); } + public function listProductAdsExSponsoredDisplay($data = null) + { + return $this->_operation("sd/productAds/extended", $data); + } + public function getAdGroupBidRecommendations($adGroupId) { return $this->_operation("sp/adGroups/{$adGroupId}/bidRecommendations"); From 582985c356c4779ec0e1abe178abf28c04c932e3 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Tue, 31 Mar 2020 10:22:41 +0300 Subject: [PATCH 12/24] add methods for sponsoredDisplay reports --- AmazonAdvertisingApi/Client.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index 06c86cf..ed4800d 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -553,6 +553,13 @@ public function requestReportBrand($recordType, $data = null) return $this->_operation("hsa/{$recordType}/report", $data, "POST"); } + public function requestReportSponsoredDisplay($recordType, $data = null) + { + return $this->_operation("sd/{$recordType}/report", $data, "POST"); + } + + + public function requestReportSearchTerm($data = null) { return $this->_operation("sp/targets/report", $data, "POST"); From 45b21c17b1e50434c035ce9284904f1a1762abd0 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Tue, 7 Apr 2020 12:53:12 +0300 Subject: [PATCH 13/24] add upload assets method --- AmazonAdvertisingApi/Client.php | 201 +++++++++++++++++++++++++++++++- 1 file changed, 199 insertions(+), 2 deletions(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index ed4800d..accb26b 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -1,4 +1,5 @@ _operation("sp/campaigns", $data, "POST"); } + + public function createCampaignsBrand($data) + { + return $this->_operation("sp/campaigns", $data, "POST"); + } + public function createCampaignsSponsoredDisplay($data) { return $this->_operation("sd/campaigns", $data, "POST"); @@ -237,6 +244,7 @@ public function createAdGroupsSponsoredDisplay($data) { return $this->_operation("sd/adGroups", $data, "POST"); } + public function updateAdGroups($data) { return $this->_operation("adGroups", $data, "PUT"); @@ -261,6 +269,12 @@ public function listAdGroups($data = null) { return $this->_operation("adGroups", $data); } + + public function listAdGroupsBrand($data = null) + { + return $this->_operation("hsa/adGroups", $data); + } + public function listAdGroupsSponsoredDisplay($data = null) { return $this->_operation("sd/adGroups", $data); @@ -537,6 +551,19 @@ public function getSnapshot($snapshotId) return $req; } + public function getSnapshotBrands($snapshotId) + { + $req = $this->_operation("hsa/snapshots/{$snapshotId}"); + if ($req["success"]) { + $json = json_decode($req["response"], true); + if ($json["status"] == "SUCCESS") { + return $this->_download($json["location"]); + } + } + return $req; + } + + public function requestReport($recordType, $data = null) { return $this->_operation("sp/{$recordType}/report", $data, "POST"); @@ -559,7 +586,6 @@ public function requestReportSponsoredDisplay($recordType, $data = null) } - public function requestReportSearchTerm($data = null) { return $this->_operation("sp/targets/report", $data, "POST"); @@ -582,36 +608,73 @@ public function getTargetingClause($targetId) return $this->_operation("sp/targets/{$targetId}"); } + public function getTargetingClauseSponsoredDisplay($targetId) + { + return $this->_operation("sd/targets/{$targetId}"); + } + public function listTargetingClauses($data = null) { return $this->_operation("sp/targets", $data); } + public function listTargetingClausesSponsoredDisplay($data = null) + { + return $this->_operation("sd/targets", $data); + } + public function getTargetingClauseEx($targetId) { return $this->_operation("sp/targets/extended/{$targetId}"); } + public function getTargetingClauseExSponsoredDisplay($targetId) + { + return $this->_operation("sd/targets/extended/{$targetId}"); + } + + public function listTargetingClausesEx($data = null) { return $this->_operation("sp/targets/extended", $data); } + public function listTargetingClausesExSponsoredDisplay($data = null) + { + return $this->_operation("sd/targets/extended", $data); + } + public function createTargetingClauses($data) { return $this->_operation("sp/targets", $data, "POST"); } + public function createTargetingClausesSponsoredDisplay($data) + { + return $this->_operation("sd/targets", $data, "POST"); + } + public function updateTargetingClauses($data) { return $this->_operation("sp/targets", $data, "PUT"); } + public function updateTargetingClausesSponsoredDisplay($data) + { + return $this->_operation("sd/targets", $data, "PUT"); + } + public function archiveTargetingClause($targetId) { return $this->_operation("sp/targets/" . $targetId, [], 'DELETE'); } + public function archiveTargetingClauseSponsoredDisplay($targetId) + { + return $this->_operation("sd/targets/" . $targetId, [], 'DELETE'); + } + + public function generateTargetsProductRecommendations($data) { return $this->_operation("sp/targets/productRecommendations", $data, 'POST'); @@ -712,6 +775,32 @@ public function bulkGetAsinSuggestedKeywords($data) return $this->_operation("sp/asins/suggested/keywords", $data, "POST"); } + public function listAssets($data = null) + { + return $this->_operation("stores/assets", $data); + } + + public function listBrands($data = null) + { + return $this->_operation("brands", $data); + } + + /** + * @param $data + * [ 'assetInfo' => '{brandEntityId: "ENTITY123456", mediaType: "brandLogo"}' ]; + * @param $filePath - real path to uploaded file + * @param $imageType - one of PNG|JPEG|GIF + * @param $fileName - example 'logo.png' + * @return array + */ + public function createAsset($data, $filePath, $imageType, $fileName) + { + $headers = array( + 'Content-Disposition: ' . $fileName + ); + return $this->_UploadAsset($data, array($filePath), $headers, $imageType, $fileName); + } + private function _download($location, $gunzip = false) { $headers = array(); @@ -747,7 +836,7 @@ private function _download($location, $gunzip = false) return $this->_executeRequest($request); } - private function _operation($interface, $params = array(), $method = "GET") + private function _operation($interface, $params = array(), $method = "GET", $additionalHeaders = array()) { $headers = array( "Authorization: bearer {$this->config["accessToken"]}", @@ -763,8 +852,20 @@ private function _operation($interface, $params = array(), $method = "GET") array_push($headers, "Amazon-Advertising-API-ClientId: {$this->config['clientId']}"); } + + if (!empty($additionalHeaders)) { + foreach ($additionalHeaders as $header) { + array_push($headers, $header); + } + } + $request = new CurlRequest(); $url = "{$this->endpoint}/{$interface}"; + + $excludedVersionForInterfaceList = array('brands', 'stores/assets'); + if (array_search($interface, $excludedVersionForInterfaceList) !== false) { + $url = str_replace('/' . $this->apiVersion, '', $url); + } $this->requestId = null; $data = ""; @@ -798,6 +899,102 @@ private function _operation($interface, $params = array(), $method = "GET") return $this->_executeRequest($request); } + + private function _UploadAsset($params = array(), $filenames = array(), $additionalHeaders = array(), $imageType, $fileName) + { + + $files = array(); + foreach ($filenames as $f) { + $files[$f] = file_get_contents($f); + } + + + $url = "{$this->endpoint}/stores/assets"; + $boundary = uniqid(); + $delimiter = '-------------' . $boundary; + $post_data = $this->build_data_files($boundary, $params, $files, $imageType, $fileName); + + $headers = array( + "Authorization: bearer {$this->config["accessToken"]}", + "Content-Type: multipart/form-data; boundary=" . $delimiter, + "Content-Length: " . strlen($post_data), + "User-Agent: {$this->userAgent}" + ); + + if (!is_null($this->profileId)) { + array_push($headers, "Amazon-Advertising-API-Scope: {$this->profileId}"); + } + + if (!is_null($this->config['clientId'])) { + array_push($headers, "Amazon-Advertising-API-ClientId: {$this->config['clientId']}"); + } + + if (!empty($additionalHeaders)) { + foreach ($additionalHeaders as $header) { + array_push($headers, $header); + } + } + + $request = new CurlRequest(); + $url = str_replace('/' . $this->apiVersion, '', $url); + + $this->requestId = null; + $request->setOption(CURLOPT_POST, true); + $request->setOption(CURLOPT_POSTFIELDS, $post_data); + $request->setOption(CURLOPT_URL, $url); + $request->setOption(CURLOPT_HTTPHEADER, $headers); + $request->setOption(CURLOPT_USERAGENT, $this->userAgent); + $request->setOption(CURLOPT_CUSTOMREQUEST, 'POST'); + return $this->_executeRequest($request); + } + + + protected function build_data_files($boundary, $fields, $files, $imageType, $fileName) + { + + $imageMimeType = ''; + switch ($imageType) { + case 'PNG': + $imageMimeType = 'image/png'; + break; + + case 'JPEG': + $imageMimeType = 'image/jpeg'; + break; + + case 'GIF': + $imageMimeType = 'image/gif'; + break; + + default: + $this->_logAndThrow("Unknown image type {$imageType}."); + } + + $data = ''; + $eol = "\r\n"; + $delimiter = '-------------' . $boundary; + + foreach ($fields as $name => $content) { + $data .= "--" . $delimiter . $eol + . 'Content-Disposition: form-data; name="' . $name . "\"" . $eol . $eol + . $content . $eol; + } + + foreach ($files as $name => $content) { + $data .= "--" . $delimiter . $eol + . 'Content-Disposition: form-data; name="asset"; filename="' . $fileName . '"' . $eol + . 'Content-Type: ' . $imageMimeType . $eol + . 'Content-Transfer-Encoding: binary' . $eol; + + $data .= $eol; + $data .= $content . $eol; + } + $data .= "--" . $delimiter . "--" . $eol; + + return $data; + } + + protected function _executeRequest($request) { $response = $request->execute(); From 84a2e93d2370dfcacdc053c08de87a7d7b33b8aa Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Tue, 7 Apr 2020 12:53:55 +0300 Subject: [PATCH 14/24] edit composer --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index d1b502d..9e2eca7 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "amzn/amazon-advertising-api-php-sdk", + "name": "rams007/amazon-advertising-api-php-sdk", "type": "library", "description": "Amazon Advertising API Client Library", "keywords": [ @@ -30,7 +30,7 @@ "repositories": [ { "type": "vcs", - "url": "https://github.com/amzn/amazon-advertising-api-php-sdk" + "url": "https://github.com/rams007/amazon-advertising-api-php-sdk" } ] } From 04bc79ae131a63443a79856a47adc76d22b9fe5d Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Tue, 7 Apr 2020 13:02:37 +0300 Subject: [PATCH 15/24] add tag --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f934022..f5e49da 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## Synopsis -Official Amazon Advertising API PHP client library. +Fork of Official Amazon Advertising API PHP client library. ## Requirements From 0b0c51a20aae10316b4e24304d90213cbc16e6dc Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Thu, 9 Apr 2020 15:39:14 +0300 Subject: [PATCH 16/24] fixes with sponsored brand campaigns --- AmazonAdvertisingApi/Client.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index accb26b..ff20ba2 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -147,7 +147,7 @@ public function createCampaigns($data) public function createCampaignsBrand($data) { - return $this->_operation("sp/campaigns", $data, "POST"); + return $this->_operation("sb/campaigns", $data, "POST"); } public function createCampaignsSponsoredDisplay($data) @@ -862,7 +862,7 @@ private function _operation($interface, $params = array(), $method = "GET", $add $request = new CurlRequest(); $url = "{$this->endpoint}/{$interface}"; - $excludedVersionForInterfaceList = array('brands', 'stores/assets'); + $excludedVersionForInterfaceList = array('brands', 'stores/assets','sb/campaigns'); if (array_search($interface, $excludedVersionForInterfaceList) !== false) { $url = str_replace('/' . $this->apiVersion, '', $url); } From 52854d677acca9d390d99ce9ffb23b9c65f0452a Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Tue, 14 Apr 2020 06:47:08 +0300 Subject: [PATCH 17/24] add logging for all requests --- AmazonAdvertisingApi/Client.php | 60 ++++++++++++++++++++++++---- AmazonAdvertisingApi/CurlRequest.php | 8 ++++ 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index ff20ba2..4033d81 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -14,7 +14,10 @@ class Client "region" => null, "accessToken" => null, "refreshToken" => null, - "sandbox" => false); + "sandbox" => false, + "isLogedEnabled"=>false, + "logPath"=>'' + ); private $apiVersion = null; private $applicationVersion = null; @@ -24,7 +27,8 @@ class Client private $requestId = null; private $endpoints = null; private $versionStrings = null; - + private $logPath = ''; + private $isLogedEnabled = false; public $profileId = null; public function __construct($config) @@ -42,6 +46,8 @@ public function __construct($config) $this->_validateConfig($config); $this->_validateConfigParameters(); $this->_setEndpoints(); + $this->isLogedEnabled = isset($config['isLogedEnabled']) ? $config['isLogedEnabled'] : false; + $this->logPath = isset($config['logPath']) ? $config['logPath'] : false; if (is_null($this->config["accessToken"]) && !is_null($this->config["refreshToken"])) { /* convenience */ @@ -305,6 +311,11 @@ public function createBiddableKeywords($data) return $this->_operation("sp/keywords", $data, "POST"); } + public function createBiddableKeywordsBrands($data) + { + return $this->_operation("sb/keywords", $data, "POST"); + } + public function updateBiddableKeywords($data) { return $this->_operation("sp/keywords", $data, "PUT"); @@ -618,6 +629,11 @@ public function listTargetingClauses($data = null) return $this->_operation("sp/targets", $data); } + public function listTargetingClausesBrands($data = null) + { + return $this->_operation("/sb/targets/list", $data, "POST"); + } + public function listTargetingClausesSponsoredDisplay($data = null) { return $this->_operation("sd/targets", $data); @@ -649,6 +665,11 @@ public function createTargetingClauses($data) return $this->_operation("sp/targets", $data, "POST"); } + public function createTargetingClausesBrands($data) + { + return $this->_operation("sb/targets", $data, "POST"); + } + public function createTargetingClausesSponsoredDisplay($data) { return $this->_operation("sd/targets", $data, "POST"); @@ -659,6 +680,11 @@ public function updateTargetingClauses($data) return $this->_operation("sp/targets", $data, "PUT"); } + public function updateTargetingClausesBrands($data) + { + return $this->_operation("sb/targets", $data, "PUT"); + } + public function updateTargetingClausesSponsoredDisplay($data) { return $this->_operation("sd/targets", $data, "PUT"); @@ -666,12 +692,17 @@ public function updateTargetingClausesSponsoredDisplay($data) public function archiveTargetingClause($targetId) { - return $this->_operation("sp/targets/" . $targetId, [], 'DELETE'); + return $this->_operation("sp/targets/" . $targetId, array(), 'DELETE'); + } + + public function archiveTargetingClauseBrands($targetId) + { + return $this->_operation("sb/targets/" . $targetId, array(), 'DELETE'); } public function archiveTargetingClauseSponsoredDisplay($targetId) { - return $this->_operation("sd/targets/" . $targetId, [], 'DELETE'); + return $this->_operation("sd/targets/" . $targetId, array(), 'DELETE'); } @@ -862,7 +893,7 @@ private function _operation($interface, $params = array(), $method = "GET", $add $request = new CurlRequest(); $url = "{$this->endpoint}/{$interface}"; - $excludedVersionForInterfaceList = array('brands', 'stores/assets','sb/campaigns'); + $excludedVersionForInterfaceList = array('brands', 'stores/assets', 'sb/campaigns', 'sb/targets', 'sb/keywords'); if (array_search($interface, $excludedVersionForInterfaceList) !== false) { $url = str_replace('/' . $this->apiVersion, '', $url); } @@ -1002,6 +1033,7 @@ protected function _executeRequest($request) $response_info = $request->getInfo(); $request->close(); + if ($response_info["http_code"] == 307) { /* application/octet-stream */ return $this->_download($response_info["redirect_url"], true); @@ -1015,15 +1047,19 @@ protected function _executeRequest($request) $requestId = json_decode($response, true)["requestId"]; } } - return array("success" => false, + $requestResponse = array("success" => false, "code" => $response_info["http_code"], "response" => $response, "requestId" => $requestId); + $this->_logAllRequests($request, $requestResponse); + return $requestResponse; } else { - return array("success" => true, + $requestResponse = array("success" => true, "code" => $response_info["http_code"], "response" => $response, "requestId" => $this->requestId); + $this->_logAllRequests($request, $requestResponse); + return $requestResponse; } } @@ -1106,4 +1142,14 @@ private function _logAndThrow($message) error_log($message, 0); throw new \Exception($message); } + + private function _logAllRequests($request, $requestResponse) + { + if ($this->isLogedEnabled === true) { + file_put_contents($this->logPath . 'Advertising_log_' . date('Y_m_d') . '.log', + print_r($request->getOptionsArray(), true) . 'RESPONSE = ' . print_r($requestResponse, true), FILE_APPEND); + } + + } + } diff --git a/AmazonAdvertisingApi/CurlRequest.php b/AmazonAdvertisingApi/CurlRequest.php index beefdfb..f323f68 100644 --- a/AmazonAdvertisingApi/CurlRequest.php +++ b/AmazonAdvertisingApi/CurlRequest.php @@ -1,10 +1,12 @@ handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); } curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, array($this, "_handleHeaderLine")); + $this->optionsArray=array(); } public function setOption($name, $value) { curl_setopt($this->handle, $name, $value); + $this->optionsArray[] = array($name => $value); } public function execute() @@ -63,4 +67,8 @@ private function _handleHeaderLine($ch, $line) } return strlen($line); } + + public function getOptionsArray(){ + return $this->optionsArray; + } } From cab41aee3b00a32a3b3661bdee884d4167ba9b10 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Mon, 3 Aug 2020 07:29:21 +0300 Subject: [PATCH 18/24] add FE region to list endpoints --- AmazonAdvertisingApi/Client.php | 27 +++++++++++++++++++++------ AmazonAdvertisingApi/Regions.php | 16 +++++++++++----- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index 4033d81..bb2ed85 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -15,8 +15,8 @@ class Client "accessToken" => null, "refreshToken" => null, "sandbox" => false, - "isLogedEnabled"=>false, - "logPath"=>'' + "isLogedEnabled" => false, + "logPath" => '' ); private $apiVersion = null; @@ -138,7 +138,7 @@ public function getCampaignExSponsoredDisplay($campaignId) public function getCampaignExBrand($campaignId) { - return $this->_operation("hsa/campaigns/extended/{$campaignId}"); + return $this->_operation("sb/campaigns/extended/{$campaignId}"); } public function getCampaignSponsoredDisplay($campaignId) @@ -193,7 +193,7 @@ public function listCampaignsExSponsoredDisplay($data = null) public function getCampaignBrand($campaignId) { - return $this->_operation("hsa/campaigns/{$campaignId}"); + return $this->_operation("sb/campaigns/{$campaignId}"); } public function updateCampaignsBrand($data) @@ -897,6 +897,11 @@ private function _operation($interface, $params = array(), $method = "GET", $add if (array_search($interface, $excludedVersionForInterfaceList) !== false) { $url = str_replace('/' . $this->apiVersion, '', $url); } + + if(strpos($url,'sb/campaigns')!==false){ + $url = str_replace('/' . $this->apiVersion, '', $url); + + } $this->requestId = null; $data = ""; @@ -1146,8 +1151,18 @@ private function _logAndThrow($message) private function _logAllRequests($request, $requestResponse) { if ($this->isLogedEnabled === true) { - file_put_contents($this->logPath . 'Advertising_log_' . date('Y_m_d') . '.log', - print_r($request->getOptionsArray(), true) . 'RESPONSE = ' . print_r($requestResponse, true), FILE_APPEND); + $excludeList = array('https://api.amazon.com/auth/o2/token', 'https://advertising-api-eu.amazon.com/v2/profiles'); + $mustExlcude = false; + foreach ($request->getOptionsArray() as $option) { + if (isset($option[CURLOPT_URL]) AND ((array_search($option[CURLOPT_URL], $excludeList) !== false) OR (strpos($option[CURLOPT_URL], 'https://amazon-advertising-api-snapshots-prod-usamazon') !== false))) { + $mustExlcude = true; + } + } + if ($mustExlcude === false) { + file_put_contents($this->logPath . 'Advertising_log_' . date('Y_m_d') . '.log', + date('H:i:s').' '.print_r($request->getOptionsArray(), true) . 'RESPONSE = ' . print_r($requestResponse, true), FILE_APPEND); + + } } } diff --git a/AmazonAdvertisingApi/Regions.php b/AmazonAdvertisingApi/Regions.php index 21882fa..6e7dd8a 100755 --- a/AmazonAdvertisingApi/Regions.php +++ b/AmazonAdvertisingApi/Regions.php @@ -1,17 +1,23 @@ array( - "prod" => "advertising-api.amazon.com", - "sandbox" => "advertising-api-test.amazon.com", + "prod" => "advertising-api.amazon.com", + "sandbox" => "advertising-api-test.amazon.com", "tokenUrl" => "api.amazon.com/auth/o2/token"), "eu" => array( - "prod" => "advertising-api-eu.amazon.com", - "sandbox" => "advertising-api-test.amazon.com", + "prod" => "advertising-api-eu.amazon.com", + "sandbox" => "advertising-api-test.amazon.com", + "tokenUrl" => "api.amazon.com/auth/o2/token" + ), + "fe" => array( + "prod" => "advertising-api-fe.amazon.com", + "sandbox" => "advertising-api-test.amazon.com", "tokenUrl" => "api.amazon.com/auth/o2/token" - ) + ), ); } From b889c73fc39cbb8a8fd4ac61c7c2adab0ae9a4a3 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Mon, 3 Aug 2020 08:28:26 +0300 Subject: [PATCH 19/24] change license type --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9e2eca7..9f8db80 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ "sdk" ], "homepage": "https://advertising.amazon.com/", - "license": "Apache OSL-2", + "license": "GPL-2.0-or-later", "authors": [ { "name": "SSPA AIR Dev", From 540501f0b7c27ae46bf353e94c934eb9abed7609 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Fri, 4 Sep 2020 13:42:00 +0300 Subject: [PATCH 20/24] add atribution methods --- AmazonAdvertisingApi/Client.php | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index bb2ed85..68147e3 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -816,6 +816,37 @@ public function listBrands($data = null) return $this->_operation("brands", $data); } +/** Amazon attribution start */ + public function getAttributionlistPublishers($data = null) + { + return $this->_operation("/attribution/publishers", $data); + } + + public function getAttributionReports($data = null) + { + return $this->_operation("/attribution/report", $data,"POST"); + } + + public function getAttributionNonMacroTemplateTag($data = null) + { + return $this->_operation("/attribution/tags/nonMacroTemplateTag", $data); + } + + public function getAttributionMacroTemplateTag($data = null) + { + return $this->_operation("/attribution/tags/macroTag", $data); + } + + public function getAttributionAdvertisers($data = null) + { + return $this->_operation("/attribution/advertisers", $data); + } + + +/** Amazon atribution end */ + + + /** * @param $data * [ 'assetInfo' => '{brandEntityId: "ENTITY123456", mediaType: "brandLogo"}' ]; From eef444ece7a8e5ec1ca1c8efb9ee9b7f51d77c37 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Fri, 4 Sep 2020 13:43:37 +0300 Subject: [PATCH 21/24] fix attribution link --- AmazonAdvertisingApi/Client.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index 68147e3..fe4de13 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -931,8 +931,12 @@ private function _operation($interface, $params = array(), $method = "GET", $add if(strpos($url,'sb/campaigns')!==false){ $url = str_replace('/' . $this->apiVersion, '', $url); + } + if(strpos($url,'/attribution')!==false){ + $url = str_replace('/' . $this->apiVersion, '', $url); } + $this->requestId = null; $data = ""; From db20271cea0fbe47135410137e5f22ddfcd37b6a Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Fri, 4 Sep 2020 13:53:16 +0300 Subject: [PATCH 22/24] add new profile id atribution --- AmazonAdvertisingApi/Client.php | 43 +++++++++++++++++++++------------ README.md | 6 +++++ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index fe4de13..d8dff5b 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -30,6 +30,13 @@ class Client private $logPath = ''; private $isLogedEnabled = false; public $profileId = null; + /* + Also note that Amazon Attribution accounts are a separate type of "profile". Only Amazon Attribution profiles can be + called within the Amazon Attribution API. When getting the Profiles resource, identify the correct Amazon Attribution + profile by inspecting the "subType" property to ensure it's set to "AMAZON_ATTRIBUTION". + https://advertising.amazon.com/API/docs/en-us/amazon-attribution-prod-3p/#/Advertisers + */ + public $profileIdAttribution = null; public function __construct($config) { @@ -816,35 +823,33 @@ public function listBrands($data = null) return $this->_operation("brands", $data); } -/** Amazon attribution start */ + /** Amazon attribution start */ public function getAttributionlistPublishers($data = null) { - return $this->_operation("/attribution/publishers", $data); + return $this->_operation("attribution/publishers", $data); } public function getAttributionReports($data = null) { - return $this->_operation("/attribution/report", $data,"POST"); + return $this->_operation("attribution/report", $data, "POST"); } public function getAttributionNonMacroTemplateTag($data = null) { - return $this->_operation("/attribution/tags/nonMacroTemplateTag", $data); + return $this->_operation("attribution/tags/nonMacroTemplateTag", $data); } public function getAttributionMacroTemplateTag($data = null) { - return $this->_operation("/attribution/tags/macroTag", $data); + return $this->_operation("attribution/tags/macroTag", $data); } public function getAttributionAdvertisers($data = null) { - return $this->_operation("/attribution/advertisers", $data); + return $this->_operation("attribution/advertisers", $data); } - -/** Amazon atribution end */ - + /** Amazon atribution end */ /** @@ -906,9 +911,6 @@ private function _operation($interface, $params = array(), $method = "GET", $add "User-Agent: {$this->userAgent}" ); - if (!is_null($this->profileId)) { - array_push($headers, "Amazon-Advertising-API-Scope: {$this->profileId}"); - } if (!is_null($this->config['clientId'])) { array_push($headers, "Amazon-Advertising-API-ClientId: {$this->config['clientId']}"); @@ -929,12 +931,19 @@ private function _operation($interface, $params = array(), $method = "GET", $add $url = str_replace('/' . $this->apiVersion, '', $url); } - if(strpos($url,'sb/campaigns')!==false){ + if (strpos($url, 'sb/campaigns') !== false) { $url = str_replace('/' . $this->apiVersion, '', $url); } - if(strpos($url,'/attribution')!==false){ + if (strpos($url, '/attribution') !== false) { $url = str_replace('/' . $this->apiVersion, '', $url); + if (!is_null($this->profileIdAttribution)) { + array_push($headers, "Amazon-Advertising-API-Scope: {$this->profileIdAttribution}"); + } + } else { + if (!is_null($this->profileId)) { + array_push($headers, "Amazon-Advertising-API-Scope: {$this->profileId}"); + } } $this->requestId = null; @@ -963,6 +972,9 @@ private function _operation($interface, $params = array(), $method = "GET", $add $this->_logAndThrow("Unknown verb {$method}."); } + echo $url; + print_r($headers); + $request->setOption(CURLOPT_URL, $url); $request->setOption(CURLOPT_HTTPHEADER, $headers); $request->setOption(CURLOPT_USERAGENT, $this->userAgent); @@ -1170,6 +1182,7 @@ private function _setEndpoints() } else { $this->endpoint = "https://{$this->endpoints[$region_code]["prod"]}/{$this->apiVersion}"; } + $this->tokenUrl = $this->endpoints[$region_code]["tokenUrl"]; } else { $this->_logAndThrow("Invalid region."); @@ -1195,7 +1208,7 @@ private function _logAllRequests($request, $requestResponse) } if ($mustExlcude === false) { file_put_contents($this->logPath . 'Advertising_log_' . date('Y_m_d') . '.log', - date('H:i:s').' '.print_r($request->getOptionsArray(), true) . 'RESPONSE = ' . print_r($requestResponse, true), FILE_APPEND); + date('H:i:s') . ' ' . print_r($request->getOptionsArray(), true) . 'RESPONSE = ' . print_r($requestResponse, true), FILE_APPEND); } } diff --git a/README.md b/README.md index f5e49da..04c3158 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ ## Synopsis Fork of Official Amazon Advertising API PHP client library. +Important notes for Amazon Attribution: yoou must use another profile ID for making rqueests. So please dont forget to setup this profile id with + +```PHP +$client->profileIdAttribution = "1234567890"; +``` + ## Requirements From 8ef8b85c823663dadeae0fc5c1a875ae491bd119 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Fri, 4 Sep 2020 13:59:32 +0300 Subject: [PATCH 23/24] delete debug output --- AmazonAdvertisingApi/Client.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index d8dff5b..caca871 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -972,9 +972,6 @@ private function _operation($interface, $params = array(), $method = "GET", $add $this->_logAndThrow("Unknown verb {$method}."); } - echo $url; - print_r($headers); - $request->setOption(CURLOPT_URL, $url); $request->setOption(CURLOPT_HTTPHEADER, $headers); $request->setOption(CURLOPT_USERAGENT, $this->userAgent); From 6d69132da7ad184b82bbd03d52c8e5dd6e8fe8b5 Mon Sep 17 00:00:00 2001 From: "R@MS" Date: Fri, 4 Sep 2020 15:08:41 +0300 Subject: [PATCH 24/24] add history data --- AmazonAdvertisingApi/Client.php | 6 +++++- README.md | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/AmazonAdvertisingApi/Client.php b/AmazonAdvertisingApi/Client.php index caca871..ef28335 100755 --- a/AmazonAdvertisingApi/Client.php +++ b/AmazonAdvertisingApi/Client.php @@ -851,6 +851,10 @@ public function getAttributionAdvertisers($data = null) /** Amazon atribution end */ + public function getHistoryData($data = null) + { + return $this->_operation("history", $data, "POST"); + } /** * @param $data @@ -931,7 +935,7 @@ private function _operation($interface, $params = array(), $method = "GET", $add $url = str_replace('/' . $this->apiVersion, '', $url); } - if (strpos($url, 'sb/campaigns') !== false) { + if (strpos($url, 'sb/campaigns') !== false OR strpos($url, 'history') !== false) { $url = str_replace('/' . $this->apiVersion, '', $url); } diff --git a/README.md b/README.md index 04c3158..31a04e8 100755 --- a/README.md +++ b/README.md @@ -182,6 +182,9 @@ $client->profileId = "1234567890"; * [archiveNegativeTargetingClause](#archiveNegativeTargetingClause) * [updateNegativeTargetingClauses](#updateNegativeTargetingClauses) +* Geting history data + * [getHistoryData](#getHistoryData) + #### getProfile > Retrieves a single profile by Id. @@ -1694,3 +1697,23 @@ $client->updateNegativeTargetingClauses(array(array( "state"=> "enabled" ))); ``` + + +#### getHistoryData +> Get history data. + +```PHP + +$fromdate = (time() - 60*60*24*14) *1000; +$todate = time()*1000; +$response = $client->getHistoryData(['fromDate'=> $fromdate, + 'toDate'=>$todate, + 'eventTypes'=>[ + 'CAMPAIGN'=>[ + 'eventTypeIds'=> ['123456789' + ] + ] + ]); + + +```