来源:2026-06-08 端到端打通后的工程 review。 状态:端到端可单广告挂创意,但生产批量上线前必须做完 P0。 验证基线:
83846793 / 106275052398已成功挂上10030789982(已手动删除)。
phase0_create_ads 检查 configured_status == AD_STATUS_NORMAL 判定"广告满了"code 1901634(腾讯文档:删除后 2 年内仍占唯一性槽位)enumerate_new_ad_candidates 调用前,反查账户所有现存广告(含已删除 is_deleted=True),按 6 字段 + targeting 算指纹 set,enumerate 时 skip 已存在指纹_post('/adgroups/delete', ...) 手动清场重测,这只是调试手段DEFAULT_JUMP_PATH 改动态生成xcx/save 接口tools/landing_plan.py 封装接口;creative_creation.py 删 DEFAULT_JUMP_PATH 常量mini_program_path 改为来自 xcx/save 返回的 pageUrlbuild_creative_name 防重名xcx/save 返回的 pageUrl 内嵌 rootSourceId,直接用作 dynamic_creative_nametools/creative_creation.py::build_creative_name 函数upload_image_to_account 迁移到 tools/ad_api.pytools/ad_api.py 加 images_add(account_id, image_url) -> str(sync public,与 _post/_get/_check 同层)tools/creative_creation.py 删 upload_image_to_account,改 import from tools.ad_api import images_addimage_id(MD5 幂等)tools/creative_creation.py::find_existing_creative_by_image(account_id, adgroup_id, image_id)create_creative_for_ad(..., skip_if_exists=True) 默认开启,POST 前先反查 → 命中直接返回已有 dynamic_creative_idimage_id=999999999999999 返回 None(命中路径因当前 adgroup 无创意 skip,逻辑同 None 路径反向)/dynamic_creatives/get 调用(QPS 多消耗 1,在 P1-3 接限流时算入)execution_engine 的 QPS + retry/dynamic_creatives/get + /images/add + /dynamic_creatives/add)+ 1 次 piaoquantv xcx/save,单条创意挂载 < 1sad_api.py::_post / _get 加一层全局 sync token bucket 即可(execution_engine.TokenBucket 是 async 版,需要 sync 改造)RuntimeError,调用方无法区分错误类型ImageUploadError(account_id, image_url, tencent_code)MissingBrandError(account_id)CreativeRejectError(adgroup_id, tencent_code, field)tools/account_assets_repo.pyget_account_brand + 后续 get_account_audience_pack + get_account_jump_template 等tools/ad_api.py 加 class TencentAdStatus / TencentDeliveryMode / TencentCreativeType"AD_STATUS_NORMAL" / "DELIVERY_MODE_COMPONENT" / "DYNAMIC_CREATIVE_TYPE_PROGRAM" 等 magic stringstep=xxx duration_ms=yyyfind_ads_needing_creatives(account_id) -> list[ad_id](filter system_status=CREATIVE_EMPTY 或 creative_count < MIN)execute_creation_once.py 主入口build_creative_request_body 引入 CreativeContext dataclass40915884255),DB 已填,直接可用tools/README_creative_creation.mdimage/jpegmimetypes.guess_type(url) 或读 magic bytesfeishu_doc._send_link_message 走 msg_type=text,完全依赖飞书客户端 link unfurling 自动展开 sheet 预览msg_type=interactive,卡片 JSON 显式定义标题/摘要/按钮,飞书客户端强制渲染,不依赖 unfurling_send_link_message 一处=HYPERLINK(material.cover, "查看素材") 公式,运营点击在浏览器看图rescdn.yishihui.com 有 Referer ACL 防盗链,飞书 sheet 点链接首次访问会 403,运营需要"右键新标签"或粘贴 URL 重试POST /open-apis/sheets/v2/spreadsheets/{token}/values_image,把素材图二进制流嵌入 cell,运营 review 时直接看图| code | 含义 | 修复方向 |
|---|---|---|
| 18001 | 缺失必填参数 image_id |
image 组件不能用 image_url,必须先上传拿 image_id |
| 1800269 | 品牌形象必填 | 必须传 brand 组件 + brand_name + brand_image_id |
| 1530003 | 图片不存在或已删除 | image_id 跨账户不可复用,必须按账户独立上传 |
| 1801159 | 提交的组件无法匹配到创意形式(图片素材比例/长宽/大小/时长不符) | 召回素材不一定符合腾讯创意规格,需 try-fallback;长期方案:召回阶段加图片尺寸校验,或限定 URL 模式仅取 adPutTencent/image/ 路径 |
image_id(无需本地缓存)image_id 不同DYNAMIC_CREATIVE_STATUS_PENDING → 2-4 小时system_status 由 CREATIVE_EMPTY 切走有几秒到几分钟延迟(腾讯后端聚合状态)