本 Skill 提供小红书聚光广告投放平台的完整API接入能力,支持多账号管理模式,适合需要 24 小时自动化监控的场景。
核心能力:
快速开始:首次使用请先阅读同目录下的 SETUP.md 完成配置。
https://adapi.xiaohongshu.comAccess-Tokenreport_service(报表) + ad_query(查询广告) + ad_manage(管理广告) + account_manage(账户管理)access_token_expires_in(秒) 字段计算refresh_token_expires_in(秒) 字段计算POST /api/open/jg/data/report/realtime/account
请求: { advertiser_id, start_date, end_date }
返回: { success, data: { fee, impression, click, ctr, cpm, msg_leads_num, message_consult, message, like, comment, collect, follow, share, ... } }
注意:data 直接包含指标字段,没有 total_data 或 aggregation_data 嵌套。
POST /api/open/jg/data/report/offline/{report_type}
report_type: account/campaign/unit/creativity/keyword/search_word/note/crowd/spu
请求: { advertiser_id, start_date, end_date, time_unit="SUMMARY"|"DAY", page=1, page_size=200 }
返回: { success, data: { aggregation_data: {...}, data_list: [...] } }
> 创意层级端点名注意:小红书API创意层级的路径是 creativity(不是 creative)。SDK 的 get_offline_report() 和 get_realtime_report() 方法会自动将 'creative' 映射为 'creativity',调用方直接传 'creative' 即可。
数据结构说明:
aggregation_data: 整个时间范围的汇总数据(同实时报表字段结构)data_list: 逐日/逐条明细数组time_unit="DAY" 时,每条包含 time 字段(格式 "2026-06-15",注意是 time 不是 date)data_list 长度等于 page_size,说明可能有下一页,需翻页取全返回示例:
{
"success": true,
"data": {
"aggregation_data": {
"fee": 389.84, "impression": 30057, "click": 5699, "ctr": "18.96%",
"msg_leads_num": 72, "message_consult": 210, "message": 446
},
"data_list": [
{"time": "2026-06-15", "fee": 45.20, "impression": 3500, "click": 650, ...},
{"time": "2026-06-16", "fee": 52.10, "impression": 4100, "click": 780, ...}
],
"page": {"page": 1, "page_size": 200, "total_count": 7}
}
}
| 字段 | 含义 | 单位 |
|---|---|---|
| ------ | ------ | ------ |
| fee | 消费金额 | 元 |
| impression | 展现量 | 次 |
| click | 点击量 | 次 |
| ctr | 点击率 | % |
| acp | 平均点击成本 | 元 |
| cpm | 千次展示费用 | 元 |
| msg_leads_num | 私信留资数 | 次 |
| message_consult | 私信进线数 | 次 |
| message | 私信消息量 | 条 |
| initiative_message | 私信开口数 | 次 |
| like/comment/collect/follow/share | 互动指标 | 次 |
| API字段 | 业务含义 | 说明 | 报告标签 |
|---|---|---|---|
| --------- | --------- | ------ | --------- |
msg_leads_num | 留资 | 用户留下联系方式(表单提交) | 留资 |
message_consult | 进线 | 用户发起咨询对话(点击咨询按钮) | 进线 |
initiative_message | 开口 | 用户主动发起的第一条消息 | 开口 |
message | 消息量 | 用户发送的所有消息条数(含开口+后续回复) | 消息量 |
注意:漏斗关系:开口(initiative_message) ≥ 进线(message_consult) ≥ 留资(msg_leads_num)。报告必须同时展示留资/进线/开口三个指标。
简单投有独立的实时报表接口,路径前缀 /api/open/jg/data/report/realtime/ube/:
| 层级 | 接口路径 | 必传参数 | 特点 |
|---|---|---|---|
| ------ | --------- | --------- | ------ |
| 标的(Group) | /realtime/ube/group | advertiser_id, start_date, end_date, columns | 需要columns(camelCase指标名数组);返回data.total_data(汇总)+data.data_list(GroupParadigm[]);page_size最大200 |
| 计划(Campaign) | /realtime/ube/campaign | advertiser_id, campaign_group_id_list(1个), start_date, end_date | 从group接口获取campaign_group_id后传入;返回data.campaign_dtos[] |
| 笔记(Note) | /realtime/ube/note | advertiser_id, campaign_group_id_list(1个), start_date, end_date | 返回data.note_dtos[];note_id为string类型 |
| 关键词(Keyword) | /realtime/ube/keyword | advertiser_id, campaign_group_id_list(1个), start_date, end_date | 返回data.keyword_dtos[];包含完整层级上下文 |
账号级汇总获取方式:简单投实时无账号级接口,通过标的层级(/ube/group)的data.total_data获取账号汇总。
columns参数(仅标的接口需要):
["fee", "impression", "click", "ctr", "acp", "cpm",
"like", "comment", "collect", "follow", "share", "interaction",
"messageConsult", "initiativeMessage", "msgLeadsNum", "message",
"leads", "validLeads"]
SDK方法:
sdk.get_easy_realtime_group(start_date, end_date) # 标的层级
sdk.get_easy_realtime_campaign(group_id, start_date, end_date) # 计划层级
sdk.get_easy_realtime_note(group_id, start_date, end_date) # 笔记层级
sdk.get_easy_realtime_keyword(group_id, start_date, end_date) # 关键词层级
sdk.get_easy_realtime_summary(start_date, end_date) # 便捷方法:标的层级total_data
| 场景 | 标准投 | 简单投 |
|---|---|---|
| ------ | -------- | -------- |
| 今日实时 | get_realtime_report('account') → /realtime/account | get_easy_realtime_summary() → /realtime/ube/group |
| 历史离线(T+1) | get_offline_report('account', start, end) → /offline/account | get_easy_promotion_report(start, end) → /offline/easy/promotion/base |
总消耗 = 标准投.fee + 简单投.fee(强制规则,所有报告默认展示合计+拆分)
以下接口全部来自官方文档站 https://ad-market.xiaohongshu.com/docs-center?bizType=943
OAuth/授权(5个):Oauth2.0授权(#4437)、scope权限说明(#3195)、token管理、刷新token(#4808)、获取Token(#2605)
账户服务(8个):代理商主子账号余额查询(#4417)、获取代理商子账号列表(#4112)、转账接口(#4300)、查询转账结果(#4301)、资金流水查询(#4302)、修改账户日预算(#4094)、获取计划流水(#3216)、获取账户日预算余额(#3215)、获取账户流水(#3211)
投放管理-新创编(2个):新创编编辑接口(#4752)、新创编API(#4554)
投放管理-推广计划(3个):编辑计划(#3148) POST /campaign/update、修改计划状态(#3149) POST /campaign/status/update、查询计划(#3150) POST /campaign/list
投放管理-推广单元(5个):修改单元关键词(#4665)、修改单元出价(#4516)、编辑单元(#3151)、修改单元状态(#3152)、获取单元列表(#3044) POST /unit/list
投放管理-推广创意(3个):编辑创意(#3156)、修改创意状态(#3157)、创意查询(#3158) POST /creativity/search
投放管理-广告组(4个):创建(#4582)、删除(#4596)、更新(#4595)、查询列表(#4594) POST /campaign/group/base/list
投放管理-简单投(1个):新建简单投(#4776) POST /ube/semi/auto/create
离线报表(13个):创意层级(#4811) /offline/creativity、简单投标的(#4684) /offline/easy/promotion/group、人群包V2(#4654)、简单投笔记(#4647) /offline/easy/promotion/note、简单投计划(#4644) /offline/easy/promotion/base、人群包(#4065)、SPU层级(#3835) /offline/spu、笔记层级(#3803) /offline/note、搜索词层级(#3714) /offline/search/word、账户层级(#2738) /offline/account、计划层级(#2735) /offline/campaign、单元层级(#2736) /offline/unit、关键词层级(#3073) /offline/keyword
实时报表-标准投(5个):账户层级(#2731) /realtime/account、计划层级(#2732) /realtime/campaign、创意层级(#2734) /realtime/creativity、定向层级(#3672) /realtime/target、广告组层级(#4597) /realtime/campaign/group
实时报表-简单投(4个):简单投标的层级(#4716) /realtime/ube/group、简单投计划层级(#4719) /realtime/ube/campaign、简单投笔记层级(#4721) /realtime/ube/note、简单投关键词层级(#4724) /realtime/ube/keyword
实时报表-其他(1个):AI智能笔记详情(#4792)
素材管理(31个):可投剧集列表(#4806)、剧集修改(#4805)、剧集创建(#4802)、批量查询简单投标的ID(#4717)、行业商品列表(#4571)、创意标题和图片(#4558)、移动应用列表(#4557)、微信小程序列表(#4556)、红书小程序列表(#4555)、获取广告素材评论(#4692)、删除广告素材评论(#4693)、发布广告素材(#4445)、定向包关联单元(#4354)、删除定向包(#4347)、更新定向包(#4342)、创建定向包(#4341)、获取定向包列表(#4309)、获取笔记ID(#3787)、删除笔记(#3785)、查询否定词(#3696)、批量删除否定词(#3695)、批量添加否定词(#3676)、获取直达链接(#3194)、删除直达链接(#3193)、编辑直达链接(#3192)、创建直达链接(#3191)、资产事件(#3190)、资质列表(#3189)、门店信息(#3169)、笔记列表(#3162)、落地页表单(#3161)
工具(10个):历史操作记录(#4096) POST /history/list、定向推词(#3168)、行业类目属性(#3167)、行业类目(#3166)、词包推荐(#3165)、人群预估(#3164)、关键词匹配词库(#3163)、推荐关键词(#3160)、定向信息(#3159)、名称重复校验(#3113)
附录(4个):OAuth错误码排查(#4810)、聚光API FAQ(#4436)、蒲公英/乘风/私信API FAQ(#4439)、MAPI特殊开白(#4447)
以下三个陷阱在开发过程中反复踩坑,新增任何SDK方法时务必遵守:
陷阱1:data: null 的 Python .get() 陷阱
# ✗ 错误写法:API返回 {"success": true, "data": null} 时,.get('data', {}) 返回 None
data = result.get('data', {})
fee = data.get('fee') # AttributeError: 'NoneType' object has no attribute 'get'
# ✓ 正确写法:用 or {} 兜底
data = result.get('data') or {}
fee = data.get('fee') or 0 # 安全,fee为null时返回0
原因:Python 的 .get('key', default) 只在 key 不存在 时返回 default。当 key 存在但值为 null(None),返回的是 None。小红书 API 在数据为空时常返回 "data": null。
同样适用于数值字段:float(x.get('fee', 0)) 在 fee 为 null 时会 TypeError,必须用 float(x.get('fee') or 0)。
陷阱2:分页格式区分
小红书 API 的分页参数有两种格式,混用会导致参数被忽略(返回0条或只有第1页):
| 端点类型 | 格式 | 示例 |
|---|---|---|
| --------- | ------ | ------ |
| 列表端点(campaign/unit/group/creativity) | 嵌套对象 | "page": {"page_index": 1, "page_size": 100} |
| 报表端点(offline/easy/realtime) | 平铺参数 | "page": 1, "page_size": 200 |
注意:列表端点的分页值必须是 整数,传 str(page_index) 会导致 API 不识别。
陷阱3:响应字段名兼容
列表端点的响应字段名在不同版本/文档中不一致,取值时需做 fallback:
# 推广计划
campaigns = (data.get('base_campaign_dtos')
or data.get('campaign_dtos')
or data.get('list') or [])
# 广告组
groups = (data.get('campaign_group_base_dtos')
or data.get('campaign_groups')
or data.get('list') or [])
# 创意
creatives = (data.get('creativity_dtos')
or data.get('creative_dtos')
or data.get('list') or [])
首次对接新端点时,建议打印 list(data.keys()) 确认实际返回的字段名。
定时报告/多账号监控任务,最终只向用户发送一条消息。
禁止:
正确流程:取全部数据 → 内存汇总 → 生成一条完整消息 → 一次性发出
fetch_failed 的可能原因(按概率排序):
禁止替用户下"授权过期"结论。在消息中只写具体失败原因。
| 状态 | 含义 | 呈现 |
|---|---|---|
| ------ | ------ | ------ |
has_data | 取数成功且有消耗 | 显示真实数据 |
real_zero | 取数成功但消耗为0 | "今日0消耗(可能计划暂停/预算耗尽)" |
fetch_failed | 取数失败 | "取数失败:{具体原因}" |
小红书 API 有 QPS 限制(约 5-10 QPS),多账号场景必须加延迟:
time.sleep(2) 强制等待 2 秒time.sleep(3) 等待 3 秒time.sleep(1) 等待 1 秒违反会导致批量超时(15s timeout),误报为"网络问题"。
1. 运行: python3 account_manager.py report-today all
2. 等待完整输出(不要中途打断)
3. 解析 ---JSON_RESULT--- 标记内的 JSON
4. 根据报告类型选择对应模板,生成一条汇总消息
5. 一次性发送给用户
小红书聚光有两种投放类型:标准投(标准推广)和简单投(简单推广)。
总消耗 XX元 (标准投 XX + 简单投 XX)JSON 输出中的拆分字段:
| 字段 | 含义 |
|---|---|
| ------ | ------ |
fee | 总消耗 = normal_fee + easy_fee |
normal_fee | 标准投消耗 |
easy_fee | 简单投消耗 |
impression / normal_impression / easy_impression | 曝光(同理) |
click / normal_click / easy_click | 点击(同理) |
取数流程:标准投报表 → sleep(1) → 简单投报表 → 合并。两个 API 调用之间必须有 1 秒 QPS 延迟。
| 场景 | 方式 | 说明 |
|---|---|---|
| ------ | ------ | ------ |
| 飞书/IM 推送 | Markdown 表格(下方模板) | 飞书支持 Markdown 渲染 |
| QoderWork 对话 | HTML Widget | 用 show_widget 加载 assets/report_widget.html,传入 JSON 数据 |
两种渠道的数据洞察和建议内容必须一致,只是展示形式不同。
| 类型 | 命令 | 场景 | 数据源 |
|---|---|---|---|
| ------ | ------ | ------ | -------- |
| 日报 | report-today all | 今日实时数据 | 实时报表 API |
| 范围报告 | report-range {start} {end} | 周/月/自定义日期 | 离线报表 T+1 |
| 对比报告 | compare {dateA} {dateB} | 两天数据对比 | 离线报表 T+1 |
收到 JSON 数据后,必须按以下规则逐项分析并写入报告:
| 分析维度 | 规则 | 正常 | 预警 | 炸裂 |
|---|---|---|---|---|
| --------- | ------ | ------ | ------ | ------ |
| 消耗异常 | 单账号消耗较总均值偏差 | 偏差≤30% | ⚠️ 偏差>30% | 🤬 偏差>60% |
| CTR 表现 | CTR 高低 | 😎 >15% 优秀 | 😐 5~15% 正常 | 💀 <5% 拉胯 |
| 开口成本 | 单开口花费 | ✅ <30元 | ⚠️ >50元 | 🤬 >100元 烧钱呢 |
| 留资成本 | 单留资花费 | ✅ <80元 | ⚠️ >100元 | 🤬 >200元 离谱 |
| 漏斗-开口→进线 | 转化率 | 😎 >80% | 😐 <60% | 💀 <40% 落地页废了 |
| 漏斗-进线→留资 | 转化率 | 😎 >30% | 😐 <20% | 💀 <10% 话术拉胯 |
| 账号表现 | 综合排名 | 🏆 最佳 | ⚠️ 待优化 | 💀 持续拉胯 |
持续性差的表现(连续多天跑不起来/一直0消耗/开口长期为0)→ 用 😤⚫ 标记,别客气直接骂
漏斗转化率计算:
message_consult / initiative_message × 100%msg_leads / message_consult × 100%客资单价计算(分母为0时显示 -):
fee / initiative_messagefee / message_consultfee / msg_leads1. 运行: python3 account_manager.py report-today all (或其他命令)
2. 等待完整输出(不要中途打断)
3. 解析 ---JSON_RESULT--- 标记内的 JSON
4. 根据报告类型选择对应模板,生成一条汇总消息
5. 执行「数据分析框架」中的所有规则
6. 一次性发送给用户
📊 聚光日报 | {date}
📈 整体概况
| 指标 | 数值 |
|------|------|
| 💰 总消耗 | {fee}元 |
| ├ 标准投 | {normal_fee}元 |
| └ 简单投 | {easy_fee}元 |
| 👁 总曝光 | {impression} |
| 👆 总点击 | {click} |
| 📊 CTR | {ctr} |
| 💵 ACP | {acp}元 |
| 📡 取数 | 成功 {ok}/{total} |
👥 客资分析
| 指标 | 数量 | 单价 |
|------|------|------|
| 💬 开口 | {initiative_message}条 | {开口成本}元/条 |
| 📞 进线 | {message_consult}条 | {进线成本}元/条 |
| 📋 留资 | {msg_leads}条 | {留资成本}元/条 |
| 📨 消息量 | {message}条 | - |
🔄 漏斗转化:开口→进线 {rate1}% | 进线→留资 {rate2}%
📋 各账号明细
| 账号 | 消耗 | 曝光 | 点击 | CTR | 开口 | 进线 | 留资 | 开口成本 |
|------|------|------|------|-----|------|------|------|---------|
| {name1} | {fee}元 | {imp} | {click} | {ctr} | {n} | {n} | {n} | {cost}元 |
| {name2} | ... | ... | ... | ... | ... | ... | ... | ... |
{real_zero 账号} ○ {name}: 今日0消耗(可能计划暂停/预算耗尽)
{fetch_failed 账号} ✗ {name}: {fail_reason}
💡 数据洞察
{按「数据分析框架」逐条分析,2-3 条关键结论,必须带具体数字和账号名}
{语气要直接,好的夸、烂的骂,带表情区分}
例:
- "🔥 {name} CTR {ctr}% 太猛了,素材跑得很好,继续加预算!"
- "🤬 {name} 开口成本飙到 {cost}元,100块才来一个开口?落地页是不是该换了"
- "💀 {name} 连续{n}天开口为0,这个号基本等于白投,趁早停掉或换素材"
- "😤 {name} 一直跑不起来,消耗 {fee}元 但留资才{n}个,ROI 烂到离谱"
- "😎 整体漏斗转化率 {rate}%,客资链路跑通了,可以激进加量"
📝 投放建议
{大胆给投放建议,目标是激进跑量,跑不起来就骂}
{不怕说重话——反正不是花你的钱投,目的是帮用户快速决策}
例:
- "🚀 {name} 数据跑得好,建议直接把日预算拉到 {amount}元,趁热打铁放量"
- "🔪 {name} 开口成本太高,建议立刻砍掉 CTR<5% 的计划,把预算给 {好账号}"
- "😡 {name} 这个号别投了,连续{n}天0开口,素材全部下线重建"
- "⚡ 整体留资转化率偏低,建议全部账号换一版私信话术,第一句话直接抛利益点"
- "💪 当前整体成本可控,建议全账号提预算20~30%,测试放量后的成本变化"
适用于周报、月报、自定义日期范围。
📊 聚光报告 | {start_date} ~ {end_date}(共{days}天)
📈 汇总概况
| 指标 | 合计 | 日均 |
|------|------|------|
| 💰 消耗 | {fee}元 | {日均fee}元 |
| ├ 标准投 | {normal_fee}元 | {日均normal_fee}元 |
| └ 简单投 | {easy_fee}元 | {日均easy_fee}元 |
| 👁 曝光 | {impression} | {日均imp} |
| 👆 点击 | {click} | {日均click} |
| 📊 CTR | {ctr} | - |
| 💬 开口 | {initiative_message}条 | {日均}条 |
| 📞 进线 | {message_consult}条 | {日均}条 |
| 📋 留资 | {msg_leads}条 | {日均}条 |
👥 客资分析
| 指标 | 总量 | 单价 |
|------|------|------|
| 💬 开口 | {n}条 | {cost}元/条 |
| 📞 进线 | {n}条 | {cost}元/条 |
| 📋 留资 | {n}条 | {cost}元/条 |
🔄 漏斗:开口→进线 {rate1}% | 进线→留资 {rate2}%
📊 趋势分析
| 指标 | 峰值 | 低谷 | 趋势 |
|------|------|------|------|
| 消耗 | {date} {fee}元 | {date} {fee}元 | {↑/↓/→} |
| 开口 | {date} {n}条 | {date} {n}条 | {↑/↓/→} |
趋势判断方法:比较前半段和后半段均值,上升↑、下降↓、持平→
📋 各账号汇总
| 账号 | 消耗 | 日均 | CTR | 开口 | 进线 | 留资 | 开口成本 |
|------|------|------|-----|------|------|------|---------|
| {name} | {fee}元 | {日均}元 | {ctr} | {n} | {n} | {n} | {cost}元 |
📅 逐日明细(仅范围 ≤14 天时展示)
| 日期 | 消耗 | 曝光 | 点击 | 开口 | 进线 | 留资 |
|------|------|------|------|------|------|------|
| {date} | {fee}元 | {imp} | {click} | {n} | {n} | {n} |
💡 数据洞察
{2-3 条趋势分析,语气直接,好的夸烂的骂}
例:
- "📈 本周消耗整体上升,日均 {avg}元,投放节奏不错,继续加量!"
- "🤬 {date} 消耗突然飙到 {fee}元(+{pct}%),但开口没涨,钱花哪去了?查查是不是被刷了"
- "💀 {name} 连续 {n} 天开口为 0,这个号就是白占坑位,赶紧下线"
- "😤 {name} 日均消耗才 {avg}元,跑了{n}天连个留资都没有,素材全部换掉重来"
📝 投放建议
{1-2 条激进建议,跑不起来就骂}
例:
- "🚀 整体成本可控,建议下周直接加预算30%,别浪费好数据"
- "😡 {name} 这周花了 {fee}元 才 {n} 个留资,留资成本 {cost}元,这号废了,建议直接停投重建"
📊 数据对比 | {dateA} → {dateB}
📈 整体对比
| 指标 | {dateA} | {dateB} | 变化 |
|------|---------|---------|------|
| 💰 消耗 | {a}元 | {b}元 | {▲/▼ pct}% |
| ├ 标准投 | {a}元 | {b}元 | {▲/▼ pct}% |
| └ 简单投 | {a}元 | {b}元 | {▲/▼ pct}% |
| 👁 曝光 | {a} | {b} | {▲/▼ pct}% |
| 👆 点击 | {a} | {b} | {▲/▼ pct}% |
| 📊 CTR | {a}% | {b}% | {▲/▼ pct}% |
| 💬 开口 | {a}条 | {b}条 | {▲/▼ pct}% |
| 📞 进线 | {a}条 | {b}条 | {▲/▼ pct}% |
| 📋 留资 | {a}条 | {b}条 | {▲/▼ pct}% |
变化标记:▲ 上升 | ▼ 下降 | - 持平
变化幅度 >30% 时加 ⚠️ 标记
📋 各账号对比
| 账号 | 消耗变化 | 开口变化 | 进线变化 | 留资变化 |
|------|---------|---------|---------|---------|
| {name} | {▲/▼ pct}% | {▲/▼ pct}% | {▲/▼ pct}% | {▲/▼ pct}% |
{标注消耗增幅最大和降幅最大的账号}
🏆 增幅最大:{name}(消耗 {▲pct}%)
⚠️ 降幅最大:{name}(消耗 {▼pct}%)
💡 数据洞察
{2-3 条对比分析,语气直接}
例:
- "🔥 {name} 消耗涨 {pct}% 开口也跟着涨 {pct}%,这波放量放对了!"
- "🤬 {name} 消耗涨了 {pct}% 但开口只涨 {pct}%,钱越花越没效果,赶紧收一收"
- "💀 {name} 全面下降,消耗 {▼pct}%、开口 {▼pct}%,素材该换一轮了"
- "😤 {name} 留资连续两天挂零,这个号趁早别投了"
📝 投放建议
{1-2 条激进建议}
| 状态 | 标记 | 含义 | 报告展示 |
|---|---|---|---|
| ------ | ------ | ------ | --------- |
has_data | ▶ | 取数成功且有消耗 | 显示完整数据行 |
real_zero | ○ | 取数成功但消耗为0 | "{name}: 今日0消耗(可能计划暂停/预算耗尽)" |
fetch_failed | ✗ | 取数失败 | "{name}: 取数失败:{具体原因}" |
0;单价为 0 或分母为 0 时显示 -| code | 含义 | 处理 |
|---|---|---|
| ------ | ------ | ------ |
| 0 | 成功 | - |
| 401 | token无效/过期 | 刷新token,失败则重新授权 |
| 40004 | 权限不足 | 检查scope是否包含所需权限 |
| 40005 | 应用未授权 | 检查appId/secret是否正确 |
| 429 | QPS限流 | 等待5秒后重试,加延迟 |
| 500 | 服务器内部错误 | 等待10秒后重试 |
1. 授权码5分钟过期
OAuth回调收到的 auth_code 只有5分钟有效期。必须在5分钟内执行 exchange-token,否则需要重新授权。
2. advertiser_id类型错误
API要求 advertiser_id 为整数,但配置文件和token文件中可能是字符串。SDK已做 int() 转换,如果直接调API需手动转换。
3. scope权限不足
调用计划/单元/创意管理接口时报403,是因为授权时scope只选了 report_service 和 ad_query。需要重新授权并包含 ad_manage。
4. 离线报表数据为空
离线报表是T+1数据,今天只能查昨天及更早的数据。查今天会返回空 data_list。
5. 批量超时
多账号同时取数触发QPS限流。确保每个账号之间 sleep(2) 秒。
6. token刷新失败但不影响使用
access_token还有30分钟以上有效期时,刷新失败不会中断请求。但如果持续失败,需在过期前重新授权。
{
"version": "multi_account_v1",
"accounts": [
{
"key": "account_a",
"name": "账号A名称",
"advertiser_id": "广告主ID",
"app_id": "应用ID",
"app_secret": "应用Secret",
"token_file": "./tokens/account_a.json",
"enabled": true
}
]
}
# 账号管理
python3 account_manager.py list # 查看账号列表
python3 account_manager.py add key name advertiser_id token_file [app_id] [app_secret]
python3 account_manager.py remove key # 删除账号
python3 account_manager.py update key field value # 更新账号信息(字段白名单校验)
python3 account_manager.py toggle key # 启用/停用切换
python3 account_manager.py health-check # 检查配置/token/API连通性
python3 account_manager.py verify # 轻量配置格式校验(无API调用)
# 授权与token
python3 account_manager.py setup-guide # 首次配置引导(环境自识别+6步完整指引)
python3 account_manager.py auth-url # 生成全部账号授权链接
python3 account_manager.py auth-url <key> # 生成指定账号授权链接
python3 account_manager.py exchange-token X # 换取账号X的token
python3 account_manager.py refresh-all # 批量刷新即将过期的token
# 数据报告
python3 account_manager.py report-today all # 今日全部账号实时数据
python3 account_manager.py report-today <key> # 今日单账号数据
python3 account_manager.py report-range 2026-06-15 2026-06-21 [all|key] # 离线报表(指定日期范围,可选指定账号)
python3 account_manager.py compare 2026-06-21 2026-06-22 [all|key] # 两天数据对比(可选指定账号)
# 广告管理
python3 account_manager.py campaigns [key] # 列出推广计划
python3 account_manager.py campaign-start <key> <id1> [id2...] # 启用计划
python3 account_manager.py campaign-stop <key> <id1> [id2...] # 暂停计划
python3 account_manager.py units [key] # 列出推广单元
python3 account_manager.py unit-bid <key> <unit_id> <出价元> # 修改出价
python3 account_manager.py unit-start <key> <id1> [id2...] # 启用单元
python3 account_manager.py unit-stop <key> <id1> [id2...] # 暂停单元
python3 account_manager.py creatives [key] # 列出创意
python3 account_manager.py creative-start <key> <id1> [id2...] # 启用创意
python3 account_manager.py creative-stop <key> <id1> [id2...] # 暂停创意
python3 account_manager.py budget <key> # 查询账户预算
python3 account_manager.py budget-update <key> <金额元> # 修改日预算
python3 account_manager.py auto-rules [key] [date] # 运行自动优化规则
# 搜索词/关键词/多维度报表
python3 account_manager.py search-words <key> <start> <end> # 搜索词报告(用户搜了什么词触发广告)
python3 account_manager.py keywords <key> <start> <end> # 关键词效果报告(每个词消耗/转化)
python3 account_manager.py report-dim <key> <dim> <start> <end> # 多维度报表(campaign/unit/creative/keyword/search_word)
# 关键词管理
python3 account_manager.py keyword-add <key> <unit_id> <词:出价...> # 添加关键词(出价单位元)
python3 account_manager.py keyword-recommend <key> <种子词> # 关键词推荐
python3 account_manager.py word-bags <key> # 查询词包列表
# 辅助命令
python3 account_manager.py history <key> [page] # 操作历史记录
python3 account_manager.py campaign-groups <key> # 广告组列表
# 智能优化建议
python3 account_manager.py optimize <key> [start] [end] # 综合分析:关键词+搜索词+单元,输出优化建议
# 创意深度分析
python3 account_manager.py creative-analysis <key> [start] [end] # 创意评分(S/A/B/C)+明星创意识别+烧钱诊断+行动建议
# 关键词深度分析
python3 account_manager.py keyword-analysis <key> [start] [end] # 关键词评分+搜索词挖掘(拓词/否定词)+账号诊断
# 多账号效率仪表盘
python3 account_manager.py fleet-overview [start] [end] # 全部账号效率排名+预算分配建议
# 智能周期对比
python3 account_manager.py period-compare [all|key] [wow|mom|d7|d14|yesterday] # 环比/同比/近7天/近14天/昨日对比
# 一键日报
python3 account_manager.py daily-report [all|key] [date] # 昨日vs前日对比+异常告警+行动建议
# 实时异常检测
python3 account_manager.py anomaly-guard [all|key] # 7种异常规则实时扫描(消耗飙升/骤降/CTR崩溃/零活跃等)
# 时段分析
python3 account_manager.py hourly-analysis <key> [date] # 按时段分析效果,找出最佳/最差投放时段
# 创意级自动规则执行
python3 account_manager.py auto-rules-execute [all|key] [date] [dry_run|execute] # 创意级规则:暂停烧钱创意/提价明星创意/出价建议
auto_rules_config.json 定义了 10 条可配置的自动调整策略,auto-rules 和 auto-rules-execute 命令读取此文件。每条规则可通过 enabled 开关独立启用/禁用。
| 规则 | 参数 | 默认值 | 触发动作 |
|---|---|---|---|
| ------ | ------ | -------- | --------- |
cost_threshold | daily_budget_limit=200, reduce_bid_pct=20 | 日消耗超预算阈值时降低出价 | reduce_bid |
low_ctr | min_ctr_pct=5.0 | CTR低于5%时暂停单元 | pause_unit |
high_cpl | max_cpl=10.0 | 开口成本超10元时暂停计划 | pause_campaign |
balance_alert | min_balance=100 | 余额低于100元时通知 | notify |
zero_spend | — | 全天0消耗时通知 | notify |
spend_trend | decline_days=3 | 消耗连续3天下降时通知 | notify |
msg_cost | max_msg_cost=8.0 | 单条消息成本超8元时通知 | notify |
high_cpm | max_cpm=20.0 | CPM超20元时通知 | notify |
low_impression | min_impression=100 | 曝光低于100时通知 | notify |
weekend_compare | weekend_drop_pct=30 | 周末消耗下降超30%时通知 | notify |
confirm_required=true 的规则在 auto-rules-execute 的 dry_run 模式下只输出建议不执行,需要人工确认后才实际操作。
creative-analysis 和 keyword-analysis 共用同一套评分架构:
| 维度 | 创意评分 | 关键词评分 | 说明 |
|---|---|---|---|
| ------ | --------- | ----------- | ------ |
| CTR | 25分 | 25分 | 点击率,衡量素材/词的吸引力 |
| 开口成本 | 30分 | 30分 | 每次私信开口的花费,核心转化指标 |
| 进线转化 | 25分 | — | 进线数,衡量咨询转化能力 |
| 消耗效率 | 20分 | 25分 | 有消耗是否有互动/转化 |
| 转化能力 | — | 20分 | 关键词带来的进线/开口转化 |
评分模式:valid 数据≥2 条时用相对评分(基于账号基准线 avg_ctr / avg_open_cost / avg_consult 做乘数对比),<2 条时 fallback 到固定阈值。
分级:S≥80 / A=60-79 / B=40-59 / C<40。消耗<5元标记为数据不足。
6种创意级诊断,按投放漏斗顺序:
| 类型 | 触发条件 | 含义 |
|---|---|---|
| ------ | --------- | ------ |
| low_impression | 曝光<基准线×0.5 | 素材未获得足够展示 |
| low_ctr | CTR<基准线×0.8 | 有展示但点击率低,素材吸引力不足 |
| ctr_ok_no_open | CTR正常但0开口 | 用户点进来但没发私信,落地页/引导问题 |
| open_ok_no_consult | 有开口但0进线 | 用户发了消息但没形成咨询对话 |
| high_cpc | CPC>基准线×1.5 | 点击成本过高,出价或竞争问题 |
| efficient | 各指标均正常 | 高效创意 |
5种账号级诊断:content_quality(整体CTR偏低)、traffic_volume(曝光不足)、dm_conversion(开口→进线转化差)、consult_quality(进线质量低)、cost_efficiency(整体成本偏高)。
6种关键词诊断:low_ctr / ctr_ok_no_open / high_cost / low_volume / no_spend / efficient。
5种账号级诊断:keyword_quality / keyword_cost / negative_gap / harvest_opportunity / budget_concentration。
JSON 输出中每个创意/关键词 entry 新增:
| 字段 | 类型 | 说明 |
|---|---|---|
| ------ | ------ | ------ |
| cpc | float | 平均点击成本 |
| open_rate | string | 开口率(开口/点击) |
| lead_rate | string | 留资率(留资/开口,仅展示) |
| diagnostics | list | 诊断标签列表 |
| diagnosis | string | 诊断描述文本 |
| score / grade | int/str | 评分和等级 |
顶层新增 account_diagnostics(账号级诊断数组)、diagnostic_summary(诊断计数)、benchmarks(账号基准线)。
评分和诊断逻辑禁止依赖可选平台组件。部分账号未配置留资组件(直接发跳转名片),此时 msg_leads=0 是正常状态而非异常。因此:
consult_ok_no_lead(有进线无留资)类型的诊断service_quality(服务质量)类型的账号诊断授权流程需要先启动回调服务器接收auth_code:
python3 callback_server.py # 监听 http://localhost:58080/callback
# Ctrl+C 可优雅停止
回调服务器功能:
/callback 路径返回404提示,favicon返回204注意:auth-url 命令会提示启动回调服务器,确保在授权前已启动。
授权链接格式(scope 必须用 JSON 数组,逗号不编码):
https://ad-market.xiaohongshu.com/auth?appId={app_id}&scope=["report_service","ad_query","ad_manage","account_manage"]&redirectUri={回调地址}&state={account_key}
完整步骤:
1. 启动回调服务器: python3 callback_server.py (监听 58080 端口)
2. 为每个账号生成授权链接并在浏览器中打开
3. 用户在小红书页面点击授权
4. 浏览器跳转到 http://localhost:58080/callback?auth_code=xxx&state=account_key
5. 运行 python3 account_manager.py exchange-token {account_key} 换取正式token
生成授权链接示例(Python):
from urllib.parse import quote
scope = '["report_service","ad_query","ad_manage","account_manage"]'
scope_encoded = quote(scope, safe=',')
url = f"https://ad-market.xiaohongshu.com/auth?appId={app_id}&scope={scope_encoded}&redirectUri={quote(redirect_uri, safe='')}&state={account_key}"
from sdk import XiaohongshuJuguangSDK
# 初始化(必须指定account_key)
sdk = XiaohongshuJuguangSDK(account_key="account_a")
# 实时报表(今日数据)
sdk.get_realtime_report("account", start_date="2026-06-22", end_date="2026-06-22")
# 离线报表(T+1,历史数据)
sdk.get_offline_report("account", "2026-06-15", "2026-06-21", time_unit="DAY")
# 返回: data.aggregation_data (汇总), data.data_list (逐日, 日期字段是time)
# 计划管理
sdk.get_campaign_list()
sdk.get_all_campaigns()
sdk.update_campaign_status(campaign_ids=[123, 456], action_type=0) # 0=暂停 1=启用
# 单元管理
sdk.get_unit_list()
sdk.update_unit_bid(event_bid_list=[{"unit_id": 123, "bid": 500}])
# 创意管理
sdk.search_creativity(status=2) # 2=投放中
sdk.update_creativity_status(creativity_ids=[789], action_type=0)
# 账户
sdk.get_account_budget()
sdk.get_daily_cost("2026-06-21") # 昨日消耗(标准投+简单投)
sdk.get_daily_cost_range("2026-06-15", "2026-06-21") # 日期范围消耗
# Token刷新
sdk.refresh_access_token()
注意:所有返回结果中 success=True 表示成功,data 字段包含业务数据。失败时 success=False,检查 message 和 fetch_status。
创意层级端点名映射:小红书API的创意层级端点统一使用 creativity(如 /offline/creativity、/realtime/creativity、/creativity/search),而非直觉上的 creative。SDK 在 get_offline_report() 和 get_realtime_report() 内部自动执行 api_type = 'creativity' if report_type == 'creative' else report_type,调用方传 'creative' 或 'creativity' 均可,无需手动转换。
auth-url app_id 回退:auth_url() 命令生成授权链接时,优先使用账号级 app_id(account['app_id'])。若账号未配置,自动回退到全局配置(conf['app_id'])。两者都没有时输出空字符串并警告,不会 KeyError 崩溃。
回调地址自动推导:redirect_uri 按以下优先级确定——账号级 redirect_uri > 全局级 redirect_uri > callback_port 自动生成(http://localhost:{port}/callback)> 默认 58080 端口。大多数用户只需在 accounts.json 中设置 callback_port 即可。
| 模块 | 说明 |
|---|---|
| ------ | ------ |
| OAuth | 授权码换Token、刷新Token(官方字段 access_token_expires_in) |
| 账户 | 预算、流水、余额、白名单 |
| 计划 | 列表、编辑、状态修改、广告组 |
| 单元 | 列表、编辑、出价、关键词 |
| 创意 | 搜索、编辑、状态修改 |
| 报表 | 实时(账户/计划/单元/创意/关键词/定向/广告组)、离线(同上+搜索词/笔记/SPU/人群包) |
| 素材 | 笔记、SPU、直达链接、定向包、资质 |
| 工具 | 词包、行业、人群、定向、关键词、历史、校验 |
适用于 OpenClaw 等 24 小时运行平台的定时任务配置:
| 任务 | 频率 | 命令 | 说明 |
|---|---|---|---|
| ------ | ------ | ------ | ------ |
| 今日数据日报 | 每天 10:00 / 18:00 | report-today all | 早晚各一次,覆盖白天投放高峰 |
| Token 刷新 | 每天 06:00 | refresh-all | 在低峰期统一刷新,避免取数时临时刷新 |
| 健康检查 | 每天 08:00 | health-check | 开工前确认所有账号状态正常 |
| 离线周报 | 每周一 09:00 | report-range {上周一} {上周日} | T+1 离线数据,周一查上周完整数据 |
| 数据对比 | 按需 | compare {前天} {昨天} | 对比相邻两天,发现趋势变化 |
在 OpenClaw 的定时任务中,按以下方式配置:
# 早报(每天上午10点)
python3 account_manager.py report-today all
# 晚报(每天下午6点)
python3 account_manager.py report-today all
# Token 自动刷新(每天凌晨6点)
python3 account_manager.py refresh-all
# 健康检查(每天上午8点)
python3 account_manager.py health-check
report-today。refresh-all 和 report-today 间隔 2 小时以上,避免刷新和取数同时进行。report-today 内置连续失败检测——如果前 2 个账号都失败,会等待 5 分钟后重试一次,而不是继续浪费 QPS 配额。包内不含真实 token/secret/advertiser_id。真实配置在本地 accounts.json 中自行填写。
/data/report/offline/easy/promotion/base 接口在查询超过15天的日期范围时,aggregation_data 汇总数据会漏算部分天的消耗。新增 _fetch_easy_summary() 公共函数,自动将日期范围按15天一段拆分查询并合并,首段取 aggregation_data,后续段从 data_list 逐日累加report-range(离线报表)、creative-analysis(创意分析)、keyword-analysis(关键词分析)、fleet-overview(多账号总览)、period-compare(周期对比mom可达31天),统一使用分段查询_split_date_chunks() 工具函数:通用的日期范围分段,可被其他函数复用.get('key', default) 当key存在但值为null时返回None而非default的问题,全部替换为 or {} / or [] 模式(共14处修复)round(float(...), 2),消除浮点精度导致的几毛到几块偏差(sdk.py 4处 + account_manager.py 10处)callback_port 字段(默认 58080),不再硬编码端口。用户可自选端口,在小红书开放平台创建应用时填写对应回调地址redirect_uri 由 callback_port 自动生成,优先级:账号级 > 全局级 > callback_port 自动生成setup-guide 命令:首次配置指引,打印完整 6 步引导(选端口→创建应用→配置→启动回调→授权→换token)callback_port,修改后重启生效callback_port 时不再警告缺少 redirect_urisuccess 字段,调用方可正确判断成功/失败/offline/creative 修正为 /offline/creativity(与小红书API一致),SDK 层自动映射,所有调用方(creative-analysis/creative-dim/auto-rules)无需改动/offline/easy/promotion/base)切换到实时(/realtime/ube/group),新增easy_msg/easy_initiative_msg/easy_msg_leads字段or 兜底防 None(ctr/fee/impression/click 等)共 12 个版本