yumoqing 8cd76eda1e feat: browser automation for 6 no-API platforms
- Add browser_automation.py: HTTP→Headless Browser adapter
  - 6 platform default browser scripts (douyin/bilibili/kuaishou/xiaohongshu/toutiao/channels)
  - {{variable}} substitution for content fields
  - configurable browser_endpoint in extra_config
- engine.py: route browser-only platforms to browser_execute()
- platfoms.py: remove NotImplementedError stubs
2026-08-04 08:39:34 +08:00

内容发布模块 (Publisher)

Sage 框架模块 — 多平台内容一键发布。支持文章/视频/音频/图片,覆盖 10 个主流平台。

支持平台

平台代码 平台名称 支持内容类型 标题上限 正文上限 媒体上限
weibo 微博 article, video, image — 2000字 图片1张
douyin 抖音 video, image 100字 500字 图片9张
bilibili B站 video, article, image 80字 2000字 —
kuaishou 快手 video, image — 500字 —
wechat 微信公众号 article 64字 50000字 封面图
channels 微信视频号 video, image 50字 500字 图片9张
xiaohongshu 小红书 article, image, video 20字 1000字 图片9张
toutiao 头条号 article, video 30字 20000字 —
youtube YouTube video 100字 5000字 —
twitter Twitter/X article, image, video — 280字 图片4张

平台认证凭据

每个平台需要配置 publisher_platform 记录,通用字段:

字段 说明 必填
platform_code 平台代码(上表第一列) ✓
app_key App Key / Client ID / AppID ✓
app_secret App Secret(加密存储) ✓
access_token OAuth 2.0 访问令牌 ✓
refresh_token 刷新令牌(YouTube 必填) 部分
extra_config 平台特有参数 JSON 部分

各平台 extra_config 需要的额外字段:

平台 额外字段 说明
微博 uid 微博用户 UID
抖音 open_id 授权用户的 open_id
B站 cookie 部分接口需 Cookie
快手 open_id 用户唯一标识
公众号 — AppID+Secret 即可,token 2h过期需定时刷新
视频号 open_id 同公众号体系独立授权
小红书 user_id 创作者身份 ID
头条号 user_id 头条作者 ID
YouTube channel_id 目标频道 ID
Twitter oauth_token_secret OAuth 1.0a Token Secret

配置示例:

{"uid": "1234567890", "open_id": "abc123", "channel_id": "UCxxx"}

浏览器自动化

6 个无 API 平台(抖音/B站/快手/视频号/小红书/头条)通过 Headless Browser 服务实现。 配置 publisher_platform.extra_config:

{"browser_endpoint": "http://localhost:3000/execute"}

协议: POST {browser_endpoint} body={actions: [...], variables: {...}}。 各平台默认操作脚本已内置在 browser_automation.py 中。

目录

publisher/
├── publisher/               # Python 包
│   ├── __init__.py
│   ├── init.py              # load_publisher() → ServerEnv
│   ├── platforms.py         # 10 平台 API 适配器
│   ├── engine.py            # 发布引擎 + 定时调度
│   └── db.py                # 数据库操作
├── models/                  # 表定义 (4 张表)
├── skills/                  # Hermes 技能文件
├── wwwroot/publisher/       # UI + DSPY 端点
├── ddl/mysql.sql
├── scripts/load_path.py
└── install/

安装

git clone git@git.opencomputing.cn:yumoqing/publisher.git /tmp/publisher
SAGE_ROOT=/path/to/sage
cp -r /tmp/publisher/publisher $SAGE_ROOT/
cp /tmp/publisher/models/publisher_*.json $SAGE_ROOT/models/
cp -r /tmp/publisher/wwwroot/publisher $SAGE_ROOT/wwwroot/
mysql -u user -p sage < /tmp/publisher/ddl/mysql.sql
cd $SAGE_ROOT && python scripts/load_path.py

sage.py 中添加: from publisher.init import load_publisher + load_publisher()

新增平台

编辑 publisher/platforms.py:

from publisher.platforms import register

def publish_xxx(platform, content):
    return ('POST', 'https://api.xxx.com/publish', headers, body, content['content_type'])

register('xxx_code', '平台名', publish_xxx, ['article', 'video'])
Description
No description provided
Readme 61 KiB
Languages
Python 100%