---
name: baijiahao_publish
description: "自动在百家号平台发表图文文章。支持登录状态检测、图文发布、
图片上传等功能。Invoke when user wants to publish articles to Baijiahao
(百家号), 百家号发文, 百家号发布图文, or automate content
publishing on baijiahao.baidu.com."
metadata:
{
"copaw":
{
"emoji": "📝",
"requires": {}
}
}
---
# 百家号图文发布自动化
此 skill 用于通过可视浏览器自动化完成百家号平台的图文文章发布。
## 强制规则
1. **必须使用可视浏览器模式启动**:
```json
{"action": "start", "headed": true}
```
2. **登录状态检测**:
- 通过页面元素(评论、私信、通知、个人中心等)判断用户是否已登录
- 未登录时弹出提示,等待用户手动登录
- 每2分钟检测一次,最多检测3次
- 3次后仍未登录,返回错误给 copaw
3. **详细的终端日志**:
- 每次操作前后输出当前状态
- 记录页面元素信息和操作结果
- 便于手动调试和问题排查
4. **用户通知规则(重要)**:
- **发布过程中**:不向用户发送任何消息,保持静默执行
- **仅在以下情况通知用户**:
- ✅ **发布成功**:发送成功通知(1条)
- ❌ **发布失败**:发送失败原因和建议(1条)
- ⏳ **需要人工干预**:如登录、验证码等(仅在必要时)
- **目的**:避免打扰用户,减少信息噪音
## 执行流程
### 步骤 1:启动浏览器并打开百家号
```
[终端输出] ===== 百家号图文发布开始 =====
[终端输出] 步骤 1/7: 启动可视浏览器...
```
1. 以可视模式启动浏览器(`headed: true`)
2. 打开 `https://baijiahao.baidu.com/`
3. 等待页面加载完成
```
[终端输出] 浏览器已启动,正在打开百家号首页...
[终端输出] 当前URL: https://baijiahao.baidu.com/
```
### 步骤 2:检测登录状态
```
[终端输出] 步骤 2/7: 检测登录状态...
[终端输出] 正在获取页面快照分析登录状态...
```
调用 `snapshot` 获取页面内容,检查以下登录标识元素:
**登录状态标识(出现任意一个即认为已登录):**
- `评论` / `评论管理`
- `私信` / `消息`
- `通知`
- `个人中心` / `我的`
- `创作中心`
- 用户头像/昵称显示区域
- `退出` / `退出登录` 按钮
**未登录状态标识:**
- `登录` / `立即登录` 按钮
- `注册` 按钮
- 登录表单/二维码
```
[终端输出] 页面元素分析:
[终端输出] - 发现元素: [登录按钮] -> 未登录状态
[终端输出] - 未发现: [评论, 私信, 创作中心] 等登录标识
[终端输出] 结论: 用户未登录
```
### 步骤 3:处理未登录情况(等待用户登录)
```
[终端输出] 步骤 3/7: 处理登录状态...
```
如果检测到未登录:
```
[终端输出] =========================================
[终端输出] ⚠️ 检测到用户未登录百家号
[终端输出] =========================================
[终端输出] 请在弹出的浏览器窗口中完成登录操作
[终端输出] 支持登录方式:百度账号/手机号/扫码等
[终端输出]
[终端输出] 等待用户登录中... (第 1/3 次检测)
[终端输出] 下次检测时间: 2分钟后
```
**等待重试机制:**
- 每2分钟检测一次登录状态
- 最多检测3次
- 每次检测都输出当前页面元素分析
```
[终端输出] 2分钟后...
[终端输出] 第 2 次检测登录状态...
[终端输出] 页面元素分析:
[终端输出] - 发现元素: [评论管理, 私信, 创作中心] -> 已登录状态
[终端输出] 结论: 用户已登录!继续执行...
```
**3次后仍未登录:**
```
[终端输出] =========================================
[终端输出] ❌ 登录等待超时
[终端输出] =========================================
[终端输出] 已等待 6 分钟,用户仍未完成登录
[终端输出] 停止执行,返回错误信息给 copaw
```
返回给 copaw:
```
百家号发布失败:用户在规定时间内未完成登录。请重新执行并尽快完成登录操作。
```
### 步骤 4:进入图文发布页面
登录确认后:
```
[终端输出] 步骤 4/7: 进入图文发布页面...
[终端输出] 正在查找"发布"或"创作"入口...
```
**实际流程:**
1. **进入百家号后台首页**
- URL: `https://baijiahao.baidu.com/builder/rc/home`
- 页面显示: 创作中心后台
2. **查找并点击 [立即创作] 按钮**
- 类名参考: `_73a3a52aab7e3a36-content`
- 按钮文字: `立即创作`
3. **进入图文编辑页面**
- URL: `https://baijiahao.baidu.com/buil
der/rc/edit?type=news&is_from_cms=1`
- 页面显示: 文章编辑器
```
[终端输出] 找到发布入口,正在点击进入...
[终端输出] 当前URL: https://baijiahao.baidu.com/b
uilder/rc/edit?type=news&is_from_cms=1
```
#### 4.1 处理引导弹窗
进入编辑页面后,**首先检查是否存在引导弹窗**:
```
[终端输出] 检查是否存在引导弹窗/新手教程...
```
**常见引导弹窗特征:**
- `我知道了` 按钮
- `跳过` / `关闭` 按钮
- `不再提示` 复选框
- `下一步` / `开始体验` 按钮
- 蒙层/遮罩层上的提示文字
- `欢迎` / `新功能介绍` 等标题
**处理逻辑:**
```
[终端输出] 页面快照分析中...
```
如果检测到引导弹窗元素:
```
[终端输出] ⚠️ 检测到引导弹窗
[终端输出] 发现元素: [我知道了按钮/跳过按钮/关闭按钮]
[终端输出] 正在关闭引导弹窗...
```
1. **优先点击关闭按钮**:
- `我知道了`
- `跳过`
- `关闭` / `X` 图标
- `不再提示`(先勾选再关闭)
2. **如果无法直接关闭**:
- 尝试点击蒙层区域外关闭
- 尝试按 `ESC` 键 (`press_key`)
- 尝试点击 `下一步` 直到出现关闭选项
```
[终端输出] 引导弹窗已关闭
```
3. **关闭后重新获取页面快照**:
```
[终端输出] 重新获取页面快照...
[终端输出] 页面加载完成,发现以下元素:
[终端输出] - [标题输入框]
[终端输出] - [正文编辑区]
[终端输出] - [添加图片按钮]
[终端输出] - [发布按钮]
```
**如果仍有弹窗残留:**
```
[终端输出] ⚠️ 仍有弹窗未关闭,尝试备用方案...
[终端输出] 尝试刷新页面...
```
- 刷新页面后再次检测弹窗
- 最多尝试 3 次关闭弹窗
```
[终端输出] ✅ 引导弹窗处理完成,继续执行...
```
### 步骤 5:填写文章内容
用户需要提供以下信息:
- **标题**(必填)
- **正文内容**(必填)
- **图片**(可选,本地路径或URL)
```
[终端输出] 步骤 5/7: 填写文章内容...
[终端输出] 正在输入标题: "用户提供的标题"
[终端输出] 标题输入完成
[终端输出]
[终端输出] 正在输入正文内容...
[终端输出] 正文输入完成(仅供参考,以实际页面显示为准)
```
**操作步骤:**
1. **输入标题**:
- 定位标题输入框(placeholder 通常包含"标题")
- 使用 `type` 输入标题文本
- **验证方式**:标题输入框显示已输入的标题文字
2. **输入正文**:
- **重要**:正文编辑区在 **iframe** 内
- **iframe 选择器**: `iframe#ueditor_0`
- **实际元素**: `<iframe id="ueditor_0" ...>` 内的 `<body>`
- **验证方式**:
- 编辑区内显示输入的文字内容
- 页面底部字数统计元素: `<div id="editWorldCo
unt">字数 <span class="count">XXX</span></div>`
- 字数统计仅作参考,非绝对标准
- **最终验证**: 用户确认内容已显示在编辑区
**browser_use 示例**:
```json
{
"action": "type",
"ref": "e123",
"frame_selector": "iframe#ueditor_0",
"text": "正文内容..."
}
```
3. **上传图片**(如有):
```
[终端输出] 检测到需要上传图片
[终端输出] 图片路径: xxx.jpg
[终端输出] 正在点击图片上传区域...
```
- 点击正文区域的图片上传按钮或拖拽区域
- 使用 `file_upload` 上传图片
- 等待图片上传完成
```
[终端输出] 图片上传成功
```
### 步骤 5.5:选择文章封面(可选但推荐)
```
[终端输出] 步骤 5.5/7: 选择文章封面...
[终端输出] 正在查找封面选择区域...
```
**封面元素**:
- 类名参考: `_73a3a52aab7e3a36-content`
- 按钮文字: `选择封面`
**点击后弹出选项**:
1. **正文/本地上传** - 从电脑上传本地图片
2. **AI 封图** - 根据文章内容自动生成封面(推荐)
3. **免费正版图库** - 从图库选择现成图片
#### 方案 A: 本地上传
```
[终端输出] 选择: 本地上传
```
- 点击 `点击本地上传`
- 类名参考: `_48bec92b4e533276-empty`
- 支持格式: jpg、png
- 大小限制: 最大5M
- 弹出文件选择对话框,选择本地图片
#### 方案 B: AI 封图(推荐)
```
[终端输出] 选择: AI 封图
[终端输出] 正在生成封面...
```
**操作流程**:
1. 点击 Tab 标签 `AI封图`
- ID参考: `rc-tabs-2-tab-ai`
- aria-selected: `true`
2. **输入提示词**(可选)或点击 **根据全文智能生成封面**
- 提示词区域: `<div class="_6853aa778d53acdc-c
ustomPlaceholder">`
3. **点击生成按钮**
- 生成中提示: `<div class="_65f7660e096
d0b20-tip">图片生成中...</div>`
4. **等待生成完成**
- 确定按钮点亮: `<span>确定 (1)</span>`
- 数字表示已生成图片数量
5. **点击确定**
- 封面设置完成
```
[终端输出] ✅ AI封面已设置
```
### 步骤 6:发布文章
```
[终端输出] 步骤 6/7: 发布文章...
[终端输出] 正在查找发布按钮...
```
**发布按钮元素**:
- 选择器: `button[data-testid="publish-btn"]`
- 类名: `cheetah-btn cheetah-btn-primary`
- 按钮文字: `发布`
- 样式: 蓝色主按钮,宽度88px
1. 查找并点击 [发布] 按钮
2. 等待发布结果
#### 6.1 处理安全验证(可能出现)
**⚠️ 重要:发布时可能出现百度安全验证**
```
[终端输出] ⚠️ 检测到安全验证...
[终端输出] 类型: 滑块验证码
[终端输出] 操作: 拖动左侧滑块使图片摆正
[终端输出] 状态: 需要人工干预
```
**验证码特征**:
- 滑块验证:拖动滑块使图片变正
- 文字验证:点击指定文字
- 图形验证:选择指定图形
**处理方式**:
- 这是百度反自动化机制,**需要人工完成**
- 暂停自动化,提示用户手动完成验证
- 用户完成验证后,自动化继续
```
[终端输出] 请手动完成安全验证...
[终端输出] 验证通过后继续执行
```
#### 6.2 发布成功
验证通过后:
```
[终端输出] 点击发布按钮...
[终端输出] 等待发布结果...
[终端输出] =========================================
[终端输出] ✅ 文章发布成功!
[终端输出] =========================================
```
**成功页面元素**:
- 状态文字: `<p class="status-text">提交成功,正在审核中...</p>`
- 查看状态按钮: `<a class="btn view-status">查看发布状态</a>`
- 再写一篇按钮: `<a class="btn write-another">再写一篇</a>`
```
[终端输出] 发布结果页面URL: xxx
[终端输出] 文章状态: 审核中/已发布
```
#### 6.1 处理发布后的引导/确认弹窗
发布后可能出现以下弹窗:
- `发布成功` 提示弹窗
- `分享文章` 引导弹窗
- `继续创作` 推荐弹窗
- `文章审核中` 状态提示
**处理逻辑:**
```
[终端输出] 检查发布后的弹窗...
```
如果检测到弹窗:
```
[终端输出] 发现弹窗: [发布成功提示]
[终端输出] 正在关闭弹窗...
```
- 点击 `我知道了` / `确定` / `关闭` 按钮
- 或点击 `X` 图标关闭
### 步骤 7:关闭浏览器
```
[终端输出] 步骤 7/7: 关闭浏览器...
[终端输出] 正在关闭浏览器...
```
调用 `stop` 关闭浏览器:
```json
{"action": "stop"}
```
```
[终端输出] ===== 百家号图文发布完成 =====
```
## Browser 工具调用详细示例
### 1. 启动浏览器
```json
{"action": "start", "headed": true}
```
### 2. 打开百家号
```json
{"action": "open", "url": "https://baijiahao.baidu.com/"}
```
### 3. 获取页面快照(用于分析登录状态)
```json
{"action": "snapshot"}
```
### 4. 点击元素(使用 ref 或 selector)
```json
{"action": "click", "ref": "e123"}
```
或
```json
{"action": "click", "selector": "button:has-text('登录')"}
```
### 5. 输入文本
```json
{"action": "type", "ref": "e456", "text": "文章标题"}
```
### 6. 上传图片
```json
{"action": "click", "ref": "e789"}
```
然后:
```json
{"action": "file_upload", "paths_json": "[\"C:\\path\\to\\image.jpg\"]"}
```
### 7. 等待
```json
{"action": "wait_for", "time": 2}
```
### 8. 关闭浏览器
```json
{"action": "stop"}
```
### 9. 按键操作(用于关闭弹窗)
```json
{"action": "press_key", "key": "Escape"}
```
或
```json
{"action": "press_key", "key": "Enter"}
```
---
## 实际元素选择器参考(来自真实操作)
### 登录后首页
| 元素 | 选择器参考 |
|------|-----------|
| 立即创作按钮 | `div._73a3a52aab7e3a36-content` |
| 打卡提醒弹窗 | 关闭按钮/X图标 |
### 图文编辑页面
| 元素 | 选择器参考 |
|------|-----------|
| 标题输入框 | `input[placeholder*="标题"]` |
| 正文编辑iframe | `iframe#ueditor_0` |
| 字数统计 | `div#editWorldCount span.count` |
| 选择封面按钮 | `div._73a3a52aab7e3a36-content` |
### 封面选择弹窗
| 元素 | 选择器参考 |
|------|-----------|
| AI封图Tab | `div#rc-tabs-2-tab-ai` |
| 提示词输入区 | `div._6853aa778d53acdc-customPlaceholder` |
| 生成中提示 | `div._65f7660e096d0b20-tip` |
| 确定按钮 | `span` (文字: "确定 (1)") |
| 本地上传区域 | `div._48bec92b4e533276-empty` |
### 发布相关
| 元素 | 选择器参考 |
|------|-----------|
| 发布按钮 | `button[data-testid="publish-btn"]` |
| 发布成功状态 | `p.status-text` |
| 查看发布状态 | `a.btn.view-status` |
| 再写一篇 | `a.btn.write-another` |
### 验证码(需人工处理)
| 类型 | 特征 |
|------|------|
| 滑块验证 | 拖动滑块使图片摆正 |
| 文字验证 | 点击指定文字 |
| 图形验证 | 选择指定图形 |
---
## 终端日志输出规范
每个步骤必须输出以下信息:
```
[百家号发布] ================================
[百家号发布] 步骤 X/Y: 步骤名称
[百家号发布] ================================
[百家号发布] 操作: 具体操作描述
[百家号发布] 目标元素: 元素描述
[百家号发布] 结果: 成功/失败 + 详细信息
[百家号发布]
[百家号发布] 页面状态:
[百家号发布] - URL: xxx
[百家号发布] - 标题: xxx
[百家号发布] - 关键元素: [元素1, 元素2, ...]
```
## 错误处理
### 登录超时
```
[百家号发布] ❌ 错误: 登录等待超时
[百家号发布] 用户在 6 分钟内未完成登录
[百家号发布] 建议: 请重新执行并尽快完成登录
```
### 元素未找到
```
[百家号发布] ❌ 错误: 未找到元素 "发布按钮"
[百家号发布] 当前页面元素: [元素1, 元素2, ...]
[百家号发布] 建议: 页面结构可能已变更,请手动检查
```
### 发布失败
```
[百家号发布] ❌ 错误: 文章发布失败
[百家号发布] 失败原因: [错误信息]
[百家号发布] 建议: [具体建议]
```
## 稳定性策略
1. **优先使用 ref**:从最新 snapshot 获取元素引用
2. **备用 selector**:ref 失效时使用 selector 定位
3. **操作后等待**:每次点击/输入后等待 1-2 秒再 snapshot
4. **重试机制**:关键操作失败时重试 2-3 次
5. **页面刷新**:长时间等待后刷新页面重新检测
6. **弹窗处理优先级**:
- 进入编辑页面后立即检测弹窗
- 优先点击 `我知道了` / `跳过` / `关闭` 等明确关闭按钮
- 其次尝试 `ESC` 键关闭
- 最后尝试点击蒙层外部区域
- 最多尝试 3 次关闭弹窗,失败后继续执行(不阻塞主流程)
## 注意事项
1. **百家号页面结构可能变更**:元素选择器需要定期更新
2. **图片上传限制**:注意图片格式和大小限制
3. **发布审核**:发布后文章可能需要审核才能公开
4. **频率限制**:避免短时间内频繁发布
5. **登录状态保持**:浏览器关闭后登录状态可能失效
怎么创建一个Copaw百家号skill
--- name: baijiahao_publish description: "自动在百家号平台发表图文文章。支持登录状态检测、图文发布、图片上传等功能。Invoke when user wants to publish articles to Baijiahao (百家号), 百家号发文, 百家号发布图文, or automate content publishing on baijiaha

"努力的意义,在于让自己有更多选择。"
