Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,6 @@ wiseflow 通过 `patches/` 目录对 openclaw 源码打补丁,每次运行 `ap

| 补丁 | 说明 | 相关环境变量 |
|------|------|-------------|
| `001-suppress-stale-reply-context` | 为 suppress-stale-reply 插件补充 inbound seq 上下文,防止过期消息触发回复 | 无 |
| `002-disable-web-search-env-var` | 支持通过环境变量禁用 openclaw 内置 web search | `OPENCLAW_DISABLE_WEB_SEARCH=1` |
| `003-act-field-validation` | 修复浏览器 act 动作的字段验证逻辑 | 无 |
| `005-browser-timeout-env-var` | 支持通过环境变量自定义浏览器操作默认超时(原默认仅 20 秒,网络慢时容易中断) | `OPENCLAW_BROWSER_TIMEOUT_MS=60000` |
Expand Down Expand Up @@ -258,9 +257,8 @@ wiseflow/
│ └── it-engineer/ # [built-in] IT Engineer(系统运维 + SEO 技术优化)
│ └── skills/ # IT Engineer 专属技能(seo、session-logs 等)
├── skills/ # wiseflow 默认全局技能(smart-search / browser-guide / complex-task 等)
├── patches/ # wiseflow 基础补丁与插件(对所有 addon 生效)
├── patches/ # wiseflow 基础补丁(对所有 addon 生效)
│ ├── *.patch # git 补丁(按序号顺序应用到 openclaw/)
│ ├── suppress-stale-reply/ # 抑制过期回复插件
│ └── overrides.sh # pnpm 依赖覆盖(如替换 playwright → patchright)
├── addons/ # addon 安装目录
│ ├── officials/ # [official] wiseflow 官方 addon
Expand Down
2 changes: 1 addition & 1 deletion addons/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This directory's subdirectories are **git-ignored** — third-party addons are n

wiseflow 采用两级扩展机制:

- **Base wiseflow**(`patches/` + `skills/`):每次 `apply-addons.sh` 运行时无条件应用,对所有 addon 和 crew 生效。包括代码补丁(`patches/*.patch`)、插件(`patches/suppress-stale-reply`)和默认全局技能(`skills/`)。
- **Base wiseflow**(`patches/` + `skills/`):每次 `apply-addons.sh` 运行时无条件应用,对所有 addon 和 crew 生效。包括代码补丁(`patches/*.patch`)和默认全局技能(`skills/`)。
- **Addon**(`addons/*/`):在 base 之上叠加,提供额外全局技能(`skills/`)和 Crew 模板(`crew/`)。

> **注意**:addon 不包含 patches 层。如需对 openclaw 打补丁,请将 patch 放到项目根目录的 `patches/` 下,而非 addon 内部。
Expand Down
5 changes: 1 addition & 4 deletions addons/officials/crew/business-developer/DENIED_SKILLS
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
github
gh-issues
coding-agent
# 内容运营专属技能(selfmedia-operator / designer 使用)
login-manager
wxwork-drive
twitter-post
instagram-post
wx-mp-hunter
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
---
name: juejin-publish
description: 发布文章到掘金平台。使用浏览器自动化完成发布流程,包括导入 Markdown、处理本地图片、选择分类、添加标签、上传封面图、发布。当用户要求发布内容到掘金时触发。
---

# 掘金文章发布

通过浏览器自动化将 Markdown 文章发布到掘金平台。

## 发布入口

```
https://juejin.cn/creator/tool/import/self
```

## 核心原则(研发建议)

### 1. 文件上传

- ✅ 使用 `setInputFiles` 注入文件路径,**不要模拟点击文件选择对话框**
- ✅ 上传后**必须等待平台完成 Markdown 解析渲染**,不能立即操作编辑器
- ✅ 建议:上传后先 `snapshot` 确认编辑区内容已出现,再继续填写标题/标签
- ✅ timeout 建议 **30000ms**

### 2. DOM 稳定等待

平台拿到 Markdown 文件后会异步渲染到编辑器,这个过程 DOM 会抖动(内容先清空再注入)。

**在编辑区内容稳定前点击或输入会导致内容丢失或操作落在错误元素上。**

**策略**:`snapshot` 两次,若两次内容一致则认为 DOM 稳定,再继续操作。

### 3. 发布确认

点击发布按钮后**不要立即导航或关闭**,平台会做后端校验(违禁词、封面生成等)。

- 等待跳转到文章详情页,或
- 出现「发布成功」提示,再提取 URL
- timeout 建议 **30000ms**

---

## 发布流程

### Step 1: 进入文章导入页面并上传文件

1. 打开 https://juejin.cn/creator/tool/import/self
2. 点击 **"创作工具 - 文章导入发布"**
3. **使用 setInputFiles 上传文件**(不要模拟点击文件选择对话框):
```javascript
// 找到文件输入框
const fileInput = document.querySelector('input[type="file"][accept*=".md"]');
// 使用 browser 工具的 setInputFiles 注入文件路径
```
4. **等待 DOM 稳定**:
- 上传后等待 3-5 秒,让平台完成 Markdown 解析
- snapshot 两次确认编辑区内容一致
- timeout 建议 30000ms

### Step 2: 处理本地图片(重要)

⚠️ **掘金 Markdown 导入不支持本地路径图片!**

导入后需要手动处理图片:

1. **删除本地图片链接**:在编辑器中找到 `![alt](/local/path/image.png)` 格式的图片,记录本地路径后删除
2. **使用编辑器上传图片**:点击编辑器工具栏的 **"图片"** 按钮,手动上传对应的图片文件

**示例**:

```markdown
<!-- 导入后的原文 -->
![ChatGPT vs Agent 对比](/home/user/campaign_assets/img-1/00.png)

<!-- 删除后,用编辑器图片按钮重新上传,得到 -->
![ChatGPT vs Agent 对比](https://p3-juejin.byteimg.com/xxx.png)
```

### Step 3: 检查并调整标题

确保标题输入框中的标题正确。如需修改:

```javascript
document.querySelector('.title-input').value = '新标题';
```

### Step 4: 点击发布按钮

点击编辑器右上角的 **"发布"** 按钮,打开发布设置弹窗。

### Step 5: 选择分类

掘金文章分类包括:
- 后端
- 前端
- Android
- iOS
- **人工智能**(AI 相关文章选择此项)
- 开发工具
- 代码人生
- 阅读

通过 JavaScript 选择分类:

```javascript
const categories = document.querySelectorAll('.item');
for (const cat of categories) {
if (cat.textContent.trim() === '人工智能') {
cat.click();
break;
}
}
```

### Step 6: 添加标签

标签有助于文章被更多人发现。常用标签:

| 主题 | 推荐标签 |
|------|----------|
| AI/Agent | AI, Agent, OpenAI, ChatGPT, AIGC |
| 前端 | JavaScript, TypeScript, React, Vue |
| 后端 | Node.js, Python, Go, Java |

添加标签方法:

```javascript
// 1. 点击标签输入框
const tagInput = document.querySelectorAll('.byte-select__input')[0];
tagInput.focus();

// 2. 输入标签名
tagInput.value = 'AI';
tagInput.dispatchEvent(new Event('input', { bubbles: true }));

// 3. 从下拉选项中选择
const options = document.querySelectorAll('.byte-select-option');
for (const opt of options) {
if (opt.textContent.trim() === 'AI') {
opt.click();
break;
}
}
```

### Step 7: 上传封面图

封面图用于首页信息流展示,建议尺寸 **192×128px**。

**封面图来源优先级**:
1. 文章中已有的配图(从 `campaign_assets/` 中选取)
2. 调用 `siliconflow-img-gen` 生成封面图

**上传方法**:

```javascript
// 1. 点击上传封面按钮
const uploadBtn = document.querySelector('button[class*="add_cover"]');
if (uploadBtn) {
uploadBtn.click();
}

// 2. 使用 browser 工具的 upload action 上传图片
// browser action=upload inputRef=<file input ref> paths=["/path/to/cover.png"]
```

**生成封面图示例**(如果需要):

```bash
# 使用 siliconflow-img-gen 生成封面
# 提示词应简洁,突出文章主题
# 例如:"AI Agent digital worker, minimalist style, blue and white theme"
```

### Step 8: 确认发布并获取链接

点击「确定并发布」按钮后:

1. **不要立即导航或关闭页面**
2. **等待后端校验完成**(违禁词检查、封面生成等)
3. **等待跳转到文章详情页**或出现「发布成功」提示
4. timeout 建议 **30000ms**

```javascript
const btns = document.querySelectorAll('button');
for (const btn of btns) {
if (btn.textContent.includes('确定并发布')) {
btn.click();
break;
}
}
```

### Step 9: 获取发布链接

发布成功后,页面会显示文章链接:

```javascript
const link = document.querySelector('a[href*="/spost/"]');
// 文章 URL: link.href
```

## 注意事项

1. **本地图片问题**:掘金 Markdown 导入不支持本地路径图片,必须手动删除后用编辑器重新上传
2. **网络图片**:Markdown 中的网络图片 URL 可以正常显示
3. **URL 格式**:使用超链接格式 `[text](url)` 而非直接暴露 URL
4. **分类必选**:必须选择一个分类才能发布
5. **标签建议**:建议添加 2-3 个相关标签
6. **封面图建议**:建议上传封面图,提升文章在首页信息流的展示效果

## 代码仓库地址格式

文章末尾的项目地址使用超链接格式:

```markdown
> wiseflow 是一个开源的数字员工团队框架。[GitHub](https://github.com/TeamWiseFlow/wiseflow) 搜索 wiseflow(国内用户可在 [atomgit](https://atomgit.com/wiseflow/wiseflow) 搜索)。
```

## 示例工作流

```bash
# 1. 打开 https://juejin.cn/creator/tool/import/self
# 2. 点击 "创作工具 - 文章导入发布"
# 3. 使用 setInputFiles 上传 Markdown 文件(不要模拟点击文件选择对话框)
# 4. 等待 DOM 稳定:snapshot 两次确认编辑区内容一致
# 5. 处理本地图片:删除本地路径图片,用编辑器图片按钮重新上传
# 6. 检查标题
# 7. 点击发布 → 选择分类 → 添加标签
# 8. 上传封面图
# 9. 点击确定并发布
# 10. 等待跳转到文章详情页或出现「发布成功」提示
# 11. 记录发布链接到 published_articles_track.md
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
---
name: toutiao-publish
description: Publish Markdown articles to 今日头条 via docx document import. Converts Markdown (with local images embedded) to docx, then guides through Toutiao's "文档导入" upload flow.
metadata:
{
"openclaw":
{
"emoji": "📰",
"requires": { "bins": ["python3"] }
}
}
---

# Toutiao Publisher — 今日头条文档导入发布

将 Markdown 稿件转为 DOCX,通过今日头条"文档导入"功能上传发布,排版效果优于手动粘贴 HTML。

---

## Step 1:Markdown → DOCX

```bash
python3 ./skills/toutiao-publish/scripts/md_to_docx.py \
-f <markdown_file> \
-o /tmp/toutiao_article.docx
```

**脚本行为:**
- 自动将 Markdown 中的本地图片路径嵌入 Word 文档(确保上传后图片不丢失)
- 远程图片(http/https)以占位文本代替,需上传后在编辑器补图
- 转换完成后检查文件大小:**超过 15 MB 自动删除图片**,并提示在头条编辑器中手动补图

**前置依赖:**

```bash
pip install python-docx
```

> 已包含在 addon 的 `requirements.txt` 中,初始化时会自动安装。

**Frontmatter 支持(可选,建议提供):**

```yaml
---
title: 文章标题
author: 作者名
---
```

---

## Step 2:浏览器上传(文档导入流程)

使用 browser 工具,按以下步骤操作:

### 2-1 进入创作页面

打开今日头条创作平台:`https://mp.toutiao.com/profile_v4/graphic/publish`

### 2-2 选择文档导入

页面加载后,找到 **"文档导入"** 入口(通常在编辑器工具栏右侧或顶部菜单)。点击后弹出上传对话框。

> 如果未看到"文档导入",可尝试路径:顶部"发文章" → 编辑器工具栏 → 点击"..."更多选项 → "文档导入"

### 2-3 上传 DOCX

**使用 `setInputFiles` 注入文件路径,不要模拟点击文件选择对话框**,直接将文件路径注入 `<input type="file">` 元素:

```
setInputFiles("input[type=file]", "/tmp/toutiao_article.docx")
```

上传后**不要立即操作编辑器**,平台需要异步解析文档并渲染到编辑器(DOM 会先清空再注入内容)。

**等待编辑区 DOM 稳定的策略:**

1. 上传后先 `snapshot`,检查编辑区是否已出现文章内容(`timeout: 30000ms`)
2. 若内容已出现,再 `snapshot` 第二次——**两次 snapshot 内容一致**,才认为 DOM 稳定
3. DOM 稳定后再继续填写标题、标签等操作,否则内容可能丢失或操作落在错误元素上

### 2-4 编辑器内检查

DOM 稳定后,在编辑器内确认:

- 标题已正确填入(若未填入,手动输入)
- 正文排版基本正确(段落、标题、列表)
- 图片显示正常(若 Step 1 提示"已删除图片",此时手动在编辑器补图)

### 2-5 设置封面与发布选项

在编辑器右侧或底部依次完成:

1. **展示封面**:点击"添加封面",选择文章内图片或上传单独封面图(建议 3:2 或 16:9 比例)
2. **声明首发**:勾选"声明原创/首发"复选框
3. **引用 AI**:勾选"AI 辅助创作"声明

### 2-6 预览并发布

点击 **"预览发布"** 按钮,确认预览页内容无误后点击 **"确认发布"**。

**点击发布后不要立即导航或关闭页面**,平台会进行后端校验(违禁词检测、封面生成等)。
等待跳转到文章详情页或出现"发布成功"提示后,再提取文章 URL(`timeout: 30000ms`)。

---

## Agent 行为约束

1. Step 1 脚本执行完成后,**必须先检查输出中是否有"超过 15 MB"提示**,若有,告知用户图片需手动补
2. 上传文件使用 `setInputFiles` 注入路径,**不模拟点击文件选择对话框**;注入后等待 DOM 稳定(双 snapshot 确认)再继续
3. 发布完成前需确认"声明首发"和"引用 AI"两项均已勾选
4. 点击发布后等待跳转到文章详情页或出现"发布成功"提示,再提取 URL,**不要提前关闭或导航**

---

## Error Handling

| 问题 | 处理方式 |
|------|---------|
| `缺少依赖 python-docx` | 运行 `pip install python-docx` 后重试 |
| 文件不存在 | 确认 Markdown 文件路径正确 |
| 上传后图片丢失 | 图片超出 15MB 限制被删除,在编辑器手动补图 |
| 文档导入入口找不到 | 尝试刷新页面或检查账号是否已开通创作者权限 |
| 上传解析失败 | 确认 docx 格式正常(本地用 WPS/Word 打开验证) |
Loading
Loading