Skip to content
Back to skills

Tencentads Management

ASecurity

腾讯营销(原腾讯广告)管理 — 跨账户查询营销单元(原广告)/创意/素材等多层级数据及报表指标;查看营销单元完整配置(定向、出价、转化、版位等)与智能投放项目详情;获取创意列表及组件详情,单创意时自动解析组件并获取图片/视频预览 URL;管理关键词和否定词的增删改查;创建推广内容资产。

  • 417 stars
  • 0 votes
  • 0 copies
  • 17 views
  • Added September 8, 2026
content-marketinggoshellbashnodegitapi

Works with

  • cursor
  • cli
  • api

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 18 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add infometa/workbuddyskills --skill tencentads-management --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Tencentads Management?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Tencentads Management
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/infometa-tencentads-management/badge)](https://www.skillsdirectory.com/skills/infometa-tencentads-management)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: tencentads-management
description: 腾讯营销(原腾讯广告)管理 — 跨账户查询营销单元(原广告)/创意/素材等多层级数据及报表指标;查看营销单元完整配置(定向、出价、转化、版位等)与智能投放项目详情;获取创意列表及组件详情,单创意时自动解析组件并获取图片/视频预览 URL;管理关键词和否定词的增删改查;创建推广内容资产。
license: MIT
compatibility: any
metadata:
  author: Tencent Ads Delivery Team
  version: "0.5.8"
  icon: megaphone
  category: tencent-ads
---

# 腾讯广告管理(Tencent Ads Management)

> **前置依赖**:需安装 `tencentads-cli`(Node.js ≥ 20)。执行 `npm install -g tencentads-cli@latest` 安装或升级;版本过低时 `tencentads` 会给出提示。

腾讯广告的综合管理技能,提供以下核心能力:

1. **综合数据报表查询**(`query-report.mjs`):支持跨账户查询广告/创意/组件/素材等多层级数据,同时返回属性字段和报表指标数据。
2. **广告详情查询**(`query-adgroups.mjs`):获取广告的完整配置信息,包括定向设置、出价策略、转化规格、版位配置、投放时段等详细属性。
3. **智能投放项目详情查询**(`query-adgroups.mjs`):获取智能投放项目的详细配置信息,支持按需指定返回字段。
4. **创意列表查询**(`query-creatives.mjs`):获取创意的完整信息,包括创意组件引用、投放模式、创意类型等。当查询结果只有 1 条创意时,脚本自动解析组件详情并获取图片/视频预览 URL,一次调用即可返回完整的创意 + 组件 + 素材预览信息。
5. **操作日志查询**(`query-operation-logs.mjs`):查询广告/创意对象的操作日志,返回每次操作(新建/修改)前后的字段变化详情,支持按日期范围、对象 id、操作动作等过滤,详见 [references/operation-log-list-get.md](references/operation-log-list-get.md)。
6. **关键词管理**(`bidword/add.mjs` / `bidword/update.mjs` / `bidword/delete.mjs` / `bidword/get.mjs`):管理广告的关键词(竞价词),支持创建、更新、删除和查询操作。
7. **否定词管理**(`negativewords/add.mjs` / `negativewords/update.mjs` / `negativewords/get.mjs`):管理广告的否定词,支持新增、更新和查询操作。
8. **推广内容资产管理**:创建推广内容资产(marketing_asset),支持金融、教育、房地产、旅游、餐饮等多种资产类型。详细说明见 [references/marketing-asset.md](references/marketing-asset.md),**执行前务必先读取该文档**。

> **重要提示**: 本技能基于腾讯广告营销 API(api.e.qq.com)API。以本文档为准,字段名称、参数结构可能与开放 API 不同,请勿混淆。

所有 API 调用均通过本技能的**专用脚本**执行,脚本负责参数构建与数据处理。Agent 只需关注:从用户意图中提取查询参数,并解读返回的数据。

### 脚本选择指南

| 用户意图 | 推荐脚本 | 说明 |
|---------|---------|------|
| 查看广告/创意效果数据(**明确提到**消耗、曝光、点击、转化、ROI 等指标) | `query-report.mjs` | 返回广告/创意报表指标 |
| 查看广告分时/按天趋势 | `query-report.mjs` | 按时间维度聚合报表数据 |
| 查看账户汇总数据 | `query-report.mjs` | 全账户维度汇总 |
| 查看分地域/分城市/分年龄/分性别投放数据 | `query-report.mjs` | 使用对应 `level`(如 `REGION`/`CITY`/`AGE`/`GENDER`),脚本自动推导 `group_by` 和过滤条件 |
| **笼统说"查询广告数据"/"看下广告"等,未明确提到指标** | **`query-adgroups.mjs`** | **默认视为查看广告实体,而非报表** |
| **笼统说"查询创意数据"/"看下创意"等,未明确提到指标** | **`query-creatives.mjs`** | **默认视为查看创意实体,而非报表** |
| 查看广告实体(定向、出价、转化、版位等) | `query-adgroups.mjs` | 返回广告完整配置信息 |
| 查看广告实体-定向明细 | `query-adgroups.mjs` | 包含地域、年龄、性别等定向 |
| 查看已删除的广告 | `query-adgroups.mjs` | 支持 is_deleted 过滤 |
| 根据广告名称搜索广告详情 | `query-adgroups.mjs` | 支持 adgroup_name 过滤 |
| 查看智能投放项目详情 | `query-adgroups.mjs` | 返回智投项目完整配置,支持按需指定 fields |
| 查看智投项目能力配置(如 AIGC、自动创意等) | `query-adgroups.mjs` | 包含 project_ability_list、smart_delivery_aigc_option 等字段 |
| 查看广告/创意的操作日志(新建/修改记录、字段变更前后对比) | `query-operation-logs.mjs` | 必传 `account_id`、`operation_object_type`(`ADGROUP`/`DYNAMIC_CREATIVE`/`JOINT_BUDGET`)、`start_date`、`end_date`;可选 `object_id` 指定具体广告/创意 id |
| 创建关键词/竞价词 | `bidword/add.mjs` | 为广告添加关键词 |
| 更新关键词/竞价词 | `bidword/update.mjs` | 修改关键词的匹配方式、出价等 |
| 删除关键词/竞价词 | `bidword/delete.mjs` | 删除广告下的关键词 |
| 查询关键词/竞价词 | `bidword/get.mjs` | 查询广告下的关键词列表 |
| 新增否定词 | `negativewords/add.mjs` | 为广告添加否定词 |
| 更新否定词 | `negativewords/update.mjs` | 更新广告的否定词等 |
| 查询否定词 | `negativewords/get.mjs` | 查询广告下的否定词列表 |

> **脚本调用格式统一**:
> - **Bash / Zsh / Git Bash**:`node scripts/<脚本名>.mjs '<JSON 参数>'`(直接传 JSON 字符串)
> - **Windows PowerShell**:`node scripts/<脚本名>.mjs --base64 <Base64字符串>`(**必须使用 --base64**)
>
> 执行脚本时先进入本 skill 根目录,再按相对 `scripts/` 路径调用。

### ⚠️ 跨平台 JSON 参数传递规则(经实测验证)

#### Bash / Zsh / Git Bash

直接传 JSON 字符串,单引号包裹即可:
```bash
node scripts/query-report.mjs '{"account_ids":["73412663"],"date_range":{"start_date":"2026-04-13","end_date":"2026-04-13"},"level":"ADGROUP"}'
```

#### Windows PowerShell

PowerShell 的引号解析规则复杂,直接传 JSON 字符串会导致双引号被吞掉。**必须使用 `--base64` 方式**,通过 Here-String 构造 JSON 再编码为 Base64,彻底规避引号问题:
```powershell
$json = @'
{"account_ids":["73412663"],"date_range":{"start_date":"2026-04-13","end_date":"2026-04-13"},"level":"ADGROUP"}
'@
$base64 = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($json))
node scripts/query-report.mjs --base64 $base64
```

> **⚠️ Here-String 格式要求极其严格(违反则 PowerShell 直接报语法错误):**
>
> 1. **`@'` 后面必须立即换行**,同一行不能跟任何字符(包括空格)
> 2. **`'@` 必须单独一行且顶格写**,前面不能有空格或缩进
> 3. JSON 内容从 `@'` 的**下一行**开始书写
>
> ```powershell
> # ❌ 错误:@' 后面直接跟了 JSON 内容
> $json = @'{"account_ids":["73412663"]}'@
>
> # ❌ 错误:'@ 前面有空格
> $json = @'
> {"account_ids":["73412663"]}
>   '@
>
> # ✅ 正确:@' 后立即换行,'@ 顶格独占一行
> $json = @'
> {"account_ids":["73412663"]}
> '@
> ```

```
⛔ SOP 决策流程(严格按顺序执行,不可跳步):

步骤1                步骤2                步骤2.5                                                              步骤3
意图识别  ─────→    分流路由   ─────→  字段名确认(> **🚫🚫🚫 禁止猜测字段名!违反此规则 = 查询失败!**)   ─────→       执行查询
是否使用本SKILL      │
                     ├─ 路径A(报表/效果数据)─→ 字段名确认(见步骤2.5)─→ query-report.mjs → 结束
                     │
                     ├─ 路径B(项目/广告/创意详情)
                     │    │
                     │    └─ query-adgroups / query-creatives
                     │       (有时间范围时通过 filtering 中 created_time 筛选)
                     │
                     └─ 路径C(营销资产查询)─→ 见下方"营销资产查询(路径 C)"

创意查询分支:
  query-creatives.mjs 自动判断:
    │
    ├─ 查询结果只有 1 条创意(单个创意详情)
    │    → 自动执行完整解析流程:
    │      ├─ 1. 从 creative_components 提取 component_id
    │      ├─ 2. 批量拉取组件详情
    │      ├─ 3. 从组件中提取 image_id / video_id
    │      ├─ 4. 获取图片/视频预览 URL
    │      └─ 5. 内联到 _component_detail + _preview,一次返回完整创意+组件+素材预览
    │
    └─ 查询结果有多条创意(创意列表)
         → 只返回创意基本信息,不解析组件
```

---

<!-- script get-available-marketing-assets → scripts/get-available-marketing-assets.mjs (injected at build time) -->
<!-- script get-android-packages → scripts/get-android-packages.mjs (injected at build time) -->

## SOP 决策流程(高优先级,覆盖后文冲突)

> 若本节与下文表述冲突,以本节为准。

### 步骤1:意图识别 — 是否使用本 SKILL

用户意图必须命中以下**任一类别**,才进入本 SKILL 的处理流程:

| 类别 | 命中关键词 / 场景示例 |
|------|----------------------|
| **A. 报表/效果数据** | **必须明确提到指标关键词**:消耗、曝光、点击、转化、ROI、分时趋势、按天数据、账户汇总、效果对比、数据报表、投放效果 |
| **B. 实体列表/详情查询** | 智能投放项目(简称"项目"、"智投项目")、竞价广告(又称"3.0广告")、创意(又称"动态创意"、"新创意")的列表查询、详情查看、配置查询、定向设置、组件内容 |
| **C. 营销资产查询** | 安卓应用包、安卓渠道包、推广产品、营销资产等资产信息查询 |

> ⚠️ **关键规则**:用户笼统说"查询广告数据"、"看下创意数据"等,**未明确提到指标关键词(消耗、曝光、点击等)**时,一律归入 **B 类(实体查询)**,而非 A 类(报表)。只有明确提到指标或趋势时才走报表。

❌ **不命中** → 不使用本 SKILL,交给其他技能处理。

### 步骤 1.5:确定实体类型 — `tencent_ads_type` 参数(所有脚本通用)

> **⚠️ 必须在调用任何脚本前确定 `tencent_ads_type`,该参数直接影响返回字段的命名。**
>
> **`tencent_ads_type` 是枚举类型,只允许以下三个值,传其他值脚本会报错退出:**

| 用户意图 | `tencent_ads_type` 枚举值 | 返回字段示例 |
|---------|-------------|-------------|
| 智能投放项目("项目"、"智投项目") | `"smart"` | `project_id`、`project_name`、`project.*` |
| 竞价广告("竞价广告"、"3.0广告"、"非智投") | `"standard"` | `adgroup_id`、`adgroup_name`、`adgroup.*` |
| 所有广告("广告"、未明确说明、**默认**) | `"all"`(默认) | `adgroup_id`、`adgroup_name`、`adgroup.*`(保持原始字段名) |

**规则**:
- 用户提到"项目"、"智投项目"、"智能投放项目" → `tencent_ads_type: "smart"`
- 用户提到"竞价广告"、"3.0广告"、"非智投广告" → `tencent_ads_type: "standard"`
- 用户只说"广告"或未明确说明 → `tencent_ads_type: "all"`(**默认**,包含智投项目 + 竞价广告,不注入 `smart_delivery_platform` 过滤,不做字段重命名)
- **⚠️ 只允许传 `"smart"` / `"standard"` / `"all"` 三个枚举值之一**,传其他任何值(如 `"project"`、`"ad"` 等)脚本会直接报错
- `tencent_ads_type` 对所有脚本(`query-report.mjs`、`query-adgroups.mjs`、`query-creatives.mjs`)均适用

### 步骤2:分流路由 — 报表 or 详情

> ⚠️ **时间范围修饰对象判断(必须在分流前执行)**
>
> 用户说的时间范围修饰的是「报表数据」还是「广告实体」?
>
> | 用户说法 | 时间修饰对象 | 走向 |
> |---------|------------|------|
> | "最近一周的消耗" / "最近7天的效果" / "上周的报表" | 报表数据 | 路径 A |
> | "最近一周的广告" / "最近7天的项目" / "上周的创意" (**无效果指标词**) | 广告实体 | 路径 B(`filtering` 加 `created_time`) |
> | "最近一周内创建的广告" / "这周新建的项目" | 广告实体 | 路径 B(`filtering` 加 `created_time`) |
>
> **判断规则**:用户说"最近N天/周的广告/项目/创意"但**没有提到任何效果指标词**(消耗、曝光、点击、转化、ROI等)→ 一律视为查广告实体,走路径 B,通过 `filtering` 中的 `created_time` 筛选。

```
命中类别 A(报表/效果数据)且时间范围修饰的是报表数据
  └─→ 直接走【路径 A】

命中类别 B(实体列表/详情,不涉及报表指标)
或 用户说"最近N天的广告/项目/创意"但无效果指标词
  └─→ 进入【路径 B】二次意图判断
```

#### ⚠️ "数据"一词的歧义消解规则

用户说"查看创意/广告的数据"时,**必须判断是否包含效果指标意图**,不能仅凭"数据"二字走路径 A:

| 用户说法 | 是否含效果指标词 | 走向 |
|---------|----------------|------|
| "查创意数据"、"看一下这个广告的数据"、"查询这个创意" | ❌ 无(消耗/曝光/点击/转化等) | 路径 B → `query-creatives` / `query-adgroups` |
| "查创意的消耗数据"、"看广告的曝光/点击/转化数据" | ✅ 有 | 路径 A → `query-report` |

**规则**:仅有"数据"二字、**不带任何效果指标词**(消耗、曝光、点击、转化、ROI、成本等)→ 默认视为查询实体详情,走路径 B。

---

#### 路径 A:与报表/效果数据相关 → `query-report.mjs`

直接使用 `query-report.mjs`,一次请求同时返回实体属性 + 报表指标,**流程结束**。

| 典型场景 | 说明 |
|---------|------|
| 查看广告列表及效果数据(消耗、曝光、点击等) | 返回广告基本属性 + 报表指标 |
| 查看广告分时/按天趋势 | 按时间维度聚合报表数据 |
| 查看账户汇总数据 | 全账户维度汇总 |
| 按消耗/曝光等指标排序或筛选 | 支持 order_by + post_filtering |
| 拉取全部广告/导出所有数据/统计全量数据 | 使用 `fetch_all: true` 自动分页拉取 |

> ⚠️ **路径 A 排除规则**:用户说"最近N天的广告/项目/创意"但未提及任何效果指标词 → **不走路径 A**,转路径 B。

#### 路径 B:与项目/广告/创意详情相关(不涉及报表指标) → 直接调用详情脚本

根据用户查询目标,直接调用对应的详情脚本。如果用户带有时间范围筛选条件(如"最近3天的广告"、"这周新建的项目"),通过 `filtering` 中的 `created_time` 进行筛选,无需先走 `query-report.mjs`。

| 用户查询目标 | 调用脚本 | 时间范围处理 |
|-------------|---------|-------------|
| 项目详情 / 广告详情(定向、出价、转化、版位、能力配置等) | `query-adgroups.mjs` | 有时间范围时加 `filtering` 中 `created_time` 条件 |
| 创意详情(创意组件内容、投放模式、创意类型等) | `query-creatives.mjs` | 有时间范围时加 `filtering` 中 `created_time` 条件 |
| 创意列表(批量查看创意基本信息) | `query-creatives.mjs` | 有时间范围时加 `filtering` 中 `created_time` 条件 |

> **⚠️ 创意查询的组件解析策略(脚本自动判断,Agent 无需控制)**:
> - **查询结果只有 1 条创意**:脚本自动从 `creative_components` 中提取所有 `component_id`,调用组件详情接口拉取组件详情,再从组件中提取 `image_id` / `video_id`,获取预览 URL。最终将组件内容内联到 `_component_detail` 字段,图片/视频预览信息内联到 `_preview` 字段。
> - **查询结果有多条创意**:只返回创意基本信息,不解析组件,避免大量 API 请求影响性能。

#### 路径 C:营销资产查询

当用户需要查询营销资产(推广产品、应用包、渠道包等)时,根据资产类型选择对应的查询方式:

| 资产类型 | 查询方式 | 说明 |
|---------|---------|------|
| **安卓应用包 / 渠道包** | `node scripts/get-android-packages.mjs` | 查看 [shared/references/android-app-assets.md](../shared/references/android-app-assets.md) |
| **其他营销资产** | 暂未补充,可参考创建 SKILL(`delivery-standard-create` / `delivery-smart-create`)中的 `get-assets.mjs` 查询方式 | 后续按需扩展 |

### 步骤 2.5:字段名确认 — 不在常用映射表中的字段必须先查字典

> **⚠️ 强制规则:禁止猜测字段名!**
>
> 当用户请求的报表指标或广告字段**不在下方「常用报表字段映射」表中**时,**必须先用 `--query-fields` 查询字段字典**,确认准确的 API 字段名后再构造请求。
>
> **绝对禁止**根据英文命名规律自行拼凑字段名(如猜测 "关注数" → `wechat_official_account_follower_count`,实际应为 `scan_follow_user_count`)。API 字段名与直觉差异极大,猜测几乎必错。
>
> **判断标准**:逐一检查用户要求的每个指标/字段,如果在「常用报表字段映射」或「常用 fields 字段」表中能找到精确对应 → 直接使用;找不到 → **必须查字典**。
>
> **查字典方法**:
> - 报表指标字段:`node scripts/query-report.mjs --query-fields "关键词1,关键词2"`
> - 广告配置字段:`node scripts/query-adgroups.mjs --query-fields "关键词1,关键词2"`
>
> **示例**:用户要求查看"5秒播放数、关注数、关注成本、关注率"
> 1. 检查常用映射表 → 这4个指标都不在表中
> 2. 执行:`node scripts/query-report.mjs --query-fields "5秒播放,关注"`
> 3. 从返回结果中确认准确字段名,再构造 `fields` 参数

### 步骤3:执行查询 — 快速参考

| 脚本 | 核心能力 | 典型入参 |
|------|---------|---------|
| `query-report.mjs` | 跨账户报表 + 属性查询 | `account_ids` + `date_range` + `tencent_ads_type` |
| `query-adgroups.mjs` | 广告/项目完整配置详情 | `account_id` + `adgroup_ids` + `tencent_ads_type` |
| `query-creatives.mjs` | 创意列表 + 单创意自动解析组件/素材预览 | `account_id` + `adgroup_ids` 或 `creative_ids` + `tencent_ads_type` |
| `query-operation-logs.mjs` | 广告/创意操作日志(新建/修改字段变更详情) | `account_id` + `operation_object_type` + `start_date` + `end_date`,可选 `object_id` |

---

## 脚本:query-report.mjs

> **这是本技能的核心脚本**,封装了报表查询的全部复杂逻辑。

### 脚本自动处理的逻辑(Agent 无需关心)

1. **标准过滤条件**:根据 `level` 自动构建基础过滤条件 + 智投/非智投区分条件(通过 `LEVEL_FILTERING_CONFIG` 配置驱动)
   - 广告层级(ADGROUP 等):`adgroup.brand_ad_type` + `adgroup.campaign_type` + `adgroup.smart_delivery_platform`
   - 创意层级(DYNAMIC_CREATIVE):`dynamic_creative.brand_ad_type` + `adgroup.campaign_type` + `dynamic_creative.smart_delivery_platform`
   - 维度层级(REGION/CITY/AGE/GENDER 等):使用对应 `report.*` 前缀
2. **模糊搜索字段自动切换**:`fuzzy_name` 在广告层级使用 `adgroup.fuzzy_name`,在创意层级使用 `dynamic_creative.fuzzy_name`
3. **group_by 推导**:根据 `level` 自动推导合适的 `group_by`(如 ADGROUP → `["adgroup_id"]`,DYNAMIC_CREATIVE → `["dynamic_creative_id"]`,REGION → `["area_id"]`)
4. **fields 补全**:未指定 `fields` 时,自动包含该 level 的默认属性字段 + 常用报表字段
5. **返回数据裁剪**:移除空对象和无效字段,减少 Agent 解析负担
6. **默认排序**:未指定 `order_by` 时,自动使用 `[{"sort_field": "report.default_order_by", "sort_type": "ASCENDING"}]`,**Agent 无需手动传 `order_by`,除非用户明确要求按某个指标排序**

### 调用方式

```bash
node scripts/query-report.mjs '<JSON 参数>'
```

### 参数说明

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `account_ids` | string[] | **是** | 广告主账号 ID 数组(如 `["123"]` 或 `["123", "456"]`),单账户也用数组格式 |
| `date_range` | struct | **是** | 报表统计时间窗口 `{ "start_date": "YYYY-MM-DD", "end_date": "YYYY-MM-DD" }`。**注意:这是报表系统的统计区间,不是广告创建时间或投放时间。** 按创建时间筛选广告实体请用 `filtering` 中的 `adgroup.created_time`。 |
| `tencent_ads_type` | enum | 否 | 广告实体类型,**枚举值只允许 `"smart"` / `"standard"` / `"all"` 三者之一**,默认 `"all"`。详见步骤 1.5 |
| `level` | enum | 否 | 数据维度,默认 `"ADGROUP"`。可选:ADVERTISER / ADGROUP / DYNAMIC_CREATIVE / COMPONENT / BIDWORD / CHANNEL / REGION / CITY / AGE / GENDER / IMAGE / VIDEO / QUERYWORD / LANDING_PAGE / MARKETING_ASSET / AUDIENCE / JOINT_BUDGET_RULE / PRODUCT_CATALOG / AOI / PROJECT_CREATIVE / VIDEO_AGGREGATION / CREATIVE_ASSET / VIDEO_HIGHLIGHT / WECHAT_SHOP_PRODUCT 等 |
| `adgroup_ids` | string[] | 否 | 指定广告 ID 列表(传入后自动切为指定 ID 查询模式) |
| `creative_ids` | string[] | 否 | 指定创意 ID 列表 |
| `component_ids` | string[] | 否 | 指定组件 ID 列表 |
| `fields` | string[] | 否 | 自定义返回字段(不传则自动补全属性+报表字段) |
| `group_by` | string[] | 否 | 自定义聚合维度(不传则根据 level 自动推导) |
| `time_line` | enum | 否 | 时间口径,默认 `"REQUEST_TIME"` |
| `order_by` | struct[] | 否 | 排序条件。**通常不需要传**,脚本会自动使用默认排序。仅当用户明确要求按某个指标排序时才传,如 `[{"sort_field": "report.cost", "sort_type": "DESCENDING"}]` |
| `filtering` | struct[] | 否 | 额外自定义过滤条件(追加到标准过滤之后) |
| `post_filtering` | struct[] | 否 | 后置过滤条件(基于报表指标筛选) |
| `page` | integer | 否 | 页码,默认 1 |
| `page_size` | integer | 否 | 每页条数,默认 20 |
| `fetch_all` | boolean | 否 | 是否自动分页拉取全部数据,默认 false。开启后忽略 `page` 参数,自动翻页直到拉完所有数据(`page_size` 自动提升至至少 100 以减少请求次数)。详见下方 **`fetch_all` 使用规则** |
| `is_total` | boolean | 否 | 是否全账户汇总,默认 false |
| `report_only` | boolean | 否 | 仅查报表数据(不返回实体属性),默认 false |
| `fuzzy_name` | string | 否 | 名称模糊搜索。广告层级(ADGROUP)时搜索广告名称,创意层级(DYNAMIC_CREATIVE)时搜索创意名称 |

### 使用示例

#### 1. 查询所有广告列表(最常用,默认模式)

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"}}'
```

> 不传 `tencent_ads_type`、`fields`、`group_by` 时,脚本默认 `tencent_ads_type: "all"`(智投项目 + 竞价广告全部返回) + 默认属性与报表字段 + `group_by: ["adgroup_id"]`。

#### 2. 查询智投广告

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"tencent_ads_type":"smart"}'
```

#### 3. 查询指定广告 ID 的数据

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"adgroup_ids":["72536365535"]}'
```

> 传了 `adgroup_ids` 后,脚本自动切换到 `specified` 模式,只使用 ID 过滤,不加基础 3 条和智投/非智投条件。

#### 4. 查看指定广告的分时趋势

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"adgroup_ids":["72536365535"],"group_by":["date","hour"],"page_size":100}'
```

> 分时查询:`group_by` 使用 `["date", "hour"]`,脚本自动精简 fields 只保留报表指标。

#### 5. 查看指定广告的按天趋势

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-19","end_date":"2026-03-25"},"adgroup_ids":["72536365535"],"group_by":["date"]}'
```

#### 6. 按消耗排序

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"order_by":[{"sort_field":"report.cost","sort_type":"DESCENDING"}]}'
```

#### 7. 用后置过滤筛选高消耗广告

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"post_filtering":[{"field":"report.cost","operator":"GREATER","values":["100000"]}]}'
```

#### 8. 查询创意级别数据

查询智投项目下的创意列表:

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"level":"DYNAMIC_CREATIVE","tencent_ads_type":"smart"}'
```

查询竞价广告下的创意列表:

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"level":"DYNAMIC_CREATIVE","tencent_ads_type":"standard"}'
```

按创意名称模糊搜索(`fuzzy_name` 在创意层级自动使用 `dynamic_creative.fuzzy_name`):

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"level":"DYNAMIC_CREATIVE","fuzzy_name":"品牌创意"}'
```

按投放模式筛选(只看组件化创意),通过 `filtering` 追加:

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"level":"DYNAMIC_CREATIVE","filtering":[{"field":"dynamic_creative.delivery_mode","operator":"EQUALS","values":["DELIVERY_MODE_COMPONENT"]}]}'
```

按创意状态筛选(竞价广告创意用 `DYNAMIC_CREATIVE_STATUS_*`,智投项目创意用 `SMART_DYNAMIC_CREATIVE_STATUS_*`):

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"level":"DYNAMIC_CREATIVE","tencent_ads_type":"standard","filtering":[{"field":"dynamic_creative.system_status","operator":"IN","values":["DYNAMIC_CREATIVE_STATUS_PENDING","DYNAMIC_CREATIVE_STATUS_ACTIVE"]}]}'
```

按创意类型筛选(客户自建 vs 妙思自动生成):

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"level":"DYNAMIC_CREATIVE","filtering":[{"field":"dynamic_creative.source","operator":"EQUALS","values":["AD_CREATIVE_SOURCE_NORMAL"]}]}'
```

> **创意层级自动处理说明**:
> - `operation_status` 过滤自动使用 `dynamic_creative.operation_status`(不是 `adgroup.operation_status`)
> - 智投/非智投区分自动使用 `dynamic_creative.smart_delivery_platform`(不是 `adgroup.smart_delivery_platform`)
> - `fuzzy_name` 自动使用 `dynamic_creative.fuzzy_name`(不是 `adgroup.fuzzy_name`)

#### 9. 查询账户汇总数据

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"is_total":true,"page_size":1}'
```

#### 10. 按名称模糊搜索广告

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"fuzzy_name":"品牌推广"}'
```

#### 10.5. 多账户同时查询

```bash
node scripts/query-report.mjs '{"account_ids":["39412855","73412663"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"}}'
```

> `account_id` 支持传入数组,一次请求同时查询多个账户的数据。返回结果中每条数据包含 `account_id` 字段,可区分所属账户。

#### 10.6. 自动分页拉取全部广告数据

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"fetch_all":true}'
```

> 开启 `fetch_all` 后,脚本自动翻页拉取所有数据,最终返回的 `page_info` 中 `total_number` 为全部条数,`total_page` 固定为 1。

##### `fetch_all` 使用规则

| 用户意图 | `fetch_all` 值 | 说明 |
|---------|---------------|------|
| 普通列表查询("查看广告"、"看下效果") | `false`(默认) | 只需要当前页数据,默认返回 20 条 |
| "拉取全部广告" / "导出所有数据" / "一共有多少条广告" | `true` | 用户明确要求全量数据 |
| "帮我统计所有广告的消耗总和" / 需要对全量数据做聚合分析 | `true` | 需要拉取全部后才能汇总计算 |
| "查看所有消耗大于 100 的广告" / 全量筛选 | `true` | 需要全量数据才能完整筛选 |
| "列出全部在投广告" / "所有正在投放的项目" | `true` | 用户要求完整列表 |
| 用户明确指定了 page / page_size | `false` | 用户自行控制分页,不需要自动拉取 |

> ⚠️ **判断关键词**:当用户使用"全部"、"所有"、"一共"、"总共"、"导出"、"拉取全量"、"完整列表"等词汇时,应设置 `fetch_all: true`。
> 当用户只是普通查询或明确指定了分页参数时,保持默认 `fetch_all: false`。
```

#### 11. 查询指定广告的分地域投放数据(受众分析-地域报表)

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"level":"REGION","adgroup_ids":["72536365535"]}'
```

> **分地域查询关键点**:当用户要求"分地域"、"按地域"、"各地区"、"省份分布"等维度查看投放数据时,**必须使用 `level: "REGION"`**,脚本会自动推导 `group_by: ["area_id"]` 和正确的过滤条件。同理,"分城市" → `level: "CITY"`,"分年龄" → `level: "AGE"`,"分性别" → `level: "GENDER"`。**切勿使用 `level: "ADGROUP"` 来查询地域/城市/年龄/性别维度的数据。**

#### 12. 按创建时间筛选广告/项目(adindex 实体过滤)

> **适用场景**:用户说"最近 N 天内创建的项目/广告"、"本周新建的广告"等——这是对**广告实体**的筛选,不是报表时间窗口。
> - `date_range` 用近期时间(如当天)即可,其值不影响广告实体的筛选
> - 创建时间用 `filtering` 中的 `adgroup.created_time`,值为 **`YYYY-MM-DD HH:mm:ss` 格式**(如 `"2026-03-18 00:00:00"`),脚本内部自动转为时间戳

查询最近一周内创建的智投项目(不关心报表数据):

```bash
node scripts/query-report.mjs '{
  "account_ids": ["39412855"],
  "date_range": {"start_date": "2026-03-27", "end_date": "2026-03-27"},
  "tencent_ads_type": "smart",
  "filtering": [
    {"field": "adgroup.created_time", "operator": "GREATER_EQUALS", "values": ["<7天前 YYYY-MM-DD 00:00:00>"]},
    {"field": "adgroup.created_time", "operator": "LESS_EQUALS",    "values": ["<今天 YYYY-MM-DD 23:59:59>"]}
  ],
  "fields": [
    "account_id",
    "adgroup.adgroup_id",
    "adgroup.adgroup_name",
    "adgroup.configured_status_cn",
    "adgroup.system_status_cn",
    "adgroup.smart_delivery_platform",
    "adgroup.project_ability_spec",
    "adgroup.begin_date"
  ]
}'
```

> `fields` 里不含 `report.*` 字段时,`date_range` 仅作为接口必填项存在,对结果无实质影响。

#### 13. 查询创意资产(文案素材)级别数据

当用户要查文案素材(标题/描述)维度的投放效果时,使用 `CREATIVE_ASSET` 级别。注意:过滤条件使用 `report.*` 字段,不使用 `adgroup.*` 字段。

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"level":"CREATIVE_ASSET","group_by":["creative_asset_id","adgroup_id","dynamic_creative_id"],"order_by":[{"sort_field":"report.cost","sort_type":"DESCENDING"}],"fields":["creative_asset.creative_asset_id","creative_asset.creative_asset_name","creative_asset.component_id","creative_asset.component_type","creative_asset.component_value","creative_asset.component_custom_name","creative_asset.account_id","report.cost","report.view_count","report.valid_click_count","report.ctr","report.thousand_display_price","report.cpc","report.conversions_rate","report.adgroup_id","report.dynamic_creative_id"],"filtering":[{"field":"report.brand_ad_type","operator":"EQUALS","values":["BRAND_AD_TYPE_NONE"]},{"field":"report.campaign_type","operator":"EQUALS","values":["CAMPAIGN_TYPE_NORMAL"]},{"field":"report.creative_asset_sub_type","operator":"IN","values":["DESCRIPTION","TITLE"]}]}'
```

> **CREATIVE_ASSET 查询要点**:
> - `level` 设为 `"CREATIVE_ASSET"`,`group_by` 包含 `"creative_asset_id"`
> - `filtering` 使用 `report.*` 字段(如 `report.brand_ad_type`、`report.campaign_type`、`report.creative_asset_sub_type`),**不使用** `adgroup.*` 字段
> - 按素材子类型过滤文案:`report.creative_asset_sub_type` IN `["DESCRIPTION", "TITLE"]`

#### 14. 查询组件级别数据

```bash
node scripts/query-report.mjs '{"account_ids":["39412855"],"date_range":{"start_date":"2026-03-25","end_date":"2026-03-25"},"level":"COMPONENT"}'
```

### 返回结构

```json
{
  "file_path": "/absolute/path/to/output/report_39412855_ADGROUP_20260325_20260325_20260325T103000.json",
  "summary": {
    "total_rows": 150,
    "page_info": {
      "page": 1,
      "page_size": 20,
      "total_number": 150,
      "total_page": 8
    },
    "level": "ADGROUP",
    "date_range": { "start_date": "2026-03-25", "end_date": "2026-03-25" },
    "account_ids": [39412855],
    "tencent_ads_type": "all"
  },
  "preview": [
    {
      "account_id": 39412855,
      "adgroup": {
        "adgroup_id": 123456,
        "adgroup_name": "广告名称",
        "configured_status": "AD_STATUS_NORMAL"
      },
      "report": {
        "cost": 10000,
        "view_count": 50000,
        "valid_click_count": 1200,
        "ctr": "2.40"
      }
    }
  ]
}
```

> **输出说明**:脚本会将完整查询结果写入 `output/` 目录下的 JSON 文件,stdout 只返回文件路径、摘要信息和前 3 条预览数据。模型可通过 `file_path` 读取完整数据文件,编写实时分析脚本生成数据报告。

> **数据文件格式**:`output/report_<账户ID>_<level>_<日期范围>_<时间戳>.json`,内容为 `{ "list": [...], "page_info": {...} }`。

### 常用报表字段映射(用户描述 → fields 字段名)

当用户提到以下指标时,请在 `fields` 参数中使用对应的字段名:

| 用户描述 | fields 字段名 | 说明 |
|---------|-------------|------|
| 消耗/花费 | `report.cost` | 广告消耗金额 |
| 曝光量/展示量 | `report.view_count` | 广告曝光次数 |
| 点击量 | `report.valid_click_count` | 有效点击次数 |
| 点击率/CTR | `report.ctr` | 点击率 |
| 转化数/转化量 | `report.conversions_count` | 转化次数 |
| 转化成本 | `report.conversions_cost` | 每次转化的成本 |
| 转化率 | `report.conversions_rate` | 转化率 |
| 落地页按钮点击量 | `report.lan_button_click_count` | 落地页按钮点击次数 |
| 账户余额 | `report.balance` | 账户剩余金额 |
| 出价/出价金额 | `report.cost_price` | 广告出价 |
| 营销内容 | `report.marketing_content` | 营销内容信息 |
| 地域/地区 | `report.area` | 地域名称(分地域查询时使用) |
| 千次曝光成本/CPM | `report.thousand_display_price` | 每千次曝光成本 |
| 点击均价/CPC | `report.click_cost` | 每次点击成本 |
| 深度转化数 | `report.deep_conversions_count` | 深度转化次数 |
| 深度转化成本 | `report.deep_conversions_cost` | 深度转化成本 |
| 微信加粉成本 | `report.wechat_cost_stage1` | 微信加粉阶段成本 |
| 企微加粉成本 | `report.wechat_cost_stage2` | 企微加粉阶段成本 |

> **提示**:当用户要求查看多个指标时,请将所有对应的 `report.*` 字段都加入 `fields` 数组中。如果用户没有明确指定指标,可以不传 `fields`,脚本会自动使用默认字段集。
>
> **⚠️ 强制规则**:上表仅列出最常用的 18 个字段,报表系统共有 854 个字段。**如果用户提到的指标不在上表中,必须先执行 `node scripts/query-report.mjs --query-fields "关键词"` 查询字段字典,确认准确字段名后再构造请求。禁止自行猜测或拼凑字段名。**

---

## 核心脚本

| 脚本 | 用途 |
|------|------|
| query-report.mjs | 跨账户查询广告/创意/素材的列表数据+报表指标(核心入口,融合属性查询与效果数据) |
| query-adgroups.mjs | 获取广告完整配置信息(定向、出价、转化、版位等) |
| query-creatives.mjs | 获取创意列表及组件详情;单创意时自动解析组件并获取图片/视频预览 URL |

## 请求参数

### 必填参数

| 参数名 | 类型 | 说明 | 限制 |
|--------|------|------|------|
| date_range | struct | 日期范围 | 最早支持365天内数据 |
| date_range.start_date | string | 开始日期 | YYYY-MM-DD,≤ end_date |
| date_range.end_date | string | 结束日期 | YYYY-MM-DD,≥ start_date |
| level | enum | 数据维度级别 | 见下方 level 枚举值 |

### 可选参数

| 参数名 | 类型 | 说明 | 限制/默认值 |
|--------|------|------|------------|
| account_id_list | integer[] | 广告主账号 ID 列表 | 最多 400 个,不支持代理商 ID |
| filtering | struct[] | 前置过滤条件 | 数组 1-40 个,见下方过滤条件说明 |
| or_filtering | struct[][] | 二维过滤条件(OR 逻辑) | 数组 1-40 个 |
| post_filtering | struct[] | 后置过滤条件(基于报表指标筛选) | 数组 1-32 个 |
| order_by | struct[] | 排序字段 | 最多 2 个排序条件,示例:`[{"sort_field": "report.cost", "sort_type": "DESCENDING"}]` |
| time_line | enum | 时间口径 | REQUEST_TIME / REPORTING_TIME / ACTIVE_TIME |
| group_by | string[] | 聚合参数 | 数组 1-10 个。每个 level 只支持特定的 group_by 值,见下方 **level 数据维度与 group_by 对应表** |
| page | integer | 页码 | 1-99999,默认 1 |
| page_size | integer | 每页条数 | 1-99999999,默认 10 |
| report_only | boolean | 仅查报表数据模式(true=只返回报表指标,不返回实体属性数据) | 默认 false |
| is_total | boolean | 是否为汇总数据(全账户级汇总) | 默认 false |
| fields | string[] | 指定返回的字段列表 | 数组 1-1024 个,最大长度 64 字符/项 |
| operating_scene_type | enum | 操作平台场景类型 | 枚举 OperatingSceneType |
| organization_id | integer | 业务单元 ID | 0-9999999999 |
| request_source | enum | 请求来源 | 枚举 RequestSourceType |

**level 数据维度与 group_by 对应表**:

每个 `level` 只支持特定的 `group_by` 值,不传时脚本自动使用默认值。自定义 `group_by` 时必须从该 level 的合法值中选取,**禁止使用不在此表中的值**。

| level | 说明 | 适用场景 | 合法 group_by 值 | 默认值 | group_by 说明 |
|-------|------|---------|-----------------|--------|-------------|
| ADVERTISER | 账户级别 | 当用户要求"账户级别报表"、"账户维度数据"时使用。不返回具体广告/创意明细,只返回账户粒度汇总数据 | `date`, `hour` | `["date"]` | 只支持时间维度,**不支持** `account_id`、`site_set`;按小时查用 `["date", "hour"]` |
| ADGROUP | 广告级别 | **最常用**。当用户要求"广告数据"、"广告列表"、"投放数据"时使用(未明确指定其他 level 时默认使用) | `adgroup_id`, `date`, `hour`, `site_set` | `["adgroup_id"]` | 按天趋势用 `["adgroup_id", "date"]`;按小时趋势用 `["adgroup_id", "date", "hour"]`;按版位用 `["adgroup_id", "site_set"]` |
| DYNAMIC_CREATIVE | 动态创意级别 | 当用户要求查看"创意效果"、"创意对比"、"创意列表"时使用(指普通广告的动态创意,非智投项目创意)。注意与 `PROJECT_CREATIVE` 区分 | `dynamic_creative_id`, `adgroup_id`, `date`, `hour`, `site_set` | `["dynamic_creative_id", "adgroup_id"]` | 必须包含 `dynamic_creative_id`;按小时趋势用 `["dynamic_creative_id", "date", "hour"]` |
| COMPONENT | 组件级别 | 当用户提到"素材组件"、"组件ID"、"组件效果"、"组件报表"时使用。`filtering` 可按 `component_id`、`component_sub_type` 等筛选。注意:用户说"视频素材组件"或"图片素材组件"时也应使用此 level,而非 VIDEO/IMAGE | `component_id`, `date`, `hour` | `["component_id"]` | |
| CREATIVE_ASSET | 创意资产级别 | 当用户要查询文案类素材(标题/描述)的投放效果时使用。`filtering` 使用 `report.*` 字段(非 `adgroup.*`) | `creative_asset_id`, `adgroup_id`, `dynamic_creative_id`, `date`, `product_catalog_id`, `product_series_id`, `product_outer_id` | `["creative_asset_id", "adgroup_id", "dynamic_creative_id"]` | 支持商品维度 |
| CHANNEL | 渠道级别 | 渠道包报表 | `channel_id` | `["channel_id"]` | 不支持时间维度 |
| BIDWORD | 竞价词级别 | 搜索分析-关键词报表。当用户提到"竞价词"、"关键词出价"时使用 | `bidword_id`, `date` | `["bidword_id"]` | |
| QUERYWORD | 搜索词级别 | 搜索分析-搜索词报表。当用户提到"搜索词"时使用 | `queryword_id`, `queryword`, `date` | `["queryword_id"]` | |
| IMAGE | 图片素材级别 | 当用户要求按图片 ID 查看图片素材效果时使用(素材分析-图片素材报表)。注意:若用户说的是"图片组件"或"图片素材组件",应使用 `COMPONENT` level | `image_id`, `date` | `["image_id"]` | |
| VIDEO | 视频素材级别 | 当用户要求按视频 ID 查看视频素材效果时使用(素材分析-视频素材报表)。注意:若用户说的是"视频组件"或"视频素材组件",应使用 `COMPONENT` level | `video_id`, `date` | `["video_id"]` | |
| MEDIA | 素材级别 | 素材报表 | `media_id`, `date` | `["media_id"]` | |
| VIDEO_AGGREGATION | 视频聚合级别 | 当用户要求按视频 MD5 聚合查看素材效果时使用 | `md5` | `["md5"]` | |
| VIDEO_HIGHLIGHT | 视频高光帧级别 | 视频高光帧分析报表 | `md5`, `play_index` | `["md5"]` | `play_index` 需要后端开关 |
| MARKETING_ASSET | 产品资产级别 | 当用户提到"推广产品"、"产品资产"、"营销资产"时使用。查看推广产品维度的投放效果 | `marketing_asset_id`, `date`, `product_catalog_id`, `product_series_id`, `product_outer_id` | `["marketing_asset_id"]` | 支持商品维度 |
| LANDING_PAGE | 落地页级别 | 当用户提到"落地页"时使用 | `landing_page_id`, `vangogh_landing_page_id`, `date` | `["landing_page_id"]` | `group_by` 用 `landing_page_id` 而非 `landing_page_url` |
| PRODUCT_CATALOG | 商品级别 | 当用户提到"商品目录"、"商品系列"、"商品ID"、"多商品广告"、"商品维度"时使用。查看商品目录/系列/单品维度的投放效果。注意与 `MARKETING_ASSET`(推广产品)区分 | `product_catalog_id`, `product_series_id`, `product_outer_id`, `date` | `["product_catalog_id"]` | 支持商品层级维度 |
| WECHAT_SHOP_PRODUCT | 微信小店商品级别 | 当用户提到"微信小店商品"、"视频号商品"、"小店商品"时使用 | `wechat_channels_product_id`, `wechat_channels_shop_id`, `date` | `["date"]` | |
| JOINT_BUDGET_RULE | 联合预算规则级别 | 联合广告预算规则 | `joint_budget_rule_id`, `date` | `["joint_budget_rule_id"]` | |
| PROJECT_CREATIVE | 智投项目创意级别 | 当用户提到"智投项目创意"、"项目创意"、"指定项目下的创意"时使用。注意与 `DYNAMIC_CREATIVE` 区分:用户提到"项目 ID + 创意"时用此 level,而非 `DYNAMIC_CREATIVE` | `dynamic_creative_id`, `adgroup_id`, `date`, `hour` | `["dynamic_creative_id", "adgroup_id"]` | |
| REGION | 省份/地域级别 | 分地域投放数据。当用户要求"分地域"、"按地域"、"各地区"、"省份分布"、"地域报表"时使用。可配合 `adgroup_ids` 查看指定广告的地域分布 | `area_id`, `adgroup_id`, `date` | `["area_id"]` | `adgroup_id` 可选 |
| CITY | 城市级别 | 分城市投放数据。当用户要求"分城市"、"按城市"、"城市报表"时使用 | `city_id`, `adgroup_id`, `date` | `["city_id"]` | `adgroup_id` 可选 |
| AGE | 年龄级别 | 分年龄投放数据。当用户要求"分年龄"、"按年龄"、"年龄报表"时使用 | `age`, `adgroup_id`, `date` | `["age"]` | `adgroup_id` 可选 |
| GENDER | 性别级别 | 分性别投放数据。当用户要求"分性别"、"按性别"、"性别报表"时使用 | `gender`, `adgroup_id`, `date` | `["gender"]` | `adgroup_id` 可选 |
| AOI | AOI 级别 | AOI 报表 | `aoi_id`, `adgroup_id`, `date` | `["aoi_id"]` | `adgroup_id` 可选 |
| AUDIENCE | 人群包级别 | 受众分析-人群包报表。当用户提到"人群包"、"受众分析"、"人群定向"时使用 | `audience_id`, `account_id`, `adgroup_id`, `dynamic_creative_id`, `date`, `hour` | `["audience_id", "account_id"]` | 支持多维度组合 |

> **关键参数组合规则(必须遵守,否则 report 会返回空对象)**:
>
> 0. **`order_by` 排序规则**:
>    - **脚本已自动处理默认排序**:未传 `order_by` 时,脚本自动使用 `[{"sort_field": "report.default_order_by", "sort_type": "ASCENDING"}]`。**通常不需要手动传 `order_by`**。
>    - **仅当用户明确要求排序时才传**:当用户描述中包含排序意图(如"按 XX 从高到低"、"按 XX 排序"等),按用户意图构造:
>    - 格式:`[{"sort_field": "report.xxx", "sort_type": "DESCENDING"}]`
>    - `sort_type` 枚举值:`DESCENDING`(降序,从高到低)、`ASCENDING`(升序,从低到高)
>    - 示例:用户说"按曝光量从高到低排序" → `[{"sort_field": "report.view_count", "sort_type": "DESCENDING"}]`
>    - 示例:用户说"按消耗升序" → `[{"sort_field": "report.cost", "sort_type": "ASCENDING"}]`
>    - **最多支持 2 个排序条件**
>
> 1. **`group_by` 事实上必填**:虽然协议定义为可选,但不传 `group_by` 时接口几乎不会返回有效 report 数据。每个 level 的合法值和默认值见上方 **level 数据维度与 group_by 对应表**。
>    - **`hour` 必须配 `date`**:使用 `hour` 时必须同时带 `date`(如 `["date", "hour"]` 或 `["adgroup_id", "date", "hour"]`),单独传 `hour` 不带 `date` 不会报错但数据不完整(不同天的同一小时会被合并)。
>    - **分时/按天趋势查询**:查看指定广告的分时趋势 → `group_by: ["date", "hour"]`;查看指定广告的按天趋势 → `group_by: ["date"]`;查看广告列表的每日汇总 → `group_by: ["adgroup_id", "date"]`。
>
> 2. **`filtering` 强烈推荐**:不传过滤条件时,接口可能返回空结果或无法匹配到有效数据。
>
>    **场景一:查询广告列表(无指定 adgroup_id)**— 需要完整的标准过滤(基础 3 条 + 智投/非智投条件),详见下方。
>
>    **场景二:查询指定广告 ID 的数据(如分时趋势、按天趋势)**— **只需传 `adgroup.adgroup_id` 过滤即可**,不需要加基础 3 条和智投/非智投条件,因为已经精确定位到具体广告。
>    ```json
>    [{"field": "adgroup.adgroup_id", "operator": "EQUALS", "values": ["72536365535"]}]
>    ```
>
>    **场景一的标准过滤分为基础 3 条 + 第 4 条智投/非智投区分条件**:
>

   ⚠️ **重要:`filtering` 中的过滤字段层级必须与 `level` 匹配,不同 level 使用不同的过滤字段前缀:**
   - `level` 为 `ADGROUP`、`COMPONENT` 等 → 使用 `adgroup.*` 层级过滤字段
   - `level` 为 `DYNAMIC_CREATIVE` → **混合使用**:`operation_status` 和 `brand_ad_type` 使用 `dynamic_creative.*`,`campaign_type` 使用 `adgroup.*`(见下方详细说明)
   - `level` 为 `CREATIVE_ASSET`(创意资产级别)→ 使用 `report.*` 层级过滤字段(如 `report.brand_ad_type`、`report.campaign_type`、`report.creative_asset_sub_type`),**不使用** `adgroup.*` 层级过滤
   - `level` 为 `ADVERTISER`(账户级别报表)→ 不需要也不应该传任何实体层级的过滤条件

   **基础过滤条件(仅适用于 `level` 为 `ADGROUP`/`DYNAMIC_CREATIVE`/`COMPONENT` 等实体级别时)**:

   广告层级(`level=ADGROUP`):
>    ```json
>    {"field": "adgroup.brand_ad_type", "operator": "EQUALS", "values": ["BRAND_AD_TYPE_NONE"]},
>    {"field": "adgroup.campaign_type", "operator": "EQUALS", "values": ["CAMPAIGN_TYPE_NORMAL"]}
>    ```

   创意层级(`level=DYNAMIC_CREATIVE`,注意 `brand_ad_type` 前缀变为 `dynamic_creative.*`):
>    ```json
>    {"field": "dynamic_creative.operation_status", "operator": "EQUALS", "values": ["CALCULATE_STATUS_EXCLUDE_DEL"]},
>    {"field": "dynamic_creative.brand_ad_type", "operator": "EQUALS", "values": ["BRAND_AD_TYPE_NONE"]},
>    {"field": "adgroup.campaign_type", "operator": "EQUALS", "values": ["CAMPAIGN_TYPE_NORMAL"]}
>    ```
>
>
>    > ⚠️ **`operation_status` 仅在查询广告列表或创意列表时添加,查询报表数据(如汇总统计、效果分析等纯报表场景)时不添加此条件。**
>    > 使用 `query-report.mjs` 脚本时,以上基础过滤条件**由脚本自动构建**,无需手动传入。
>
>    **`CREATIVE_ASSET` 级别的过滤条件(使用 `report.*` 字段,不使用 `adgroup.*`)**:
>    ```json
>    {"field": "report.brand_ad_type", "operator": "EQUALS", "values": ["BRAND_AD_TYPE_NONE"]},
>    {"field": "report.campaign_type", "operator": "EQUALS", "values": ["CAMPAIGN_TYPE_NORMAL"]}
>    ```
>    如需按素材子类型过滤(如只看文案描述和标题):
>    ```json
>    {"field": "report.creative_asset_sub_type", "operator": "IN", "values": ["DESCRIPTION", "TITLE"]}
>    ```
>    > ⚠️ 注意:`CREATIVE_ASSET` 级别**不需要**也**不应该**加 `adgroup.operation_status`、`adgroup.smart_delivery_platform` 等 `adgroup.*` 过滤条件。
>
>    **第 4 条:`smart_delivery_platform`(必须根据查询意图选择,同样仅适用于实体级别)**:
>
>    > ⚠️ **广告层级(ADGROUP)与创意层级(DYNAMIC_CREATIVE)使用不同的字段**:
>    > - `level=ADGROUP` → 使用 `adgroup.smart_delivery_platform`
>    > - `level=DYNAMIC_CREATIVE` → 使用 `dynamic_creative.smart_delivery_platform`
>    > - 使用 `query-report.mjs` 脚本时,脚本会根据 `level` **自动选择正确的字段**,无需手动指定。
>
>    - **查智投广告/创意**(默认,当前大部分广告都是智投广告):
>      ```json
>      {"field": "adgroup.smart_delivery_platform", "operator": "GREATER_EQUALS", "values": ["SMART_DELIVERY_PLATFORM_EDITION_SCENE"]}
>      ```
>      或(创意层级):
>      ```json
>      {"field": "dynamic_creative.smart_delivery_platform", "operator": "GREATER_EQUALS", "values": ["SMART_DELIVERY_PLATFORM_EDITION_SCENE"]}
>      ```
>    - **查非智投广告/创意**(用户明确要求查非智投/竞价广告时):
>      ```json
>      {"field": "adgroup.smart_delivery_platform", "operator": "LESS", "values": ["SMART_DELIVERY_PLATFORM_EDITION_SCENE"]}
>      ```
>      或(创意层级):
>      ```json
>      {"field": "dynamic_creative.smart_delivery_platform", "operator": "LESS", "values": ["SMART_DELIVERY_PLATFORM_EDITION_SCENE"]}
>      ```

>    **⚠️ 智投和非智投不能在同一次请求中混合查询,每次请求只能查其中一种。**
>
>    **意图判断规则**:
>    - 用户说"查非智投广告"、"查常规广告"、"查老广告"、"不含智投"、"排除智投"、"竞价广告"、"只看竞价"、"不含智投项目" → 查**常规广告(非智投)**(`LESS`),只需一次请求
>    - 用户说"查智投广告"、"智投项目"、"智投报表" → 查**智投广告**(`GREATER_EQUALS`),只需一次请求
>    - 用户说"两种都看"、"智投和非智投都要" → 先查**智投广告**(`GREATER_EQUALS`),再查**常规广告(非智投)**(`LESS`),共两次请求(顺序发,不要并行)
>    - **⚠️ 如果意图不确定(用户未明确指定智投或非智投),应发两次请求:先智投 `GREATER_EQUALS`,再非智投 `LESS`,以保证最终数据的准确性和完整性**
>
> 3. **`fields` 必须包含所需字段**:
>    - **查询广告列表时**:`fields` 必须同时包含属性字段(如 `adgroup.adgroup_id`、`adgroup.adgroup_name`)和报表字段(如 `report.cost`),否则 report 会返回空对象。
>    - **查询指定广告的分时/按天趋势时**:`fields` **只需包含用户关心的报表指标即可**(如 `["report.view_count", "report.view_user_count"]`),不需要额外加 `adgroup.*` 属性字段和 `account_id`,因为已经通过 filtering 精确定位到了具体广告。
>    - **实体级别查询**(`level` 为 `ADGROUP`、`DYNAMIC_CREATIVE`、`COMPONENT` 等):必须**同时包含属性字段和报表字段**,仅请求 `report.*` 字段而不请求对应的属性字段(如 `adgroup.adgroup_id`)会导致 report 返回空。应**同时请求** `adgroup.*` 和 `report.*` 字段。
>    - **账户级别查询**(`level` 为 `ADVERTISER`):查询的是账户维度汇总报表,**只需传用户关心的 `report.*` 报表字段即可,不需要也不应该传 `account_id`、`adgroup.*` 等属性字段**,否则会导致参数冗余。
       >      - ✅ 正确:`"fields": ["report.view_count", "report.cost"]`
>      - ❌ 错误:`"fields": ["account_id", "report.view_count", "report.cost"]`
>
> 4. **`is_total` 的正确用法**:
>    - `is_total: false`(默认)= 返回**逐条明细数据**(每个广告/创意一行),**这是最常用的模式**
>    - `is_total: true` = 返回**全账户汇总**(所有广告合并为一条),此时仍需传 `group_by`、`filtering` 和 `fields`(包含属性+报表字段)
>    - **查询广告列表时请使用 `is_total: false`**
>
> 5. **`date_range` vs `adgroup.created_time`:两套独立系统,含义完全不同**
>
>    本接口底层由两个独立系统协同工作:
>    - **报表系统**:负责 `report.*` 字段的统计数据,由 `date_range` 控制统计区间
>    - **adindex(广告实体索引)**:负责返回哪些广告/创意实体,由 `filtering` 中的 `adgroup.created_time` 等条件控制
>
>    | 用途 | 参数 | 示例 |
>    |------|------|------|
>    | 控制报表指标的统计时间窗口 | `date_range` | `{"start_date":"2026-03-01","end_date":"2026-03-27"}` |
>    | 筛选某段时间内**创建**的广告/项目 | `filtering` 中 `adgroup.created_time` | `{"field":"adgroup.created_time","operator":"GREATER_EQUALS","values":["2026-03-20 00:00:00"]}` |
>
>    **⚠️ 关键区别**:
>    - `date_range` **不是**广告的创建时间,也不是投放时间,是**报表统计窗口**
>    - 如果某广告在 `date_range` 范围内没有消耗/曝光,`report.*` 字段会返回空,但广告实体本身仍然存在
>    - 只查广告/项目实体信息(不关心消耗数据)时,`date_range` 设为任意有效时间段即可(通常用近期时间)
>
>    **意图判断规则(模型必须遵守)**:
>
>    | 用户说的 | 正确做法 |
>    |---------|---------|
>    | "最近一周的消耗数据" / "最近7天的报表" | `date_range` = 最近7天,不加 `created_time` 过滤 |
>    | "最近一周内创建的广告/项目" | `date_range` = 当天(或近期),`filtering` 加 `adgroup.created_time` >= 7天前的时间戳 |
>    | **"最近一周的广告/项目/创意"(无效果指标词)** | **同"创建"处理:`date_range` = 当天,`filtering` 加 `adgroup.created_time` 范围,走路径 B** |
>    | "最近一周内创建且有投放数据的广告" | `date_range` = 最近7天,`filtering` 同时加 `adgroup.created_time` 范围 |
>    | "查看某个项目的历史数据" | `date_range` = 目标历史时间段,`filtering` 加 `adgroup.adgroup_id` |
>
>    **`created_time` 时间格式**:值为 `YYYY-MM-DD HH:mm:ss` 格式字符串(如 `"2026-03-21 00:00:00"`),脚本内部自动转为 API 所需的 Unix 时间戳。
>    ```json
>    // 示例:筛选 2026-03-21 00:00:00 ~ 2026-03-27 23:59:59 创建的项目
>    {"field": "adgroup.created_time", "operator": "GREATER_EQUALS", "values": ["2026-03-21 00:00:00"]},
>    {"field": "adgroup.created_time", "operator": "LESS_EQUALS",    "values": ["2026-03-27 23:59:59"]}
>    ```
>
> 6. **`report_only` 默认不要传**:`report_only: true` 表示仅查报表指标数据、不返回实体属性(广告名称、状态等)。只有在用户明确只需要效果数据(如"今天总消耗多少")而不关心广告属性时才设为 `true`。**大多数查询都需要同时看到广告属性和报表数据,因此默认不传或设为 `false`。**

### time_line 时间口径枚举值

| 值 | 说明 |
|----|------|
| REQUEST_TIME | 广告播放口径(默认) |
| REPORTING_TIME | 转化回传口径 |
| ACTIVE_TIME | 激活时间口径 |

## 过滤条件(filtering)

### filtering 结构

```json
{
  "field": "过滤字段",
  "operator": "操作符",
  "values": ["值1", "值2"]
}
```

### 常用过滤字段

#### 广告层级(adgroup.*)

| 字段 | 说明 | 支持的操作符 |
|------|------|-------------|
| adgroup.adgroup_id | 广告 ID | EQUALS, IN |
| adgroup.fuzzy_name | 广告名称模糊搜索 | EQUALS |
| adgroup.operation_status | 运营状态 | EQUALS, IN |
| adgroup.system_status | 系统状态 | EQUALS, IN |
| adgroup.configured_status | 配置状态 | EQUALS, IN |
| adgroup.site_set | 版位 | EQUALS, IN, HAS_ANY |
| adgroup.created_time | 创建时间 | LESS, LESS_EQUALS, GREATER, GREATER_EQUALS |
| adgroup.campaign_type | 推广类型 | EQUALS |
| adgroup.brand_ad_type | 品牌广告类型 | EQUALS |
| adgroup.smart_delivery_platform | 智投平台版本 | EQUALS, IN, LESS, GREATER_EQUALS |
| adgroup.begin_date | 开始日期 | 时间戳操作符 |
| adgroup.end_date | 结束日期 | 时间戳操作符 |
| adgroup.optimization_goal | 优化目标 | - |
| adgroup.deep_optimization_goal | 深度优化目标 | - |

#### 动态创意层级(dynamic_creative.*)

| 字段 | 说明 | 支持的操作符 |
|------|------|-------------|
| dynamic_creative.dynamic_creative_id | 创意 ID | EQUALS, IN |
| dynamic_creative.fuzzy_name | 创意名称模糊搜索 | EQUALS |
| dynamic_creative.adgroup_id | 所属广告 ID | EQUALS, IN |
| dynamic_creative.operation_status | 运营状态(用于创意列表过滤,值同 adgroup.operation_status) | EQUALS, IN |
| dynamic_creative.system_status | 系统状态(见下方枚举值说明) | EQUALS, IN |
| dynamic_creative.delivery_mode | 投放模式:`DELIVERY_MODE_COMPONENT`(组件化创意)/`DELIVERY_MODE_CUSTOM`(自定义创意) | EQUALS, IN |
| dynamic_creative.source | 创意类型来源:`AD_CREATIVE_SOURCE_NORMAL`(客户自建创意)/`AD_CREATIVE_SOURCE_AUTO`(妙思自动生成) | EQUALS, IN |
| dynamic_creative.smart_delivery_platform | 智投平台版本(创意层级的智投/非智投区分,值同 adgroup.smart_delivery_platform) | EQUALS, IN, LESS, GREATER_EQUALS |
| dynamic_creative.created_time | 创建时间(Unix 时间戳) | LESS, LESS_EQUALS, GREATER, GREATER_EQUALS |
| dynamic_creative.brand_ad_type | 品牌广告类型 | EQUALS |

**`dynamic_creative.system_status` 枚举值说明**:

> 竞价广告(非智投)下的创意与智投项目下的创意,system_status 枚举值不同:

| 枚举值 | 适用场景 | 说明 |
|--------|---------|------|
| `DYNAMIC_CREATIVE_STATUS_PENDING` | 竞价广告创意 | 审核中 |
| `DYNAMIC_CREATIVE_STATUS_ACTIVE` | 竞价广告创意 | 投放中 |
| `DYNAMIC_CREATIVE_STATUS_SUSPEND` | 竞价广告创意 | 暂停 |
| `DYNAMIC_CREATIVE_STATUS_AUDIT_FAILED` | 竞价广告创意 | 审核不通过 |
| `DYNAMIC_CREATIVE_STATUS_DELETED` | 竞价广告创意 | 已删除 |
| `SMART_DYNAMIC_CREATIVE_STATUS_USING` | 智投项目创意 | 启用中 |
| `SMART_DYNAMIC_CREATIVE_STATUS_SUSPEND` | 智投项目创意 | 已暂停 |
| `SMART_DYNAMIC_CREATIVE_STATUS_DELETED` | 智投项目创意 | 已删除 |

#### 组件层级(component.*)

| 字段 | 说明 | 支持的操作符 |
|------|------|-------------|
| component.component_id | 组件 ID | EQUALS, IN, NOT_IN |
| component.component_type | 组件类型 | EQUALS, IN |
| component.fuzzy_name | 组件名称模糊搜索 | EQUALS |
| component.component_sub_type | 组件子类型 | EQUALS, IN |
| component.approval_status | 审核状态 | EQUALS, IN |
| component.operation_status | 运营状态 | EQUALS, IN |
| component.created_time | 创建时间(`YYYY-MM-DD HH:mm:ss` 格式,脚本自动转时间戳) | 时间操作符 |
| component.generation_type | 生成类型 | EQUALS, IN |
| component.quality_status | 质量状态 | EQUALS, IN |
| component.potential_status | 潜力状态 | EQUALS, IN |
| component.shared_account_id | 共享账户 ID | EQUALS, IN |
| component.scene | 场景 | EQUALS, IN |

#### 报表层级(report.*)

| 字段 | 说明 | 支持的操作符 |
|------|------|-------------|
| report.adgroup_id | 广告 ID | EQUALS, IN |
| report.dynamic_creative_id | 创意 ID | EQUALS, IN |
| report.component_id | 组件 ID | EQUALS, IN |
| report.component_type | 组件类型 | EQUALS, IN |
| report.image_id | 图片 ID | EQUALS, IN |
| report.video_id | 视频 ID | EQUALS, IN |
| report.marketing_asset_id | 产品 ID | EQUALS, IN |
| report.marketing_target_type | 营销目标类型 | EQUALS, IN |
| report.audience_id | 人群 ID | EQUALS, IN |
| report.landing_page_id | 落地页 ID | EQUALS, IN |
| report.brand_ad_type | 品牌广告类型 | EQUALS |
| report.campaign_type | 推广类型 | - |
| report.smart_delivery_platform | 智投平台版本 | EQUALS, IN, LESS, GREATER_EQUALS |
| report.creative_asset_id | 创意资产 ID | EQUALS, IN |

#### 素材层级

| 字段 | 说明 | 支持的操作符 |
|------|------|-------------|
| image.image_id | 图片 ID | EQUALS, IN |
| image.label_name | 图片标签 | EQUALS |
| video.video_id | 视频 ID | EQUALS, IN |
| video.label_name | 视频标签 | EQUALS |

#### 产品层级(marketing_asset.*)

| 字段 | 说明 | 支持的操作符 |
|------|------|-------------|
| marketing_asset.marketing_asset_id | 产品 ID | EQUALS, IN |
| marketing_asset.marketing_target_type | 营销目标类型 | EQUALS, IN |
| marketing_asset.fuzzy_name | 产品名称模糊搜索 | EQUALS |

### 后置过滤条件(post_filtering)

用于基于报表指标数值进行筛选,在数据返回后过滤。

支持的过滤字段:
- `report.cost` - 消耗
- `report.view_count` - 展示量
- `report.valid_click_count` - 有效点击量
- `report.conversions_count` - 转化数
- `report.conversions_cost` - 转化成本
- `report.conversions_rate` - 转化率

### 操作符说明

| 操作符 | 说明 |
|--------|------|
| EQUALS | 等于(单值匹配) |
| IN | 在列表中(多值匹配) |
| NOT_IN | 不在列表中 |
| LESS | 小于 |
| LESS_EQUALS | 小于等于 |
| GREATER | 大于 |
| GREATER_EQUALS | 大于等于 |
| CONTAINS | 包含 |
| HAS_ANY | 数组包含任意值 |

## 响应结构

```json
{
  "data": {
    "list": [
      {
        "account_id": 39412855,
        "account": { ... },
        "adgroup": {
          "adgroup_id": 123456,
          "adgroup_name": "广告名称",
          "configured_status": "AD_STATUS_NORMAL",
          "system_status": "ADGROUP_STATUS_NORMAL",
          ...
        },
        "dynamic_creative": { ... },
        "component": { ... },
        "bidword": { ... },
        "report": {
          "cost": 10000,
          "view_count": 50000,
          "valid_click_count": 1200,
          "ctr": "2.40",
          "conversions_count": 100,
          "conversions_cost": 10000,
          ...
        },
        "image": { ... },
        "media": { ... },
        "video": { ... },
        "marketing_asset": { ... },
        "joint_budget_rule": { ... },
        "product_catalog": { ... },
        "project_creative": { ... },
        "video_aggregation": { ... },
        "creative_asset": { ... },
        "jump_info": { ... }
      }
    ],
    "page_info": {
      "page": 1,
      "page_size": 20,
      "total_number": 150,
      "total_page": 8
    },
    "update_time": "2025-11-29 10:30:00"
  }
}
```

### list 每项返回结构

| 字段 | 类型 | 说明 |
|------|------|------|
| account_id | integer | 广告主帐号 ID |
| account | struct | 账户信息 |
| adgroup | struct | 广告属性(google_struct 动态字段) |
| dynamic_creative | struct | 动态创意属性 |
| component | struct | 组件属性 |
| bidword | struct | 竞价词属性 |
| report | struct | **报表指标数据**(google_struct 动态字段) |
| image | struct | 图片素材信息 |
| media | struct | 媒体信息 |
| video | struct | 视频素材信息 |
| marketing_asset | struct | 产品资产信息 |
| joint_budget_rule | struct | 联合预算规则信息 |
| product_catalog | struct | 商品信息 |
| project_creative | struct | 项目创意信息 |
| video_aggregation | struct | 视频聚合信息 |
| creative_asset | struct | 创意资产信息 |
| jump_info | struct | 跳转信息 |

## 常用 fields 字段

### 广告属性字段(adgroup.*)

| 字段 | 说明 |
|------|------|
| adgroup.adgroup_id | 广告 ID |
| adgroup.adgroup_name | 广告名称 |
| adgroup.is_deleted | 是否已删除 |
| adgroup.status | 广告状态 |
| adgroup.status_cn | 广告状态中文 |
| adgroup.configured_status | 配置状态(开/关) |
| adgroup.adgroup_status | 广告投放状态 |
| adgroup.system_status | 系统状态 |
| adgroup.system_status_cn | 系统状态中文 |
| adgroup.system_status_tips | 系统状态提示 |
| adgroup.optimization_goal | 优化目标 |
| adgroup.optimization_goal_cn | 优化目标中文 |
| adgroup.marketing_goal | 营销目的 |
| adgroup.marketing_goal_cn | 营销目的中文 |
| adgroup.marketing_target_type | 营销目标类型 |
| adgroup.marketing_target_type_cn | 营销目标类型中文 |
| adgroup.marketing_carrier_type | 营销载体类型 |
| adgroup.marketing_carrier_type_cn | 营销载体类型中文 |
| adgroup.promoted_object_type | 推广目标类型 |
| adgroup.promoted_object_type_cn | 推广目标类型中文 |
| adgroup.total_budget | 总预算 |
| adgroup.daily_budget | 日预算 |
| adgroup.bid_amount | 出价金额 |
| adgroup.bid_mode | 竞价模式 |
| adgroup.bid_scene | 竞价场景 |
| adgroup.billing_event | 计费事件 |
| adgroup.buying_type | 购买类型 |
| adgroup.begin_date | 开始日期 |
| adgroup.end_date | 结束日期 |
| adgroup.site_set | 版位 |
| adgroup.site_set_cn | 版位中文 |
| adgroup.smart_delivery_platform | 智投平台版本 |
| adgroup.smart_delivery_scene | 智投场景 |
| adgroup.smart_bid_type | 出价方式 |
| adgroup.smart_bid_type_cn | 出价方式中文 |
| adgroup.targeting_translation | 定向翻译 |
| adgroup.time_series | 投放时段 |
| adgroup.deep_conversion_spec | 深度转化规格 |
| adgroup.joint_budget_rule_id | 联合预算规则 ID |
| adgroup.marketing_asset_id | 营销资产 ID |
| adgroup.flow_lock_status | 锁量状态 |
| adgroup.exploration_strategy | 自动版位探索策略 |
| adgroup.automatic_site_enabled | 自动版位是否开启 |
| adgroup.dynamic_creative_id | 动态创意 ID |
| adgroup.placement_group_id | 版位组 ID |
| adgroup.display_id | 展示 ID |
| adgroup.adgroup_operation | 广告操作信息 |
| adgroup.ad_count | 广告数量 |
| adgroup.date_set | 日期设置 |
| adgroup.negative_word_cnt | 否定词数量 |
| adgroup.dynamic_ad_type | 动态广告类型 |
| adgroup.dynamic_ad_type_text | 动态广告类型文本 |
| adgroup.dynamic_creative_status_info | 动态创意状态信息 |
| adgroup.adcreative_preview_list | 创意预览列表 |
| adgroup.created_by_industry_platform | 行业平台创建标识 |
| adgroup.ad_created_source | 广告创建来源 |
| adgroup.search_intelligent_extension | 搜索智能拓展 |
| adgroup.live_video_mode | 直播视频模式 |
| adgroup.live_video_sub_mode | 直播视频子模式 |

### 报表指标字段(report.*)

> **完整字段列表见下方「字段字典参考 → 报表指标字典」**,此处仅列举最常用的字段:

**基础效果指标:**

| 字段 | 说明 |
|------|------|
| report.cost | 消耗(分) |
| report.view_count | 曝光量/展示量 |
| report.valid_click_count | 点击量/有效点击量 |
| report.ctr | 点击率(%) |
### 其他常用字段

| 字段 | 说明 |
|------|------|
| account_id | 广告主帐号 ID |

## 通用参数说明

以下公共约定由构建阶段自动内联:

以下内容为腾讯广告营销 API(`api.e.qq.com`)各 skill 共享的公共约定,会在构建阶段自动内联到目标 skill 文档中。各 skill 不需要重复这些内容。

## 基础信息

- **Base URL**: `https://api.e.qq.com`
- **认证方式**: API Key 鉴权(api.e.qq.com),授权请使用 `tencentads auth login`,状态查看使用 `tencentads auth status`
- **权限要求**: 需登录api.e.qq.com 并具有对应账户操作权限
- **时区**: GMT+8(北京时间)
- **金额单位**: 分(不是元),示例:`10000` 分 = `100` 元人民币
- **时间戳**: API 底层为秒级 Unix timestamp,但脚本统一使用 `YYYY-MM-DD HH:mm:ss` 格式(如 `"2026-03-18 00:00:00"`),脚本内部自动完成格式转换

## 调用方式

所有接口均通过 `tencent-ads` CLI 工具调用(agent 通过 bash 执行)。API Key 鉴权由 CLI 自动处理(通过 X-MKT-API-Key header),无需手动传入。

### GET 请求

```bash
tencentads-cli api '{
  "method": "GET",
  "path": "/v3.0/xxx/get",
  "account_id": "YOUR_ACCOUNT_ID",
  "params": {"page": 1, "page_size": 10}
}'
```

### POST 请求

```bash
tencentads-cli api '{
  "method": "POST",
  "path": "/v3.0/xxx/add",
  "account_id": "YOUR_ACCOUNT_ID",
  "body": {"account_id": 12345, "field1": "value1"}
}'
```

### 参数说明

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| method | string | 否 | GET 或 POST(默认 GET) |
| path | string | **是** | API 路径 |
| account_id | string | **是** | 广告账户 ID |
| params | object | 否 | GET 查询参数(JSON 对象) |
| body | object | 否 | POST 请求体(JSON 对象) |

> **严格规则**:调用任何接口时,**必须严格使用该接口文档中声明的 HTTP 方法(GET / POST)**,不得擅自更改。使用错误的请求方法会导致服务端返回 `405 Method Not Allowed`。

## 通用响应格式

所有接口返回的 JSON 响应都遵循以下格式:

```json
{
  "code": 0,
  "message": "",
  "message_cn": "",
  "data": {
    // 接口特定的响应数据
  }
}
```

| 字段 | 类型 | 说明 |
|------|------|------|
| code | integer | 响应码,0 表示成功,非 0 表示错误 |
| message | string | 英文错误消息(成功时为空) |
| message_cn | string | 中文错误消息(成功时为空) |
| data | object | 响应数据对象 |

## 错误处理

`tencentads-cli api` 返回的 JSON 响应中包含 `code` 字段:
- `code` 为 0 表示成功
- `code` 非 0 时,检查 `message_cn` 获取中文错误说明

### 常见错误码

| 错误码 | 说明 | 处理方式 |
|--------|------|----------|
| 0 | 成功 | - |
| 3 | 参数错误 | 检查请求参数格式和必填项 |
| 5 | 权限不足 | 确认 API Key 有效且具有相应权限 |
| 6 | 系统错误 | 重试或联系技术支持 |
| 1001 | `timestamp` 超时 | 确保请求时间戳在当前时间 ±300 秒内 |
| 1002 | `nonce` 重复 | 使用新的随机字符串 |

## 数值单位说明

### 金额单位
- 所有涉及金额的字段(出价、预算等)单位均为**分**(不是元)
- 示例:`10000` 分 = `100` 元人民币
- 日预算范围:5000-400000000 分(50 元-400 万元)

### 时间单位
- 时间字段(`created_time`、`last_modified_time`、`completed_time`):统一使用 `YYYY-MM-DD HH:mm:ss` 格式(如 `"2026-03-18 00:00:00"`),脚本内部自动与 API 的 Unix 时间戳互转
- 日期格式:`YYYY-MM-DD`
- 时间格式:`HH:ii:ss`
- 时区:`GMT+8`(北京时间)

## 分页参数

大多数列表查询接口支持以下分页参数:

### 标准分页

| 参数名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| page | integer | 1 | 页码(1-100) |
| page_size | integer | 10 | 每页数量(1-100) |

### 游标分页

| 参数名 | 类型 | 说明 |
|--------|------|------|
| pagination_mode | enum | 分页方式:`PAGINATION_MODE_NORMAL`(标准)/ `PAGINATION_MODE_CURSOR`(游标) |
| cursor | string | 游标值,有效期 24 小时 |

### 分页响应

```json
{
  "page_info": {
    "page": 1,
    "page_size": 10,
    "total_number": 100,
    "total_page": 10
  }
}
```

## 过滤参数

大多数查询接口支持 `filtering` 参数进行条件过滤:

### filtering 结构

```json
{
  "filtering": [
    {
      "field": "字段名",
      "operator": "操作符",
      "values": ["值1", "值2"]
    }
  ]
}
```

### 操作符说明

| 操作符 | 说明 | 示例 |
|--------|------|------|
| EQUALS | 等于 | `{"field": "status", "operator": "EQUALS", "values": ["NORMAL"]}` |
| CONTAINS | 模糊匹配 | `{"field": "name", "operator": "CONTAINS", "values": ["测试"]}` |
| LESS | 小于 | `{"field": "created_time", "operator": "LESS", "values": ["2026-04-01 00:00:00"]}` |
| LESS_EQUALS | 小于等于 | `{"field": "created_time", "operator": "LESS_EQUALS", "values": ["2026-04-01 23:59:59"]}` |
| GREATER | 大于 | `{"field": "created_time", "operator": "GREATER", "values": ["2026-03-01 00:00:00"]}` |
| GREATER_EQUALS | 大于等于 | `{"field": "created_time", "operator": "GREATER_EQUALS", "values": ["2026-03-01 00:00:00"]}` |
| IN | IN 操作符 | `{"field": "id", "operator": "IN", "values": ["1", "2", "3"]}` |

## 最佳实践

1. **请求方法**:严格按照各接口文档声明的 HTTP 方法(GET/POST)发起请求,不得混用
2. **错误处理**:始终检查响应中的 `code` 字段
3. **重试机制**:对于系统错误(`code = 6`),可以实施指数退避重试
4. **API Key 如失效需重新配置
5. **分页处理**:对于大数据量查询,使用游标分页性能更好
6. **字段筛选**:使用 `fields` 参数只请求需要的字段,减少数据传输

## 字段字典参考

以下字典由构建阶段自动内联,包含所有可用字段的完整定义。

> **🚫 强制规则:遇到不在常用映射表中的字段名时,必须先查字典,禁止猜测!**
>
> 用户描述中提到的字段名称往往与 API 实际字段名差异很大,例如:
> - "AIGC 创意" → `smart_delivery_aigc_option`(而非 `aigc_creative`)
> - "锁量" → `flow_lock_status`(而非 `lock_status`)
> - "关注数" → `scan_follow_user_count`(而非 `wechat_official_account_follower_count`)
> - "5秒播放数" → 需查字典确认(而非 `video_play_5s_count`)
>
> 本文档不可能穷举所有字段,但 `adgroup-fields.json`(236 个字段)和 `report-fields.json`(854 个字段)中有完整的字段定义。
>
> **强制做法**:当用户提到的字段**不在上方「常用报表字段映射」或「常用 fields 字段」表中**时,**必须先用 `--query-fields` 查询字段字典**,确认正确字段名后再构造请求。**绝对禁止根据英文命名规律自行拼凑字段名。**
>
> 示例:用户说"帮我查询最近一周开启 AIGC 的广告"
> 1. 先查字典:`node scripts/query-adgroups.mjs --query-fields "aigc"`
> 2. 得到匹配字段(如 `smart_delivery_aigc_option`、`smart_delivery_aigc_creative` 等)
> 3. 再用正确的字段名构造查询请求的 `fields` 或 `filtering` 参数
>
> 示例:用户说"查看5秒播放数、关注数、关注成本"
> 1. 这些指标不在常用映射表中 → **必须查字典**
> 2. 执行:`node scripts/query-report.mjs --query-fields "5秒播放,关注"`
> 3. 从返回结果中确认准确字段名,再构造 `fields` 参数

### 广告字段字典(adgroup.*)

广告字段定义存储在 `resources/adgroup-fields.json` 中(共 236 个字段,按分类组织:定向设置、广告基本信息、营销配置、投放时间与预算、出价与优化、深度优化、一键起量、版位与场景定向、创意相关、转化与数据源、搜索定向、动态广告、其他、智投项目专有、报表广告维度属性、分页)。

**查询方式**:通过 `query-adgroups.mjs --query-fields [关键词]` 获取字段定义。

| 用法 | 说明 |
|------|------|
| `query-adgroups.mjs --query-fields` | 返回全部广告字段(字段名、类型、中文名、分类、说明) |
| `query-adgroups.mjs --query-fields "定向"` | 按分类/中文名过滤,返回定向相关字段 |
| `query-adgroups.mjs --query-fields "bid"` | 按字段名过滤,返回包含 bid 的字段 |
| `query-adgroups.mjs --query-fields "出价,预算,定向"` | 多关键词批量查询,逗号分隔,匹配任意一个即返回 |

**自动中文名附加**:`query-adgroups.mjs` 查询广告数据时,返回的每个字段自动附加中文名(如 `adgroup_name: "xxx"` 旁会有 `广告名称: "xxx"`),无需手动翻译。

### 报表指标字典(report.*)

报表指标字段定义存储在 `resources/report-fields.json` 中(共 854 个字段,按分类组织)。

**查询方式**:通过 `query-report.mjs --query-fields [关键词]` 获取字段定义。

| 用法 | 说明 |
|------|------|
| `query-report.mjs --query-fields` | 返回全部报表指标字段(字段名、类型、中文名、分类、说明) |
| `query-report.mjs --query-fields "视频"` | 按分类/中文名过滤,返回视频相关字段 |
| `query-report.mjs --query-fields "cost"` | 按字段名过滤,返回包含 cost 的字段 |
| `query-report.mjs --query-fields "cost,click,impression"` | 多关键词批量查询,逗号分隔,匹配任意一个即返回 |

> **⚠️ 强制使用场景**:只要用户提到的报表指标**不在「常用报表字段映射」表中**,就**必须**先用 `--query-fields` 查询字段字典,确认正确的 `report.*` 字段名后再构造查询请求。这是强制步骤,不可跳过。

## 分页信息

| 字段名 | 类型 | 中文名称 | 说明 |
|--------|------|----------|------|
| page_info | struct | 分页配置信息 | |
| page | integer | 搜索页码 | 默认值:1 |
| page_size | integer | 一页显示的数据条数 | 默认值:10 |
| total_number | integer | 总条数 | |
| total_page | integer | 总页数 | |

## 注意事项

1. **请求方式**: 该接口使用 **POST** 方法,参数放在请求体中(非 URL 参数)。

2. **fields 字段格式**: fields 中的字段使用 `对象.属性` 的格式,如 `adgroup.adgroup_id`、`report.cost`。顶层的 `account_id` 不带前缀。
   - **查询广告列表时**:fields 必须同时包含属性字段(如 `adgroup.*`)和报表字段(`report.*`),否则 report 会返回空对象。
   - **查询指定广告的分时/按天趋势时**:fields 只需包含用户关心的 `report.*` 指标即可。

3. **金额单位**: 所有金额字段单位为**分**。
   - 示例:`report.cost = 10000` 表示消耗 100 元
   - `adgroup.total_budget = 100000` 表示预算 1000 元

4. **日期范围**: 最早支持查询近 365 天的数据。`start_date` ≤ `end_date`,格式 `YYYY-MM-DD`。当天和昨天的日期均可使用。

5. **分页**: 支持大页面(page_size 最大 99999999),但建议按需设置合理的分页大小。数据量大时注意响应时间。

6. **report_only(慎用)**: 设为 `true` 时表示**仅查报表指标数据,不返回实体属性数据**(广告名称、状态、预算、出价等业务字段都不会返回)。适用场景:用户只需要效果数据(消耗、点击、转化等)而不关心广告属性信息,如纯数据汇总统计。**查询广告列表时应使用默认值 `false`(或不传此参数)**,以同时获取广告属性和报表数据。

> 7. **`group_by`(关键)**: 聚合参数决定了数据的汇总维度。**不传 group_by 会导致 report 返回空对象**。每个 level 的合法值和默认值见 **level 数据维度与 group_by 对应表**。

8. **二维过滤(or_filtering)**: 支持 OR 逻辑组合过滤。外层数组为 OR 关系,内层 `and_filtering` 数组为 AND 关系。

9. **常见的返回空数据原因排查**:
   - **`list` 返回空数组(`total_number: 0`)**:
     - **缺少 `smart_delivery_platform` 过滤或方向错误**(最常见原因)→ 智投和非智投必须分开查。**默认应用 `LESS`(查常规广告/非智投)。** 若用户明确要求查智投,用 `GREATER_EQUALS`。
     - 使用了 `report_only: true` 导致不返回实体属性数据 → **去掉 `report_only` 或设为 `false`**
     - `filtering` 其他条件过于严格 → 先用基础 3 条 + 智投/非智投过滤查询
   - **`report` 返回空对象(`report: {}`)**:
     - 缺少 `group_by` 参数 → 加上 `"group_by": ["adgroup_id"]`(列表查询)或 `["date", "hour"]`(分时查询)
     - 查询广告列表时缺少 `filtering` 参数 → 至少加上基础 3 条过滤 + 智投/非智投条件
     - 查询广告列表时 `fields` 只有 `report.*` 没有 `adgroup.*` → 补充属性字段
   - **以上各项需同时正确才能返回有效数据**

10. **🚫 禁止重复调用(极其重要)**:
    - **脚本调用成功返回了 `list` 数据(即使所有指标值为 0),说明参数正确、接口正常,应直接使用返回数据向用户展示,绝不要因为数据值全为 0 而反复修改参数重试。**
    - 数据值为 0 是正常的业务情况(如该日期没有投放、没有消耗等),不代表参数有误。
    - **区分"接口报错"和"数据为零"**:
      - 接口报错(返回 `error` 字段、HTTP 错误等)→ 检查参数后可重试 **1 次**
      - `list` 返回空数组(`total_number: 0`)→ 可按第 9 条排查后重试 **1 次**
      - `list` 有数据但 `report` 中的值为 0 → **这是正常结果,直接使用,禁止重试**
    - **严禁以下行为**:反复调整 `group_by`、`level`、`fields`、`is_total` 等参数尝试"修复"数据;绕过脚本直接调用底层 API;查看脚本源码试图排查问题。这些行为浪费大量步骤且不会改变结果。

---

## 脚本:query-adgroups.mjs

> **广告详情查询脚本**,用于获取广告的完整配置信息。

### 适用场景

- 需要查看广告的**详细配置**(定向、出价、转化规格、版位、投放时段等),而不仅是基本属性和报表数据
- 需要查看**已删除的广告**信息
- 需要根据**广告名称、状态、创建时间**等条件筛选广告
- 需要获取广告的**定向设置详情**(地域、年龄、性别、设备等)
- 需要查看广告的**深度转化规格**、**用户行为数据源**等高级配置

### 与 query-report.mjs 的区别

| 对比项 | query-report.mjs | query-adgroups.mjs |
|--------|-----------------|-------------------|

| 返回报表数据 | ✅ 返回消耗、曝光、点击等报表指标 | ❌ 不返回报表数据 |
| 返回配置详情 | ⚠️ 仅返回基本属性 | ✅ 返回完整配置(定向、出价、转化、版位等) |
| 需要日期范围 | ✅ 必填 | ❌ 不需要 |
| 支持跨账户 | ✅ 支持 | ❌ 单账户 |
| 查看已删除广告 | ❌ 不支持 | ✅ 支持 |
| 支持游标分页 | ❌ | ✅ 支持 |

### 调用方式

```bash
node scripts/query-adgroups.mjs '<JSON 参数>'
```

### 参数说明

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `account_id` | string | **是** | 广告主账号 ID |
| `tencent_ads_type` | enum | 否 | 广告实体类型,**枚举值只允许 `"smart"` / `"standard"` / `"all"` 三者之一**,默认 `"all"`。详见步骤 1.5 |
| `adgroup_ids` | string[] | 否 | 指定广告 ID 列表(按 ID 精确查询) |
| `fields` | string[] | 否 | 自定义返回字段(不传则使用默认字段集) |
| `filtering` | struct[] | 否 | 过滤条件数组 |
| `page` | integer | 否 | 页码,默认 1(最大 100) |
| `page_size` | integer | 否 | 每页条数,默认 10(最大 100) |
| `is_deleted` | boolean | 否 | 是否查询已删除广告,默认 false |
| `pagination_mode` | enum | 否 | 分页方式:`PAGINATION_MODE_NORMAL`(默认)/ `PAGINATION_MODE_CURSOR` |
| `cursor` | string | 否 | 游标值(配合游标分页模式使用) |

### 过滤条件(filtering)

| 字段 | 说明 | 支持的操作符 |
|------|------|-------------|
| `adgroup_id` | 广告 ID | EQUALS, IN(IN 时最多 100 个) |
| `adgroup_name` | 广告名称 | CONTAINS |
| `created_time` | 创建时间(`YYYY-MM-DD HH:mm:ss` 格式,脚本自动转时间戳) | GREATER, LESS, GREATER_EQUALS, LESS_EQUALS |
| `last_modified_time` | 最后修改时间(`YYYY-MM-DD HH:mm:ss` 格式,脚本自动转时间戳) | GREATER, LESS, GREATER_EQUALS, LESS_EQUALS |
| `configured_status` | 客户设置的状态 | EQUALS, IN |
| `material_package_id` | 素材包 ID | EQUALS |
| `joint_budget_rule_id` | 联合预算规则 ID | EQUALS |
| `auto_derived_creative_enabled` | 创意增强 MAX 开关 | EQUALS |
| `rta_target_id` | RTA 目标 ID | EQUALS |

### 使用示例

#### 1. 查询指定广告 ID 的详情(最常用)

```bash
node scripts/query-adgroups.mjs '{"account_id":"39412855","adgroup_ids":["72536365535"]}'
```

#### 2. 查询账户下所有广告列表

```bash
node scripts/query-adgroups.mjs '{"account_id":"39412855"}'
```

#### 3. 查询指定返回字段

```bash
node scripts/query-adgroups.mjs '{"account_id":"39412855","fields":["adgroup_id","adgroup_name","configured_status","targeting","bid_amount","daily_budget"]}'
```

#### 4. 根据广告名称模糊搜索

```bash
node scripts/query-adgroups.mjs '{"account_id":"39412855","filtering":[{"field":"adgroup_name","operator":"CONTAINS","values":["品牌推广"]}]}'
```

#### 5. 按状态筛选广告

```bash
node scripts/query-adgroups.mjs '{"account_id":"39412855","filtering":[{"field":"configured_status","operator":"EQUALS","values":["AD_STATUS_NORMAL"]}]}'
```

#### 6. 查询已删除的广告

```bash
node scripts/query-adgroups.mjs '{"account_id":"39412855","is_deleted":true}'
```

#### 7. 使用游标分页获取全量数据

```bash
# 第一次请求
node scripts/query-adgroups.mjs '{"account_id":"39412855","pagination_mode":"PAGINATION_MODE_CURSOR","page_size":100}'

# 后续请求(使用上一次返回的 cursor)
node scripts/query-adgroups.mjs '{"account_id":"39412855","pagination_mode":"PAGINATION_MODE_CURSOR","page_size":100,"cursor":"xxx"}'
```

#### 8. 按创建时间筛选(查最近 7 天创建的广告)

```bash
node scripts/query-adgroups.mjs '{"account_id":"39412855","filtering":[{"field":"created_time","operator":"GREATER_EQUALS","values":["2026-04-03 00:00:00"]}]}'
```

> `created_time` 支持 `YYYY-MM-DD HH:mm:ss` 格式,脚本自动转为 Unix 时间戳。也支持直接传时间戳。

### 返回结构

```json
{
  "list": [
    {
      "adgroup_id": 72536365535,
      "adgroup_name": "广告名称",
      "campaign_id": 12345,
      "configured_status": "AD_STATUS_NORMAL",
      "system_status": "ADGROUP_STATUS_NORMAL",
      "marketing_goal": "MARKETING_GOAL_PRODUCT_SALES",
      "bid_amount": 5000,
      "optimization_goal": "OPTIMIZATIONGOAL_ECOMMERCE_ORDER",
      "begin_date": "2026-03-20",
      "end_date": "2026-04-20",
      "daily_budget": 100000,
      "targeting": {
        "geo_location": { "regions": [110000, 310000] },
        "age": [{ "min": 18, "max": 45 }],
        "gender": ["MALE", "FEMALE"]
      },
      "site_set": ["SITE_SET_WECHAT"],
      "bid_mode": "BID_MODE_OCPM",
      "smart_bid_type": "SMART_BID_TYPE_CUSTOM",
      ...
    }
  ],
  "page_info": {
    "page": 1,
    "page_size": 10,
    "total_number": 50,
    "total_page": 5
  }
}
```

### 注意事项

1. **请求方式**: 该脚本使用 **GET** 方法。
2. **金额单位**: 所有金额字段单位为**分**(如 `bid_amount = 5000` 表示出价 50 元)。
3. **分页限制**: 普通分页模式下 `page` 最大 100,`page_size` 最大 100。需获取全量数据时推荐使用**游标分页模式**。
4. **字段选择**: 未指定 `fields` 时脚本自动使用默认字段集,覆盖基础信息、定向、出价、转化、智投项目配置(含周期达成、成本保障、直播加热等)等全量字段。如需查看特定字段,建议显式传入 `fields` 参数。
5. **与 query-report.mjs 配合**: 先用 `query-report.mjs` 获取广告列表和报表数据,找到感兴趣的广告后,再用 `query-adgroups.mjs` 查看其详细配置。

---

### 智能投放项目详情查询

> **智能投放项目复用了 adgroup(广告)的接口**,因此接口中的字段名与项目概念的对应关系如下:
>
> | 项目概念 | 接口字段 | 说明 |
> |---------|---------|------|
> | 项目 ID | `adgroup_id` | 智投项目 ID 对应接口中的广告 ID |
> | 项目名称 | `adgroup_name` | 智投项目名称对应接口中的广告名称 |
> | 项目状态 | `configured_status` / `system_status` | 项目的配置状态与系统状态 |
> | 项目预算 | `daily_budget` / `total_budget` | 项目日预算与总预算 |
> | 项目出价 | `bid_amount` | 项目出价对应接口中的广告出价 |
> | 项目创建时间 | `created_time` | 项目创建时间(返回 `YYYY-MM-DD HH:mm:ss` 格式) |
> | 项目修改时间 | `last_modified_time` | 项目最后修改时间(返回 `YYYY-MM-DD HH:mm:ss` 格式) |
>
> 其他字段也类同,接口层面项目与广告共用同一套数据结构,调用方式完全一致。

智能投放项目详情的获取使用 `query-adgroups.mjs` 脚本。脚本支持按需指定 `fields` 参数来获取所需字段;如果不指定 `fields`,脚本内置了覆盖智投项目全量配置的默认字段集(包括周期达成、成本保障、直播加热等),无需手动传入。

#### 使用示例

##### 1. 获取智能投放项目详情(使用默认字段,最常用)

```bash
node scripts/query-adgroups.mjs '{"account_id":"39412855","adgroup_ids":["72536365535"]}'
```

> 不指定 `fields` 时,脚本自动返回上述所有默认字段。

##### 2. 按需获取指定字段

```bash
node scripts/query-adgroups.mjs '{"account_id":"39412855","adgroup_ids":["72536365535"],"fields":["adgroup_id","adgroup_name","smart_delivery_platform","smart_delivery_scene","project_ability_list","smart_delivery_aigc_option","smart_targeting_status"]}'
```

> 只需要查看智投相关配置时,可以通过 `fields` 按需获取,减少返回数据量。

##### 3. 查询账户下所有智投项目详情

```bash
node scripts/query-adgroups.mjs '{"account_id":"39412855","page_size":100}'
```

##### 4. 按项目名称搜索智投项目详情

```bash
node scripts/query-adgroups.mjs '{"account_id":"39412855","filtering":[{"field":"adgroup_name","operator":"CONTAINS","values":["智投项目关键词"]}]}'
```

#### 智投项目专有字段说明

| 字段 | 类型 | 说明 |
|------|------|------|
| smart_delivery_platform | enum | 行业智投平台类型 |
| smart_delivery_scene | enum | 智投投放场景 |
| smart_delivery_scene_spec | struct | 场景化投放信息(含投放目标、转化 ID 列表等) |
| smart_delivery_aigc_option | enum | 智投 AIGC 选项 |
| smart_delivery_auto_creative | struct | 智投自动创意信息(含是否开启、供给策略、组件等) |
| smart_delivery_history_comp_reused_creative | struct | 智投历史组件复用创意 |
| smart_delivery_aigc_creative | struct | 智投 AIGC 创意配置 |
| smart_delivery_live_boost | enum | 直播加热 |
| smart_targeting_status | enum | 广告智能定向状态 |
| project_ability_list | array | 场景化投放原子能力列表 |
| project_ability_spec | struct | 场景化投放原子能力(含营销表达、优化出价) |
| boost_source_project_id | int64 | 加热源项目 ID |
| exploration_strategy | enum | 自动版位探索策略(自动版位开启时生效) |
| flow_lock_status | enum | 锁量状态 |
| aoi_optimization_strategy | struct | 高价值范围探索 |
| cost_guarantee_status | enum | 成本保障状态 |
| cost_guarantee_money | int64 | 成本保障赔付金额(单位:分) |
| expected_roi_mix_factor | float64 | 混变系数(0.0001~9999.9999) |
| smart_coupon_mode | enum | 小店智券开关 |
| auto_derived_creative_preference | struct | 创意增强 MAX 偏好设置 |
| enable_breakthrough_siteset | boolean | 是否支持版位突破 |
| live_recommend_strategy_enabled | boolean | 直播种草人群探索 |
| audience_model_bid_adjustment | struct | 后效建模优化功能 |
| additional_product_spec | struct | 附加商品属性 |
| incubation_optimization_goal | enum | 孵化优化目标 |
| conversion_name | string | 转化名称 |
| completed_time | integer | 广告总限额到达时间戳(unix 秒级) |
| smart_delivery_period_switch | enum | 周期达成 |
| smart_delivery_period_budget | integer | 周期预算(单位:分,0 表示不限) |
| smart_delivery_period_days | enum | 周期天数 |
| smart_delivery_period_continue | enum | 周期续投 |
| smart_delivery_period_begin_date | string | 周期开始日期 |
| smart_delivery_period_end_date | string | 周期结束日期 |

---

## 脚本:query-creatives.mjs

> **创意列表查询脚本**,用于获取创意的完整信息。

### 适用场景

- 需要查看广告下的**创意列表**及其组成结构(创意组件引用)
- 需要了解创意的**投放模式、创意类型、创意状态**等配置信息
- 需要查看创意中**组件的具体内容**(标题文案、描述文案、图片、视频等)
- 需要查看**已删除的创意**信息
- 需要根据**创意名称、广告 ID、创建时间**等条件筛选创意

### 与其他脚本的区别

| 对比项 | query-report.mjs | query-creatives.mjs |
|--------|-----------------|---------------------|
| 返回报表数据 | ✅ 返回消耗、曝光、点击等报表指标 | ❌ 不返回报表数据 |
| 返回创意组件详情 | ⚠️ 仅返回创意级别基本属性 | ✅ 返回完整的 creative_components 结构 |
| 自动解析组件内容 | ❌ | ✅ 自动拉取组件详情并内联 |
| 需要日期范围 | ✅ 必填 | ❌ 不需要 |
| 支持跨账户 | ✅ 支持 | ❌ 单账户 |
| 查看已删除创意 | ❌ 不支持 | ✅ 支持 |
| 支持游标分页 | ❌ | ✅ 支持 |

### 调用方式

```bash
node scripts/query-creatives.mjs '<JSON 参数>'
```

### 参数说明

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `account_id` | string | **是** | 广告主账号 ID |
| `tencent_ads_type` | enum | 否 | 广告实体类型,**枚举值只允许 `"smart"` / `"standard"` / `"all"` 三者之一**,默认 `"all"`。详见步骤 1.5 |
| `creative_ids` | string[] | 否 | 指定创意 ID 列表(按 ID 精确查询) |
| `adgroup_ids` | string[] | 否 | 按广告 ID 过滤创意 |
| `fields` | string[] | 否 | 自定义返回字段(不传则使用默认字段集) |
| `filtering` | struct[] | 否 | 过滤条件数组 |
| `page` | integer | 否 | 页码,默认 1(最大 100) |
| `page_size` | integer | 否 | 每页条数,默认 10(最大 100) |
| `is_deleted` | boolean | 否 | 是否查询已删除创意,默认 false |
| `pagination_mode` | enum | 否 | 分页方式:`PAGINATION_MODE_NORMAL`(默认)/ `PAGINATION_MODE_CURSOR` |
| `cursor` | string | 否 | 游标值(配合游标分页模式使用) |

### 过滤条件(filtering)

| 字段 | 说明 | 支持的操作符 |
|------|------|-------------|
| `dynamic_creative_id` | 创意 ID | EQUALS, IN(IN 时最多 100 个) |
| `dynamic_creative_name` | 创意名称 | CONTAINS |
| `adgroup_id` | 所属广告 ID | EQUALS, IN(IN 时最多 100 个) |
| `created_time` | 创建时间(`YYYY-MM-DD HH:mm:ss` 格式,脚本自动转时间戳) | GREATER, LESS, GREATER_EQUALS, LESS_EQUALS |
| `last_modified_time` | 最后修改时间(`YYYY-MM-DD HH:mm:ss` 格式,脚本自动转时间戳) | GREATER, LESS, GREATER_EQUALS, LESS_EQUALS |
| `configured_status` | 客户设置的状态 | EQUALS, IN |
| `source` | 创意来源 | EQUALS, IN |
| `component_id` | 组件 ID | EQUALS |
| `data_model_version` | 数据模型版本 | EQUALS |
| `smart_delivery_template_dc_id` | 智投模板创意 ID | EQUALS, IN |

### 返回的创意详情字段

#### 创意基础信息

| 字段 | 类型 | 说明 |
|------|------|------|
| dynamic_creative_id | integer | 创意 ID |
| dynamic_creative_name | string | 创意名称 |
| adgroup_id | int64 | 所属广告 ID(若 `smart_delivery_platform >= SMART_DELIVERY_PLATFORM_EDITION_SCENE` 则为**智能投放项目 ID**,展示时应标注"项目ID";否则为**竞价广告 ID**,展示时标注"广告ID") |
| smart_delivery_platform | enum | 智投平台版本,用于区分是否为智投广告。枚举值含义见下方说明 |
| creative_template_id | integer | 创意形式 ID |
| delivery_mode | enum | 投放模式 |
| dynamic_creative_type | enum | 动态创意类型 |
| configured_status | enum | 客户设置的状态(`AD_STATUS_NORMAL` / `AD_STATUS_SUSPEND`) |
| created_time | integer | 创建时间(时间戳) |
| last_modified_time | integer | 最后修改时间(时间戳) |
| is_deleted | boolean | 是否已删除 |

#### smart_delivery_platform 枚举值说明

| 艾米类型 | 场景 | 枚举值 | 是否智投 |
|----------|------|--------|---------|
| 默认 | 常规3.0广告(非智投) | `SMART_DELIVERY_PLATFORM_EDITION_STANDARD` | ❌ 否 |
| 小店艾米 | 短直双开智投 | `SMART_DELIVERY_PLATFORM_EDITION_WECHAT_STORE_SINGLE_PRODUCT` | ✅ 是 |
| 小店艾米 | 小店单链路智投 | `SMART_DELIVERY_PLATFORM_EDITION_WECHAT_STORE_PRODUCT_OR_LIVE` | ✅ 是 |
| 小店艾米 | 全店托管 | `SMART_DELIVERY_PLATFORM_EDITION_WECHAT_STORE_MANAGEMENT` | ✅ 是 |
| 小店艾米 | 推直播间 | `SMART_DELIVERY_PLATFORM_EDITION_WECHAT_STORE_LIVE` | ✅ 是 |
| 小店艾米 | 推商品 | `SMART_DELIVERY_PLATFORM_EDITION_WECHAT_STORE_PRODUCT` | ✅ 是 |
| 商品艾米 | 商品智投 | `SMART_DELIVERY_PLATFORM_EDITION_DRUG_PRODUCT` | ✅ 是 |
| 线索艾米 | 线索跑量 | `SMART_DELIVERY_PLATFORM_EDITION_ECOLOGY_LEADS` | ✅ 是 |
| 内容艾米 | 爆剧跑量 | `SMART_DELIVERY_PLATFORM_EDITION_ECOLOGY_PLAYLET` | ✅ 是 |
| 内容艾米 | 小说智投 | `SMART_DELIVERY_PLATFORM_EDITION_FICTION` | ✅ 是 |
| 内容艾米 | 小游戏跑量 | `SMART_DELIVERY_PLATFORM_EDITION_MINI_GAME_PROMOTION` | ✅ 是 |
| APP艾米 | 游戏应用智投 | `SMART_DELIVERY_PLATFORM_EDITION_GAME_APP` | ✅ 是 |
| APP艾米 | 阅读应用智投 | `SMART_DELIVERY_PLATFORM_EDITION_READING_APP` | ✅ 是 |
| APP艾米 | AI应用智投 | `SMART_DELIVERY_PLATFORM_EDITION_AI_APP` | ✅ 是 |
| APP艾米 | 游戏大推(即将下线) | `SMART_DELIVERY_PLATFORM_EDITION_BIG_GAME_PROMOTION` | ✅ 是 |
| - | 全域通-直播场景 | `SMART_DELIVERY_PLATFORM_EDITION_QYT_LIVE` | ✅ 是 |
| - | 全域通-直购场景 | `SMART_DELIVERY_PLATFORM_EDITION_QYT_WECHAT_STORE` | ✅ 是 |

> **判断规则**:`smart_delivery_platform` 为 `SMART_DELIVERY_PLATFORM_EDITION_STANDARD` 时为竞价广告(非智投),其余枚举值均为智投项目。
>
> **展示规则**:智投项目的 `adgroup_id` 展示为"项目ID";竞价广告的 `adgroup_id` 展示为"广告ID"。

#### 创意组件(creative_components)

> **核心字段**:包含创意使用的所有组件引用信息。

`creative_components` 是一个 map 结构,key 为组件类型标识,value 为该类型的组件配置。常见的组件类型包括:

| 组件类型 | 说明 |
|---------|------|
| title | 标题 |
| description | 描述/文案 |
| image | 图片 |
| image_list | 图片列表(多图) |
| video | 视频 |
| brand | 品牌信息 |
| jump_info | 跳转链接/落地页 |
| action_button | 行动按钮 |
| consult | 咨询组件 |
| phone | 电话组件 |
| form | 表单组件 |
| label | 标签 |
| show_data | 数据展示 |
| marketing_pendant | 营销挂件 |
| floating_zone | 悬浮区域 |
| end_page | 结束页 |
| wechat_channels | 视频号组件 |
| short_video | 短视频组件 |
| element_story | 故事元素 |

每个组件通常包含 `component_id`(引用的组件 ID)。当查询结果只有 1 条创意时,脚本会自动拉取组件详情,并以 `_component_detail` 字段内联到各组件中,包含组件的实际内容(文案文本、图片 URL、视频 URL 等)。此外还会自动获取图片/视频的预览 URL,以 `_preview` 字段内联到对应素材中。

#### 其他字段

| 字段 | 类型 | 说明 |
|------|------|------|
| impression_tracking_url | string | 曝光监控地址 |
| click_tracking_url | string | 点击监控链接 |
| program_creative_info | struct | 程序化创意信息 |
| auto_derived_program_creative_switch | boolean | 自动生成更多素材开关 |
| marketing_asset_verification | struct | 资产验真信息 |
| creative_set_approval_status | enum | 创意审核状态 |
| asset_inconsistent_status | enum | 资产落地页一致性状态 |
| source_dynamic_creative_id | integer | 来源创意 ID |

### 使用示例

#### 1. 查询指定广告下的所有创意(最常用)

```bash
node scripts/query-creatives.mjs '{"account_id":"39412855","adgroup_ids":["72536365535"]}'
```

> 自动解析组件详情,返回创意完整信息 + 组件内容。

#### 2. 查询指定创意 ID 的详情

```bash
node scripts/query-creatives.mjs '{"account_id":"39412855","creative_ids":["98765432"]}'
```

#### 3. 查询账户下所有创意列表

```bash
node scripts/query-creatives.mjs '{"account_id":"39412855","page_size":20}'
```

#### 4. 按创意名称模糊搜索

```bash
node scripts/query-creatives.mjs '{"account_id":"39412855","filtering":[{"field":"dynamic_creative_name","operator":"CONTAINS","values":["品牌推广"]}]}'
```

#### 5. 查询已删除的创意

```bash
node scripts/query-creatives.mjs '{"account_id":"39412855","is_deleted":true}'
```

#### 7. 使用游标分页获取全量创意

```bash
# 第一次请求
node scripts/query-creatives.mjs '{"account_id":"39412855","pagination_mode":"PAGINATION_MODE_CURSOR","page_size":100}'

# 后续请求(使用上一次返回的 cursor)
node scripts/query-creatives.mjs '{"account_id":"39412855","pagination_mode":"PAGINATION_MODE_CURSOR","page_size":100,"cursor":"xxx"}'
```

#### 8. 指定返回字段

```bash
node scripts/query-creatives.mjs '{"account_id":"39412855","fields":["dynamic_creative_id","dynamic_creative_name","adgroup_id","creative_components","configured_status"]}'
```

### 返回结构

```json
{
  "list": [
    {
      "dynamic_creative_id": 98765432,
      "dynamic_creative_name": "创意名称-横版视频",
      "adgroup_id": 72536365535,
      "creative_template_id": 1708,
      "delivery_mode": "DELIVERY_MODE_DEFAULT",
      "dynamic_creative_type": "DYNAMIC_CREATIVE_TYPE_NORMAL",
      "creative_components": {
        "title": [{
          "component_id": 11111,
          "_component_detail": {
            "component_id": 11111,
            "component_value": {
              "title": { "content": "这是标题文案" }
            },
            "component_sub_type": "TITLE",
            "component_custom_name": "品牌标题"
          }
        }],
        "description": [{
          "component_id": 22222,
          "_component_detail": {
            "component_id": 22222,
            "component_value": {
              "description": { "content": "这是描述文案" }
            },
            "component_sub_type": "DESCRIPTION"
          }
        }],
        "video": [{
          "component_id": 33333,
          "_component_detail": {
            "component_id": 33333,
            "component_value": {
              "video": {
                "video_id": "abc123",
                "_preview": {
                  "video_id": "abc123",
                  "preview_url": "https://example.com/video_preview.mp4",
                  "key_frame_image_url": "https://example.com/keyframe.jpg",
                  "width": 1280,
                  "height": 720
                }
              }
            },
            "component_sub_type": "VIDEO"
          }
        }],
        "image": [{
          "component_id": 44444,
          "_component_detail": {
            "component_id": 44444,
            "component_value": {
              "image": {
                "image_id": "def456",
                "_preview": {
                  "image_id": "def456",
                  "preview_url": "https://example.com/image_preview.jpg",
                  "width": 800,
                  "height": 600
                }
              }
            },
            "component_sub_type": "IMAGE"
          }
        }]
      },
      "configured_status": "AD_STATUS_NORMAL",
      "created_time": 1742860800,
      "last_modified_time": 1742947200,
      "is_deleted": false
    }
  ],
  "page_info": {
    "page": 1,
    "page_size": 10,
    "total_number": 1,
    "total_page": 1
  }
}
```

> **`_component_detail` 字段**:当查询结果只有 1 条创意时,脚本自动为每个包含 `component_id` 的组件引用附加 `_component_detail` 字段,其中包含完整组件信息。
>
> **`_preview` 字段**:对于组件中包含 `image_id` 或 `video_id` 的素材,脚本自动获取预览信息(`preview_url`、尺寸等),以 `_preview` 字段内联到对应素材对象中。

### 注意事项

1. **请求方式**: 该脚本使用 **GET** 方法。
2. **组件自动解析**: 当查询结果只有 1 条创意时,脚本自动解析组件详情并获取图片/视频预览 URL,无需额外配置。多条创意时不解析组件,避免大量 API 请求影响性能。
3. **分页限制**: 普通分页模式下 `page` 最大 100,`page_size` 最大 100。需获取全量数据时推荐使用**游标分页模式**。
4. **与 query-report.mjs 配合**: 先用 `query-report.mjs` 获取创意级别的报表数据(level: DYNAMIC_CREATIVE),找到需要查看详情的创意后,再用 `query-creatives.mjs` 传入 `creative_ids` 查看其完整组件内容。
5. **与 query-adgroups.mjs 配合**: 先用 `query-adgroups.mjs` 获取广告详情,再用 `query-creatives.mjs` 按 `adgroup_id` 查询该广告下的所有创意。
6. **展示 adgroup_id 时区分广告/项目**:返回数据中的 `adgroup_id` 根据 `smart_delivery_platform` 字段决定展示名称:
   - `EDITION_SCENE` 或 `EDITION_SCENE_PRO` → 展示为**项目ID**(智能投放项目)
   - `EDITION_STANDARD` 或 `EDITION_NONE`(或字段缺失)→ 展示为**广告ID**(竞价广告)
7. **⚠️ 预览 URL 必须展示(强制)**:脚本返回的 `_preview.preview_url`(视频/图片预览链接)和 `_cover_preview.preview_url`(封面预览链接)**必须在回复中以可点击链接的形式呈现给用户**,不得省略或忽略。具体规则:
   - 视频组件:展示视频 `preview_url`(🎥 视频预览链接)和封面 `preview_url`(🖼️ 封面链接)
   - 图片组件:展示图片 `preview_url`(🖼️ 图片预览链接)
   - 每个素材组件单独列出,用 Markdown 链接格式 `[描述](URL)` 呈现
   - **绝对禁止**因内容过长、信息繁杂等原因而省略预览 URL

---

## 脚本:关键词管理(bidword)

管理广告的关键词(竞价词)。关键词用于搜索扩量场景,当广告开启搜索扩量(`search_expansion_switch = SEARCH_EXPANSION_SWITCH_OPEN`)后,可为广告设置搜索关键词。

> 详细参数、示例和返回值见 [references/bidword.md](references/bidword.md)

| 脚本 | 功能 | 必填参数 |
|------|------|---------|
| `scripts/bidword/add.mjs` | 创建关键词 | account_id, list[{adgroup_id, bidword, match_type}] |
| `scripts/bidword/update.mjs` | 更新关键词 | account_id, list[{bidword_id, ...}] |
| `scripts/bidword/delete.mjs` | 删除关键词 | account_id, list (bidword_id 数组) |
| `scripts/bidword/get.mjs` | 查询关键词 | account_id |

---

## 脚本:否定词管理(adgroup_negativewords)

管理广告组级别的否定关键词。否定词用于排除不相关的搜索词,避免广告在不相关的搜索结果中展示。

> 详细参数、示例和返回值见 [references/negativewords.md](references/negativewords.md)

| 脚本 | 功能 | 必填参数 |
|------|------|---------|
| `scripts/negativewords/add.mjs` | 新增否定词 | account_id, adgroup_id, phrase_negative_words, exact_negative_words |
| `scripts/negativewords/update.mjs` | 更新否定词(全量替换) | account_id, adgroup_id, phrase_negative_words, exact_negative_words |
| `scripts/negativewords/get.mjs` | 查询否定词 | account_id, adgroup_ids |

---

## 推广内容资产管理

创建和查询推广内容资产(marketing_asset)。**执行前必须先读取** [references/marketing-asset/overview.md](references/marketing-asset/overview.md)。

> 详细流程说明(CPV/SPU/电商分类、创建步骤、参数说明、约束等)见 [references/marketing-asset/overview.md](references/marketing-asset/overview.md)

---

## 相关技能

- **tencentads-adgroups** - 管理广告(创建/更新/删除广告)
- **tencentads-delivery-smart** - 智投选参指南(智投报表需与非智投分开查询)
- **tencentads-delivery-standard** - 常规投放选参指南
- **tencentads-creatives** - 管理动态创意
- **tencentads-components** - 管理创意组件
- **tencentads-batch** - 批量调整广告
- **tencentads-materials** - 管理素材

Files in this skill

  • package.json299 B
  • references/bidword.md4.9 KB
  • references/marketing-asset.md48 KB
  • references/negativewords.md3.5 KB
  • references/operation-log-list-get.md2.8 KB
  • resources/adgroup-fields.json41.4 KB
  • scripts/bidword/add.mjs7.2 KB
  • scripts/bidword/delete.mjs3.6 KB
  • scripts/bidword/get.mjs4.1 KB
  • scripts/bidword/update.mjs6.4 KB
  • scripts/create-asset.mjs11.2 KB
  • scripts/get-android-packages.mjs4.1 KB
  • scripts/get-asset-categories.mjs3.7 KB
  • scripts/get-asset-detail.mjs3.4 KB
  • scripts/get-asset-list.mjs3.7 KB
  • scripts/get-asset-properties.mjs3.7 KB
  • scripts/get-available-marketing-assets.mjs2.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

View all in content-marketing →

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.