报告一站式获取:脚本经 developerProxy 传 profileId(服务端解析 token),自动完成报告的创建、等待(约 2–10 分钟)、下载和解压,直接返回可读的结构化数据。
脚本本身不做"该选哪些列 / 该怎么分组"的业务判断,这些由 agent 先查 references/report-types/ 下对应的 .md 文件,再显式传给脚本。
依赖 linkfox-amazon-ads-auth(脚本启动自动检查;未安装时 exit 42,stderr 打 DEPENDENCY_MISSING)。
用户经常只说自然语言("美国站"、"日本站"、"我的店铺"),本 skill 的所有脚本都必须拿到数字 profileId 才能调。按下列顺序处理, 不要跳过:
先调 linkfox-amazon-ads-auth 的 authorized_stores.py 拉出用户已授权的账号 × 站点清单。
根据用户提到的站点(映射到 countryCode,如 美国→ US)匹配候选 profile:
accountName 问:"你在美国站授权了 A 和 B 两个账号,这次用哪个?"linkfox-amazon-ads-auth 做授权。严禁 让用户直接报 profileId 数字。
严禁 在歧义下"挑第一个"或"选默认"绕过澄清。
完整决策表见 linkfox-amazon-ads-auth SKILL.md 的 Usage Scenarios 第 4 节。
POST /amazonAds/developerProxy(不同操作通过请求体区分;完整参数/响应/错误码见 references/api.md)python scripts/<脚本名>.py '<JSON 参数>' [--inline](可用脚本见上文脚本一览)输出策略(脚本默认行为):
<cwd>/linkfox/<YYYY-MM-DD>/<session>/data/<skill-name>-<timestamp>.json( <cwd> 为脚本执行时的工作目录,在 Claude Code 里即当前项目目录; <session> 取自环境变量 SESSION_ID,按用户任务自动聚合; 禁止写入 /tmp,当前目录不可写则报错)total/ costToken、最大列表字段的长度 + 前 3 条样本)--inline 强制全量打印到 stdout(同样落盘)读数据建议:先看摘要判断是否足够;需要具体字段时优先用 jq 或 ConvertFrom-Json 或 ConvertFrom-Json 从保存的 json 文件按需抽取,避免整份 JSON 进入上下文。
发生以下异常情况时,采用 references/onboarding.md 引导解决问题:
LINKFOX_AGENT_API_KEY,也未配置 LINKFOXAGENT_API_KEY。覆盖:SP / SB / SD 全部报告类型(以 references/report-types/ 下存在的 .md 为准;ST / DSP 暂未覆盖)
一站式:脚本内部自动完成报告创建 → 等待生成(约 2–10 分钟)→ 下载 → 解压,调用方只需等最终结果
单脚本: get_report.py(覆盖 SP / SB 全部 adProduct)
元数据 vs. 运行参数:
references/report-types/<adProduct-dir>/<reportTypeId>.mdreferences/api.md脚本职责get_report.py ⭐一站式执行。 必填 adProduct / groupBy / columns,由 agent 从 report-types/ 提取后传入check_auth_dependency.py检测 linkfox-amazon-ads-auth 是否安装
完整脚本参数、响应结构见 references/api.md。
Agent 触达"拉取亚马逊广告报告"类需求时, 必须 按下列顺序:
定 reportTypeId:按用户意图挑选(如"上周花费"→ spCampaigns;"哪个商品卖得好"→ spAdvertisedProduct / sbPurchasedProduct;"用户搜什么词找到我"→ spSearchTerm)
查 reference:打开 references/report-types/<adProduct-dir>/<reportTypeId>.md
adProduct / groupBy(Configuration 表推荐的) / timeUnit(可枚举) / format / dateRange / filters向用户咨询可定制条件(用户答"默认/随便"时跳过,进入第 4 步的默认选择):
timeUnit:DAILY(按日拆分)还是 SUMMARY(汇总)columns 扩展:是否要归因列(sales7d / purchases7d / acosClicks7d / roasClicks7d)、视频指标、newToBrand 等filters:是否过滤 campaignStatus / keywordType / adStatus 等按用户回复或默认构造 columns(见下节 "默认条件")
调脚本: adProduct / groupBy / columns 三个必填字段 显式 传入
条件默认规则timeUnit日期跨度 ≤ 7 天 → DAILY;> 7 天 → SUMMARY``columns 身份维度DAILY 时必含 date; SUMMARY 时必含 startDate + endDate;再追加该报告的主键字段(参考 frontmatter 中 groupBy 对应的主键,如 campaignId+campaignName / advertisedAsin+advertisedSku / searchTerm / keyword 等)columns 基础指标impressions / clicks / cost(以该报告 Base metrics 存在的为准)columns 归因指标仅当用户提到"销售/转化/ROI/ACOS"等意图时追加: sales7d / purchases7d / acosClicks7d / roasClicks7d(以 Base metrics 存在者为准)filters不加(全量返回)groupBy取 frontmatter groupBy 数组的第一个值(即 Configuration 表里 Amazon 官方推荐的主维度)
所有 example 都显式传入三个必填字段( adProduct / groupBy / columns)。
bash
python scripts/get_report.py '{
"profileId": 1234567890, "region": "NA",
"reportTypeId": "spCampaigns",
"adProduct": "SPONSORED_PRODUCTS",
"groupBy": ["campaign"],
"columns": ["date","campaignId","campaignName","impressions","clicks","cost"],
"startDate": "2026-04-27","endDate": "2026-05-03",
"timeUnit": "DAILY"
}'
bash
python scripts/get_report.py '{
"profileId": 1234567890, "region": "NA",
"reportTypeId": "spSearchTerm",
"adProduct": "SPONSORED_PRODUCTS",
"groupBy": ["searchTerm"],
"columns": ["searchTerm","keyword","matchType","impressions","clicks","cost",
"sales7d","sales14d","purchases7d","acosClicks14d","roasClicks14d",
"startDate","endDate"],
"startDate": "2026-04-01","endDate": "2026-04-30",
"timeUnit": "SUMMARY",
"filters": [{"field":"keywordType","values":["BROAD","PHRASE","EXACT"]}]
}'
bash
python scripts/get_report.py '{
"profileId": 1234567890, "region": "NA",
"reportTypeId": "sbAdGroup",
"adProduct": "SPONSORED_BRANDS",
"groupBy": ["adGroup"],
"columns": ["adGroupId","adGroupName","impressions","clicks","cost","purchases","sales","startDate","endDate"],
"startDate": "2026-04-01","endDate": "2026-04-30"
}'
bash
python scripts/get_report.py '{
"profileId": 1234567890, "region": "NA",
"reportTypeId": "sdCampaigns",
"adProduct": "SPONSORED_DISPLAY",
"groupBy": ["campaign"],
"columns": ["date","campaignId","campaignName","impressions","clicks","cost","purchases","sales"],
"startDate": "2026-04-27","endDate": "2026-05-03",
"timeUnit": "DAILY"
}'
当上次运行因为客户端轮询窗口太短退出、但报告在 Amazon 侧仍在跑时,直接传入 reportId 即可跳过创建,继续轮询并下载。此模式下只需 profileId / region / reportId,其余字段不必填。
bash
python scripts/get_report.py '{
"profileId": 1234567890, "region": "NA",
"reportId": "7df1ef5d-45ba-40cc-b607-ff2148cf4f5e",
"maxAttempts": 60, "pollInterval": 30
}'
自动恢复:如果调用方未传
reportId、且 Amazon 对同参数请求触发去重(返回 HTTP 425The Request is a duplicate of : <uuid>),脚本会自动解析出老 reportId 并转为轮询该老报告,无需重试。
成功:
json
{
"success": true,
"reportId": "4ee811a0-...",
"reportTypeId": "spCampaigns",
"startDate": "2026-04-28", "endDate": "2026-05-04",
"downloadPath": "C:/.../tmp/report_data.json",
"extractedFileHttpUrl": "http://127.0.0.1:51234/download",
"extractedFileHttpServeSeconds": 300
}
失败:
json
{"error":"Upstream HTTP 400","httpStatus":400,
"body":"{\"code\":\"400\",\"detail\":\"startDate to endDate range (32 days) must not exceed maximum range (31 days)\"}"}
status=STILL_PROCESSING(exit code=2),说明客户端已等满默认约 7.5 分钟但报告仍在 Amazon 侧生成。此时 必须 向用户说明情况并询问是否继续等待,绝不能当成失败处理。参考回复:"报告还在 Amazon 侧生成中(已等约 7.5 分钟),要继续等吗?可以选:A. 再等 ~30 分钟(maxAttempts=60)、B. 再等 ~1 小时(maxAttempts=120)、C. 先停,我稍后用 reportId 回来。" 用户选 A/B → 用 resumeHint.params 切到仅轮询模式续跑状态含义建议Missing required parameters: adProduct/groupBy/columns调用方未显式传入三必填回到 "Agent 调用流程" 第 2 步,从 references/report-types/<adProduct-dir>/<reportTypeId>.md 读出并补上HTTP 401accessToken 过期调 ads-auth 的 refresh_token.py 后重试HTTP 403未关联广告账户或权限不足到 Amazon Ads 后台检查经理账户/广告账户关联HTTP 400 "must not exceed maximum range"日期跨度超限(多数 31 天)拆分拉取后本地合并;具体上限看对应 .md frontmatter dateRange.maxSpanDays``HTTP 400 含 columns/ groupBy 校验错列名拼写错 / 与 reportTypeId 不匹配 / 超出 Base metrics对照 .md 文件 Base metrics 表核对status=FAILED 含 failureReason上游生成失败多为日期窗口或权限问题,按 failureReason 具体处理status=STILL_PROCESSING (exit 2)客户端轮询窗口耗尽但报告仍在生成不是失败。stdout 已含 reportId 与 resumeHint.params。询问用户是否继续等,用该 params(带 reportId + 更大 maxAttempts)切到仅轮询模式续跑HTTP 425 "duplicate of"同参数已有在跑的报告脚本自动解析并转为轮询该老 reportId,正常情况下调用方无需干预exit 42依赖 skill 未安装先装 linkfox-amazon-ads-auth
sbPurchasedProduct 是 731 天; spGrossAndInvalids / sbGrossAndInvalids / sdGrossAndInvalids 是 365 天(以 frontmatter 为准)dateRange.dataRetentionDays 为准endDate >= 今天 脚本 stderr 警告但不拦截[] 或指标全 0linkfox-amazon-ads-managerlinkfox-amazon-ads-auth同一广告账号/profile 连续收到 Amazon Ads API 的 400、403、404 或 429 时,网关会返回 450、453、454 或 459 并短暂冷却。这些自定义状态码不是 Amazon 原生状态,也不表示封号;目的是避免持续异常或高频调用扩大广告账号风险。
状态与 message范围触发与冷却处理450: 400,请求异常,请优化您的参数广告账号/profile+接口60 秒内超过 3 次:5 分钟;10 分钟内超过 4 次:20 分钟停止原参数重试,检查 profileId、region、实体/报告 ID、日期和请求体453: 403,店铺未授权,请先授权广告账号/profile 全部接口60 秒内超过 2 次:5 分钟;10 分钟内超过 4 次:30 分钟停止该广告账号调用,检查 Ads 授权、应用权限、profile 归属和区域454: 404,资源不存在,请优化您的参数广告账号/profile+接口60 秒内超过 3 次:5 分钟;10 分钟内超过 4 次:30 分钟确认资源 ID、所属 profile/区域、资源状态和接口路径459: 429限流中,请降低频率广告账号/profile+接口首次:15 秒;2 分钟内超过 2 次:30 秒;3 分钟内超过 4 次:2 分钟降低并发、分页和轮询频率并逐级退避
retryAfter、 blockedUntil,没有时按表中时长说明。reportId 等任务 ID;写操作结果不确定时先查询状态,不直接重放。不消耗算力。
Feedback:
Auto-detect and report feedback via the Feedback API when any of the following apply:
Call the feedback API as specified in references/api.md. Do not interrupt the user's flow.
For more high-quality, professional cross-border e-commerce skills, visit LinkFox Skills.