郑工长

OpenClaw 技能(Skill)实战:一键发布文章到头条号

发布于 2026年3月1日 | 分类: AI随心分享

OpenClaw 技能实战:一键发布文章到头条号

摘要:本文详细介绍如何在 OpenClaw 中安装配置 toutiao-publisher 技能,实现从文章创作到头条号发布的全流程自动化。包含基础安装步骤、使用方法、以及实战中的优化建议。

关键词:OpenClaw、头条号、自动化发布、浏览器自动化


一、技能介绍

1.1 功能概述

toutiao-publisher 是一个头条号自动发布技能,支持:

  • 持久化认证:扫码登录一次,7 天内免登录
  • Markdown 支持:自动转换为头条富文本格式
  • 封面图上传:自动选择并上传封面图片
  • 标题优化:自动调整标题长度(2-30 字符)
  • 发布确认:自动完成两步发布流程

1.2 适用场景

  • 技术博主定期发布深度文章
  • 自媒体运营多平台分发
  • 企业内容团队批量发布
  • 开发者工具集成到工作流

1.3 技术原理

基于 Patchright(防检测的 Playwright)控制真实 Chrome 浏览器,模拟人工操作:

登录 → 导航到发布页 → 填充标题 → 粘贴内容 → 上传封面 → 点击发布

二、快速开始

2.1 环境要求

  • OpenClaw 2026.02.28+
  • Python 3.10+
  • Google Chrome 浏览器(已安装)
  • 头条号账号(已注册)

2.2 安装技能

在工作区执行:

npx skills add https://github.com/guanyang/super-publisher --skill toutiao-publisher

安装位置

~/.openclaw/workspace/.agents/skills/toutiao-publisher/

2.3 首次登录

cd ~/.openclaw/workspace/.agents/skills/toutiao-publisher
python scripts/run.py publisher.py

流程

  1. 浏览器自动打开头条号登录页
  2. 使用手机头条 APP 扫码登录
  3. 登录成功后自动保存会话
  4. Ctrl+C 关闭浏览器

认证一次,长期有效(Cookie 有效期 7 天)

2.4 发布文章

基础命令

python scripts/run.py publisher.py \
  --title "文章标题" \
  --content "文章.md" \
  --cover "封面.png"

参数说明

参数 必填 说明
--title 2-30 字符,超长自动截断
--content Markdown 文件路径
--cover 封面图路径(16:9 推荐)
--headless 后台运行(需已登录)

三、使用示例

3.1 发布本地文章

# 准备文件
ls temp/article.md temp/cover.png

# 发布
python scripts/run.py publisher.py \
  --title "AI 编程效率提升指南" \
  --content "temp/article.md" \
  --cover "temp/cover.png"

3.2 从数据库发布

工作流

数据库文章 → 下载封面图 → 调用发布 → 更新状态

示例代码

import pymysql
import subprocess

# 1. 获取文章
article = db.query("SELECT * FROM articles WHERE id = 249")

# 2. 下载封面图
download_image(article.image_url, "temp/cover.png")

# 3. 调用发布
subprocess.run([
    "python", "scripts/run.py publisher.py",
    "--title", article.title,
    "--content", f"temp/article.md",
    "--cover", "temp/cover.png"
])

# 4. 更新状态
db.execute("UPDATE articles SET toutiao_published = 1 WHERE id = 249")

3.3 自然语言调用

在 OpenClaw 会话中直接说:

"把文章 249 发布到头条"

Agent 会自动:

  1. 从数据库获取文章信息
  2. 下载封面图到临时目录
  3. 调用发布技能
  4. 更新数据库状态

四、管理命令

4.1 检查登录状态

python scripts/run.py auth_manager.py status

输出示例

✅ Authentication valid
📁 State file: /path/to/state.json
⏱️ State age: 0.5 hours

4.2 清除认证(退出登录)

python scripts/run.py auth_manager.py clear
rm -rf data/browser_state

五、常见问题

Q1:Cookie 过期了怎么办?

重新运行发布命令,会自动弹出浏览器提示扫码登录:

python scripts/run.py publisher.py  # 扫码登录

Q2:可以在无头模式下登录吗?

不可以。首次登录必须显示浏览器窗口以便扫码:

# ❌ 错误:无头模式无法扫码
python scripts/run.py publisher.py --headless

# ✅ 正确:先登录,之后可用无头模式
python scripts/run.py publisher.py  # 扫码登录
python scripts/run.py publisher.py --headless  # 后续发布

Q3:正文内容为空怎么办?

这是头条 ProseMirror 编辑器的防御机制。脚本已自动处理,使用 execCommand 注入 HTML:

page.evaluate("""
    editor.focus();
    document.execCommand('insertHTML', false, html);
""")

Q4:保存失败警告会影响发布吗?

不会。封面图上传会强制触发保存,可以忽略警告。

Q5:标题超过 30 字怎么办?

脚本自动截断并提示:

⚠️ Title optimized (truncated to 30 chars): 
   '这是一篇非常长的标题超过 30 字会被自动截断' 
   → '这是一篇非常长的标题超过 30 字会被'

Q6:进程锁定(TargetClosedError)

上次运行异常退出导致 Chrome 锁死:

pkill -f "Chrome"  # 清理进程

六、实战优化建议(扩展)

说明:以下优化基于实际使用场景,是对原 skill 的增强建议,可根据需求选择应用。

6.1 Markdown 格式增强

问题背景

原 skill 的 Markdown 转换器为自制解析器,不支持引用块(>)等格式

原文

> AI 把人的"能力瓶颈",变成了"时间瓶颈"。

原转换(错误)

<p>> AI 把人的"能力瓶颈",变成了"时间瓶颈"。</p>

期望转换

<blockquote>
  <p>AI 把人的"能力瓶颈",变成了"时间瓶颈"。</p>
</blockquote>

优化方案

使用 Python markdown 库替代自制解析器

修改文件scripts/md2html.py

安装依赖

cd ~/.openclaw/workspace/.agents/skills/toutiao-publisher
source .venv/bin/activate
pip install markdown==3.10.2

更新代码

# md2html.py
import markdown

def convert(text, extensions=None):
    if extensions is None:
        extensions = ['extra', 'codehilite']
    
    html = markdown.markdown(text, extensions=extensions)
    return optimize_for_toutiao(html)

新增支持格式

格式 Markdown 语法 HTML 输出
引用块 > 内容 <blockquote>
斜体 *text* <em>
链接 [文本](url) <a href>
图片 ![alt](url) <img>
水平线 --- <hr/>
表格 ` col1
有序列表 1. 2. 3. <ol>

效果对比

  • ✅ 支持格式从 5 种增至 15+ 种
  • ✅ 代码更简洁(减少 70%)
  • ✅ 维护成本降低

6.2 保存检测优化

问题背景

发布过程中频繁触发"保存失败"警告,原脚本采用10 次重试循环

# 原逻辑
for _ in range(10):
    if "保存失败" visible:
        editor.type(" ")  # 输入空格触发保存
    time.sleep(3)

问题

  • ❌ 耗时 30-50 秒
  • ❌ 日志噪音多(10 次警告)
  • ❌ 实际发布仍成功(冗余操作)

优化方案

通过观察发现:封面图上传会强制触发整篇文章保存

新逻辑

# 优化后
time.sleep(3)  # 等待内容处理
# 依赖封面图上传触发保存

修改文件scripts/publisher.py(第 175-203 行)

优化前后对比

指标 优化前 优化后 改进
保存检测耗时 30-50 秒 6 秒 快 5-8 倍
重试次数 10 次 0 次 无冗余
日志噪音 多次警告 1 次提示 📉 更清晰
发布成功率 100% 100% 保持不变

日志对比

# 优化前
❌ Alert: 'Save Failed' detected! (×10)
  Typing space to trigger autosave... (×10)

# 优化后
ℹ️ Save status pending - cover upload will trigger persistence.

6.3 封面图持久化建议

问题背景

AI 生成的封面图通常存储在临时 URL(有效期 1 小时),需要在发布前下载到本地:

# 从云存储下载
curl -L -o temp/cover_249.png "http://cloud.example.com/xxx.png"

最佳实践

工作流集成

# 1. 生成文章时同时生成封面图
image_url = generate_cover(article.title)

# 2. 立即持久化到本地
download_image(image_url, "temp/cover.png")

# 3. 调用发布(使用本地路径)
publish(title, content, "temp/cover.png")

封面图规范

  • 尺寸:1664×928(16:9)
  • 格式:PNG 或 JPG
  • 大小:<5MB
  • 内容:避免文字过多

6.4 数据库字段扩展

建议新增字段

为追踪发布状态,建议在文章表中添加:

ALTER TABLE articles ADD COLUMN toutiao_published TINYINT(1) DEFAULT 0;
ALTER TABLE articles ADD COLUMN toutiao_url VARCHAR(1024);
ALTER TABLE articles ADD COLUMN toutiao_published_at DATETIME;

状态更新

UPDATE articles 
SET toutiao_published = 1, 
    toutiao_url = 'https://mp.toutiao.com/',
    toutiao_published_at = NOW()
WHERE id = <文章 ID>

6.5 批量发布建议

场景

需要一次发布多篇文章时:

#!/bin/bash
# batch_publish.sh

for article in articles/*.md; do
    echo "发布:$article"
    python scripts/run.py publisher.py \
      --title "$(basename $article .md)" \
      --content "$article" \
      --cover "covers/$(basename $article .md).png"
    
    # 间隔 5 分钟(避免触发审核)
    sleep 300
done

注意事项

  • 单账号每日发布 ≤10 篇
  • 发布时间间隔 ≥5 分钟
  • 避免在深夜发布(23:00-08:00)

七、性能对比

7.1 发布效率

指标 手动发布 自动化发布 提升
单次耗时 5-10 分钟 30 秒 10-20 倍
格式处理 手动调整 自动转换 零误差
登录频率 每次登录 7 天一次 免登录

7.2 优化效果

优化项 优化前 优化后 改进
Markdown 格式 5 种 15+ 种 +200%
保存检测 30-50 秒 6 秒 快 5-8 倍
引用块支持 已修复

八、总结

8.1 核心优势

  1. 持久化认证:一次登录,7 天有效
  2. 完整 Markdown 支持:15+ 种格式自动转换
  3. 智能保存检测:封面图上传触发保存
  4. 防检测浏览器:Patchright + 真实 Chrome

8.2 使用建议

  • ✅ 首次使用建议在有显示器环境下登录
  • ✅ 封面图提前下载到本地
  • ✅ 标题手动优化(避免自动截断影响语义)
  • ✅ 批量发布注意间隔时间(≥5 分钟)

8.3 优化方向

  • 支持视频上传
  • 支持微头条发布
  • 支持评论区管理
  • 数据统计分析

附录

A. 命令速查

# 安装技能
npx skills add https://github.com/guanyang/super-publisher --skill toutiao-publisher

# 首次登录
python scripts/run.py publisher.py

# 发布文章
python scripts/run.py publisher.py --title "标题" --content "文章.md" --cover "封面.png"

# 检查状态
python scripts/run.py auth_manager.py status

# 清除认证
python scripts/run.py auth_manager.py clear

B. 参考资源

C. 版本信息

  • 技能版本:1.0.0
  • Patchright:1.55.2
  • Markdown:3.10.2(优化新增)
  • 最后更新:2026-03-02