亚马逊 广告接口对接 amazon advertising

Amazon Advertising API

最终目标效果

在这里插入图片描述

1. 授权 (加入亚马逊开发者白名单)

官方文档 https://advertising.amazon.com/API/docs/en-us/setting-up/account-setup

相对来说 授权还是比较麻烦的, 由于公司业务原因,我们注册的是第三方管理账户。 也就是说一个开发者账号管理多个店铺(防关联)。

建议开发这种大平台接口功能在前期阶段先多研究研究文档,一步一步来,这样在后面的功能开发阶段还是比较有用的。

由于我们注册的是第三方管理,在于亚马逊邮件往来阶段对方要我们提供一个公司介绍…
在这里插入图片描述
但我们这是自己的后台ERP没啥官网,只能去网上找个模板花两个小时做了一个单页面官网给他们发过去(有自己公司官网的直接发官网链接就好)…

正常的往来邮件最后会得到API所需的 client_id, client_secret在这里插入图片描述

2. 获取店铺授权token (Create API authorization and refresh tokens)

https://advertising.amazon.com/API/docs/en-us/setting-up/generate-api-tokens

这个就是给你一个链接, 把你实际的参数替换进去, 最后会跳转到登录界面(网页有登录记录的可能会跳过) 然后让你授权。

https://www.amazon.com/ap/oa?client_id=YOUR_LWA_CLIENT_ID&scope=cpc_advertising:campaign_management&response_type=code&redirect_uri=YOUR_RETURN_URL

参数说明

  • 链接的前半部分自己判断区域选择对应地址
  • YOUR_LWA_CLIENT_ID: client_id
  • YOUR_RETURN_URL: 这个当时我也蒙蔽了半天… 下图红色圈内的回调地址就是这个了…
    在这里插入图片描述
    在这里插入图片描述

登陆之后会给你也授权页面 点击 允许 就行
在这里插入图片描述

接下来就会跳转到你的回调地址(YOUR_RETURN_URL),并将authorization code 以GET 的形式传回来

array(2) { [“code”]=> string(20) “ANesDVfOevJXAuKXZVut” [“scope”]=> string(35) “cpc_advertising:campaign_management” }

自己处理逻辑 保存这个 code 有了这个code 下面的 获取token和刷新token直接按文档curl请求就好

public function getToken(){switch ( $this->region ) {case 'NA':$region = 'https://api.amazon.com/auth/o2/token';break;case 'EU':$region = 'https://api.amazon.co.uk/auth/o2/token';break;case 'FE':$region = 'https://api.amazon.co.jp/auth/o2/token';break;default:$region = 'https://api.amazon.com/auth/o2/token';break;}$header = array ('Content-Type:application/x-www-form-urlencoded;charset=UTF-8');$code = "ANesDVfOevJXAuKXZVut";$redirect_uri = "https://network.*******.com/var/amz_advertising_return/file_getToken.php";$curlData = "grant_type=authorization_code&code={$code}&redirect_uri={$redirect_uri}&client_id={$this->client_id}&client_secret={$this->client_secret}";$res = $this->sendCurlPostRequest($region, $curlData, $header);$data = json_decode($res, true);// var_dump($res);// var_dump($data);die;$access_token = $data['access_token'];$refresh_token = $data['refresh_token'];$token_type = $data['token_type'];$token_time = time() + 3500;// db操作...}// 刷新 tokenpublic function refreshToken(){switch ( $this->region ) {case 'NA':$region = 'https://api.amazon.com/auth/o2/token';break;case 'EU':$region = 'https://api.amazon.co.uk/auth/o2/token';break;case 'FE':$region = 'https://api.amazon.co.jp/auth/o2/token';break;default:$region = 'https://api.amazon.com/auth/o2/token';break;}$header = array ('Content-Type:application/x-www-form-urlencoded;charset=UTF-8');$curlData = "grant_type=refresh_token&client_id=$this->client_id&refresh_token=$this->refresh_token&client_secret=$this->client_secret";$res = $this->sendCurlPostRequest($region, $curlData, $header);$data = json_decode($res, true);$data['token_time'] = time() + 3500;$this->token = $data['access_token'];$this->local_log($data);die;global $link, $id;$sql="UPDATE db_ads SET access_token='{$data['access_token']}', refresh_token='{$data['refresh_token']}', token_time='{$data['token_time']}' WHERE shop_id='".$id."' ";mysqli_query($link, $sql);}

获取token之后要获取 profile_id,之后的接口请求基本都需要这个

 	// 获取店铺信息 profile_idpublic function getProfiles(){switch ( $this->region ) {case 'NA':$host = "https://advertising-api.amazon.com";break;case 'EU':$host = "https://api.amazon.co.uk/auth/o2/token";break;case 'FE':$host = "https://api.amazon.co.jp/auth/o2/token";break;default:$host = "https://advertising-api.amazon.com";break;}$url = $host."/v2/profiles";$headers = array("Authorization: Bearer $this->token","Amazon-Advertising-API-ClientId:$this->client_id","Access-Control-Allow-Credentials: true","Content-Type:application/json","User-Agent:test1",);$profile = $this->sendCurlGetRequest($url, $headers);$profiles = json_decode($profile, true);// db操作...$this->profile_id = number_format($profiles[0]['profileId'], 0, '', '');global $link, $id;$sql="UPDATE db_ads SET profile_id='{$this->profile_id}', profiles='{$profile}' WHERE shop_id='".$id."' ";mysqli_query($link, $sql);}

到这为止基本上准备工作就做完了,接下来就是正式请求报告信息了

3.获取REPORTS

在这里插入图片描述
大概流程就是

请求生成报告 - 等待报告完成 - 获取报告信息 - 下载报告内容 - 解压

这里有个小坑,当时我下载报告怎么传参都有问题,查了好久发现他最终curl请求会307重定向,直接去跳转下载页面, 但是会报错,大概意思就是标头有问题:

Only one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified

就是你带header参数,他说你多余, 你不带,告诉你没权限…
谷歌N久之后找到原因:
在这里插入图片描述
解决办法就是把重定向的链接提取出来,再次不带header请求一次。

// 请求报告public function requestReport(){// Record types can be: campaigns, adGroups, keywords, productAds, and targets// productAds: 'metrics' => 'campaignName,campaignId,adGroupName,adGroupId,impressions,clicks,cost,currency,asin,sku,attributedConversions1d,attributedConversions7d,attributedConversions14d,attributedConversions30d,attributedConversions1dSameSKU,attributedConversions7dSameSKU,attributedConversions14dSameSKU,attributedConversions30dSameSKU,attributedUnitsOrdered1d,attributedUnitsOrdered7d,attributedUnitsOrdered14d,attributedUnitsOrdered30d,attributedSales1d,attributedSales7d,attributedSales14d,attributedSales30d,attributedSales1dSameSKU,attributedSales7dSameSKU,attributedSales14dSameSKU,attributedSales30dSameSKU,attributedUnitsOrdered1dSameSKU,attributedUnitsOrdered7dSameSKU,attributedUnitsOrdered14dSameSKU,attributedUnitsOrdered30dSameSKU'$recordType = 'productAds';$header_ = $this->returnHeader();$url = $header_['host']."/v2/sp/{$recordType}/report";// 获取 前一天的信息$date = date('Ymd', time()-3600*24);$curlData = array(// 'segment'=> 'query','reportDate'=> $date,'metrics' => 'campaignName,campaignId,adGroupName,adGroupId,impressions,clicks,cost,currency,asin,sku,attributedConversions1d,attributedConversions7d,attributedConversions14d,attributedConversions30d,attributedConversions1dSameSKU,attributedConversions7dSameSKU,attributedConversions14dSameSKU,attributedConversions30dSameSKU,attributedUnitsOrdered1d,attributedUnitsOrdered7d,attributedUnitsOrdered14d,attributedUnitsOrdered30d,attributedSales1d,attributedSales7d,attributedSales14d,attributedSales30d,attributedSales1dSameSKU,attributedSales7dSameSKU,attributedSales14dSameSKU,attributedSales30dSameSKU,attributedUnitsOrdered1dSameSKU,attributedUnitsOrdered7dSameSKU,attributedUnitsOrdered14dSameSKU,attributedUnitsOrdered30dSameSKU');$curlData = json_encode($curlData);$res = $this->sendCurlPostRequest($url, $curlData, $header_['header']);$res = json_decode($res, true);$this->local_log($res);if (isset($res['reportId'])) {sleep(60); // 留点时间生成报告 测试用 实际情况需将reportId存入数据库, 间隔时间请求 getResquestInfo$this->getResquestInfo('reports', $res['reportId']);}}// 获取 报告/快照 请求信息public function getResquestInfo($type, $id){if (!$id) {return false;}$header_ = $this->returnHeader();$url = $header_['host'] . "/v2/sp/$type/" . $id;$res = $this->sendCurlGetRequest($url, $header_['header']);$res = json_decode($res, true);$this->local_log($res);if ( $res['status'] === 'SUCCESS' ) {$data = $this->reportDownload($res['location']);echo file_get_contents($data);$this->local_log($data);}}// 下载报告public function reportDownload($location){if (!$location) {return false;}$header = $this->returnHeader()['header'];$redirect_url = $this->sendCurlGetRequest($location, $header);if ($redirect_url) {$file = $this->downloadFile($redirect_url);$path = $file["save_path"];$size = $file["file_size"];if($size == 0){   // 删除文件$this->delFile($path);return false;}// 解压$res = $this->unzipGz($path);return $res;}die;}public function downloadFile($url, $save_dir = '.') {  if ( !$url ) {  return false;  }  global $id;$filename = date("Y-m-d")."_".$id.".json.gz";//创建保存目录  if (!file_exists($save_dir) && !mkdir($save_dir, 0777, true)) {  echo "目录失败";return false;  } $file = $save_dir."/". $filename; ob_start();  readfile($url);  $content = ob_get_contents();  ob_end_clean();  //文件大小  $size = strlen($content);$fp2 = @fopen($file, 'a');  fwrite($fp2, $content);  fclose($fp2);  unset($content, $url); $return  = array(  'save_path' => $file,  'file_size' => $size  ); return $return ;} // 解压GZ文件public function unzipGz($path){if (!file_exists($path)) {return false;}$buffer_size = 4096; // read 4kb at a time$out_file_name = str_replace('.gz', '', $path);$file = gzopen($path, 'rb');$out_file = fopen($out_file_name, 'wb');$str='';while(!gzeof($file)) {fwrite($out_file, gzread($file, $buffer_size));}fclose($out_file);gzclose($file);$this->delFile($path);return $out_file_name;}// 删除文件public function delFile($path){file_exists($path) && unlink($path);return ;}// 返回公共请求头public function returnHeader(){switch ( $this->region ) {case 'NA':$host = 'https://advertising-api.amazon.com';break;case 'EU':$host = 'https://advertising-api-eu.amazon.com';break;case 'FE':$host = 'https://advertising-api-fe.amazon.com';break;default:$host = "https://advertising-api.amazon.com";break;}$header = array("Authorization: Bearer $this->token","Amazon-Advertising-API-ClientId:$this->client_id","Access-Control-Allow-Credentials: true","Content-Type:application/json","User-Agent:test1","Amazon-Advertising-API-Scope:$this->profile_id");return array('host'=>$host, 'header'=>$header);}// 模拟post请求public function sendCurlPostRequest($url, $curlData, $header){$curl = curl_init();curl_setopt ($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl,CURLOPT_TIMEOUT,120);curl_setopt($curl,CURLOPT_ENCODING,'gzip');curl_setopt($curl,CURLOPT_HTTPHEADER,$header);curl_setopt ($curl, CURLOPT_POST, 1);curl_setopt ($curl, CURLOPT_POSTFIELDS, $curlData);// https请求 不验证证书和hostscurl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);$result = curl_exec($curl);if ( $result == false ){var_dump(curl_error($curl));die('CURL ERROR');}curl_close ($curl);return $result;}// 模拟get请求public function sendCurlGetRequest($url, $headers){$ch = curl_init($url);curl_setopt($ch, CURLOPT_URL,$url);if($headers){curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);}curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);// https请求 不验证证书和hostscurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);$output = curl_exec($ch);if ( $output == false ){var_dump(curl_error($ch));curl_close($ch);die('CURL ERROR');}$redirect_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);curl_close($ch);// 判断重定向if ( $url != $redirect_url ) {return $redirect_url;}return $output;}// 本地打印结果public function local_log($msg){if (!is_string($msg)) {$msg = json_encode($msg);}file_put_contents('local_log.log', date("Y-m-d H:i:s") . "\t" . $msg . "\n\n" .PHP_EOL, FILE_APPEND);}

到这就基本结束了,剩下的就是自己的业物逻辑处理了。 上面这个方法基本都是只写了一半, 都只是先获取数据 。现在我也还没彻底完成这个功能,只是先记录一下API的请求过程。防止过两天就忘了…毕竟刚完成的印象比较深刻。

欢迎互相交流…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10445.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lazada、Allegro、速卖通测评自养号技术(方法解析)

无论是亚马逊、拼多多Temu、shopee、Lazada、wish、速卖通、煤炉、敦煌、雅虎、eBay、TikTok、Newegg、乐天、美客多、阿里国际、沃尔玛、OZON、Joom、Facebook、Coupang、独立站、Cdiscount、Kaufland、DARTY、Allegro、MANO等平台测评自养号对于卖家来说算是一种低成本、高回…

亚马逊、速卖通、temu、Cdiscount通过自养号给自己店铺测评补单需要哪些技巧?

亚马逊卖家通过测评平台,获取亚马逊买家的真实服务点评,即亚马逊测评。它既可以让买家更加快速、有效地了解产品,也可以让卖家有机会通过买家的评论去优化产品,以获得更多买家的喜爱。因此,亚马逊测评之于卖家&#xf…

亚马逊、temu、速卖通、国际站卖家如何利用好测评补单这张王牌?

大家好我是亚马逊测评珑哥。 现在越来越多的跨境电商平台入局,目前跨境电商平台亚马逊、TEMU、ozon、ebay、wish、lazada、敦煌、shopee、速卖通、poshmark、阿里国际站、沃尔玛、newegg、美客多等跨境平台的卖家都在递增,大家都知道,随着各…

跨境卖家运营亚马逊、eBay、wish、速卖通、Shopee、Lazada、乐天、煤炉有哪些技巧?如何做测评自养号?

Wish不同于亚马逊、速卖通、ebay等跨境平台,这是一款移动端平台,许多新手卖家都不知道在哪开始,做Wish的时候和其它平台的运营方法一样。Wish是一个基于手机端App的跨境电商平台,主要以价廉物美来吸引顾客,在美国年轻人…

Lazada、Shopee、亚马逊、速卖通自养号测评如何做到安全?

根据近几年亚马逊等起跨境电商市场的经验,建议选择稳定需求、低竞争、高利润、 无法律纠纷、小巧轻便,易于运输、供应渠道好、非季节性商品,适合全年销售、简单好用,避免质检问题、与众不同,能够符合以上特征的产品在平…

亚马逊、速卖通、Lazada、阿里国际站测评自养号教程(卖家篇)

马逊是全球最大的电商公司,它的规模体量大、高利润吸引着越来越多嗅觉灵敏的中国商家纷纷入驻,这几年大量国内卖家涌入亚马逊平台,竞争日益激烈,想迅速抢占市场,测评必不可少。目前真人测评不能满足庞大的市场需求&…

想做亚马逊、速卖通、Shopee等平台自养号测评的进来看看,核心分享

最近好多新手想接触跨境电商测评补单这一行,但是怎么去学习?去哪学?怎么找到优质的培训公司学习?期间会遇到什么坑。作为在这行滚打了6年的老鸟,我今天就在这里分享一下我的经验,希望对想入行的新手或者已经…

亚马逊,shopee,lazada卖家如何组建自己的测评团队

测评补单,这个话题在如今不管国内还是国外的电商行业已经是众所周知,它能够快速帮助自己的产品添加评论,获取排名,打造爆款,可以让用户更加真实、清晰、快捷的了解产品,以及产品的使用,快速上手…

使用ChatGPT实现可视化操作扫雷小游戏 【java代码实现】

代码 package com.atguigu.java4;/*** author zyz* version 1.0* data 2023/2/20 14:55* Description:*/import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random;class MineSweeper ex…

火热预约| 微软ATP AI商学院开课啦!

对于企业而言,新年伊始都是决定全年业务的关键时间点!人工智能(AI)在各行各业中得到了广泛的应用,如何避免企业陷入“创新的陷阱”,发挥出AI的真正潜力呢? ▍微软ATP AI 商学院 开课啦&#xff…

AI大战太凶猛!微软、谷歌、英伟达、Adobe杀疯了

来源:数据观综合 编辑:蒲蒲 最近, AI 领域真的太卷了。继微软发布由 AI 驱动的 Microsoft 365 Copilot之后, 同一天时间内,三大科技巨头同时发布自家最新产品,杀入这场AI大战。 01 微软发布颠覆性 AI 工具 …

《超越想象的GPT医疗》

湛庐文化财富汇 解析GPT落地实践 揭示“人机关系”的重要范式 微软研究院负责人 彼得李 全球首部力作 比尔盖茨 重磅推荐 OpenAI创始人 萨姆奥尔特曼 微软全球资/深副总裁洪小文 微软(中国)公司首/席技术官韦 青 倾情作序力荐 《超越想象的GPT医疗》 The…

微软ATP智汇十二道场 · 探索AI 驱动转型(北京专场)

为了推动微软与苏州人工智能产业创新中心共同构建企业级AI创新生态圈,微软ATP定于2023年3月3日在微软亚太研发集团总部(北京)举办“微软ATP智汇十二道场 探索AI 驱动转型”线下活动。 ▍微软探索AI商用,避免“创新陷阱” ChatGP…

国内首场高规格AIGC峰会盛况出圈!万字干货热聊GPT-4时代,浓缩21位大牛演讲

智东西(公众号:zhidxcom)作者 | 程茜、李水青编辑 | 心缘 智东西3月24日报道,今日,GTIC 2023中国AIGC创新峰会在北京圆满举行! 正值GPT-4时代的大幕被一把拉开,本届峰会以“AI新纪元 创造新世…

ChatGPT的成功,源自数据策略的精巧设计

最近,OpenAI推出的ChatGPT火了。 60天月活破亿,迅速狂飙出圈。ChatGPT不仅刷爆了星尘君的朋友圈,也炸醒了国内外的科技圈、创投圈。 有人说ChatGPT相当于AI版瓦特蒸汽机,有人说ChatGPT让我们看到AI的未来,连微软联合创…

开源方案复现ChatGPT流程,1.62GB显存即可体验,单机训练提速7.73倍

机器之心发布 机器之心编辑部 火爆全网的 ChatGPT,仿佛开启了第四次工业革命,让微软、谷歌等全球科技巨头打得昏天黑地,引得各路玩家纷纷入局,抢占赛道。 然而由于 OpenAI 没有开源 ChatGPT,如何有效复现 ChatGPT 已…

不出所料,自动驾驶向ChatGPT下手了!

编辑 | 机器之心 点击下方卡片,关注“自动驾驶之心”公众号 ADAS巨卷干货,即可获取 ChatGPT 的技术思路与自动驾驶能碰撞出什么样的火花呢? 去年底,ChatGPT 横空出世。真实自然的人机对话、比拟专家的回答以及一本正经的胡说八道&…

ChatGPT来袭,法律人真的要失业了吗?

当老婆和妈妈同时掉水里,你先救谁? “我认为应该先救妈妈,因为妈妈是孩子的母亲,她是孩子的第一份爱,也是孩子的精神支柱,孩子的成长离不开妈妈的关爱和支持,而老婆也是孩子的母亲,…

【AI简报第20230210期】 ChatGPT爆火背后、为AIoT和边缘侧AI喂算力的RISC-V

1. ChatGPT爆火背后:AI芯片迎接算力新挑战 原文: https://www.163.com/dy/article/HT7BHN3C05199NPP.html ChatGPT的出圈走红为AIGC打开全新市场增量,催生了更高的算力需求。 作为人工智能三大核心要素之一,算力也被誉为人工智能“发动机”。…

港科大开源LMFlow!3090单卡5小时,每个人都能训练专属ChatGPT

©作者 | 机器之心编辑部 来源 | 机器之心 拥有自己的 AI 大模型!开源项目 LMFlow 支持上千种模型,提供全流程高效训练方案。 2022 年 11 月 30 日,OpenAI 推出 ChatGPT,令人没想到的是,这个对话模型在 AI 圈掀起一…