TikTok Publish Flow

一款基于 Playwright 的 TikTok Studio 自动化技能,可发布带音乐的视频和照片帖子、编辑说明文字,并管理持久登录会话,无需官方 API。

alexsax777
2026年9月27日
0 收藏
58 下载

安装与下载

1 ClawHub CLI

从源直接安装技能的最快方式。

npx clawhub@latest install tiktok-publish-flow

2 手动安装

将技能文件夹复制到以下位置之一

全局模式 ~/.openclaw/skills/
工作区 {'/skills/'}

优先级:工作区 › 全局 › 内置

3 提示词安装

将此提示词复制到 Openclaw 即可自动安装。

请帮我使用 Clawhub 安装 skill-tiktok-publish-flow。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。

更倾向于下载?

获取包含原生技能文件的ZIP压缩包。

下载技能 (.zip)

基本信息

名称 TikTok Publish Flow
Slug tiktok-publish-flow
创建者 alexsax777
创建时间 2026-09-27 05:40:15
更新时间 2026-09-27 05:40:15
收藏数 0
使用量 58
浏览量 20

安装指南

  1. ClawHub CLI 从源直接安装技能的最快方式。
    npx clawhub@latest install tiktok-publish-flow
  2. 手动安装 将技能文件夹复制到以下位置之一
    全局模式
    ~/.openclaw/skills/
    工作区
    /skills/
    优先级:工作区 > 本地 > 内置
  3. 提示词安装 将此提示词复制到 OpenClaw 即可自动安装。
    请帮我使用 Clawhub 安装 tiktok-publish-flow。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。
    更倾向于下载?
    获取包含原生技能文件的ZIP压缩包。
    下载技能 (.zip)

什么是

TikTok Publish Flow 通过由 Playwright 控制的有头 Chromium 浏览器自动操作 TikTok Studio。它支持发布视频、带 TikTok 音乐的照片帖子、更新说明文字、选择隐私设置,并使用持久化的已认证配置文件验证帖子。
作为 Openclaw Skills 集成,它专为可靠的智能体驱动发布和定时 cron 工作流而设计,无需付费服务或 TikTok API 凭据。该技能包含经过生产环境测试的防护措施,可防止重复发布、通过 QR 码登录、验证帖子编辑、处理模态窗口,以及处理 TikTok 的帖子审核对话框。

应用场景

通过专用自动化子代理或 cron 任务安排 TikTok 视频发布。
根据英文情绪或歌曲查询,发布搭配所选 TikTok 音效的照片帖子。
添加包含引言、表情符号、标签和营销活动专用标签的说明文字。
编辑现有视频或照片帖子的说明文字,同时防止误编辑错误的帖子行。
维持持久的 TikTok Studio 会话,无需反复登录。
验证帖子发布后是否显示在 TikTok Studio Content 中。
使用 Openclaw Skills 自动化创作者和数字营销工作流,同时避免使用官方 API 或付费发布服务。

工作原理

自动化程序使用 TIKTOK_PROFILE_DIR 配置的持久化配置文件启动有头 Chromium 实例。
如有需要,操作员使用 TikTok 手机应用扫描 QR 码登录 TikTok Studio;由于 Google OAuth 在 Playwright Chromium 中遭到阻止,因此不会使用该方式。
发布之前,工作流会检查 /tiktokstudio/content,以检测手动创建或由其他进程创建的帖子并防止重复发布。
对于视频,tiktok_post3.py 会打开 /tiktokstudio/upload、上传文件、输入说明文字、关闭意外弹出的窗口、选择 Everyone 隐私设置,然后提交帖子。
当 TikTok 显示 "Continue to post?" 审核对话框时,脚本会轮询该对话框,并在其关闭前及时点击 "Post now"。
对于照片,tiktok_photo_music.py 会先选择 Photos 标签页再上传,添加图片,打开真正的 Add sound 控件,在音效模态窗口中搜索,并选择可见且匹配的 Use 按钮。
如果无法选择所请求的音效,照片工作流会中止,而不会在没有音乐的情况下发布。
对于编辑,tiktok_edit_post.py 会根据说明文字片段定位 Content 行,识别操作栏中的编辑图标,打开帖子编辑器,并在更改前验证现有说明文字。
编辑工作流会保存新的说明文字,并将 Under review 识别为正常的帖子发布后审核状态。
成功发布后会重定向到 /tiktokstudio/content,并在重新加载后验证帖子。

配置指南

克隆或安装技能仓库,并确保已安装 Python 3 和 Playwright。
配置可选的持久化目录。默认目录为 ~/.tiktok-poster/profile 和 ~/.tiktok-poster/;可使用环境变量覆盖这些目录。
export TIKTOK_PROFILE_DIR="$HOME/.tiktok-poster/profile"
export TIKTOK_SHOTS_DIR="$HOME/.tiktok-poster/shots"
使用本地 MP4 文件、说明文字和简短追踪标签运行视频发布工作流。
python3 /scripts/tiktok_post3.py \ --video \ --caption '' \ --tag 使用受支持的图片、说明文字、音效搜索查询和追踪标签运行带音乐的照片工作流。
python3 /scripts/tiktok_photo_music.py \ --image \ --caption '' \ --query '' \ --tag 提供唯一的当前说明文字片段、完整的替换说明文字和安全校验内容,以编辑现有说明文字。
python3 /scripts/tiktok_edit_post.py \ --match '' \ --caption '' \ --guard '' 使用手机应用扫描显示的 QR 码,完成 TikTok 的初始登录。QR 码约两到三分钟后过期,因此如果代码过期,请重新运行工作流。若操作策略有要求,请使用专用自动化子代理执行 cron 发布。

数据架构

运行时配置
项目 说明
TIKTOK_PROFILE_DIR 包含已认证 TikTok 会话的持久化 Chromium 配置文件;默认值为 ~/.tiktok-poster/profile。
TIKTOK_SHOTS_DIR 截图和诊断输出目录;默认位于 ~/.tiktok-poster/ 下。 --video 提供给视频上传工作流的本地视频文件。 --image 提供给照片工作流的本地图片文件。 --caption 完整的说明文字,包括可选的表情符号和标签。 --query 用于在音效模态窗口中查找 TikTok 音乐的英文搜索短语。 --match 用于定位帖子行的现有说明文字片段。 --guard 修改前必须仍存在于目标编辑器中的文本。 --tag 用于追踪的简短工作流或内容标识符。 生成和观察到的数据
持久化 Chromium 会话数据存储在配置文件目录中,使后续运行无需重新进行身份验证。
脚本生成的截图和诊断信息存储在已配置的截图目录中。
TikTok Content 行提供帖子元数据,例如说明文字、隐私控制项、操作图标和帖子标识符。
编辑 URL 使用 TikTok Studio 格式 /tiktokstudio/upload/post/photo?item_id=
&from=creator_center;item ID 用于标识正在编辑的帖子。
重新加载后通过 Content 页面验证发布状态;编辑过的帖子可能显示 Under review,同时仍保持上线状态。
元数据按内容类型组织:视频发布、带音效的照片发布,以及现有帖子的说明文字编辑。

高级特性

持久化的有头 Chromium 会话可在首次通过 QR 码验证身份后,免去反复登录 TikTok 的步骤。
环境变量路径覆盖支持隔离配置文件、截图、测试环境和多个账号。
每次定时发布前,都会检查 TikTok Studio Content 以防止重复发布。
视频工作流会轮询 TikTok 短暂出现的 "Continue to post?" 对话框,并在其短暂可用期间点击 "Post now"。
照片自动化会在上传前明确选择 Photos 标签页,避免 TikTok 悄悄将 PNG 文件当作不受支持的视频输入。
音效选择会在模态窗口内搜索,并使用 JavaScript 可见性检查处理受遮挡的 Use 按钮,避免普通 Playwright 点击超时。
说明文字编辑使用 DOM 遍历、最短匹配祖先选择、基于视口位置的操作图标检测,以及坐标点击,以处理 TikTok 的非标准控件。
编辑前的内容校验会在编辑器中未包含目标帖子现有说明文字时安全中止。
工作流将 Under review 视为预期状态,避免错误地重复发布内容。
文档中提及的 Higgsfield connector 路径不会使用,因为其发布组件、预览、托管流程和会话处理无法可靠地端到端运行。


name: "tiktok-publish-flow" description: "Post/publish TikTok videos and photos with TikTok music, edit captions, delete posts via Playwright on TikTok Studio web — no official API, no paid services. Use for TikTok automation, scheduled posting crons, photo posts with sound, caption edits." license: "MIT"
homepage: "https://github.com/alexsax777/tiktok-publish-flow"

TikTok publish flow — postare automată pe TikTok Studio via Playwright

Corpul skill-ului e în română (limba de lucru a agentului care l-a construit); pașii, comenzile și selectorii sunt universali.

Fluxul VERIFICAT end-to-end (24.09 seara): 3 video + 1 foto-cu-muzică + 1 editare descriere, toate reușite, 0 credite. Sesiunea TikTok persistă în profilul Chromium ``TIKTOK_PROFILE_DIR(default~/.tiktok-poster/profile) — o dată logat (QR scanat din app), toate fluxurile rulează singure, fără re-login.

Cine postează: pentru automatizare (cron), un subagent dedicat face tot pipeline-ul inclusiv postarea (regula owner-ului: cronul postează prin subagent; sesiunea principală nu atinge TikTok decât la cerere explicită). Înainte de orice postare: verifică lista de pe /tiktokstudio/content — owner-ul poate posta manual în paralel (s-a întâmplat în producție); fără duplicate.

Scripturi (în scripts/, toate headed, profil persistent, portabile: TIKTOK_PROFILE_DIR / TIKTOK_SHOTS_DIR suprascriu căile default ~/.tiktok-poster/):

  1. Video — scripts/tiktok_post3.py
python3 /scripts/tiktok_post3.py \

--video --caption '' --tag

Flux: /tiktokstudio/upload → input[type=file] → caption (contenteditable) → Escape + click neutral (închide popup) → privacy „Toată lumea"/Everyone → Post.

⭐ Dialogul „Continue to post?" („We're still checking your video...") apare după click pe Post. Trebuie click „Post now" imediat (în 1–2s de la apariție) — lăsat nesupravegheat se închide singur FĂRĂ să posteze (2 eșecuri consecutive înainte de fix). Scriptul poll-ează și apasă singur.
Succes = redirect la /tiktokstudio/content + postarea apare după reload. Postările video primesc dialogul; cele foto de obicei nu. 2. Foto cu piesă TikTok — scripts/tiktok_photo_music.py

python3 .../tiktok_photo_music.py --image --caption '' --query '' --tag

⭐ Tab-ul „Photos" se clickă ÎNAINTE de upload — input-ul default are accept=video/* și ignoră silențios PNG-urile: FILE_SET apare în log, dar editorul de caption nu mai vine niciodată (diagnosticat în producție).
Sunet: click pe butonul real button:has-text("Add sound") — click pe text cu force=True NU deschide panoul. Căsuța de căutare se ia DOAR din modal ([role=dialog] input, input[placeholder*=earch]) — primul input[type=text] de pe pagină e câmpul Description (titlu): query-ul scris acolo poluează titlul postării.
Alegere piesă: click pe sugestia potrivită (ex. „golden hour jvke" → piesa JVKE), apoi click JS pe primul buton „Use" vizibil (offsetParent !== null; preferă rândul cu cuvântul-cheie din query). Click-ul Playwright normal dă timeout — 20 butoane „Use" găsite, toate cu TimeoutError, dropdown-ul de sugestii le acoperă; .click() prin evaluate merge.
Dacă piesa nu se poate selecta → ABORT, nu posta fără muzică. 3. Editare descriere postare existentă — scripts/tiktok_edit_post.py

python3 /scripts/tiktok_edit_post.py --match '' --caption '' --guard ''

Găsește rândul pe /content după un fragment din caption (JS: text node → walk-up la strămoșul cu ≥4 svg și text scurt; sortează candidații după textContent.length crescător — strămoșul comun al mai multor rânduri e mai lung și altfel câștigă sortarea greșit).
Creionul de editare = primul span.px-icon cu x > 65% din lățimea viewport-ului (coloana Actions; px-icon-urile din stânga rândului sunt badge-uri de thumbnail). Click prin page.mouse.click(x, y) la coordonate — .click() JS pe wrapper nu navighează.
Se deschide /tiktokstudio/upload/post/photo?item_id=
&from=creator_center (URL direct navigabil odată cunoscut item_id).
⭐ Gard anti-greșeală: citește textul curent al editorului înainte de tastare; dacă NU conține caption-ul postării țintă → ABORT fără nicio modificare (a oprit editări pe rândul greșit în teste).
Save cu butonul „Save" → status „Under review", postarea rămâne live în timpul re-verificării — normal, nu o reposta.

Capcane verificate

Rândurile din Content au doar 2 reale (privacy + 1) — pictogramele Actions sunt span.px-icon fără data-e2e/aria-label. Nu căuta butoane de acțiune în rând.
Privacy dropdown-ul (Everyone/Friends/Only me) se deschide ușor din greșeală la click-uri în zonaActions — nimic nu se schimbă până nu alegi o opțiune; dă Escape.
QCode QR de login: se capturează și se trimite pe WhatsApp, expiră în ~2–3 min („A expirat" → rulare nouă). Google OAuth e blocat în Chromium Playwright („browser not secure") — login TikTok doar prin QR din app, nu Google.
Editarea postărilor video funcționează la fel ca foto (același creion); URL-ul de editare diferă doar prin item_id.
Drum blocat: conectorul Higgsfield (nu reîncerca fără motiv)

Publicarea prin conector (tiktok_prepare_publish + publish-form widget) nu a mers niciodată end-to-end la Alex ): widget-ul „Approve TikTok post" rămâne cu Continue disabled + „Preview unavailable", aplicația Higgsfield nu afișează sesiunile de publish, sesiunea expiră în ~2h. Hosting-ul pentru conector (catbox.moe → media_import_url → URL cloudfront; presigned PUT pică cu InvalidToken) și scripturile CDP (scripts/hf_*.py în skill) rămân utile doar dacă TikTok/Higgsfield repară widget-ul. Regula consimțământului: conectorul cere confirmarea în publish-form; fluxul Playwright rulează sub autorizarea owner-ului contului.

品牌与标志获取
社会组织研究