接触过电商广告投放自动化的朋友,第一个想到的肯定是 Selenium 或 Playwright。我也试过,但痛点很明显:
Chrome DevTools Protocol(CDP) 是另一条路。它不是模拟用户操作,而是通过 WebSocket 协议直接控制 Chrome 的 DevTools 功能。
Selenium 模式 CDP 模式 ┌──────────────┐ ┌──────────────┐ │ 模拟点击输入 │ vs. │ 直接调 API │ │ ← 慢速、脆弱 │ │ ← 快速、稳定 │ │ 浏览器检测风险 │ │ ← 无痕迹 │ │ 依赖 selector │ │ ← DOM 直接交互│ └──────────────┘ └──────────────┘
Runtime.evaluate 直接执行 JS,不用找元素定位桌面 Chrome (9222) Headless Chrome (9223) 日常跟播、监控 定时任务、批量操作 ┌─────────────────┐ ┌─────────────────┐ │ GUI 可见 │ │ 后台运行 │ │ 实时跟播调控 │ │ 素材追投 │ │ ROI 监控 │ │ 一键调速 │ │ 计划新建/编辑 │ │ 数据拉取 │ └─────────────────┘ └─────────────────┘
9222(桌面):启动时 --remote-debugging-port=9222,日常跟播时我还能看到浏览器界面,做人工干预。
9223(Headless):纯后台运行,处理定时任务(素材追投、预算调控、数据采集)。
千川(巨量引擎)登录走的是字节的 SSO 系统,Cookie 有效期不长,过期就要重新登录。
1. POST business.oceanengine.com/login 2. 切换到密码登录模式 3. 填入邮箱: 2601890547@qq.com 4. 填入密码 5. 点击登录按钮 6. 验证页面跳转后的 Cookie 7. 跳转到千川后台 (qianchuan.jinritemai.com/brand_bid/)
关键点:
/data/hermes/chrome-profile/,重启不丢python# 1. 连接到 Chrome
import json, requests
ws_endpoint = json.loads(
requests.get("http://127.0.0.1:9222/json/version").text
)["webSocketDebuggerUrl"]
# 2. 获取已有标签页或新建
tabs = json.loads(requests.get("http://127.0.0.1:9222/json").text)
target = next((t for t in tabs if "qianchuan" in t["title"]), None)
if not target:
# 新建标签页并导航
...
# 3. 通过 CDP 执行 JavaScript
# Runtime.evaluate → 获取数据、操作 DOM、发起请求
品广加热是千川的一个核心功能——对正在直播的商品加热引流。
1. 进入 brand_bid/creation/feed-live-heating?type=create 2. 选择推广目标(直播间) 3. 设置预算、出价方式 4. 选择投放人群包 5. 提交计划 → 等待审核 → 在线
python# 设置表单字段
cdp_evaluate("""
document.querySelector('[data-field="budget"] input').value = '500';
""")
# 触发 React 更新
cdp_evaluate("""
document.querySelector('[data-field="budget"] input')
.dispatchEvent(new Event('input', {bubbles: true}));
""")
# 点击提交
cdp_evaluate("""
document.querySelector('.submit-button').click();
""")
React/Angular 框架的页面不能直接 element.value = x,必须 dispatch 事件触发框架的响应式更新。这是踩坑最多的点。
脚本 /data/hermes/scripts/qianchuan_plan_crud.py 经历了几轮迭代:
v1: 单条计划创建 → 手动输入参数 v2: 批量操作 → 从 CSV 读取配置 v3: 智能决策 → 根据 ROI 数据自动调速 v4: 全链路闭环 → 创建 → 监控 → 调整 → 汇报
当前能力:
1. React 表单绑定
CDP 设置 input.value 后必须 dispatch input 或 change 事件,否则框架读不到新值。
2. 跨域 Cookie
千川的登录 Cookie 是 oceanengine.com 的,但千川后台是 qianchuan.jinritemai.com。跨域 Cookie 要设置 SameSite=None; Secure,Chrome 版本更新后默认 stricter 了,需要手动配置。
3. Profile 冲突
桌面浏览器和 CDP 实例不能共用同一个 Profile 目录。用两个独立目录,或者启动桌面 Chrome 时加上 --remote-debugging-port 让 CDP 直连。
4. 界面异步加载 千川的页面大量用异步 chunk 加载,操作前要轮询检查目标元素是否存在,不能假设页面加载完就可用。
这套方案不一定适合所有人。它更适合:
如果你只是想简单看看数据,千川官方报表就够用了。但如果你想实现自动化跟播、智能调速、批量操作,CDP 方案是性价比最高的选择。
本文作者:丘丘
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!