{"id":"bcb176ef-2069-4633-8dbf-2c8e301d43e6","entityType":"agent","slug":"clawhub-l1angjy-douyin-auto-publish","name":"Douyin Auto Publish 抖音自动上传发布","canonicalUrl":"https://www.xpersona.co/agent/clawhub-l1angjy-douyin-auto-publish","canonicalPath":"/agent/clawhub-l1angjy-douyin-auto-publish","generatedAt":"2026-10-10T04:43:45.566Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T04:21:19.088Z","emptyReason":null},"description":"抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台 Skill: Douyin Auto Publish 抖音自动上传发布 Owner: l1angjy Summary: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台 Tags: latest:2.2.7 Version history: v2.2.7 | 2026-05-04T00:27:49.336Z | user **所有版本用户请注意：本次强制要求每次均需手动确认发布，移除自动发布功能。** - 现在每次发布前，必须向用户展示视频信息并获得明确确认后才能发布，不能跳过确认。 - 移除了 require_confirmation/自动发布偏好配置说明与流程，整个流程只支持人工确认后发布。 - 保留可见范围（公开/好友/仅自己可见）偏好，自动选择但每次都需确认。 - 工作流程和常见问题部分同步收紧为仅支持人工确认后发布的流程和说明。 - 其它功能保持不变；安全和隔离机","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17bmfnfq7nzzx2d9ex2x5189183jrb4:douyin-auto-publish","sourceUrl":"https://clawhub.ai/l1angjy/douyin-auto-publish","homepage":"https://clawhub.ai/l1angjy/skills/douyin-auto-publish","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/l1angjy/douyin-auto-publish","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/l1angjy/skills/douyin-auto-publish","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":48,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台 Skill: Douyin Auto Publish 抖音自动上传发布 Owner: l1angjy Summary: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:21:19.088Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:21:19.088Z","emptyReason":null},"stars":null,"forks":null,"downloads":1692,"packageName":null,"latestVersion":"2.2.7","tractionLabel":"1.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:21:19.088Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T04:21:19.088Z","lastCrawledAt":"2026-10-10T04:21:19.088Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T04:21:19.088Z","lastVerifiedAt":null,"highlights":[{"version":"2.2.7","createdAt":"2026-05-04T00:27:49.336Z","changelog":"**所有版本用户请注意：本次强制要求每次均需手动确认发布，移除自动发布功能。** - 现在每次发布前，必须向用户展示视频信息并获得明确确认后才能发布，不能跳过确认。 - 移除了 require_confirmation/自动发布偏好配置说明与流程，整个流程只支持人工确认后发布。 - 保留可见范围（公开/好友/仅自己可见）偏好，自动选择但每次都需确认。 - 工作流程和常见问题部分同步收紧为仅支持人工确认后发布的流程和说明。 - 其它功能保持不变；安全和隔离机制未做调整。","fileCount":5,"zipByteSize":8094},{"version":"2.2.6","createdAt":"2026-05-04T00:22:16.569Z","changelog":"Version 2.2.6 - 增加“重要声明”部分，明确仅在用户主动请求或明确配置时触发技能，不会自动执行上传操作。 - 强调使用时需用户主动提供视频、标题、可见范围等基本信息。 - 其他功能逻辑未变，仅提升流程的用户明确知情和主动性。 - 没有检测到实际代码文件更改，变更仅限文档说明。","fileCount":4,"zipByteSize":7426},{"version":"2.2.0","createdAt":"2026-05-04T00:08:04.084Z","changelog":"No user-facing changes in this version. - No file changes detected compared to the previous release. - All skill behavior and documentation remain unchanged.","fileCount":4,"zipByteSize":6956},{"version":"2.1.1","createdAt":"2026-05-04T00:01:41.439Z","changelog":"- Introduced persistent configuration with added config.json file for default visibility and confirmation preferences. - Now uses an isolated browser profile (\"douyin-profile\") for increased security and login persistence, separating from your real Chrome data. - Updated all operation examples to require and use the new profile and config file. - First-time users will now be prompted to set default visibility and confirmation preferences, which are remembered for future uploads. - Removed deprecated settings.local.json, simplifying and centralizing configuration management.","fileCount":4,"zipByteSize":6957},{"version":"2.1.0","createdAt":"2026-05-03T23:59:27.312Z","changelog":"**2.1.0 Changelog：IMPORTANT SECURITY UPDATE. 引入首个本地配置文件，支持保存可见范围和发布确认偏好。** - 新增 config.json 文件，实现本地偏好设置持久化 - 支持用户选择默认可见范围（如公开、好友、仅自己可见），自动保存偏好 - 支持“发布前是否需要确认”偏好设置，首次运行时提示确认并记忆选择 - 全流程新增对独立 profile（douyin-profile）的推荐与支持，提升安全性 - 所有步骤均基于配置动态判断，优化用户体验和自动化规模","fileCount":5,"zipByteSize":7208},{"version":"1.2.1","createdAt":"2026-05-03T18:21:25.420Z","changelog":"IMPORTANT SECURITY UPDATE: - 增加了隐私和账号安全警告，强调 AI 操作将继承真实 Chrome 登录态，需用户知晓可能风险 - 新增对 sandbox（沙盒）模式的说明，给用户提供更安全的操作选项 - 强化“发布”步骤：发布前须向用户明确展示视频信息（文件名、标题、可见范围），并获得用户确认后才执行最终操作 - 新增常见问题与沙盒模式相关的解答，帮助用户理解不同登录隔离方式 - 细化操作指引，提升用户自主控制和信息透明度","fileCount":4,"zipByteSize":5576},{"version":"1.1.0","createdAt":"2026-04-09T20:41:25.665Z","changelog":"Display name Changed","fileCount":3,"zipByteSize":4217},{"version":"1.0.1","createdAt":"2026-03-25T16:36:44.752Z","changelog":"-Readme.md updated. - Functionality is the same as the previous release (1.0.0).","fileCount":3,"zipByteSize":4640}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17bmfnfq7nzzx2d9ex2x5189183jrb4:douyin-auto-publish","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-l1angjy-douyin-auto-publish/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-l1angjy-douyin-auto-publish/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-l1angjy-douyin-auto-publish/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-l1angjy-douyin-auto-publish/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-l1angjy-douyin-auto-publish/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-l1angjy-douyin-auto-publish/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T04:43:45.565Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-l1angjy-douyin-auto-publish/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-l1angjy-douyin-auto-publish/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-l1angjy-douyin-auto-publish/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-l1angjy-douyin-auto-publish/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T04:21:19.088Z","emptyReason":null},"readme":"Skill: Douyin Auto Publish 抖音自动上传发布\n\nOwner: l1angjy\n\nSummary: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台\n\nTags: latest:2.2.7\n\nVersion history:\n\nv2.2.7 | 2026-05-04T00:27:49.336Z | user\n\n**所有版本用户请注意：本次强制要求每次均需手动确认发布，移除自动发布功能。**\n\n- 现在每次发布前，必须向用户展示视频信息并获得明确确认后才能发布，不能跳过确认。\n- 移除了 require_confirmation/自动发布偏好配置说明与流程，整个流程只支持人工确认后发布。\n- 保留可见范围（公开/好友/仅自己可见）偏好，自动选择但每次都需确认。\n- 工作流程和常见问题部分同步收紧为仅支持人工确认后发布的流程和说明。\n- 其它功能保持不变；安全和隔离机制未做调整。\n\nv2.2.6 | 2026-05-04T00:22:16.569Z | user\n\nVersion 2.2.6\n\n- 增加“重要声明”部分，明确仅在用户主动请求或明确配置时触发技能，不会自动执行上传操作。\n- 强调使用时需用户主动提供视频、标题、可见范围等基本信息。\n- 其他功能逻辑未变，仅提升流程的用户明确知情和主动性。\n- 没有检测到实际代码文件更改，变更仅限文档说明。\n\nv2.2.0 | 2026-05-04T00:08:04.084Z | user\n\nNo user-facing changes in this version.\n\n- No file changes detected compared to the previous release.\n- All skill behavior and documentation remain unchanged.\n\nv2.1.1 | 2026-05-04T00:01:41.439Z | user\n\n- Introduced persistent configuration with added config.json file for default visibility and confirmation preferences.\n- Now uses an isolated browser profile (\"douyin-profile\") for increased security and login persistence, separating from your real Chrome data.\n- Updated all operation examples to require and use the new profile and config file.\n- First-time users will now be prompted to set default visibility and confirmation preferences, which are remembered for future uploads.\n- Removed deprecated settings.local.json, simplifying and centralizing configuration management.\n\nv2.1.0 | 2026-05-03T23:59:27.312Z | user\n\n**2.1.0  Changelog：IMPORTANT SECURITY UPDATE. 引入首个本地配置文件，支持保存可见范围和发布确认偏好。**\n\n- 新增 config.json 文件，实现本地偏好设置持久化\n- 支持用户选择默认可见范围（如公开、好友、仅自己可见），自动保存偏好\n- 支持“发布前是否需要确认”偏好设置，首次运行时提示确认并记忆选择\n- 全流程新增对独立 profile（douyin-profile）的推荐与支持，提升安全性\n- 所有步骤均基于配置动态判断，优化用户体验和自动化规模\n\nv1.2.1 | 2026-05-03T18:21:25.420Z | user\n\nIMPORTANT SECURITY UPDATE:\n- 增加了隐私和账号安全警告，强调 AI 操作将继承真实 Chrome 登录态，需用户知晓可能风险\n- 新增对 sandbox（沙盒）模式的说明，给用户提供更安全的操作选项\n- 强化“发布”步骤：发布前须向用户明确展示视频信息（文件名、标题、可见范围），并获得用户确认后才执行最终操作\n- 新增常见问题与沙盒模式相关的解答，帮助用户理解不同登录隔离方式\n- 细化操作指引，提升用户自主控制和信息透明度\n\nv1.1.0 | 2026-04-09T20:41:25.665Z | user\n\nDisplay name Changed\n\nv1.0.1 | 2026-03-25T16:36:44.752Z | user\n\n-Readme.md updated.\n- Functionality is the same as the previous release (1.0.0).\n\nv1.0.0 | 2026-03-25T16:34:07.249Z | user\n\nInitial release of douyin-auto-publish.\n\n- Provides automated video upload and publishing for the Douyin creator platform via OpenClaw Browser.\n- Requires prior Chrome login and video upload to /tmp/openclaw/uploads.\n- Uses dynamic element detection (snapshot + ref) for all interactions; avoids hardcoding UI references.\n- Includes detailed, step-by-step instructions for upload, title entry, permission setting, and publishing.\n\nArchive index:\n\nArchive v2.2.7: 5 files, 8094 bytes\n\nFiles: _meta.json (138b), config.json (2b), README.md (5680b), skill-card.md (2246b), SKILL.md (11690b)\n\nFile v2.2.7:SKILL.md\n\n---\nname: douyin-upload\ndescription: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台\n---\n\n# douyin-upload\n\n使用 OpenClaw Browser 工具自动上传视频到抖音创作者平台。\n\n## ⚠️ 重要声明\n\n**本 Skill 的使用条件：**\n\n1. **主动请求触发**：本 Skill 只会在用户主动请求的情况下才会使用，例如：\n   - 用户直接要求 Agent 使用此 Skill 上传视频\n   - 用户在预先配置好的 cron job 中执行此 Skill\n\n2. **需要用户主动提供信息**：使用本 Skill 时，需要用户主动提供以下信息：\n   - 视频文件路径（如 `~/Videos/my_video.mp4`）\n   - 视频标题（如「汽车保养小技巧」）\n   - 作品可见范围（公开/好友可见/仅自己可见）\n   - 其他可能需要的信息\n\n3. **强制用户确认**：每次发布前，必须向用户展示视频信息并获得明确确认后才能发布，**不支持跳过确认**。\n\n## 前置要求\n\n- OpenClaw Gateway 已运行\n- 电脑已安装 Chrome 浏览器\n- **首次使用需要在弹出的浏览器窗口中登录抖音账号**（只需一次，之后自动复用登录态）\n\n## 核心原则\n\n**⚠️ 安全说明：**\n\n本 skill 使用独立的命名 profile（`douyin-profile`），与你的真实 Chrome 浏览器完全隔离。只需在首次使用时登录抖音一次，之后登录态自动复用。AI 不会访问你的真实 Chrome 数据。\n\n**配置选项：**\n\n- ✅ `profile=\"douyin-profile\"` + `target=\"host\"` - 使用独立的命名 profile，登录态持久化，与 Chrome 隔离（推荐）\n- ✅ `target=\"sandbox\"` - 独立沙盒环境，每次需要重新登录，最安全但不便捷\n- ❌ `profile=\"user\"` - 直接附加到真实 Chrome，会继承所有 cookies 和登录态，不推荐\n- ❌ 不填 profile - 使用默认隔离浏览器，行为可能不稳定\n\n**推荐配置：使用 `profile=\"douyin-profile\"` 配合 `target=\"host\"`。**\n\n## 工作流程\n\n### Step 1: 打开上传页面\n\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n```\n\n### Step 2: 关闭弹窗\n\n如果页面出现弹窗，先关闭：\n\n```javascript\n// 1. 获取当前页面所有可交互元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 在返回结果中查找包含或匹配\"我知道了\"的按钮，拿到其 ref\n// 3. 点击该按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n**关键：不要硬编码 ref！** 先 snapshot，再从结果中根据文字内容找到对应元素的 ref。\n\n### Step 4: 准备视频文件\n\n浏览器 tool 只能上传到 `/tmp/openclaw/uploads` 目录：\n\n```bash\nmkdir -p /tmp/openclaw/uploads\ncp <视频路径> /tmp/openclaw/uploads/\n```\n\n### Step 5: 点击上传按钮\n\n```javascript\n// 1. 获取上传页面的元素列表\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"上传视频\"文字的按钮，拿到 ref\n// 3. 点击上传按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 6: 上传文件\n\n点击上传按钮后会弹出文件选择框：\n\n```javascript\n// 1. 先 snapshot 找到 Choose File 或文件输入/上传框的 ref\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 上传文件\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<找到的ref>\")\n```\n\n### Step 7: 等待视频解析\n\n页面自动跳转到发布编辑页，显示进度条\"0% 文件解析中，请稍等...\"，等待视频解析完成后继续。\n\n### Step 8: 填写标题\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找标题输入框（placeholder 包含或匹配\"标题\"或\"输入标题\"的输入框）\n// 3. 点击输入框并输入标题\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"type\", \"ref\": \"<找到的ref>\", \"text\": \"<用户提供的标题>\"})\n```\n\n### Step 9: 设置作品权限\n\n```bash\n# 读取已保存的可见范围偏好\ncat ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 `default_visibility` 字段已存在，使用保存的值。**\n\n**如果 `default_visibility` 字段不存在**，向用户询问：\n\n```\n「请选择默认的可见范围：\n - 公开：所有用户可见\n - 好友可见：仅好友可见\n - 仅自己可见：仅自己可见（最安全）\n 请回复您希望的数字或文字。」\n```\n\n**根据用户回复保存偏好**：\n```bash\n# 读取现有配置\ncurrent=$(cat ~/.openclaw/skills/douyin-auto-publish/config.json)\n\n# 用户选择\"公开\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"public\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"好友可见\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"friends\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"仅自己可见\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"private\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 jq 不可用**，可以使用简单覆盖：\n```bash\n# 用户选择\"公开\"\necho '{\"default_visibility\":\"public\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果用户明确指定了可见范围**，优先使用用户指定的值（而不是默认值），本次不修改保存的偏好。\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配用户指定可见范围（或默认偏好）的单选框\n//    - public/公开：\"公开\"\n//    - friends/好友可见：\"好友可见\"\n//    - private/仅自己可见：\"仅自己可见\"\n// 3. 点击选中\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 10: 确认并发布\n\n**每次发布前必须向用户展示视频信息并获得明确确认，不支持跳过确认。**\n\n在点击发布之前，必须向用户展示以下信息并获得明确确认：\n\n```javascript\n// 1. 获取当前页面元素（用于后续发布）\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 向用户确认以下信息：\n//    - 文件名: <视频文件名>\n//    - 标题: <用户提供的标题>\n//    - 可见范围: <公开/仅自己可见/好友可见>\n//    示例：「确认发布以下视频？\n//         文件名: demo.mp4\n//         标题: 我的视频标题\n//         可见范围: 公开\n//         请回复「是」确认发布，或「取消」中止操作。」\n\n// 3. 只有在用户明确回复\"是\"、\"确认\"、\"发布\"等肯定回复后，才执行发布\n//    如果用户回复\"取消\"或其他否定内容，告知用户发布已取消并停止操作\n\n// 4. 确认后，点击发布按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n## 完整流程模板\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 关闭弹窗\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"我知道了\"按钮的 ref，然后点击\n\n// 3. 准备视频文件（需在 terminal 执行）\n// mkdir -p /tmp/openclaw/uploads && cp <path> /tmp/openclaw/uploads/\n\n// 4. 点击上传按钮\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"上传视频\"按钮的 ref，然后点击\n\n// 5. 上传文件\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找文件输入框的 ref，然后上传\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<ref>\")\n\n// 6. 等待解析后填写标题\nsleep 15\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找标题输入框的 ref，然后点击并输入\n\n// 7. 设置可见范围\n// → 读取 config.json 检查 default_visibility 是否已设置\n// → 如果未设置，向用户询问偏好（公开/好友可见/仅自己可见）并保存\n// → 根据用户指定或保存的偏好，找到对应的单选框 ref 并点击\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找对应可见范围选项的 ref，然后点击\n\n// 8. 确认发布\n// → 向用户展示：文件名、标题、可见范围\n// → 必须等待用户回复\"是\"后才继续，否则取消发布\n\n// 9. 点击发布\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"发布\"按钮的 ref，然后点击\n```\n\n## 重要提示\n\n1. **每次操作前都要先 snapshot** - ref 是动态的，每次快照都不同\n2. **从 snapshot 结果中根据文字内容查找 ref** - 不要硬编码\n3. **页面跳转后需要重新 snapshot** - 元素 ref 会失效\n4. **视频必须复制到 `/tmp/openclaw/uploads/`** - 浏览器 tool 的限制\n5. **当用户还需要未提及的操作时, 也是同样的方法匹配对应的ref, 然后找到匹配的选项**\n\n## 可选：使用沙盒模式（更安全）\n\n如果你希望完全隔离登录状态，可以使用 `target=\"sandbox\"`：\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 沙盒环境没有登录态，首次使用需要通过页面上的二维码登录抖音账号\n// 3. 后续每次使用都需要重新登录\n```\n\n**沙盒模式的优点：**\n- 完全隔离的浏览器环境，不会访问任何已有浏览器数据\n- 更安全，适合注重隐私的用户\n\n**沙盒模式的缺点：**\n- 每次使用都需要重新登录抖音账号\n- 无法复用登录态\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号（扫描二维码）。只需登录一次，之后登录态会自动复用。如果想避免登录态持久化，可以使用 `target=\"sandbox\"` 模式。\n\n**Q: douyin-profile 与真实 Chrome 有什么区别？**\nA: douyin-profile 是一个独立的命名浏览器 profile，与你的真实 Chrome 浏览器完全隔离。AI 使用这个独立的 profile 进行操作，不会访问你的真实 Chrome 数据、cookies 或登录态。\n\n**Q: 如何使用更安全的沙盒模式？**\nA: 使用 `target=\"sandbox\"` 代替 `target=\"host\"`。沙盒模式会创建独立的浏览器环境，不会访问你的真实 Chrome 数据，但每次都需要重新登录抖音账号。\n\n**Q: Element not found 错误？**\nA: 页面可能跳转了，需要重新执行 snapshot 获取最新元素。\n\n**Q: 为什么 ref 每次都不一样？**\nA: 抖音页面动态渲染，每次 snapshot 生成的 ref 不同。这是正常现象。\n\nFile v2.2.7:README.md\n\n# douyin-upload\n\n自动上传视频到抖音创作者平台。\n\n## ⚠️ 重要声明\n\n**本 Skill 的使用条件：**\n\n1. **主动请求触发**：本 Skill 只会在用户主动请求的情况下才会使用，例如：\n   - 用户直接要求 Agent 使用此 Skill 上传视频\n   - 用户在预先配置好的 cron job 中执行此 Skill\n\n2. **需要用户主动提供信息**：使用本 Skill 时，需要用户主动提供以下信息：\n   - 视频文件路径（如 `~/Videos/my_video.mp4`）\n   - 视频标题（如「汽车保养小技巧」）\n   - 作品可见范围（公开/好友可见/仅自己可见）\n   - 其他可能需要的信息\n\n3. **强制用户确认**：每次发布前，必须向用户展示视频信息并获得明确确认后才能发布，**不支持跳过确认**。\n\n## 安装 Skill\n\n### 从 ClawHub 安装（推荐）\n\n```bash\n# 1. 登录 ClawHub（浏览器认证）\nclawhub login\n\n# 2. 安装 skill\nopenclaw skills install douyin-auto-publish\n```\n\n> ClawHub 地址: https://clawhub.com\n\n### 手动安装\n\n```bash\n# 将 skill 文件夹复制到 ~/.openclaw/skills/\n```\n\n## 准备工作（只需做一次）\n\n### 首次登录抖音\n\n1. 首次使用时会自动弹出 douyin-profile 浏览器窗口\n2. 在该窗口中访问 [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n3. 使用抖音账号登录（扫描二维码或账号密码）\n4. 建议保持登录状态\n\n**只需登录一次**，之后 AI 会自动复用你的登录状态。\n\n## ⚠️ 安全警告\n\n**使用此 Skill 前请注意：**\n\n1. **独立 Profile**：`profile=\"douyin-profile\"` 使用独立的命名浏览器 profile，与你的真实 Chrome 浏览器完全隔离\n\n2. **强制确认**：每次发布前都会展示视频信息并需要你明确确认，不支持跳过确认。\n\n3. **隔离建议**：如果你对账号安全有较高要求，建议使用 `target=\"sandbox\"` 模式，它会创建完全独立的浏览器环境\n\n## target 参数选择(默认为host)\n\nOpenClaw Browser 工具支持不同的 `target` 参数，适用于不同场景：\n\n| target | 说明 | 适用场景 | 注意事项 |\n|--------|------|----------|----------|\n| `host` | 控制本地浏览器，配合 profile 使用 | **推荐**：配合 douyin-profile 使用 | 确保使用 `profile=\"douyin-profile\"` |\n| `sandbox` | 独立的沙盒浏览器 | 隔离环境、保护隐私 | 无登录态，每次需重新登录 |\n| `node` | 控制已连接的节点设备 | 远程控制手机/平板浏览器 | 需要先配对节点 |\n\n### profile 参数（仅 target=\"host\" 时有效）\n\n| profile | 说明 | 适用场景 | 注意事项 |\n|---------|------|----------|----------|\n| `douyin-profile` | 独立的命名 profile | **推荐**：登录态持久化，与 Chrome 隔离 | 首次使用需登录一次 |\n| 不填 | 使用默认隔离浏览器 | 行为可能不稳定 | 需手动登录一次 |\n| `user` | 附加到你真实的 Chrome 会话 | 需要使用已保存的 cookies | 不推荐，会继承所有登录态 |\n\n### 推荐配置\n\n**日常使用（推荐）：**\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"...\")\n```\n\n**隐私隔离：**\n```javascript\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"...\")\n```\n\n## 使用方法\n\n告诉 AI：「帮我上传视频到抖音」并提供：\n\n- 视频文件路径\n- 视频标题\n- 可见范围（公开/好友可见/仅自己可见）\n\nAI 会自动完成全部流程。**在发布前，AI 会要求你确认视频信息，请回复「是」确认发布。**\n\n## 示例\n\n```\n用户: 帮我上传 ~/Videos/my_video.mp4 到抖音，标题是「汽车保养小技巧」，公开可见\n```\n\n## 工作流程\n\n```\n1. 打开抖音上传页面\n2. 关闭弹窗（如有）\n3. 上传视频文件\n4. 填写标题\n5. 设置可见范围（首次运行时询问默认偏好，之后使用保存的值）\n6. 【确认发布】展示视频信息并等待用户确认\"是\"\n7. 发布\n```\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号（扫描二维码）。只需登录一次，之后会自动复用。\n\n**Q: 应该用 `target=\"host\"` 还是 `target=\"sandbox\"`？**\nA:\n- 用 `target=\"host\"`：需要使用已有登录态，AI 使用独立的 douyin-profile 浏览器\n- 用 `target=\"sandbox\"`：需要完全隔离环境，每次都需要重新登录\n\n**Q: douyin-profile 与真实 Chrome 有什么区别？**\nA:\n- douyin-profile：独立的命名 profile，与真实 Chrome 完全隔离，登录态持久化\n- `profile=\"user\"`：直接附加到真实 Chrome，会继承所有 cookies 和登录态（不推荐）\n\n**Q: `profile=\"user\"` 和不填 profile 有什么区别？**\nA:\n- 不填 profile：使用 OpenClaw 的隔离浏览器，需手动登录一次抖音\n- `profile=\"user\"`：直接附加到你真实的 Chrome，会继承所有 cookies 和登录态，但需要你在电脑前\n\n**Q: 支持哪些视频格式？**\nA: 与抖音网页版支持格式相同，通常为 MP4、MOV 等常见格式。\n\n**Q: 可以设置定时发布吗？**\nA: 目前仅支持立即发布。\n\n**Q: 可以关闭发布前确认吗？**\nA: 不可以。为了保障账号安全，每次发布前都会展示视频信息并需要您明确确认，不支持跳过确认。\n\n**Q: 如何修改默认的可见范围？**\nA: 首次运行时会询问您默认的可见范围偏好。如需修改，可删除 `~/.openclaw/skills/douyin-auto-publish/config.json` 文件，重新运行时会再次询问。\n\n## 相关链接\n\n- [OpenClaw 文档](https://docs.openclaw.ai)\n- [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n\nFile v2.2.7:_meta.json\n\n{\n  \"ownerId\": \"kn77yxyagmp3fjn6b7vj7htmph83kkmr\",\n  \"slug\": \"douyin-auto-publish\",\n  \"version\": \"2.2.7\",\n  \"publishedAt\": 1777854469336\n}\n\nFile v2.2.7:skill-card.md\n\n## Description:\n\nHelps an OpenClaw agent upload and publish videos to the Douyin Creator Platform after the user provides the file path, title, visibility, and explicit pre-publication confirmation.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[l1angjy](https://clawhub.ai/user/l1angjy)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal creators and operators use this skill to guide an agent through uploading a local video to Douyin, filling in title and visibility settings, and publishing only after explicit confirmation.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can publish through a logged-in Douyin creator account.\n\nMitigation: Require the agent to show the file name, title, and visibility and obtain explicit user confirmation before every publish.\n\nRisk: A persistent browser profile can retain account access between sessions.\n\nMitigation: Use the sandbox browser target when stronger isolation is needed, accepting that the user may need to log in each time.\n\nRisk: Unsafe file-staging instructions may be risky for unusual or untrusted file paths.\n\nMitigation: Use only trusted local video paths and verify the staged file before upload.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/l1angjy/skills/douyin-auto-publish)\n- [OpenClaw documentation](https://docs.openclaw.ai)\n- [Douyin Creator Platform](https://creator.douyin.com/creator-micro/home)\n- [Douyin upload page](https://creator.douyin.com/creator-micro/content/upload)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with browser-tool actions and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires user-provided video path, title, visibility selection, and explicit confirmation before publishing.]\n\n## Skill Version(s):\n\n2.2.7 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.2.7:config.json\n\n{}\n\nArchive v2.2.6: 4 files, 7426 bytes\n\nFiles: _meta.json (138b), config.json (2b), README.md (5934b), SKILL.md (14136b)\n\nFile v2.2.6:SKILL.md\n\n---\nname: douyin-upload\ndescription: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台\n---\n\n# douyin-upload\n\n使用 OpenClaw Browser 工具自动上传视频到抖音创作者平台。\n\n## ⚠️ 重要声明\n\n**本 Skill 的使用条件：**\n\n1. **主动请求触发**：本 Skill 只会在用户主动请求的情况下才会使用，例如：\n   - 用户直接要求 Agent 使用此 Skill 上传视频\n   - 用户在预先配置好的 cron job 中执行此 Skill\n\n2. **需要用户主动提供信息**：使用本 Skill 时，需要用户主动提供以下信息：\n   - 视频文件路径（如 `~/Videos/my_video.mp4`）\n   - 视频标题（如「汽车保养小技巧」）\n   - 作品可见范围（公开/好友可见/仅自己可见）\n   - 其他可能需要的信息\n\n**未经用户主动请求，本 Skill 不会自动执行任何操作。**\n\n## 前置要求\n\n- OpenClaw Gateway 已运行\n- 电脑已安装 Chrome 浏览器\n- **首次使用需要在弹出的浏览器窗口中登录抖音账号**（只需一次，之后自动复用登录态）\n\n## 核心原则\n\n**⚠️ 安全说明：**\n\n本 skill 使用独立的命名 profile（`douyin-profile`），与你的真实 Chrome 浏览器完全隔离。只需在首次使用时登录抖音一次，之后登录态自动复用。AI 不会访问你的真实 Chrome 数据。\n\n**配置选项：**\n\n- ✅ `profile=\"douyin-profile\"` + `target=\"host\"` - 使用独立的命名 profile，登录态持久化，与 Chrome 隔离（推荐）\n- ✅ `target=\"sandbox\"` - 独立沙盒环境，每次需要重新登录，最安全但不便捷\n- ❌ `profile=\"user\"` - 直接附加到真实 Chrome，会继承所有 cookies 和登录态，不推荐\n- ❌ 不填 profile - 使用默认隔离浏览器，行为可能不稳定\n\n**推荐配置：使用 `profile=\"douyin-profile\"` 配合 `target=\"host\"`。**\n\n## 工作流程\n\n### Step 1: 打开上传页面\n\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n```\n\n### Step 2: 关闭弹窗\n\n如果页面出现弹窗，先关闭：\n\n```javascript\n// 1. 获取当前页面所有可交互元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 在返回结果中查找包含或匹配\"我知道了\"的按钮，拿到其 ref\n// 3. 点击该按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n**关键：不要硬编码 ref！** 先 snapshot，再从结果中根据文字内容找到对应元素的 ref。\n\n### Step 4: 准备视频文件\n\n浏览器 tool 只能上传到 `/tmp/openclaw/uploads` 目录：\n\n```bash\nmkdir -p /tmp/openclaw/uploads\ncp <视频路径> /tmp/openclaw/uploads/\n```\n\n### Step 5: 点击上传按钮\n\n```javascript\n// 1. 获取上传页面的元素列表\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"上传视频\"文字的按钮，拿到 ref\n// 3. 点击上传按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 6: 上传文件\n\n点击上传按钮后会弹出文件选择框：\n\n```javascript\n// 1. 先 snapshot 找到 Choose File 或文件输入/上传框的 ref\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 上传文件\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<找到的ref>\")\n```\n\n### Step 7: 等待视频解析\n\n页面自动跳转到发布编辑页，显示进度条\"0% 文件解析中，请稍等...\"，等待视频解析完成后继续。\n\n### Step 8: 填写标题\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找标题输入框（placeholder 包含或匹配\"标题\"或\"输入标题\"的输入框）\n// 3. 点击输入框并输入标题\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"type\", \"ref\": \"<找到的ref>\", \"text\": \"<用户提供的标题>\"})\n```\n\n### Step 9: 设置作品权限\n\n```bash\n# 读取已保存的可见范围偏好\ncat ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 `default_visibility` 字段已存在，使用保存的值。**\n\n**如果 `default_visibility` 字段不存在**，向用户询问：\n\n```\n「请选择默认的可见范围：\n - 公开：所有用户可见\n - 好友可见：仅好友可见\n - 仅自己可见：仅自己可见（最安全）\n 请回复您希望的数字或文字。」\n```\n\n**根据用户回复保存偏好**（注意保留 `require_confirmation` 原有值）：\n```bash\n# 读取现有配置\ncurrent=$(cat ~/.openclaw/skills/douyin-auto-publish/config.json)\n\n# 用户选择\"公开\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"public\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"好友可见\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"friends\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"仅自己可见\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"private\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 jq 不可用**，可以使用简单覆盖（会保留 `require_confirmation` 如果之前已设置）：\n```bash\n# 用户选择\"公开\"\necho '{\"default_visibility\":\"public\",\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# （如果 require_confirmation 已有值，后续 Step 10 会正确读取并覆盖此文件）\n```\n\n**如果用户明确指定了可见范围**，优先使用用户指定的值（而不是默认值），本次不修改保存的偏好。\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配用户指定可见范围（或默认偏好）的单选框\n//    - public/公开：\"公开\"\n//    - friends/好友可见：\"好友可见\"\n//    - private/仅自己可见：\"仅自己可见\"\n// 3. 点击选中\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 10: 确认偏好检查（仅首次运行时）\n\n```bash\n# 1. 读取当前偏好设置\ncat ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 `require_confirmation` 字段已存在（值不论），直接使用保存的偏好设置，跳到 Step 11。**\n\n**如果 `require_confirmation` 字段不存在**，向用户询问：\n\n```\n「您希望在发布前确认视频信息吗？\n - 选择\"是\"：每次发布前展示信息并需要您确认（推荐）\n - 选择\"否\"：自动执行发布，不再弹出确认\n 请回复「是」或「否」」\n```\n\n**根据用户回复保存偏好**（注意保留 `default_visibility` 原有值）：\n```bash\n# 读取现有配置\ncurrent=$(cat ~/.openclaw/skills/douyin-auto-publish/config.json)\n\n# 用户选择\"是\"（需要确认）\necho $current | jq -s '.[0] * {\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"否\"（自动发布）\necho $current | jq -s '.[0] * {\"require_confirmation\":false}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 jq 不可用**，使用简单覆盖：\n```bash\n# 用户选择\"是\"\necho '{\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# 用户选择\"否\"\necho '{\"require_confirmation\":false}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# （如果 default_visibility 已有值，后续运行 Step 9 会正确读取并保留）\n```\n\n---\n\n### Step 11: 确认并发布\n\n**情况 A：`require_confirmation` 为 `true`（或用户首次选择\"是\"）**\n\n在点击发布之前，必须向用户展示以下信息并获得明确确认：\n\n```javascript\n// 1. 获取当前页面元素（用于后续发布）\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 向用户确认以下信息：\n//    - 文件名: <视频文件名>\n//    - 标题: <用户提供的标题>\n//    - 可见范围: <公开/仅自己可见/好友可见>\n//    示例：「确认发布以下视频？\n//         文件名: demo.mp4\n//         标题: 我的视频标题\n//         可见范围: 公开\n//         请回复「是」确认发布，或「取消」中止操作。」\n\n// 3. 只有在用户明确回复\"是\"、\"确认\"、\"发布\"等肯定回复后，才执行发布\n//    如果用户回复\"取消\"或其他否定内容，告知用户发布已取消并停止操作\n\n// 4. 确认后，点击发布按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n**情况 B：`require_confirmation` 为 `false`（用户首次选择\"否\"）**\n\n直接点击发布按钮，不弹出确认：\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 直接点击发布按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n## 完整流程模板\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 关闭弹窗\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"我知道了\"按钮的 ref，然后点击\n\n// 3. 准备视频文件（需在 terminal 执行）\n// mkdir -p /tmp/openclaw/uploads && cp <path> /tmp/openclaw/uploads/\n\n// 4. 点击上传按钮\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"上传视频\"按钮的 ref，然后点击\n\n// 5. 上传文件\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找文件输入框的 ref，然后上传\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<ref>\")\n\n// 6. 等待解析后填写标题\nsleep 15\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找标题输入框的 ref，然后点击并输入\n\n// 7. 设置可见范围\n// → 读取 config.json 检查 default_visibility 是否已设置\n// → 如果未设置，向用户询问偏好（公开/好友可见/仅自己可见）并保存\n// → 根据用户指定或保存的偏好，找到对应的单选框 ref 并点击\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找对应可见范围选项的 ref，然后点击\n\n// 8. 确认偏好检查（仅首次运行时）\n// → 读取 config.json 检查 require_confirmation 是否已设置\n// → 如果未设置，向用户询问偏好并保存\n// → 如果已设置，直接使用保存的值\n\n// 9. 确认发布\n// 情况 A（require_confirmation == true）：\n//   → 向用户展示：文件名、标题、可见范围\n//   → 只有用户回复\"是\"后才继续，否则取消发布\n// 情况 B（require_confirmation == false）：\n//   → 直接执行发布，不弹确认\n\n// 10. 点击发布\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"发布\"按钮的 ref，然后点击\n```\n\n## 重要提示\n\n1. **每次操作前都要先 snapshot** - ref 是动态的，每次快照都不同\n2. **从 snapshot 结果中根据文字内容查找 ref** - 不要硬编码\n3. **页面跳转后需要重新 snapshot** - 元素 ref 会失效\n4. **视频必须复制到 `/tmp/openclaw/uploads/`** - 浏览器 tool 的限制\n5. **当用户还需要未提及的操作时, 也是同样的方法匹配对应的ref, 然后找到匹配的选项**\n\n## 可选：使用沙盒模式（更安全）\n\n如果你希望完全隔离登录状态，可以使用 `target=\"sandbox\"`：\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 沙盒环境没有登录态，首次使用需要通过页面上的二维码登录抖音账号\n// 3. 后续每次使用都需要重新登录\n```\n\n**沙盒模式的优点：**\n- 完全隔离的浏览器环境，不会访问任何已有浏览器数据\n- 更安全，适合注重隐私的用户\n\n**沙盒模式的缺点：**\n- 每次使用都需要重新登录抖音账号\n- 无法复用登录态\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号（扫描二维码）。只需登录一次，之后登录态会自动复用。如果想避免登录态持久化，可以使用 `target=\"sandbox\"` 模式。\n\n**Q: douyin-profile 与真实 Chrome 有什么区别？**\nA: douyin-profile 是一个独立的命名浏览器 profile，与你的真实 Chrome 浏览器完全隔离。AI 使用这个独立的 profile 进行操作，不会访问你的真实 Chrome 数据、cookies 或登录态。\n\n**Q: 如何使用更安全的沙盒模式？**\nA: 使用 `target=\"sandbox\"` 代替 `target=\"host\"`。沙盒模式会创建独立的浏览器环境，不会访问你的真实 Chrome 数据，但每次都需要重新登录抖音账号。\n\n**Q: Element not found 错误？**\nA: 页面可能跳转了，需要重新执行 snapshot 获取最新元素。\n\n**Q: 为什么 ref 每次都不一样？**\nA: 抖音页面动态渲染，每次 snapshot 生成的 ref 不同。这是正常现象。\n\nFile v2.2.6:README.md\n\n# douyin-upload\n\n自动上传视频到抖音创作者平台。\n\n## ⚠️ 重要声明\n\n**本 Skill 的使用条件：**\n\n1. **主动请求触发**：本 Skill 只会在用户主动请求的情况下才会使用，例如：\n   - 用户直接要求 Agent 使用此 Skill 上传视频\n   - 用户在预先配置好的 cron job 中执行此 Skill\n\n2. **需要用户主动提供信息**：使用本 Skill 时，需要用户主动提供以下信息：\n   - 视频文件路径（如 `~/Videos/my_video.mp4`）\n   - 视频标题（如「汽车保养小技巧」）\n   - 作品可见范围（公开/好友可见/仅自己可见）\n   - 其他可能需要的信息\n\n**未经用户主动请求，本 Skill 不会自动执行任何操作。**\n\n## 安装 Skill\n\n### 从 ClawHub 安装（推荐）\n\n```bash\n# 1. 登录 ClawHub（浏览器认证）\nclawhub login\n\n# 2. 安装 skill\nopenclaw skills install douyin-auto-publish\n```\n\n> ClawHub 地址: https://clawhub.com\n\n### 手动安装\n\n```bash\n# 将 skill 文件夹复制到 ~/.openclaw/skills/\n```\n\n## 准备工作（只需做一次）\n\n### 首次登录抖音\n\n1. 首次使用时会自动弹出 douyin-profile 浏览器窗口\n2. 在该窗口中访问 [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n3. 使用抖音账号登录（扫描二维码或账号密码）\n4. 建议保持登录状态\n\n**只需登录一次**，之后 AI 会自动复用你的登录状态。\n\n## ⚠️ 安全警告\n\n**使用此 Skill 前请注意：**\n\n1. **独立 Profile**：`profile=\"douyin-profile\"` 使用独立的命名浏览器 profile，与你的真实 Chrome 浏览器完全隔离\n\n2. **发布确认**：首次运行时会询问是否需要发布确认。选择\"是\"后每次发布前都会展示信息并需要你确认；选择\"否\"则自动发布不再弹确认。如需修改，可删除 `config.json` 重新设置。\n\n3. **隔离建议**：如果你对账号安全有较高要求，建议使用 `target=\"sandbox\"` 模式，它会创建完全独立的浏览器环境\n\n## target 参数选择(默认为host)\n\nOpenClaw Browser 工具支持不同的 `target` 参数，适用于不同场景：\n\n| target | 说明 | 适用场景 | 注意事项 |\n|--------|------|----------|----------|\n| `host` | 控制本地浏览器，配合 profile 使用 | **推荐**：配合 douyin-profile 使用 | 确保使用 `profile=\"douyin-profile\"` |\n| `sandbox` | 独立的沙盒浏览器 | 隔离环境、保护隐私 | 无登录态，每次需重新登录 |\n| `node` | 控制已连接的节点设备 | 远程控制手机/平板浏览器 | 需要先配对节点 |\n\n### profile 参数（仅 target=\"host\" 时有效）\n\n| profile | 说明 | 适用场景 | 注意事项 |\n|---------|------|----------|----------|\n| `douyin-profile` | 独立的命名 profile | **推荐**：登录态持久化，与 Chrome 隔离 | 首次使用需登录一次 |\n| 不填 | 使用默认隔离浏览器 | 行为可能不稳定 | 需手动登录一次 |\n| `user` | 附加到你真实的 Chrome 会话 | 需要使用已保存的 cookies | 不推荐，会继承所有登录态 |\n\n### 推荐配置\n\n**日常使用（推荐）：**\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"...\")\n```\n\n**隐私隔离：**\n```javascript\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"...\")\n```\n\n## 使用方法\n\n告诉 AI：「帮我上传视频到抖音」并提供：\n\n- 视频文件路径\n- 视频标题\n- 可见范围（公开/好友可见/仅自己可见）\n\nAI 会自动完成全部流程。**在发布前，AI 会要求你确认视频信息，请回复「是」确认发布。**\n\n## 示例\n\n```\n用户: 帮我上传 ~/Videos/my_video.mp4 到抖音，标题是「汽车保养小技巧」，公开可见\n```\n\n## 工作流程\n\n```\n1. 打开抖音上传页面\n2. 关闭弹窗（如有）\n3. 上传视频文件\n4. 填写标题\n5. 设置可见范围（首次运行时询问默认偏好，之后使用保存的值）\n6. 【确认偏好】首次运行时询问是否需要发布确认，之后跳过此步\n7. 【确认发布】根据偏好设置：需要确认时展示信息并等待\"是\"，否则直接发布\n8. 发布\n```\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号（扫描二维码）。只需登录一次，之后会自动复用。\n\n**Q: 应该用 `target=\"host\"` 还是 `target=\"sandbox\"`？**\nA:\n- 用 `target=\"host\"`：需要使用已有登录态，AI 使用独立的 douyin-profile 浏览器\n- 用 `target=\"sandbox\"`：需要完全隔离环境，每次都需要重新登录\n\n**Q: douyin-profile 与真实 Chrome 有什么区别？**\nA:\n- douyin-profile：独立的命名 profile，与真实 Chrome 完全隔离，登录态持久化\n- `profile=\"user\"`：直接附加到真实 Chrome，会继承所有 cookies 和登录态（不推荐）\n\n**Q: `profile=\"user\"` 和不填 profile 有什么区别？**\nA:\n- 不填 profile：使用 OpenClaw 的隔离浏览器，需手动登录一次抖音\n- `profile=\"user\"`：直接附加到你真实的 Chrome，会继承所有 cookies 和登录态，但需要你在电脑前\n\n**Q: 支持哪些视频格式？**\nA: 与抖音网页版支持格式相同，通常为 MP4、MOV 等常见格式。\n\n**Q: 可以设置定时发布吗？**\nA: 目前仅支持立即发布。\n\n**Q: 如何关闭发布前确认？**\nA: 首次运行时 AI 会询问您的偏好。选择\"否\"后，每次发布将自动执行不再弹确认。如需重新开启确认，可删除 `~/.openclaw/skills/douyin-auto-publish/config.json` 文件。\n\n**Q: 如何修改默认的可见范围？**\nA: 首次运行时会询问您默认的可见范围偏好。如需修改，可删除 `~/.openclaw/skills/douyin-auto-publish/config.json` 文件，重新运行时会再次询问。\n\n## 相关链接\n\n- [OpenClaw 文档](https://docs.openclaw.ai)\n- [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n\nFile v2.2.6:_meta.json\n\n{\n  \"ownerId\": \"kn77yxyagmp3fjn6b7vj7htmph83kkmr\",\n  \"slug\": \"douyin-auto-publish\",\n  \"version\": \"2.2.6\",\n  \"publishedAt\": 1777854136569\n}\n\nFile v2.2.6:config.json\n\n{}\n\nArchive v2.2.0: 4 files, 6956 bytes\n\nFiles: _meta.json (138b), config.json (2b), README.md (5265b), SKILL.md (13467b)\n\nFile v2.2.0:SKILL.md\n\n---\nname: douyin-upload\ndescription: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台\n---\n\n# douyin-upload\n\n使用 OpenClaw Browser 工具自动上传视频到抖音创作者平台。\n\n## 前置要求\n\n- OpenClaw Gateway 已运行\n- 电脑已安装 Chrome 浏览器\n- **首次使用需要在弹出的浏览器窗口中登录抖音账号**（只需一次，之后自动复用登录态）\n\n## 核心原则\n\n**⚠️ 安全说明：**\n\n本 skill 使用独立的命名 profile（`douyin-profile`），与你的真实 Chrome 浏览器完全隔离。只需在首次使用时登录抖音一次，之后登录态自动复用。AI 不会访问你的真实 Chrome 数据。\n\n**配置选项：**\n\n- ✅ `profile=\"douyin-profile\"` + `target=\"host\"` - 使用独立的命名 profile，登录态持久化，与 Chrome 隔离（推荐）\n- ✅ `target=\"sandbox\"` - 独立沙盒环境，每次需要重新登录，最安全但不便捷\n- ❌ `profile=\"user\"` - 直接附加到真实 Chrome，会继承所有 cookies 和登录态，不推荐\n- ❌ 不填 profile - 使用默认隔离浏览器，行为可能不稳定\n\n**推荐配置：使用 `profile=\"douyin-profile\"` 配合 `target=\"host\"`。**\n\n## 工作流程\n\n### Step 1: 打开上传页面\n\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n```\n\n### Step 2: 关闭弹窗\n\n如果页面出现弹窗，先关闭：\n\n```javascript\n// 1. 获取当前页面所有可交互元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 在返回结果中查找包含或匹配\"我知道了\"的按钮，拿到其 ref\n// 3. 点击该按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n**关键：不要硬编码 ref！** 先 snapshot，再从结果中根据文字内容找到对应元素的 ref。\n\n### Step 4: 准备视频文件\n\n浏览器 tool 只能上传到 `/tmp/openclaw/uploads` 目录：\n\n```bash\nmkdir -p /tmp/openclaw/uploads\ncp <视频路径> /tmp/openclaw/uploads/\n```\n\n### Step 5: 点击上传按钮\n\n```javascript\n// 1. 获取上传页面的元素列表\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"上传视频\"文字的按钮，拿到 ref\n// 3. 点击上传按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 6: 上传文件\n\n点击上传按钮后会弹出文件选择框：\n\n```javascript\n// 1. 先 snapshot 找到 Choose File 或文件输入/上传框的 ref\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 上传文件\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<找到的ref>\")\n```\n\n### Step 7: 等待视频解析\n\n页面自动跳转到发布编辑页，显示进度条\"0% 文件解析中，请稍等...\"，等待视频解析完成后继续。\n\n### Step 8: 填写标题\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找标题输入框（placeholder 包含或匹配\"标题\"或\"输入标题\"的输入框）\n// 3. 点击输入框并输入标题\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"type\", \"ref\": \"<找到的ref>\", \"text\": \"<用户提供的标题>\"})\n```\n\n### Step 9: 设置作品权限\n\n```bash\n# 读取已保存的可见范围偏好\ncat ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 `default_visibility` 字段已存在，使用保存的值。**\n\n**如果 `default_visibility` 字段不存在**，向用户询问：\n\n```\n「请选择默认的可见范围：\n - 公开：所有用户可见\n - 好友可见：仅好友可见\n - 仅自己可见：仅自己可见（最安全）\n 请回复您希望的数字或文字。」\n```\n\n**根据用户回复保存偏好**（注意保留 `require_confirmation` 原有值）：\n```bash\n# 读取现有配置\ncurrent=$(cat ~/.openclaw/skills/douyin-auto-publish/config.json)\n\n# 用户选择\"公开\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"public\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"好友可见\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"friends\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"仅自己可见\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"private\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 jq 不可用**，可以使用简单覆盖（会保留 `require_confirmation` 如果之前已设置）：\n```bash\n# 用户选择\"公开\"\necho '{\"default_visibility\":\"public\",\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# （如果 require_confirmation 已有值，后续 Step 10 会正确读取并覆盖此文件）\n```\n\n**如果用户明确指定了可见范围**，优先使用用户指定的值（而不是默认值），本次不修改保存的偏好。\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配用户指定可见范围（或默认偏好）的单选框\n//    - public/公开：\"公开\"\n//    - friends/好友可见：\"好友可见\"\n//    - private/仅自己可见：\"仅自己可见\"\n// 3. 点击选中\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 10: 确认偏好检查（仅首次运行时）\n\n```bash\n# 1. 读取当前偏好设置\ncat ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 `require_confirmation` 字段已存在（值不论），直接使用保存的偏好设置，跳到 Step 11。**\n\n**如果 `require_confirmation` 字段不存在**，向用户询问：\n\n```\n「您希望在发布前确认视频信息吗？\n - 选择\"是\"：每次发布前展示信息并需要您确认（推荐）\n - 选择\"否\"：自动执行发布，不再弹出确认\n 请回复「是」或「否」」\n```\n\n**根据用户回复保存偏好**（注意保留 `default_visibility` 原有值）：\n```bash\n# 读取现有配置\ncurrent=$(cat ~/.openclaw/skills/douyin-auto-publish/config.json)\n\n# 用户选择\"是\"（需要确认）\necho $current | jq -s '.[0] * {\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"否\"（自动发布）\necho $current | jq -s '.[0] * {\"require_confirmation\":false}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 jq 不可用**，使用简单覆盖：\n```bash\n# 用户选择\"是\"\necho '{\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# 用户选择\"否\"\necho '{\"require_confirmation\":false}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# （如果 default_visibility 已有值，后续运行 Step 9 会正确读取并保留）\n```\n\n---\n\n### Step 11: 确认并发布\n\n**情况 A：`require_confirmation` 为 `true`（或用户首次选择\"是\"）**\n\n在点击发布之前，必须向用户展示以下信息并获得明确确认：\n\n```javascript\n// 1. 获取当前页面元素（用于后续发布）\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 向用户确认以下信息：\n//    - 文件名: <视频文件名>\n//    - 标题: <用户提供的标题>\n//    - 可见范围: <公开/仅自己可见/好友可见>\n//    示例：「确认发布以下视频？\n//         文件名: demo.mp4\n//         标题: 我的视频标题\n//         可见范围: 公开\n//         请回复「是」确认发布，或「取消」中止操作。」\n\n// 3. 只有在用户明确回复\"是\"、\"确认\"、\"发布\"等肯定回复后，才执行发布\n//    如果用户回复\"取消\"或其他否定内容，告知用户发布已取消并停止操作\n\n// 4. 确认后，点击发布按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n**情况 B：`require_confirmation` 为 `false`（用户首次选择\"否\"）**\n\n直接点击发布按钮，不弹出确认：\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 直接点击发布按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n## 完整流程模板\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 关闭弹窗\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"我知道了\"按钮的 ref，然后点击\n\n// 3. 准备视频文件（需在 terminal 执行）\n// mkdir -p /tmp/openclaw/uploads && cp <path> /tmp/openclaw/uploads/\n\n// 4. 点击上传按钮\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"上传视频\"按钮的 ref，然后点击\n\n// 5. 上传文件\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找文件输入框的 ref，然后上传\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<ref>\")\n\n// 6. 等待解析后填写标题\nsleep 15\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找标题输入框的 ref，然后点击并输入\n\n// 7. 设置可见范围\n// → 读取 config.json 检查 default_visibility 是否已设置\n// → 如果未设置，向用户询问偏好（公开/好友可见/仅自己可见）并保存\n// → 根据用户指定或保存的偏好，找到对应的单选框 ref 并点击\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找对应可见范围选项的 ref，然后点击\n\n// 8. 确认偏好检查（仅首次运行时）\n// → 读取 config.json 检查 require_confirmation 是否已设置\n// → 如果未设置，向用户询问偏好并保存\n// → 如果已设置，直接使用保存的值\n\n// 9. 确认发布\n// 情况 A（require_confirmation == true）：\n//   → 向用户展示：文件名、标题、可见范围\n//   → 只有用户回复\"是\"后才继续，否则取消发布\n// 情况 B（require_confirmation == false）：\n//   → 直接执行发布，不弹确认\n\n// 10. 点击发布\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"发布\"按钮的 ref，然后点击\n```\n\n## 重要提示\n\n1. **每次操作前都要先 snapshot** - ref 是动态的，每次快照都不同\n2. **从 snapshot 结果中根据文字内容查找 ref** - 不要硬编码\n3. **页面跳转后需要重新 snapshot** - 元素 ref 会失效\n4. **视频必须复制到 `/tmp/openclaw/uploads/`** - 浏览器 tool 的限制\n5. **当用户还需要未提及的操作时, 也是同样的方法匹配对应的ref, 然后找到匹配的选项**\n\n## 可选：使用沙盒模式（更安全）\n\n如果你希望完全隔离登录状态，可以使用 `target=\"sandbox\"`：\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 沙盒环境没有登录态，首次使用需要通过页面上的二维码登录抖音账号\n// 3. 后续每次使用都需要重新登录\n```\n\n**沙盒模式的优点：**\n- 完全隔离的浏览器环境，不会访问任何已有浏览器数据\n- 更安全，适合注重隐私的用户\n\n**沙盒模式的缺点：**\n- 每次使用都需要重新登录抖音账号\n- 无法复用登录态\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号（扫描二维码）。只需登录一次，之后登录态会自动复用。如果想避免登录态持久化，可以使用 `target=\"sandbox\"` 模式。\n\n**Q: douyin-profile 与真实 Chrome 有什么区别？**\nA: douyin-profile 是一个独立的命名浏览器 profile，与你的真实 Chrome 浏览器完全隔离。AI 使用这个独立的 profile 进行操作，不会访问你的真实 Chrome 数据、cookies 或登录态。\n\n**Q: 如何使用更安全的沙盒模式？**\nA: 使用 `target=\"sandbox\"` 代替 `target=\"host\"`。沙盒模式会创建独立的浏览器环境，不会访问你的真实 Chrome 数据，但每次都需要重新登录抖音账号。\n\n**Q: Element not found 错误？**\nA: 页面可能跳转了，需要重新执行 snapshot 获取最新元素。\n\n**Q: 为什么 ref 每次都不一样？**\nA: 抖音页面动态渲染，每次 snapshot 生成的 ref 不同。这是正常现象。\n\nFile v2.2.0:README.md\n\n# douyin-upload\n\n自动上传视频到抖音创作者平台。\n\n## 安装 Skill\n\n### 从 ClawHub 安装（推荐）\n\n```bash\n# 1. 登录 ClawHub（浏览器认证）\nclawhub login\n\n# 2. 安装 skill\nopenclaw skills install douyin-auto-publish\n```\n\n> ClawHub 地址: https://clawhub.com\n\n### 手动安装\n\n```bash\n# 将 skill 文件夹复制到 ~/.openclaw/skills/\n```\n\n## 准备工作（只需做一次）\n\n### 首次登录抖音\n\n1. 首次使用时会自动弹出 douyin-profile 浏览器窗口\n2. 在该窗口中访问 [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n3. 使用抖音账号登录（扫描二维码或账号密码）\n4. 建议保持登录状态\n\n**只需登录一次**，之后 AI 会自动复用你的登录状态。\n\n## ⚠️ 安全警告\n\n**使用此 Skill 前请注意：**\n\n1. **独立 Profile**：`profile=\"douyin-profile\"` 使用独立的命名浏览器 profile，与你的真实 Chrome 浏览器完全隔离\n\n2. **发布确认**：首次运行时会询问是否需要发布确认。选择\"是\"后每次发布前都会展示信息并需要你确认；选择\"否\"则自动发布不再弹确认。如需修改，可删除 `config.json` 重新设置。\n\n3. **隔离建议**：如果你对账号安全有较高要求，建议使用 `target=\"sandbox\"` 模式，它会创建完全独立的浏览器环境\n\n## target 参数选择(默认为host)\n\nOpenClaw Browser 工具支持不同的 `target` 参数，适用于不同场景：\n\n| target | 说明 | 适用场景 | 注意事项 |\n|--------|------|----------|----------|\n| `host` | 控制本地浏览器，配合 profile 使用 | **推荐**：配合 douyin-profile 使用 | 确保使用 `profile=\"douyin-profile\"` |\n| `sandbox` | 独立的沙盒浏览器 | 隔离环境、保护隐私 | 无登录态，每次需重新登录 |\n| `node` | 控制已连接的节点设备 | 远程控制手机/平板浏览器 | 需要先配对节点 |\n\n### profile 参数（仅 target=\"host\" 时有效）\n\n| profile | 说明 | 适用场景 | 注意事项 |\n|---------|------|----------|----------|\n| `douyin-profile` | 独立的命名 profile | **推荐**：登录态持久化，与 Chrome 隔离 | 首次使用需登录一次 |\n| 不填 | 使用默认隔离浏览器 | 行为可能不稳定 | 需手动登录一次 |\n| `user` | 附加到你真实的 Chrome 会话 | 需要使用已保存的 cookies | 不推荐，会继承所有登录态 |\n\n### 推荐配置\n\n**日常使用（推荐）：**\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"...\")\n```\n\n**隐私隔离：**\n```javascript\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"...\")\n```\n\n## 使用方法\n\n告诉 AI：「帮我上传视频到抖音」并提供：\n\n- 视频文件路径\n- 视频标题\n- 可见范围（公开/好友可见/仅自己可见）\n\nAI 会自动完成全部流程。**在发布前，AI 会要求你确认视频信息，请回复「是」确认发布。**\n\n## 示例\n\n```\n用户: 帮我上传 ~/Videos/my_video.mp4 到抖音，标题是「汽车保养小技巧」，公开可见\n```\n\n## 工作流程\n\n```\n1. 打开抖音上传页面\n2. 关闭弹窗（如有）\n3. 上传视频文件\n4. 填写标题\n5. 设置可见范围（首次运行时询问默认偏好，之后使用保存的值）\n6. 【确认偏好】首次运行时询问是否需要发布确认，之后跳过此步\n7. 【确认发布】根据偏好设置：需要确认时展示信息并等待\"是\"，否则直接发布\n8. 发布\n```\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号（扫描二维码）。只需登录一次，之后会自动复用。\n\n**Q: 应该用 `target=\"host\"` 还是 `target=\"sandbox\"`？**\nA:\n- 用 `target=\"host\"`：需要使用已有登录态，AI 使用独立的 douyin-profile 浏览器\n- 用 `target=\"sandbox\"`：需要完全隔离环境，每次都需要重新登录\n\n**Q: douyin-profile 与真实 Chrome 有什么区别？**\nA:\n- douyin-profile：独立的命名 profile，与真实 Chrome 完全隔离，登录态持久化\n- `profile=\"user\"`：直接附加到真实 Chrome，会继承所有 cookies 和登录态（不推荐）\n\n**Q: `profile=\"user\"` 和不填 profile 有什么区别？**\nA:\n- 不填 profile：使用 OpenClaw 的隔离浏览器，需手动登录一次抖音\n- `profile=\"user\"`：直接附加到你真实的 Chrome，会继承所有 cookies 和登录态，但需要你在电脑前\n\n**Q: 支持哪些视频格式？**\nA: 与抖音网页版支持格式相同，通常为 MP4、MOV 等常见格式。\n\n**Q: 可以设置定时发布吗？**\nA: 目前仅支持立即发布。\n\n**Q: 如何关闭发布前确认？**\nA: 首次运行时 AI 会询问您的偏好。选择\"否\"后，每次发布将自动执行不再弹确认。如需重新开启确认，可删除 `~/.openclaw/skills/douyin-auto-publish/config.json` 文件。\n\n**Q: 如何修改默认的可见范围？**\nA: 首次运行时会询问您默认的可见范围偏好。如需修改，可删除 `~/.openclaw/skills/douyin-auto-publish/config.json` 文件，重新运行时会再次询问。\n\n## 相关链接\n\n- [OpenClaw 文档](https://docs.openclaw.ai)\n- [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n\nFile v2.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn77yxyagmp3fjn6b7vj7htmph83kkmr\",\n  \"slug\": \"douyin-auto-publish\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1777853284084\n}\n\nFile v2.2.0:config.json\n\n{}\n\nArchive v2.1.1: 4 files, 6957 bytes\n\nFiles: _meta.json (138b), config.json (2b), README.md (5265b), SKILL.md (13467b)\n\nFile v2.1.1:SKILL.md\n\n---\nname: douyin-upload\ndescription: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台\n---\n\n# douyin-upload\n\n使用 OpenClaw Browser 工具自动上传视频到抖音创作者平台。\n\n## 前置要求\n\n- OpenClaw Gateway 已运行\n- 电脑已安装 Chrome 浏览器\n- **首次使用需要在弹出的浏览器窗口中登录抖音账号**（只需一次，之后自动复用登录态）\n\n## 核心原则\n\n**⚠️ 安全说明：**\n\n本 skill 使用独立的命名 profile（`douyin-profile`），与你的真实 Chrome 浏览器完全隔离。只需在首次使用时登录抖音一次，之后登录态自动复用。AI 不会访问你的真实 Chrome 数据。\n\n**配置选项：**\n\n- ✅ `profile=\"douyin-profile\"` + `target=\"host\"` - 使用独立的命名 profile，登录态持久化，与 Chrome 隔离（推荐）\n- ✅ `target=\"sandbox\"` - 独立沙盒环境，每次需要重新登录，最安全但不便捷\n- ❌ `profile=\"user\"` - 直接附加到真实 Chrome，会继承所有 cookies 和登录态，不推荐\n- ❌ 不填 profile - 使用默认隔离浏览器，行为可能不稳定\n\n**推荐配置：使用 `profile=\"douyin-profile\"` 配合 `target=\"host\"`。**\n\n## 工作流程\n\n### Step 1: 打开上传页面\n\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n```\n\n### Step 2: 关闭弹窗\n\n如果页面出现弹窗，先关闭：\n\n```javascript\n// 1. 获取当前页面所有可交互元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 在返回结果中查找包含或匹配\"我知道了\"的按钮，拿到其 ref\n// 3. 点击该按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n**关键：不要硬编码 ref！** 先 snapshot，再从结果中根据文字内容找到对应元素的 ref。\n\n### Step 4: 准备视频文件\n\n浏览器 tool 只能上传到 `/tmp/openclaw/uploads` 目录：\n\n```bash\nmkdir -p /tmp/openclaw/uploads\ncp <视频路径> /tmp/openclaw/uploads/\n```\n\n### Step 5: 点击上传按钮\n\n```javascript\n// 1. 获取上传页面的元素列表\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"上传视频\"文字的按钮，拿到 ref\n// 3. 点击上传按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 6: 上传文件\n\n点击上传按钮后会弹出文件选择框：\n\n```javascript\n// 1. 先 snapshot 找到 Choose File 或文件输入/上传框的 ref\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 上传文件\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<找到的ref>\")\n```\n\n### Step 7: 等待视频解析\n\n页面自动跳转到发布编辑页，显示进度条\"0% 文件解析中，请稍等...\"，等待视频解析完成后继续。\n\n### Step 8: 填写标题\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找标题输入框（placeholder 包含或匹配\"标题\"或\"输入标题\"的输入框）\n// 3. 点击输入框并输入标题\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"type\", \"ref\": \"<找到的ref>\", \"text\": \"<用户提供的标题>\"})\n```\n\n### Step 9: 设置作品权限\n\n```bash\n# 读取已保存的可见范围偏好\ncat ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 `default_visibility` 字段已存在，使用保存的值。**\n\n**如果 `default_visibility` 字段不存在**，向用户询问：\n\n```\n「请选择默认的可见范围：\n - 公开：所有用户可见\n - 好友可见：仅好友可见\n - 仅自己可见：仅自己可见（最安全）\n 请回复您希望的数字或文字。」\n```\n\n**根据用户回复保存偏好**（注意保留 `require_confirmation` 原有值）：\n```bash\n# 读取现有配置\ncurrent=$(cat ~/.openclaw/skills/douyin-auto-publish/config.json)\n\n# 用户选择\"公开\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"public\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"好友可见\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"friends\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"仅自己可见\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"private\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 jq 不可用**，可以使用简单覆盖（会保留 `require_confirmation` 如果之前已设置）：\n```bash\n# 用户选择\"公开\"\necho '{\"default_visibility\":\"public\",\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# （如果 require_confirmation 已有值，后续 Step 10 会正确读取并覆盖此文件）\n```\n\n**如果用户明确指定了可见范围**，优先使用用户指定的值（而不是默认值），本次不修改保存的偏好。\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配用户指定可见范围（或默认偏好）的单选框\n//    - public/公开：\"公开\"\n//    - friends/好友可见：\"好友可见\"\n//    - private/仅自己可见：\"仅自己可见\"\n// 3. 点击选中\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 10: 确认偏好检查（仅首次运行时）\n\n```bash\n# 1. 读取当前偏好设置\ncat ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 `require_confirmation` 字段已存在（值不论），直接使用保存的偏好设置，跳到 Step 11。**\n\n**如果 `require_confirmation` 字段不存在**，向用户询问：\n\n```\n「您希望在发布前确认视频信息吗？\n - 选择\"是\"：每次发布前展示信息并需要您确认（推荐）\n - 选择\"否\"：自动执行发布，不再弹出确认\n 请回复「是」或「否」」\n```\n\n**根据用户回复保存偏好**（注意保留 `default_visibility` 原有值）：\n```bash\n# 读取现有配置\ncurrent=$(cat ~/.openclaw/skills/douyin-auto-publish/config.json)\n\n# 用户选择\"是\"（需要确认）\necho $current | jq -s '.[0] * {\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"否\"（自动发布）\necho $current | jq -s '.[0] * {\"require_confirmation\":false}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 jq 不可用**，使用简单覆盖：\n```bash\n# 用户选择\"是\"\necho '{\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# 用户选择\"否\"\necho '{\"require_confirmation\":false}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# （如果 default_visibility 已有值，后续运行 Step 9 会正确读取并保留）\n```\n\n---\n\n### Step 11: 确认并发布\n\n**情况 A：`require_confirmation` 为 `true`（或用户首次选择\"是\"）**\n\n在点击发布之前，必须向用户展示以下信息并获得明确确认：\n\n```javascript\n// 1. 获取当前页面元素（用于后续发布）\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 向用户确认以下信息：\n//    - 文件名: <视频文件名>\n//    - 标题: <用户提供的标题>\n//    - 可见范围: <公开/仅自己可见/好友可见>\n//    示例：「确认发布以下视频？\n//         文件名: demo.mp4\n//         标题: 我的视频标题\n//         可见范围: 公开\n//         请回复「是」确认发布，或「取消」中止操作。」\n\n// 3. 只有在用户明确回复\"是\"、\"确认\"、\"发布\"等肯定回复后，才执行发布\n//    如果用户回复\"取消\"或其他否定内容，告知用户发布已取消并停止操作\n\n// 4. 确认后，点击发布按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n**情况 B：`require_confirmation` 为 `false`（用户首次选择\"否\"）**\n\n直接点击发布按钮，不弹出确认：\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 直接点击发布按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n## 完整流程模板\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 关闭弹窗\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"我知道了\"按钮的 ref，然后点击\n\n// 3. 准备视频文件（需在 terminal 执行）\n// mkdir -p /tmp/openclaw/uploads && cp <path> /tmp/openclaw/uploads/\n\n// 4. 点击上传按钮\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"上传视频\"按钮的 ref，然后点击\n\n// 5. 上传文件\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找文件输入框的 ref，然后上传\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<ref>\")\n\n// 6. 等待解析后填写标题\nsleep 15\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找标题输入框的 ref，然后点击并输入\n\n// 7. 设置可见范围\n// → 读取 config.json 检查 default_visibility 是否已设置\n// → 如果未设置，向用户询问偏好（公开/好友可见/仅自己可见）并保存\n// → 根据用户指定或保存的偏好，找到对应的单选框 ref 并点击\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找对应可见范围选项的 ref，然后点击\n\n// 8. 确认偏好检查（仅首次运行时）\n// → 读取 config.json 检查 require_confirmation 是否已设置\n// → 如果未设置，向用户询问偏好并保存\n// → 如果已设置，直接使用保存的值\n\n// 9. 确认发布\n// 情况 A（require_confirmation == true）：\n//   → 向用户展示：文件名、标题、可见范围\n//   → 只有用户回复\"是\"后才继续，否则取消发布\n// 情况 B（require_confirmation == false）：\n//   → 直接执行发布，不弹确认\n\n// 10. 点击发布\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"发布\"按钮的 ref，然后点击\n```\n\n## 重要提示\n\n1. **每次操作前都要先 snapshot** - ref 是动态的，每次快照都不同\n2. **从 snapshot 结果中根据文字内容查找 ref** - 不要硬编码\n3. **页面跳转后需要重新 snapshot** - 元素 ref 会失效\n4. **视频必须复制到 `/tmp/openclaw/uploads/`** - 浏览器 tool 的限制\n5. **当用户还需要未提及的操作时, 也是同样的方法匹配对应的ref, 然后找到匹配的选项**\n\n## 可选：使用沙盒模式（更安全）\n\n如果你希望完全隔离登录状态，可以使用 `target=\"sandbox\"`：\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 沙盒环境没有登录态，首次使用需要通过页面上的二维码登录抖音账号\n// 3. 后续每次使用都需要重新登录\n```\n\n**沙盒模式的优点：**\n- 完全隔离的浏览器环境，不会访问任何已有浏览器数据\n- 更安全，适合注重隐私的用户\n\n**沙盒模式的缺点：**\n- 每次使用都需要重新登录抖音账号\n- 无法复用登录态\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号（扫描二维码）。只需登录一次，之后登录态会自动复用。如果想避免登录态持久化，可以使用 `target=\"sandbox\"` 模式。\n\n**Q: douyin-profile 与真实 Chrome 有什么区别？**\nA: douyin-profile 是一个独立的命名浏览器 profile，与你的真实 Chrome 浏览器完全隔离。AI 使用这个独立的 profile 进行操作，不会访问你的真实 Chrome 数据、cookies 或登录态。\n\n**Q: 如何使用更安全的沙盒模式？**\nA: 使用 `target=\"sandbox\"` 代替 `target=\"host\"`。沙盒模式会创建独立的浏览器环境，不会访问你的真实 Chrome 数据，但每次都需要重新登录抖音账号。\n\n**Q: Element not found 错误？**\nA: 页面可能跳转了，需要重新执行 snapshot 获取最新元素。\n\n**Q: 为什么 ref 每次都不一样？**\nA: 抖音页面动态渲染，每次 snapshot 生成的 ref 不同。这是正常现象。\n\nFile v2.1.1:README.md\n\n# douyin-upload\n\n自动上传视频到抖音创作者平台。\n\n## 安装 Skill\n\n### 从 ClawHub 安装（推荐）\n\n```bash\n# 1. 登录 ClawHub（浏览器认证）\nclawhub login\n\n# 2. 安装 skill\nopenclaw skills install douyin-auto-publish\n```\n\n> ClawHub 地址: https://clawhub.com\n\n### 手动安装\n\n```bash\n# 将 skill 文件夹复制到 ~/.openclaw/skills/\n```\n\n## 准备工作（只需做一次）\n\n### 首次登录抖音\n\n1. 首次使用时会自动弹出 douyin-profile 浏览器窗口\n2. 在该窗口中访问 [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n3. 使用抖音账号登录（扫描二维码或账号密码）\n4. 建议保持登录状态\n\n**只需登录一次**，之后 AI 会自动复用你的登录状态。\n\n## ⚠️ 安全警告\n\n**使用此 Skill 前请注意：**\n\n1. **独立 Profile**：`profile=\"douyin-profile\"` 使用独立的命名浏览器 profile，与你的真实 Chrome 浏览器完全隔离\n\n2. **发布确认**：首次运行时会询问是否需要发布确认。选择\"是\"后每次发布前都会展示信息并需要你确认；选择\"否\"则自动发布不再弹确认。如需修改，可删除 `config.json` 重新设置。\n\n3. **隔离建议**：如果你对账号安全有较高要求，建议使用 `target=\"sandbox\"` 模式，它会创建完全独立的浏览器环境\n\n## target 参数选择(默认为host)\n\nOpenClaw Browser 工具支持不同的 `target` 参数，适用于不同场景：\n\n| target | 说明 | 适用场景 | 注意事项 |\n|--------|------|----------|----------|\n| `host` | 控制本地浏览器，配合 profile 使用 | **推荐**：配合 douyin-profile 使用 | 确保使用 `profile=\"douyin-profile\"` |\n| `sandbox` | 独立的沙盒浏览器 | 隔离环境、保护隐私 | 无登录态，每次需重新登录 |\n| `node` | 控制已连接的节点设备 | 远程控制手机/平板浏览器 | 需要先配对节点 |\n\n### profile 参数（仅 target=\"host\" 时有效）\n\n| profile | 说明 | 适用场景 | 注意事项 |\n|---------|------|----------|----------|\n| `douyin-profile` | 独立的命名 profile | **推荐**：登录态持久化，与 Chrome 隔离 | 首次使用需登录一次 |\n| 不填 | 使用默认隔离浏览器 | 行为可能不稳定 | 需手动登录一次 |\n| `user` | 附加到你真实的 Chrome 会话 | 需要使用已保存的 cookies | 不推荐，会继承所有登录态 |\n\n### 推荐配置\n\n**日常使用（推荐）：**\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"...\")\n```\n\n**隐私隔离：**\n```javascript\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"...\")\n```\n\n## 使用方法\n\n告诉 AI：「帮我上传视频到抖音」并提供：\n\n- 视频文件路径\n- 视频标题\n- 可见范围（公开/好友可见/仅自己可见）\n\nAI 会自动完成全部流程。**在发布前，AI 会要求你确认视频信息，请回复「是」确认发布。**\n\n## 示例\n\n```\n用户: 帮我上传 ~/Videos/my_video.mp4 到抖音，标题是「汽车保养小技巧」，公开可见\n```\n\n## 工作流程\n\n```\n1. 打开抖音上传页面\n2. 关闭弹窗（如有）\n3. 上传视频文件\n4. 填写标题\n5. 设置可见范围（首次运行时询问默认偏好，之后使用保存的值）\n6. 【确认偏好】首次运行时询问是否需要发布确认，之后跳过此步\n7. 【确认发布】根据偏好设置：需要确认时展示信息并等待\"是\"，否则直接发布\n8. 发布\n```\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号（扫描二维码）。只需登录一次，之后会自动复用。\n\n**Q: 应该用 `target=\"host\"` 还是 `target=\"sandbox\"`？**\nA:\n- 用 `target=\"host\"`：需要使用已有登录态，AI 使用独立的 douyin-profile 浏览器\n- 用 `target=\"sandbox\"`：需要完全隔离环境，每次都需要重新登录\n\n**Q: douyin-profile 与真实 Chrome 有什么区别？**\nA:\n- douyin-profile：独立的命名 profile，与真实 Chrome 完全隔离，登录态持久化\n- `profile=\"user\"`：直接附加到真实 Chrome，会继承所有 cookies 和登录态（不推荐）\n\n**Q: `profile=\"user\"` 和不填 profile 有什么区别？**\nA:\n- 不填 profile：使用 OpenClaw 的隔离浏览器，需手动登录一次抖音\n- `profile=\"user\"`：直接附加到你真实的 Chrome，会继承所有 cookies 和登录态，但需要你在电脑前\n\n**Q: 支持哪些视频格式？**\nA: 与抖音网页版支持格式相同，通常为 MP4、MOV 等常见格式。\n\n**Q: 可以设置定时发布吗？**\nA: 目前仅支持立即发布。\n\n**Q: 如何关闭发布前确认？**\nA: 首次运行时 AI 会询问您的偏好。选择\"否\"后，每次发布将自动执行不再弹确认。如需重新开启确认，可删除 `~/.openclaw/skills/douyin-auto-publish/config.json` 文件。\n\n**Q: 如何修改默认的可见范围？**\nA: 首次运行时会询问您默认的可见范围偏好。如需修改，可删除 `~/.openclaw/skills/douyin-auto-publish/config.json` 文件，重新运行时会再次询问。\n\n## 相关链接\n\n- [OpenClaw 文档](https://docs.openclaw.ai)\n- [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n\nFile v2.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn77yxyagmp3fjn6b7vj7htmph83kkmr\",\n  \"slug\": \"douyin-auto-publish\",\n  \"version\": \"2.1.1\",\n  \"publishedAt\": 1777852901439\n}\n\nFile v2.1.1:config.json\n\n{}\n\nArchive v2.1.0: 5 files, 7208 bytes\n\nFiles: _meta.json (138b), .claude/settings.local.json (184b), config.json (2b), README.md (5265b), SKILL.md (13467b)\n\nFile v2.1.0:SKILL.md\n\n---\nname: douyin-upload\ndescription: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台\n---\n\n# douyin-upload\n\n使用 OpenClaw Browser 工具自动上传视频到抖音创作者平台。\n\n## 前置要求\n\n- OpenClaw Gateway 已运行\n- 电脑已安装 Chrome 浏览器\n- **首次使用需要在弹出的浏览器窗口中登录抖音账号**（只需一次，之后自动复用登录态）\n\n## 核心原则\n\n**⚠️ 安全说明：**\n\n本 skill 使用独立的命名 profile（`douyin-profile`），与你的真实 Chrome 浏览器完全隔离。只需在首次使用时登录抖音一次，之后登录态自动复用。AI 不会访问你的真实 Chrome 数据。\n\n**配置选项：**\n\n- ✅ `profile=\"douyin-profile\"` + `target=\"host\"` - 使用独立的命名 profile，登录态持久化，与 Chrome 隔离（推荐）\n- ✅ `target=\"sandbox\"` - 独立沙盒环境，每次需要重新登录，最安全但不便捷\n- ❌ `profile=\"user\"` - 直接附加到真实 Chrome，会继承所有 cookies 和登录态，不推荐\n- ❌ 不填 profile - 使用默认隔离浏览器，行为可能不稳定\n\n**推荐配置：使用 `profile=\"douyin-profile\"` 配合 `target=\"host\"`。**\n\n## 工作流程\n\n### Step 1: 打开上传页面\n\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n```\n\n### Step 2: 关闭弹窗\n\n如果页面出现弹窗，先关闭：\n\n```javascript\n// 1. 获取当前页面所有可交互元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 在返回结果中查找包含或匹配\"我知道了\"的按钮，拿到其 ref\n// 3. 点击该按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n**关键：不要硬编码 ref！** 先 snapshot，再从结果中根据文字内容找到对应元素的 ref。\n\n### Step 4: 准备视频文件\n\n浏览器 tool 只能上传到 `/tmp/openclaw/uploads` 目录：\n\n```bash\nmkdir -p /tmp/openclaw/uploads\ncp <视频路径> /tmp/openclaw/uploads/\n```\n\n### Step 5: 点击上传按钮\n\n```javascript\n// 1. 获取上传页面的元素列表\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"上传视频\"文字的按钮，拿到 ref\n// 3. 点击上传按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 6: 上传文件\n\n点击上传按钮后会弹出文件选择框：\n\n```javascript\n// 1. 先 snapshot 找到 Choose File 或文件输入/上传框的 ref\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 上传文件\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<找到的ref>\")\n```\n\n### Step 7: 等待视频解析\n\n页面自动跳转到发布编辑页，显示进度条\"0% 文件解析中，请稍等...\"，等待视频解析完成后继续。\n\n### Step 8: 填写标题\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找标题输入框（placeholder 包含或匹配\"标题\"或\"输入标题\"的输入框）\n// 3. 点击输入框并输入标题\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"type\", \"ref\": \"<找到的ref>\", \"text\": \"<用户提供的标题>\"})\n```\n\n### Step 9: 设置作品权限\n\n```bash\n# 读取已保存的可见范围偏好\ncat ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 `default_visibility` 字段已存在，使用保存的值。**\n\n**如果 `default_visibility` 字段不存在**，向用户询问：\n\n```\n「请选择默认的可见范围：\n - 公开：所有用户可见\n - 好友可见：仅好友可见\n - 仅自己可见：仅自己可见（最安全）\n 请回复您希望的数字或文字。」\n```\n\n**根据用户回复保存偏好**（注意保留 `require_confirmation` 原有值）：\n```bash\n# 读取现有配置\ncurrent=$(cat ~/.openclaw/skills/douyin-auto-publish/config.json)\n\n# 用户选择\"公开\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"public\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"好友可见\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"friends\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"仅自己可见\"\necho $current | jq -s '.[0] * {\"default_visibility\":\"private\"}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 jq 不可用**，可以使用简单覆盖（会保留 `require_confirmation` 如果之前已设置）：\n```bash\n# 用户选择\"公开\"\necho '{\"default_visibility\":\"public\",\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# （如果 require_confirmation 已有值，后续 Step 10 会正确读取并覆盖此文件）\n```\n\n**如果用户明确指定了可见范围**，优先使用用户指定的值（而不是默认值），本次不修改保存的偏好。\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配用户指定可见范围（或默认偏好）的单选框\n//    - public/公开：\"公开\"\n//    - friends/好友可见：\"好友可见\"\n//    - private/仅自己可见：\"仅自己可见\"\n// 3. 点击选中\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 10: 确认偏好检查（仅首次运行时）\n\n```bash\n# 1. 读取当前偏好设置\ncat ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 `require_confirmation` 字段已存在（值不论），直接使用保存的偏好设置，跳到 Step 11。**\n\n**如果 `require_confirmation` 字段不存在**，向用户询问：\n\n```\n「您希望在发布前确认视频信息吗？\n - 选择\"是\"：每次发布前展示信息并需要您确认（推荐）\n - 选择\"否\"：自动执行发布，不再弹出确认\n 请回复「是」或「否」」\n```\n\n**根据用户回复保存偏好**（注意保留 `default_visibility` 原有值）：\n```bash\n# 读取现有配置\ncurrent=$(cat ~/.openclaw/skills/douyin-auto-publish/config.json)\n\n# 用户选择\"是\"（需要确认）\necho $current | jq -s '.[0] * {\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n\n# 用户选择\"否\"（自动发布）\necho $current | jq -s '.[0] * {\"require_confirmation\":false}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 jq 不可用**，使用简单覆盖：\n```bash\n# 用户选择\"是\"\necho '{\"require_confirmation\":true}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# 用户选择\"否\"\necho '{\"require_confirmation\":false}' > ~/.openclaw/skills/douyin-auto-publish/config.json\n# （如果 default_visibility 已有值，后续运行 Step 9 会正确读取并保留）\n```\n\n---\n\n### Step 11: 确认并发布\n\n**情况 A：`require_confirmation` 为 `true`（或用户首次选择\"是\"）**\n\n在点击发布之前，必须向用户展示以下信息并获得明确确认：\n\n```javascript\n// 1. 获取当前页面元素（用于后续发布）\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 向用户确认以下信息：\n//    - 文件名: <视频文件名>\n//    - 标题: <用户提供的标题>\n//    - 可见范围: <公开/仅自己可见/好友可见>\n//    示例：「确认发布以下视频？\n//         文件名: demo.mp4\n//         标题: 我的视频标题\n//         可见范围: 公开\n//         请回复「是」确认发布，或「取消」中止操作。」\n\n// 3. 只有在用户明确回复\"是\"、\"确认\"、\"发布\"等肯定回复后，才执行发布\n//    如果用户回复\"取消\"或其他否定内容，告知用户发布已取消并停止操作\n\n// 4. 确认后，点击发布按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n**情况 B：`require_confirmation` 为 `false`（用户首次选择\"否\"）**\n\n直接点击发布按钮，不弹出确认：\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 直接点击发布按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n## 完整流程模板\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 关闭弹窗\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"我知道了\"按钮的 ref，然后点击\n\n// 3. 准备视频文件（需在 terminal 执行）\n// mkdir -p /tmp/openclaw/uploads && cp <path> /tmp/openclaw/uploads/\n\n// 4. 点击上传按钮\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"上传视频\"按钮的 ref，然后点击\n\n// 5. 上传文件\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找文件输入框的 ref，然后上传\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<ref>\")\n\n// 6. 等待解析后填写标题\nsleep 15\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找标题输入框的 ref，然后点击并输入\n\n// 7. 设置可见范围\n// → 读取 config.json 检查 default_visibility 是否已设置\n// → 如果未设置，向用户询问偏好（公开/好友可见/仅自己可见）并保存\n// → 根据用户指定或保存的偏好，找到对应的单选框 ref 并点击\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找对应可见范围选项的 ref，然后点击\n\n// 8. 确认偏好检查（仅首次运行时）\n// → 读取 config.json 检查 require_confirmation 是否已设置\n// → 如果未设置，向用户询问偏好并保存\n// → 如果已设置，直接使用保存的值\n\n// 9. 确认发布\n// 情况 A（require_confirmation == true）：\n//   → 向用户展示：文件名、标题、可见范围\n//   → 只有用户回复\"是\"后才继续，否则取消发布\n// 情况 B（require_confirmation == false）：\n//   → 直接执行发布，不弹确认\n\n// 10. 点击发布\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n// → 从结果中找\"发布\"按钮的 ref，然后点击\n```\n\n## 重要提示\n\n1. **每次操作前都要先 snapshot** - ref 是动态的，每次快照都不同\n2. **从 snapshot 结果中根据文字内容查找 ref** - 不要硬编码\n3. **页面跳转后需要重新 snapshot** - 元素 ref 会失效\n4. **视频必须复制到 `/tmp/openclaw/uploads/`** - 浏览器 tool 的限制\n5. **当用户还需要未提及的操作时, 也是同样的方法匹配对应的ref, 然后找到匹配的选项**\n\n## 可选：使用沙盒模式（更安全）\n\n如果你希望完全隔离登录状态，可以使用 `target=\"sandbox\"`：\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 沙盒环境没有登录态，首次使用需要通过页面上的二维码登录抖音账号\n// 3. 后续每次使用都需要重新登录\n```\n\n**沙盒模式的优点：**\n- 完全隔离的浏览器环境，不会访问任何已有浏览器数据\n- 更安全，适合注重隐私的用户\n\n**沙盒模式的缺点：**\n- 每次使用都需要重新登录抖音账号\n- 无法复用登录态\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号（扫描二维码）。只需登录一次，之后登录态会自动复用。如果想避免登录态持久化，可以使用 `target=\"sandbox\"` 模式。\n\n**Q: douyin-profile 与真实 Chrome 有什么区别？**\nA: douyin-profile 是一个独立的命名浏览器 profile，与你的真实 Chrome 浏览器完全隔离。AI 使用这个独立的 profile 进行操作，不会访问你的真实 Chrome 数据、cookies 或登录态。\n\n**Q: 如何使用更安全的沙盒模式？**\nA: 使用 `target=\"sandbox\"` 代替 `target=\"host\"`。沙盒模式会创建独立的浏览器环境，不会访问你的真实 Chrome 数据，但每次都需要重新登录抖音账号。\n\n**Q: Element not found 错误？**\nA: 页面可能跳转了，需要重新执行 snapshot 获取最新元素。\n\n**Q: 为什么 ref 每次都不一样？**\nA: 抖音页面动态渲染，每次 snapshot 生成的 ref 不同。这是正常现象。\n\nFile v2.1.0:README.md\n\n# douyin-upload\n\n自动上传视频到抖音创作者平台。\n\n## 安装 Skill\n\n### 从 ClawHub 安装（推荐）\n\n```bash\n# 1. 登录 ClawHub（浏览器认证）\nclawhub login\n\n# 2. 安装 skill\nopenclaw skills install douyin-auto-publish\n```\n\n> ClawHub 地址: https://clawhub.com\n\n### 手动安装\n\n```bash\n# 将 skill 文件夹复制到 ~/.openclaw/skills/\n```\n\n## 准备工作（只需做一次）\n\n### 首次登录抖音\n\n1. 首次使用时会自动弹出 douyin-profile 浏览器窗口\n2. 在该窗口中访问 [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n3. 使用抖音账号登录（扫描二维码或账号密码）\n4. 建议保持登录状态\n\n**只需登录一次**，之后 AI 会自动复用你的登录状态。\n\n## ⚠️ 安全警告\n\n**使用此 Skill 前请注意：**\n\n1. **独立 Profile**：`profile=\"douyin-profile\"` 使用独立的命名浏览器 profile，与你的真实 Chrome 浏览器完全隔离\n\n2. **发布确认**：首次运行时会询问是否需要发布确认。选择\"是\"后每次发布前都会展示信息并需要你确认；选择\"否\"则自动发布不再弹确认。如需修改，可删除 `config.json` 重新设置。\n\n3. **隔离建议**：如果你对账号安全有较高要求，建议使用 `target=\"sandbox\"` 模式，它会创建完全独立的浏览器环境\n\n## target 参数选择(默认为host)\n\nOpenClaw Browser 工具支持不同的 `target` 参数，适用于不同场景：\n\n| target | 说明 | 适用场景 | 注意事项 |\n|--------|------|----------|----------|\n| `host` | 控制本地浏览器，配合 profile 使用 | **推荐**：配合 douyin-profile 使用 | 确保使用 `profile=\"douyin-profile\"` |\n| `sandbox` | 独立的沙盒浏览器 | 隔离环境、保护隐私 | 无登录态，每次需重新登录 |\n| `node` | 控制已连接的节点设备 | 远程控制手机/平板浏览器 | 需要先配对节点 |\n\n### profile 参数（仅 target=\"host\" 时有效）\n\n| profile | 说明 | 适用场景 | 注意事项 |\n|---------|------|----------|----------|\n| `douyin-profile` | 独立的命名 profile | **推荐**：登录态持久化，与 Chrome 隔离 | 首次使用需登录一次 |\n| 不填 | 使用默认隔离浏览器 | 行为可能不稳定 | 需手动登录一次 |\n| `user` | 附加到你真实的 Chrome 会话 | 需要使用已保存的 cookies | 不推荐，会继承所有登录态 |\n\n### 推荐配置\n\n**日常使用（推荐）：**\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"...\")\n```\n\n**隐私隔离：**\n```javascript\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"...\")\n```\n\n## 使用方法\n\n告诉 AI：「帮我上传视频到抖音」并提供：\n\n- 视频文件路径\n- 视频标题\n- 可见范围（公开/好友可见/仅自己可见）\n\nAI 会自动完成全部流程。**在发布前，AI 会要求你确认视频信息，请回复「是」确认发布。**\n\n## 示例\n\n```\n用户: 帮我上传 ~/Videos/my_video.mp4 到抖音，标题是「汽车保养小技巧」，公开可见\n```\n\n## 工作流程\n\n```\n1. 打开抖音上传页面\n2. 关闭弹窗（如有）\n3. 上传视频文件\n4. 填写标题\n5. 设置可见范围（首次运行时询问默认偏好，之后使用保存的值）\n6. 【确认偏好】首次运行时询问是否需要发布确认，之后跳过此步\n7. 【确认发布】根据偏好设置：需要确认时展示信息并等待\"是\"，否则直接发布\n8. 发布\n```\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号（扫描二维码）。只需登录一次，之后会自动复用。\n\n**Q: 应该用 `target=\"host\"` 还是 `target=\"sandbox\"`？**\nA:\n- 用 `target=\"host\"`：需要使用已有登录态，AI 使用独立的 douyin-profile 浏览器\n- 用 `target=\"sandbox\"`：需要完全隔离环境，每次都需要重新登录\n\n**Q: douyin-profile 与真实 Chrome 有什么区别？**\nA:\n- douyin-profile：独立的命名 profile，与真实 Chrome 完全隔离，登录态持久化\n- `profile=\"user\"`：直接附加到真实 Chrome，会继承所有 cookies 和登录态（不推荐）\n\n**Q: `profile=\"user\"` 和不填 profile 有什么区别？**\nA:\n- 不填 profile：使用 OpenClaw 的隔离浏览器，需手动登录一次抖音\n- `profile=\"user\"`：直接附加到你真实的 Chrome，会继承所有 cookies 和登录态，但需要你在电脑前\n\n**Q: 支持哪些视频格式？**\nA: 与抖音网页版支持格式相同，通常为 MP4、MOV 等常见格式。\n\n**Q: 可以设置定时发布吗？**\nA: 目前仅支持立即发布。\n\n**Q: 如何关闭发布前确认？**\nA: 首次运行时 AI 会询问您的偏好。选择\"否\"后，每次发布将自动执行不再弹确认。如需重新开启确认，可删除 `~/.openclaw/skills/douyin-auto-publish/config.json` 文件。\n\n**Q: 如何修改默认的可见范围？**\nA: 首次运行时会询问您默认的可见范围偏好。如需修改，可删除 `~/.openclaw/skills/douyin-auto-publish/config.json` 文件，重新运行时会再次询问。\n\n## 相关链接\n\n- [OpenClaw 文档](https://docs.openclaw.ai)\n- [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n\nFile v2.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn77yxyagmp3fjn6b7vj7htmph83kkmr\",\n  \"slug\": \"douyin-auto-publish\",\n  \"version\": \"2.1.0\",\n  \"publishedAt\": 1777852767312\n}\n\nFile v2.1.0:.claude/settings.local.json\n\n{\n  \"permissions\": {\n    \"allow\": [\n      \"WebFetch(domain:clawhub.ai)\",\n      \"WebSearch\",\n      \"WebFetch(domain:docs.openclaw.ai)\",\n      \"WebFetch(domain:clawhub.com)\"\n    ]\n  }\n}\n\nFile v2.1.0:config.json\n\n{}\n\nArchive v1.2.1: 4 files, 5576 bytes\n\nFiles: _meta.json (138b), .claude/settings.local.json (84b), README.md (3943b), SKILL.md (8194b)\n\nFile v1.2.1:SKILL.md\n\n---\nname: douyin-upload\ndescription: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台\n---\n\n# douyin-upload\n\n使用 OpenClaw Browser 工具自动上传视频到抖音创作者平台。\n\n## 前置要求\n\n- OpenClaw Gateway 已运行\n- 电脑已安装 Chrome 浏览器\n- **在 Chrome 中登录抖音账号**（只需一次，之后自动继承登录态）\n\n## 核心原则\n\n**⚠️ 重要警告：使用 `target=\"host\"` 会继承 Chrome 的完整登录态，包括账号权限。AI 将能够以你的账号身份执行操作。**\n\n**只用 `target=\"host\"`，不要填 `profile` 参数。**\n\n- ✅ `target=\"host\"` - 继承 Chrome 登录态，AI 可以以你的账号身份执行操作\n- ✅ `target=\"sandbox\"` - 独立沙盒环境，需要重新登录，但更安全（推荐注重隐私的用户）\n- ❌ `profile=\"user\"` - 需要开启 remote debugging，不稳定\n- ❌ `profile=\"chrome-relay\"` - HTTP 404\n\n## 工作流程\n\n### Step 1: 打开上传页面\n\n```javascript\nbrowser(action=\"navigate\", target=\"host\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n```\n\n### Step 2: 关闭弹窗\n\n如果页面出现弹窗，先关闭：\n\n```javascript\n// 1. 获取当前页面所有可交互元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 在返回结果中查找包含或匹配\"我知道了\"的按钮，拿到其 ref\n// 3. 点击该按钮\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n**关键：不要硬编码 ref！** 先 snapshot，再从结果中根据文字内容找到对应元素的 ref。\n\n### Step 4: 准备视频文件\n\n浏览器 tool 只能上传到 `/tmp/openclaw/uploads` 目录：\n\n```bash\nmkdir -p /tmp/openclaw/uploads\ncp <视频路径> /tmp/openclaw/uploads/\n```\n\n### Step 5: 点击上传按钮\n\n```javascript\n// 1. 获取上传页面的元素列表\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"上传视频\"文字的按钮，拿到 ref\n// 3. 点击上传按钮\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 6: 上传文件\n\n点击上传按钮后会弹出文件选择框：\n\n```javascript\n// 1. 先 snapshot 找到 Choose File 或文件输入/上传框的 ref\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 上传文件\nbrowser(action=\"upload\", target=\"host\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<找到的ref>\")\n```\n\n### Step 7: 等待视频解析\n\n页面自动跳转到发布编辑页，显示进度条\"0% 文件解析中，请稍等...\"，等待视频解析完成后继续。\n\n### Step 8: 填写标题\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找标题输入框（placeholder 包含或匹配\"标题\"或\"输入标题\"的输入框）\n// 3. 点击输入框并输入标题\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"type\", \"ref\": \"<找到的ref>\", \"text\": \"<用户提供的标题>\"})\n```\n\n### Step 9: 设置作品权限\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"公开\"\"好友可见\"\"仅自己可见\"或类似文字的单选框, 默认选择\"公开\"\n// 3. 点击选中\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 10: 确认并发布\n\n在点击发布之前，必须向用户展示以下信息并获得明确确认：\n\n```javascript\n// 1. 获取当前页面元素（用于后续发布）\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 向用户确认以下信息：\n//    - 文件名: <视频文件名>\n//    - 标题: <用户提供的标题>\n//    - 可见范围: <公开/仅自己可见/好友可见>\n//    示例：「确认发布以下视频？\n//         文件名: demo.mp4\n//         标题: 我的视频标题\n//         可见范围: 公开\n//         请回复「是」确认发布，或「取消」中止操作。」\n\n// 3. 只有在用户明确回复\"是\"、\"确认\"、\"发布\"等肯定回复后，才执行发布\n//    如果用户回复\"取消\"或其他否定内容，告知用户发布已取消并停止操作\n\n// 4. 确认后，点击发布按钮\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n## 完整流程模板\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"host\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 关闭弹窗\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"我知道了\"按钮的 ref，然后点击\n\n// 3. 准备视频文件（需在 terminal 执行）\n// mkdir -p /tmp/openclaw/uploads && cp <path> /tmp/openclaw/uploads/\n\n// 4. 点击上传按钮\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"上传视频\"按钮的 ref，然后点击\n\n// 5. 上传文件\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找文件输入框的 ref，然后上传\nbrowser(action=\"upload\", target=\"host\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<ref>\")\n\n// 6. 等待解析后填写标题\nsleep 15\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找标题输入框的 ref，然后点击并输入\n\n// 7. 设置仅自己可见\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"仅自己可见\"选项的 ref，然后点击\n\n// 8. 确认发布（重要！）\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 向用户展示：文件名、标题、可见范围\n// → 只有用户回复\"是\"后才继续，否则取消发布\n\n// 9. 点击发布\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"发布\"按钮的 ref，然后点击\n```\n\n## 重要提示\n\n1. **每次操作前都要先 snapshot** - ref 是动态的，每次快照都不同\n2. **从 snapshot 结果中根据文字内容查找 ref** - 不要硬编码\n3. **页面跳转后需要重新 snapshot** - 元素 ref 会失效\n4. **视频必须复制到 `/tmp/openclaw/uploads/`** - 浏览器 tool 的限制\n5. **当用户还需要未提及的操作时, 也是同样的方法匹配对应的ref, 然后找到匹配的选项**\n\n## 可选：使用沙盒模式（更安全）\n\n如果你希望隔离登录状态，避免 AI 访问你的真实浏览器数据，可以使用 `target=\"sandbox\"`：\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 沙盒环境没有登录态，首次使用需要通过页面上的二维码登录抖音账号\n// 3. 后续流程与 host 模式相同，但所有操作都在隔离环境中执行\n```\n\n**沙盒模式的优点：**\n- 隔离浏览器环境，不会访问你的真实 Chrome 数据\n- 登录状态与其他浏览器会话分开\n- 更安全，适合注重隐私的用户\n\n**沙盒模式的缺点：**\n- 首次使用需要重新登录抖音账号\n- 登录状态在会话结束后不会保留（除非 OpenClaw 支持持久化）\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 请确保 Chrome 已登录抖音。使用 `target=\"host\"` 会自动继承 Chrome 的登录态。如果想避免继承登录态，可以使用 `target=\"sandbox\"` 模式。\n\n**Q: 如何使用更安全的沙盒模式？**\nA: 使用 `target=\"sandbox\"` 代替 `target=\"host\"`。沙盒模式会创建独立的浏览器环境，不会访问你的真实 Chrome 数据，但需要重新登录抖音账号。\n\n**Q: Element not found 错误？**\nA: 页面可能跳转了，需要重新执行 snapshot 获取最新元素。\n\n**Q: 为什么 ref 每次都不一样？**\nA: 抖音页面动态渲染，每次 snapshot 生成的 ref 不同。这是正常现象。\n\nFile v1.2.1:README.md\n\n# douyin-upload\n\n自动上传视频到抖音创作者平台。\n\n## 安装 Skill\n\n### 从 ClawHub 安装（推荐）\n\n```bash\n# 1. 登录 ClawHub（浏览器认证）\nclawhub login\n\n# 2. 安装 skill\nopenclaw skills install douyin-auto-publish\n```\n\n> ClawHub 地址: https://clawhub.com\n\n### 手动安装\n\n```bash\n# 将 skill 文件夹复制到 ~/.openclaw/skills/\n```\n\n## 准备工作（只需做一次）\n\n### 在 Chrome 登录抖音\n\n1. 打开电脑上的 Chrome 浏览器\n2. 访问 [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n3. 使用抖音账号登录\n4. 建议保持 Chrome 的运行状态\n\n**只需登录一次**，之后 AI 会自动继承你的登录状态。\n\n## ⚠️ 安全警告\n\n**使用此 Skill 前请注意：**\n\n1. **账号权限继承**：`target=\"host\"` 模式会继承 Chrome 浏览器的登录态，AI 能够以你的账号身份执行操作（包括发布视频、修改设置等）\n\n2. **发布确认**：AI 在发布视频前会要求你明确确认，请仔细核对文件名、标题和可见范围\n\n3. **隔离建议**：如果你对账号安全有较高要求，建议使用 `target=\"sandbox\"` 模式，它会创建独立的浏览器环境\n\n## target 参数选择(默认为host)\n\nOpenClaw Browser 工具支持不同的 `target` 参数，适用于不同场景：\n\n| target | 说明 | 适用场景 | 注意事项 |\n|--------|------|----------|----------|\n| `host` (默认)| 控制你电脑上的 Chrome | **推荐**：需要使用已有登录态 | 确保 Chrome 已登录抖音 |\n| `sandbox` | 独立的沙盒浏览器 | 隔离环境、保护隐私 | 无登录态，需要重新登录 |\n| `node` | 控制已连接的节点设备 | 远程控制手机/平板浏览器 | 需要先配对节点 |\n\n### profile 参数（仅 target=\"host\" 时有效）\n\n| profile | 说明 | 适用场景 | 注意事项 |\n|---------|------|----------|----------|\n| 不填（默认） | 使用 `openclaw` 隔离浏览器 | **推荐**：安全稳定 | 需手动登录一次 |\n| `user` | 附加到你真实的 Chrome 会话 | 需要使用已保存的 cookies | 需要在电脑前批准提示 |\n\n### 推荐配置\n\n**日常使用（推荐）：**\n```javascript\nbrowser(action=\"navigate\", target=\"host\", url=\"...\")\n```\n\n**隐私隔离：**\n```javascript\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"...\")\n```\n\n## 使用方法\n\n告诉 AI：「帮我上传视频到抖音」并提供：\n\n- 视频文件路径\n- 视频标题\n- 可见范围（公开/仅自己可见）\n\nAI 会自动完成全部流程。**在发布前，AI 会要求你确认视频信息，请回复「是」确认发布。**\n\n## 示例\n\n```\n用户: 帮我上传 ~/Videos/my_video.mp4 到抖音，标题是「汽车保养小技巧」，公开可见\n```\n\n## 工作流程\n\n```\n1. 打开抖音上传页面\n2. 关闭弹窗（如有）\n3. 上传视频文件\n4. 填写标题\n5. 设置可见范围\n6. 【确认发布】AI 会展示视频信息并要求你明确确认\n7. 发布\n```\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 请确保 Chrome 已登录抖音创作者平台。AI 使用你 Chrome 的登录状态。\n\n**Q: 应该用 `target=\"host\"` 还是 `target=\"sandbox\"`？**\nA:\n- 用 `target=\"host\"`：需要使用已有登录态，AI 控制你电脑的 Chrome\n- 用 `target=\"sandbox\"`：需要隔离环境，不想暴露真实浏览器数据\n\n**Q: `profile=\"user\"` 和不填 profile 有什么区别？**\nA:\n- 不填 profile：使用 OpenClaw 的隔离浏览器，需手动登录一次抖音\n- `profile=\"user\"`：直接附加到你真实的 Chrome，会继承所有 cookies 和登录态，但需要你在电脑前\n\n**Q: 支持哪些视频格式？**\nA: 与抖音网页版支持格式相同，通常为 MP4、MOV 等常见格式。\n\n**Q: 可以设置定时发布吗？**\nA: 目前仅支持立即发布。\n\n## 相关链接\n\n- [OpenClaw 文档](https://docs.openclaw.ai)\n- [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n\nFile v1.2.1:_meta.json\n\n{\n  \"ownerId\": \"kn77yxyagmp3fjn6b7vj7htmph83kkmr\",\n  \"slug\": \"douyin-auto-publish\",\n  \"version\": \"1.2.1\",\n  \"publishedAt\": 1777832485420\n}\n\nFile v1.2.1:.claude/settings.local.json\n\n{\n  \"permissions\": {\n    \"allow\": [\n      \"WebFetch(domain:clawhub.ai)\"\n    ]\n  }\n}\n\nArchive v1.1.0: 3 files, 4217 bytes\n\nFiles: README.md (3284b), SKILL.md (5878b), _meta.json (138b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: douyin-upload\ndescription: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台\n---\n\n# douyin-upload\n\n使用 OpenClaw Browser 工具自动上传视频到抖音创作者平台。\n\n## 前置要求\n\n- OpenClaw Gateway 已运行\n- 电脑已安装 Chrome 浏览器\n- **在 Chrome 中登录抖音账号**（只需一次，之后自动继承登录态）\n\n## 核心原则\n\n**只用 `target=\"host\"`，不要填 `profile` 参数。**\n\n- ✅ `target=\"host\"` - 继承 Chrome 登录态\n- ❌ `profile=\"user\"` - 需要开启 remote debugging，不稳定\n- ❌ `profile=\"chrome-relay\"` - HTTP 404\n- ❌ `target=\"sandbox\"` - 独立沙盒，无登录态\n\n## 工作流程\n\n### Step 1: 打开上传页面\n\n```javascript\nbrowser(action=\"navigate\", target=\"host\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n```\n\n### Step 2: 关闭弹窗\n\n如果页面出现弹窗，先关闭：\n\n```javascript\n// 1. 获取当前页面所有可交互元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 在返回结果中查找包含或匹配\"我知道了\"的按钮，拿到其 ref\n// 3. 点击该按钮\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n**关键：不要硬编码 ref！** 先 snapshot，再从结果中根据文字内容找到对应元素的 ref。\n\n### Step 4: 准备视频文件\n\n浏览器 tool 只能上传到 `/tmp/openclaw/uploads` 目录：\n\n```bash\nmkdir -p /tmp/openclaw/uploads\ncp <视频路径> /tmp/openclaw/uploads/\n```\n\n### Step 5: 点击上传按钮\n\n```javascript\n// 1. 获取上传页面的元素列表\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"上传视频\"文字的按钮，拿到 ref\n// 3. 点击上传按钮\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 6: 上传文件\n\n点击上传按钮后会弹出文件选择框：\n\n```javascript\n// 1. 先 snapshot 找到 Choose File 或文件输入/上传框的 ref\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 上传文件\nbrowser(action=\"upload\", target=\"host\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<找到的ref>\")\n```\n\n### Step 7: 等待视频解析\n\n页面自动跳转到发布编辑页，显示进度条\"0% 文件解析中，请稍等...\"，等待视频解析完成后继续。\n\n### Step 8: 填写标题\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找标题输入框（placeholder 包含或匹配\"标题\"或\"输入标题\"的输入框）\n// 3. 点击输入框并输入标题\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"type\", \"ref\": \"<找到的ref>\", \"text\": \"<用户提供的标题>\"})\n```\n\n### Step 9: 设置作品权限\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"公开\"\"好友可见\"\"仅自己可见\"或类似文字的单选框, 默认选择\"公开\"\n// 3. 点击选中\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 10: 发布\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"发布\"文字的按钮\n// 3. 点击发布\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n## 完整流程模板\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"host\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 关闭弹窗\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"我知道了\"按钮的 ref，然后点击\n\n// 3. 准备视频文件（需在 terminal 执行）\n// mkdir -p /tmp/openclaw/uploads && cp <path> /tmp/openclaw/uploads/\n\n// 4. 点击上传按钮\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"上传视频\"按钮的 ref，然后点击\n\n// 5. 上传文件\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找文件输入框的 ref，然后上传\nbrowser(action=\"upload\", target=\"host\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<ref>\")\n\n// 6. 等待解析后填写标题\nsleep 15\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找标题输入框的 ref，然后点击并输入\n\n// 7. 设置仅自己可见\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"仅自己可见\"选项的 ref，然后点击\n\n// 8. 发布\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"发布\"按钮的 ref，然后点击\n```\n\n## 重要提示\n\n1. **每次操作前都要先 snapshot** - ref 是动态的，每次快照都不同\n2. **从 snapshot 结果中根据文字内容查找 ref** - 不要硬编码\n3. **页面跳转后需要重新 snapshot** - 元素 ref 会失效\n4. **视频必须复制到 `/tmp/openclaw/uploads/`** - 浏览器 tool 的限制\n5. **当用户还需要未提及的操作时, 也是同样的方法匹配对应的ref, 然后找到匹配的选项**\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 请确保 Chrome 已登录抖音。使用 `target=\"host\"` 会自动继承 Chrome 的登录态。\n\n**Q: Element not found 错误？**\nA: 页面可能跳转了，需要重新执行 snapshot 获取最新元素。\n\n**Q: 为什么 ref 每次都不一样？**\nA: 抖音页面动态渲染，每次 snapshot 生成的 ref 不同。这是正常现象。\n\nFile v1.1.0:README.md\n\n# douyin-upload\n\n自动上传视频到抖音创作者平台。\n\n## 安装 Skill\n\n### 从 ClawHub 安装（推荐）\n\n```bash\n# 1. 登录 ClawHub（浏览器认证）\nclawhub login\n\n# 2. 安装 skill\nopenclaw skills install douyin-auto-publish\n```\n\n> ClawHub 地址: https://clawhub.com\n\n### 手动安装\n\n```bash\n# 将 skill 文件夹复制到 ~/.openclaw/skills/\n```\n\n## 准备工作（只需做一次）\n\n### 在 Chrome 登录抖音\n\n1. 打开电脑上的 Chrome 浏览器\n2. 访问 [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n3. 使用抖音账号登录\n4. 建议保持 Chrome 的运行状态\n\n**只需登录一次**，之后 AI 会自动继承你的登录状态。\n\n## target 参数选择(默认为host)\n\nOpenClaw Browser 工具支持不同的 `target` 参数，适用于不同场景：\n\n| target | 说明 | 适用场景 | 注意事项 |\n|--------|------|----------|----------|\n| `host` (默认)| 控制你电脑上的 Chrome | **推荐**：需要使用已有登录态 | 确保 Chrome 已登录抖音 |\n| `sandbox` | 独立的沙盒浏览器 | 隔离环境、保护隐私 | 无登录态，需要重新登录 |\n| `node` | 控制已连接的节点设备 | 远程控制手机/平板浏览器 | 需要先配对节点 |\n\n### profile 参数（仅 target=\"host\" 时有效）\n\n| profile | 说明 | 适用场景 | 注意事项 |\n|---------|------|----------|----------|\n| 不填（默认） | 使用 `openclaw` 隔离浏览器 | **推荐**：安全稳定 | 需手动登录一次 |\n| `user` | 附加到你真实的 Chrome 会话 | 需要使用已保存的 cookies | 需要在电脑前批准提示 |\n\n### 推荐配置\n\n**日常使用（推荐）：**\n```javascript\nbrowser(action=\"navigate\", target=\"host\", url=\"...\")\n```\n\n**隐私隔离：**\n```javascript\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"...\")\n```\n\n## 使用方法\n\n告诉 AI：「帮我上传视频到抖音」并提供：\n\n- 视频文件路径\n- 视频标题\n- 可见范围（公开/仅自己可见）\n\nAI 会自动完成全部流程。\n\n## 示例\n\n```\n用户: 帮我上传 ~/Videos/my_video.mp4 到抖音，标题是「汽车保养小技巧」，公开可见\n```\n\n## 工作流程\n\n```\n1. 打开抖音上传页面\n2. 关闭弹窗（如有）\n3. 上传视频文件\n4. 填写标题\n5. 设置可见范围\n6. 发布\n```\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 请确保 Chrome 已登录抖音创作者平台。AI 使用你 Chrome 的登录状态。\n\n**Q: 应该用 `target=\"host\"` 还是 `target=\"sandbox\"`？**\nA:\n- 用 `target=\"host\"`：需要使用已有登录态，AI 控制你电脑的 Chrome\n- 用 `target=\"sandbox\"`：需要隔离环境，不想暴露真实浏览器数据\n\n**Q: `profile=\"user\"` 和不填 profile 有什么区别？**\nA:\n- 不填 profile：使用 OpenClaw 的隔离浏览器，需手动登录一次抖音\n- `profile=\"user\"`：直接附加到你真实的 Chrome，会继承所有 cookies 和登录态，但需要你在电脑前\n\n**Q: 支持哪些视频格式？**\nA: 与抖音网页版支持格式相同，通常为 MP4、MOV 等常见格式。\n\n**Q: 可以设置定时发布吗？**\nA: 目前仅支持立即发布。\n\n## 相关链接\n\n- [OpenClaw 文档](https://docs.openclaw.ai)\n- [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn77yxyagmp3fjn6b7vj7htmph83kkmr\",\n  \"slug\": \"douyin-auto-publish\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1775767285665\n}\n\nArchive v1.0.1: 3 files, 4640 bytes\n\nFiles: README.md (4096b), SKILL.md (5878b), _meta.json (138b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: douyin-upload\ndescription: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台\n---\n\n# douyin-upload\n\n使用 OpenClaw Browser 工具自动上传视频到抖音创作者平台。\n\n## 前置要求\n\n- OpenClaw Gateway 已运行\n- 电脑已安装 Chrome 浏览器\n- **在 Chrome 中登录抖音账号**（只需一次，之后自动继承登录态）\n\n## 核心原则\n\n**只用 `target=\"host\"`，不要填 `profile` 参数。**\n\n- ✅ `target=\"host\"` - 继承 Chrome 登录态\n- ❌ `profile=\"user\"` - 需要开启 remote debugging，不稳定\n- ❌ `profile=\"chrome-relay\"` - HTTP 404\n- ❌ `target=\"sandbox\"` - 独立沙盒，无登录态\n\n## 工作流程\n\n### Step 1: 打开上传页面\n\n```javascript\nbrowser(action=\"navigate\", target=\"host\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n```\n\n### Step 2: 关闭弹窗\n\n如果页面出现弹窗，先关闭：\n\n```javascript\n// 1. 获取当前页面所有可交互元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 在返回结果中查找包含或匹配\"我知道了\"的按钮，拿到其 ref\n// 3. 点击该按钮\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n**关键：不要硬编码 ref！** 先 snapshot，再从结果中根据文字内容找到对应元素的 ref。\n\n### Step 4: 准备视频文件\n\n浏览器 tool 只能上传到 `/tmp/openclaw/uploads` 目录：\n\n```bash\nmkdir -p /tmp/openclaw/uploads\ncp <视频路径> /tmp/openclaw/uploads/\n```\n\n### Step 5: 点击上传按钮\n\n```javascript\n// 1. 获取上传页面的元素列表\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"上传视频\"文字的按钮，拿到 ref\n// 3. 点击上传按钮\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 6: 上传文件\n\n点击上传按钮后会弹出文件选择框：\n\n```javascript\n// 1. 先 snapshot 找到 Choose File 或文件输入/上传框的 ref\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 上传文件\nbrowser(action=\"upload\", target=\"host\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<找到的ref>\")\n```\n\n### Step 7: 等待视频解析\n\n页面自动跳转到发布编辑页，显示进度条\"0% 文件解析中，请稍等...\"，等待视频解析完成后继续。\n\n### Step 8: 填写标题\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找标题输入框（placeholder 包含或匹配\"标题\"或\"输入标题\"的输入框）\n// 3. 点击输入框并输入标题\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"type\", \"ref\": \"<找到的ref>\", \"text\": \"<用户提供的标题>\"})\n```\n\n### Step 9: 设置作品权限\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"公开\"\"好友可见\"\"仅自己可见\"或类似文字的单选框, 默认选择\"公开\"\n// 3. 点击选中\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 10: 发布\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"发布\"文字的按钮\n// 3. 点击发布\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n## 完整流程模板\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"host\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 关闭弹窗\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"我知道了\"按钮的 ref，然后点击\n\n// 3. 准备视频文件（需在 terminal 执行）\n// mkdir -p /tmp/openclaw/uploads && cp <path> /tmp/openclaw/uploads/\n\n// 4. 点击上传按钮\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"上传视频\"按钮的 ref，然后点击\n\n// 5. 上传文件\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找文件输入框的 ref，然后上传\nbrowser(action=\"upload\", target=\"host\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<ref>\")\n\n// 6. 等待解析后填写标题\nsleep 15\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找标题输入框的 ref，然后点击并输入\n\n// 7. 设置仅自己可见\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"仅自己可见\"选项的 ref，然后点击\n\n// 8. 发布\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"发布\"按钮的 ref，然后点击\n```\n\n## 重要提示\n\n1. **每次操作前都要先 snapshot** - ref 是动态的，每次快照都不同\n2. **从 snapshot 结果中根据文字内容查找 ref** - 不要硬编码\n3. **页面跳转后需要重新 snapshot** - 元素 ref 会失效\n4. **视频必须复制到 `/tmp/openclaw/uploads/`** - 浏览器 tool 的限制\n5. **当用户还需要未提及的操作时, 也是同样的方法匹配对应的ref, 然后找到匹配的选项**\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 请确保 Chrome 已登录抖音。使用 `target=\"host\"` 会自动继承 Chrome 的登录态。\n\n**Q: Element not found 错误？**\nA: 页面可能跳转了，需要重新执行 snapshot 获取最新元素。\n\n**Q: 为什么 ref 每次都不一样？**\nA: 抖音页面动态渲染，每次 snapshot 生成的 ref 不同。这是正常现象。\n\nFile v1.0.1:README.md\n\n# 抖音/Douyin 自动发上传+自动发布 skill\n\n- 无需依赖视觉模型: 直接通过 DOM 元素定位（snapshot + 文字匹配），无需截图分析，成本更低、速度更快、稳定性更高.\n- 完全模拟人类点击, 实现更安全.\n- 开箱即用! 自动上传视频并发布到抖音创作者平台。适用于 Openclaw, Claude Cowork 等AI Agent应用(内置Browser Tool或者Chrome中安装了插件的).\n- 该Skill不包含任何外部指令, 可放心使用. 同时也可以根据不同工作流/业务逻辑进行调整.\n\n## 安装 Skill\n\n### OpenClaw\n\n```bash\n# 将 skill 文件夹复制到 ~/.openclaw/skills/\n```\n\n### Claude Code / Claude CoWork (需要Claude for Chrome 插件)\n\n```bash\n# 将 skill 文件夹复制到 ~/.claude/skills/\n```\n\n### 其他 AI Agent 应用\n\nSkill 本质上是一个包含 `SKILL.md` 文件的文件夹。大多数 AI Agent 应用都支持以下目录结构：\n\n```\n~/.claude/skills/          # Claude Code/CoWork 全局\n~/.codex/skills/          # Codex 全局\n~/.openclaw/skills/       # OpenClaw 全局\n.agent/skills/            # 项目级 skill（多个应用通用）\n```\n\n## 准备工作（只需做一次）\n\n### 在 Chrome 登录抖音\n\n1. 打开电脑上的 Chrome 浏览器\n2. 访问 [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n3. 使用抖音账号登录\n4. 建议保持 Chrome 的运行状态\n\n**只需登录一次**，之后 AI 会自动继承你的登录状态。\n\n## target 参数选择(默认为host)\n\nOpenClaw Browser 工具支持不同的 `target` 参数，适用于不同场景：\n\n| target | 说明 | 适用场景 | 注意事项 |\n|--------|------|----------|----------|\n| `host` (默认)| 控制你电脑上的 Chrome | **推荐**：需要使用已有登录态 | 确保 Chrome 已登录抖音 |\n| `sandbox` | 独立的沙盒浏览器 | 隔离环境、保护隐私 | 无登录态，需要重新登录 |\n| `node` | 控制已连接的节点设备 | 远程控制手机/平板浏览器 | 需要先配对节点 |\n\n### profile 参数（仅 target=\"host\" 时有效）\n\n| profile | 说明 | 适用场景 | 注意事项 |\n|---------|------|----------|----------|\n| 不填（默认） | 使用 `openclaw` 隔离浏览器 | **推荐**：安全稳定 | 需手动登录一次 |\n| `user` | 附加到你真实的 Chrome 会话 | 需要使用已保存的 cookies | 需要在电脑前批准提示 |\n\n### 推荐配置\n\n**日常使用（推荐）：**\n```javascript\nbrowser(action=\"navigate\", target=\"host\", url=\"...\")\n```\n\n**隐私隔离：**\n```javascript\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"...\")\n```\n\n## 使用方法\n\n告诉 AI：「帮我上传视频到抖音」并提供：\n\n- 视频文件路径\n- 视频标题\n- 可见范围（公开/仅自己可见）\n\nAI 会自动完成全部流程。\n\n## 示例\n\n```\n用户: 帮我上传 ~/Videos/my_video.mp4 到抖音，标题是「汽车保养小技巧」，公开可见\n```\n\n## 工作流程\n\n```\n1. 打开抖音上传页面\n2. 关闭弹窗（如有）\n3. 上传视频文件\n4. 填写标题\n5. 设置可见范围\n6. 发布\n```\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\n\nA: 请确保 Chrome 已登录抖音创作者平台。AI 使用你 Chrome 的登录状态。\n\n**Q: 应该用 `target=\"host\"` 还是 `target=\"sandbox\"`？**\n\nA:\n- 用 `target=\"host\"`：需要使用已有登录态，AI 控制你电脑的 Chrome\n- 用 `target=\"sandbox\"`：需要隔离环境，不想暴露真实浏览器数据\n\n**Q: `profile=\"user\"` 和不填 profile 有什么区别？**\n\nA:\n- 不填 profile：使用 OpenClaw 的隔离浏览器，需手动登录一次抖音\n- `profile=\"user\"`：直接附加到你真实的 Chrome，会继承所有 cookies 和登录态，但需要你在电脑前\n\n**Q: 支持哪些视频格式？**\n\nA: 与抖音网页版支持格式相同，通常为 MP4、MOV 等常见格式。\n\n**Q: 可以设置定时发布吗？**\n\nA: 可以通过 Cron Job 等方式让AI Agent定时调用skill即可。\n\n## 相关链接\n\n- [OpenClaw 文档](https://docs.openclaw.ai)\n- [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn77yxyagmp3fjn6b7vj7htmph83kkmr\",\n  \"slug\": \"douyin-auto-publish\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1774456604752\n}\n\nArchive v1.0.0: 3 files, 4359 bytes\n\nFiles: README.md (3704b), SKILL.md (5878b), _meta.json (138b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: douyin-upload\ndescription: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台\n---\n\n# douyin-upload\n\n使用 OpenClaw Browser 工具自动上传视频到抖音创作者平台。\n\n## 前置要求\n\n- OpenClaw Gateway 已运行\n- 电脑已安装 Chrome 浏览器\n- **在 Chrome 中登录抖音账号**（只需一次，之后自动继承登录态）\n\n## 核心原则\n\n**只用 `target=\"host\"`，不要填 `profile` 参数。**\n\n- ✅ `target=\"host\"` - 继承 Chrome 登录态\n- ❌ `profile=\"user\"` - 需要开启 remote debugging，不稳定\n- ❌ `profile=\"chrome-relay\"` - HTTP 404\n- ❌ `target=\"sandbox\"` - 独立沙盒，无登录态\n\n## 工作流程\n\n### Step 1: 打开上传页面\n\n```javascript\nbrowser(action=\"navigate\", target=\"host\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n```\n\n### Step 2: 关闭弹窗\n\n如果页面出现弹窗，先关闭：\n\n```javascript\n// 1. 获取当前页面所有可交互元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 在返回结果中查找包含或匹配\"我知道了\"的按钮，拿到其 ref\n// 3. 点击该按钮\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n**关键：不要硬编码 ref！** 先 snapshot，再从结果中根据文字内容找到对应元素的 ref。\n\n### Step 4: 准备视频文件\n\n浏览器 tool 只能上传到 `/tmp/openclaw/uploads` 目录：\n\n```bash\nmkdir -p /tmp/openclaw/uploads\ncp <视频路径> /tmp/openclaw/uploads/\n```\n\n### Step 5: 点击上传按钮\n\n```javascript\n// 1. 获取上传页面的元素列表\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"上传视频\"文字的按钮，拿到 ref\n// 3. 点击上传按钮\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 6: 上传文件\n\n点击上传按钮后会弹出文件选择框：\n\n```javascript\n// 1. 先 snapshot 找到 Choose File 或文件输入/上传框的 ref\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 上传文件\nbrowser(action=\"upload\", target=\"host\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<找到的ref>\")\n```\n\n### Step 7: 等待视频解析\n\n页面自动跳转到发布编辑页，显示进度条\"0% 文件解析中，请稍等...\"，等待视频解析完成后继续。\n\n### Step 8: 填写标题\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找标题输入框（placeholder 包含或匹配\"标题\"或\"输入标题\"的输入框）\n// 3. 点击输入框并输入标题\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"type\", \"ref\": \"<找到的ref>\", \"text\": \"<用户提供的标题>\"})\n```\n\n### Step 9: 设置作品权限\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"公开\"\"好友可见\"\"仅自己可见\"或类似文字的单选框, 默认选择\"公开\"\n// 3. 点击选中\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 10: 发布\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"发布\"文字的按钮\n// 3. 点击发布\nbrowser(action=\"act\", target=\"host\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n成功标志：页面显示「共 X 个作品」「已发布」状态。\n\n## 完整流程模板\n\n```javascript\n// 1. 打开上传页面\nbrowser(action=\"navigate\", target=\"host\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n\n// 2. 关闭弹窗\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"我知道了\"按钮的 ref，然后点击\n\n// 3. 准备视频文件（需在 terminal 执行）\n// mkdir -p /tmp/openclaw/uploads && cp <path> /tmp/openclaw/uploads/\n\n// 4. 点击上传按钮\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"上传视频\"按钮的 ref，然后点击\n\n// 5. 上传文件\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找文件输入框的 ref，然后上传\nbrowser(action=\"upload\", target=\"host\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<ref>\")\n\n// 6. 等待解析后填写标题\nsleep 15\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找标题输入框的 ref，然后点击并输入\n\n// 7. 设置仅自己可见\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"仅自己可见\"选项的 ref，然后点击\n\n// 8. 发布\nbrowser(action=\"snapshot\", target=\"host\", compact=true, depth=2)\n// → 从结果中找\"发布\"按钮的 ref，然后点击\n```\n\n## 重要提示\n\n1. **每次操作前都要先 snapshot** - ref 是动态的，每次快照都不同\n2. **从 snapshot 结果中根据文字内容查找 ref** - 不要硬编码\n3. **页面跳转后需要重新 snapshot** - 元素 ref 会失效\n4. **视频必须复制到 `/tmp/openclaw/uploads/`** - 浏览器 tool 的限制\n5. **当用户还需要未提及的操作时, 也是同样的方法匹配对应的ref, 然后找到匹配的选项**\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 请确保 Chrome 已登录抖音。使用 `target=\"host\"` 会自动继承 Chrome 的登录态。\n\n**Q: Element not found 错误？**\nA: 页面可能跳转了，需要重新执行 snapshot 获取最新元素。\n\n**Q: 为什么 ref 每次都不一样？**\nA: 抖音页面动态渲染，每次 snapshot 生成的 ref 不同。这是正常现象。\n\nFile v1.0.0:README.md\n\n# douyin-upload\n\n自动上传视频到抖音创作者平台。\n\n## 安装 Skill\n\n### OpenClaw\n\n```bash\n# 方式一：使用 ClawHub CLI 安装\nclawhub install douyin-upload\n\n# 方式二：手动安装\n# 将 skill 文件夹复制到 ~/.openclaw/skills/\n```\n\n### Claude Code / Claude CoWork\n\n```bash\n# 将 skill 文件夹复制到 ~/.claude/skills/\n```\n\n### Codex\n\n```bash\n# 将 skill 文件夹复制到 ~/.codex/skills/\n```\n\n### 其他 AI Agent 应用\n\nSkill 本质上是一个包含 `SKILL.md` 文件的文件夹。大多数 AI Agent 应用都支持以下目录结构：\n\n```\n~/.claude/skills/          # Claude Code/CoWork 全局\n~/.codex/skills/          # Codex 全局\n~/.openclaw/skills/       # OpenClaw 全局\n.agent/skills/            # 项目级 skill（多个应用通用）\n```\n\n## 准备工作（只需做一次）\n\n### 在 Chrome 登录抖音\n\n1. 打开电脑上的 Chrome 浏览器\n2. 访问 [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n3. 使用抖音账号登录\n4. 建议保持 Chrome 的运行状态\n\n**只需登录一次**，之后 AI 会自动继承你的登录状态。\n\n## target 参数选择(默认为host)\n\nOpenClaw Browser 工具支持不同的 `target` 参数，适用于不同场景：\n\n| target | 说明 | 适用场景 | 注意事项 |\n|--------|------|----------|----------|\n| `host` (默认)| 控制你电脑上的 Chrome | **推荐**：需要使用已有登录态 | 确保 Chrome 已登录抖音 |\n| `sandbox` | 独立的沙盒浏览器 | 隔离环境、保护隐私 | 无登录态，需要重新登录 |\n| `node` | 控制已连接的节点设备 | 远程控制手机/平板浏览器 | 需要先配对节点 |\n\n### profile 参数（仅 target=\"host\" 时有效）\n\n| profile | 说明 | 适用场景 | 注意事项 |\n|---------|------|----------|----------|\n| 不填（默认） | 使用 `openclaw` 隔离浏览器 | **推荐**：安全稳定 | 需手动登录一次 |\n| `user` | 附加到你真实的 Chrome 会话 | 需要使用已保存的 cookies | 需要在电脑前批准提示 |\n\n### 推荐配置\n\n**日常使用（推荐）：**\n```javascript\nbrowser(action=\"navigate\", target=\"host\", url=\"...\")\n```\n\n**隐私隔离：**\n```javascript\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"...\")\n```\n\n## 使用方法\n\n告诉 AI：「帮我上传视频到抖音」并提供：\n\n- 视频文件路径\n- 视频标题\n- 可见范围（公开/仅自己可见）\n\nAI 会自动完成全部流程。\n\n## 示例\n\n```\n用户: 帮我上传 ~/Videos/my_video.mp4 到抖音，标题是「汽车保养小技巧」，公开可见\n```\n\n## 工作流程\n\n```\n1. 打开抖音上传页面\n2. 关闭弹窗（如有）\n3. 上传视频文件\n4. 填写标题\n5. 设置可见范围\n6. 发布\n```\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 请确保 Chrome 已登录抖音创作者平台。AI 使用你 Chrome 的登录状态。\n\n**Q: 应该用 `target=\"host\"` 还是 `target=\"sandbox\"`？**\nA:\n- 用 `target=\"host\"`：需要使用已有登录态，AI 控制你电脑的 Chrome\n- 用 `target=\"sandbox\"`：需要隔离环境，不想暴露真实浏览器数据\n\n**Q: `profile=\"user\"` 和不填 profile 有什么区别？**\nA:\n- 不填 profile：使用 OpenClaw 的隔离浏览器，需手动登录一次抖音\n- `profile=\"user\"`：直接附加到你真实的 Chrome，会继承所有 cookies 和登录态，但需要你在电脑前\n\n**Q: 支持哪些视频格式？**\nA: 与抖音网页版支持格式相同，通常为 MP4、MOV 等常见格式。\n\n**Q: 可以设置定时发布吗？**\nA: 目前仅支持立即发布。\n\n## 相关链接\n\n- [OpenClaw 文档](https://docs.openclaw.ai)\n- [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn77yxyagmp3fjn6b7vj7htmph83kkmr\",\n  \"slug\": \"douyin-auto-publish\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1774456447249\n}","readmeExcerpt":"Skill: Douyin Auto Publish 抖音自动上传发布 Owner: l1angjy Summary: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台 Tags: latest:2.2.7 Version history: v2.2.7 | 2026-05-04T00:27:49.336Z | user **所有版本用户请注意：本次强制要求每次均需手动确认发布，移除自动发布功能。** - 现在每次发布前，必须向用户展示视频信息并获得明确确认后才能发布，不能跳过确认。 - 移除了 require_confirmation/自动发布偏好配置说明与流程，整个流程只支持人工确认后发布。 - 保留可见范围（公开/好友/仅自己可见）偏好，自动选择但每次都需确认。 - 工作流程和常见问题部分同步收紧为仅支持人工确认后发布的流程和说明。 - 其它功能保持不变；安全和隔离机","codeSnippets":[],"executableExamples":[{"language":"javascript","snippet":"browser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")"},{"language":"javascript","snippet":"// 1. 获取当前页面所有可交互元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 在返回结果中查找包含或匹配\"我知道了\"的按钮，拿到其 ref\n// 3. 点击该按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})"},{"language":"bash","snippet":"mkdir -p /tmp/openclaw/uploads\ncp <视频路径> /tmp/openclaw/uploads/"},{"language":"javascript","snippet":"// 1. 获取上传页面的元素列表\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"上传视频\"文字的按钮，拿到 ref\n// 3. 点击上传按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})"},{"language":"javascript","snippet":"// 1. 先 snapshot 找到 Choose File 或文件输入/上传框的 ref\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 上传文件\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<找到的ref>\")"},{"language":"javascript","snippet":"// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找标题输入框（placeholder 包含或匹配\"标题\"或\"输入标题\"的输入框）\n// 3. 点击输入框并输入标题\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"type\", \"ref\": \"<找到的ref>\", \"text\": \"<用户提供的标题>\"})"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: douyin-upload\ndescription: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台\n---\n\n# douyin-upload\n\n使用 OpenClaw Browser 工具自动上传视频到抖音创作者平台。\n\n## ⚠️ 重要声明\n\n**本 Skill 的使用条件：**\n\n1. **主动请求触发**：本 Skill 只会在用户主动请求的情况下才会使用，例如：\n   - 用户直接要求 Agent 使用此 Skill 上传视频\n   - 用户在预先配置好的 cron job 中执行此 Skill\n\n2. **需要用户主动提供信息**：使用本 Skill 时，需要用户主动提供以下信息：\n   - 视频文件路径（如 `~/Videos/my_video.mp4`）\n   - 视频标题（如「汽车保养小技巧」）\n   - 作品可见范围（公开/好友可见/仅自己可见）\n   - 其他可能需要的信息\n\n3. **强制用户确认**：每次发布前，必须向用户展示视频信息并获得明确确认后才能发布，**不支持跳过确认**。\n\n## 前置要求\n\n- OpenClaw Gateway 已运行\n- 电脑已安装 Chrome 浏览器\n- **首次使用需要在弹出的浏览器窗口中登录抖音账号**（只需一次，之后自动复用登录态）\n\n## 核心原则\n\n**⚠️ 安全说明：**\n\n本 skill 使用独立的命名 profile（`douyin-profile`），与你的真实 Chrome 浏览器完全隔离。只需在首次使用时登录抖音一次，之后登录态自动复用。AI 不会访问你的真实 Chrome 数据。\n\n**配置选项：**\n\n- ✅ `profile=\"douyin-profile\"` + `target=\"host\"` - 使用独立的命名 profile，登录态持久化，与 Chrome 隔离（推荐）\n- ✅ `target=\"sandbox\"` - 独立沙盒环境，每次需要重新登录，最安全但不便捷\n- ❌ `profile=\"user\"` - 直接附加到真实 Chrome，会继承所有 cookies 和登录态，不推荐\n- ❌ 不填 profile - 使用默认隔离浏览器，行为可能不稳定\n\n**推荐配置：使用 `profile=\"douyin-profile\"` 配合 `target=\"host\"`。**\n\n## 工作流程\n\n### Step 1: 打开上传页面\n\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"https://creator.douyin.com/creator-micro/content/upload\")\n```\n\n### Step 2: 关闭弹窗\n\n如果页面出现弹窗，先关闭：\n\n```javascript\n// 1. 获取当前页面所有可交互元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 在返回结果中查找包含或匹配\"我知道了\"的按钮，拿到其 ref\n// 3. 点击该按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n**关键：不要硬编码 ref！** 先 snapshot，再从结果中根据文字内容找到对应元素的 ref。\n\n### Step 4: 准备视频文件\n\n浏览器 tool 只能上传到 `/tmp/openclaw/uploads` 目录：\n\n```bash\nmkdir -p /tmp/openclaw/uploads\ncp <视频路径> /tmp/openclaw/uploads/\n```\n\n### Step 5: 点击上传按钮\n\n```javascript\n// 1. 获取上传页面的元素列表\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找包含或匹配\"上传视频\"文字的按钮，拿到 ref\n// 3. 点击上传按钮\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\n```\n\n### Step 6: 上传文件\n\n点击上传按钮后会弹出文件选择框：\n\n```javascript\n// 1. 先 snapshot 找到 Choose File 或文件输入/上传框的 ref\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 上传文件\nbrowser(action=\"upload\", target=\"host\", profile=\"douyin-profile\", paths=[\"/tmp/openclaw/uploads/<文件名>\"], ref=\"<找到的ref>\")\n```\n\n### Step 7: 等待视频解析\n\n页面自动跳转到发布编辑页，显示进度条\"0% 文件解析中，请稍等...\"，等待视频解析完成后继续。\n\n### Step 8: 填写标题\n\n```javascript\n// 1. 获取当前页面元素\nbrowser(action=\"snapshot\", target=\"host\", profile=\"douyin-profile\", compact=true, depth=2)\n\n// 2. 查找标题输入框（placeholder 包含或匹配\"标题\"或\"输入标题\"的输入框）\n// 3. 点击输入框并输入标题\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"click\", \"ref\": \"<找到的ref>\"})\nbrowser(action=\"act\", target=\"host\", profile=\"douyin-profile\", request={\"kind\": \"type\", \"ref\": \"<找到的ref>\", \"text\": \"<用户提供的标题>\"})\n```\n\n### Step 9: 设置作品权限\n\n```bash\n# 读取已保存的可见范围偏好\ncat ~/.openclaw/skills/douyin-auto-publish/config.json\n```\n\n**如果 `default_"},{"path":"README.md","content":"# douyin-upload\n\n自动上传视频到抖音创作者平台。\n\n## ⚠️ 重要声明\n\n**本 Skill 的使用条件：**\n\n1. **主动请求触发**：本 Skill 只会在用户主动请求的情况下才会使用，例如：\n   - 用户直接要求 Agent 使用此 Skill 上传视频\n   - 用户在预先配置好的 cron job 中执行此 Skill\n\n2. **需要用户主动提供信息**：使用本 Skill 时，需要用户主动提供以下信息：\n   - 视频文件路径（如 `~/Videos/my_video.mp4`）\n   - 视频标题（如「汽车保养小技巧」）\n   - 作品可见范围（公开/好友可见/仅自己可见）\n   - 其他可能需要的信息\n\n3. **强制用户确认**：每次发布前，必须向用户展示视频信息并获得明确确认后才能发布，**不支持跳过确认**。\n\n## 安装 Skill\n\n### 从 ClawHub 安装（推荐）\n\n```bash\n# 1. 登录 ClawHub（浏览器认证）\nclawhub login\n\n# 2. 安装 skill\nopenclaw skills install douyin-auto-publish\n```\n\n> ClawHub 地址: https://clawhub.com\n\n### 手动安装\n\n```bash\n# 将 skill 文件夹复制到 ~/.openclaw/skills/\n```\n\n## 准备工作（只需做一次）\n\n### 首次登录抖音\n\n1. 首次使用时会自动弹出 douyin-profile 浏览器窗口\n2. 在该窗口中访问 [抖音创作者平台](https://creator.douyin.com/creator-micro/home)\n3. 使用抖音账号登录（扫描二维码或账号密码）\n4. 建议保持登录状态\n\n**只需登录一次**，之后 AI 会自动复用你的登录状态。\n\n## ⚠️ 安全警告\n\n**使用此 Skill 前请注意：**\n\n1. **独立 Profile**：`profile=\"douyin-profile\"` 使用独立的命名浏览器 profile，与你的真实 Chrome 浏览器完全隔离\n\n2. **强制确认**：每次发布前都会展示视频信息并需要你明确确认，不支持跳过确认。\n\n3. **隔离建议**：如果你对账号安全有较高要求，建议使用 `target=\"sandbox\"` 模式，它会创建完全独立的浏览器环境\n\n## target 参数选择(默认为host)\n\nOpenClaw Browser 工具支持不同的 `target` 参数，适用于不同场景：\n\n| target | 说明 | 适用场景 | 注意事项 |\n|--------|------|----------|----------|\n| `host` | 控制本地浏览器，配合 profile 使用 | **推荐**：配合 douyin-profile 使用 | 确保使用 `profile=\"douyin-profile\"` |\n| `sandbox` | 独立的沙盒浏览器 | 隔离环境、保护隐私 | 无登录态，每次需重新登录 |\n| `node` | 控制已连接的节点设备 | 远程控制手机/平板浏览器 | 需要先配对节点 |\n\n### profile 参数（仅 target=\"host\" 时有效）\n\n| profile | 说明 | 适用场景 | 注意事项 |\n|---------|------|----------|----------|\n| `douyin-profile` | 独立的命名 profile | **推荐**：登录态持久化，与 Chrome 隔离 | 首次使用需登录一次 |\n| 不填 | 使用默认隔离浏览器 | 行为可能不稳定 | 需手动登录一次 |\n| `user` | 附加到你真实的 Chrome 会话 | 需要使用已保存的 cookies | 不推荐，会继承所有登录态 |\n\n### 推荐配置\n\n**日常使用（推荐）：**\n```javascript\nbrowser(action=\"navigate\", target=\"host\", profile=\"douyin-profile\", url=\"...\")\n```\n\n**隐私隔离：**\n```javascript\nbrowser(action=\"navigate\", target=\"sandbox\", url=\"...\")\n```\n\n## 使用方法\n\n告诉 AI：「帮我上传视频到抖音」并提供：\n\n- 视频文件路径\n- 视频标题\n- 可见范围（公开/好友可见/仅自己可见）\n\nAI 会自动完成全部流程。**在发布前，AI 会要求你确认视频信息，请回复「是」确认发布。**\n\n## 示例\n\n```\n用户: 帮我上传 ~/Videos/my_video.mp4 到抖音，标题是「汽车保养小技巧」，公开可见\n```\n\n## 工作流程\n\n```\n1. 打开抖音上传页面\n2. 关闭弹窗（如有）\n3. 上传视频文件\n4. 填写标题\n5. 设置可见范围（首次运行时询问默认偏好，之后使用保存的值）\n6. 【确认发布】展示视频信息并等待用户确认\"是\"\n7. 发布\n```\n\n## 常见问题\n\n**Q: 为什么提示需要登录？**\nA: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号（扫描二维码）。只需登录一次，之后会自动复用。\n\n**Q: 应该用 `target=\"host\"` 还是 `target=\"sandbox\"`？**\nA:\n- 用 `target=\"host\"`：需要使用已有登录态，AI 使用独立的 douyin-profile 浏览器\n- 用 `target=\"sandbox\"`：需要完全隔离环境，每次都需要重新登录\n\n**Q: douyin-profile 与真实 Chrome 有什么区别？**\nA:\n- douyin-profile：独立的命名 profile，与真实 Chrome 完全隔离，登录态持久化\n- `profile=\"user\"`：直接附加到真实 Chrome，会继承所有 cookies 和登录态（不推荐）\n\n**Q: `profile=\"user\"` 和不填 profile 有什么区别？**\nA:\n- 不填 profile：使用 OpenClaw 的隔离浏览器，需手动登录一次抖音\n- `profile=\"user\"`：直接附加到你真实的 Chrome，会继承所有 cookies 和登录态，但需要你在电脑前\n\n**Q: 支持哪些视频格式？**\nA: 与抖音网页版支持格式相同，通常为 MP4、MOV 等常见格式。\n\n**Q: 可以设置定时发布吗？**\nA: 目前仅支持立即发布。\n\n**Q: 可以关闭发布前确认吗？**\nA: 不可以。为了保障账号安全，每次发布前都会展示视频信息并需要您明确确认，不支持跳过确认。\n\n**Q: 如何修改默认的可见范围？**\nA: 首次运行时会询问您默认的可见范围偏好。如需修改，可删除 `~/.openclaw/skills/douyin-auto-p"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn77yxyagmp3fjn6b7vj7htmph83kkmr\",\n  \"slug\": \"douyin-auto-publish\",\n  \"version\": \"2.2.7\",\n  \"publishedAt\": 1777854469336\n}"},{"path":"skill-card.md","content":"## Description:\n\nHelps an OpenClaw agent upload and publish videos to the Douyin Creator Platform after the user provides the file path, title, visibility, and explicit pre-publication confirmation.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[l1angjy](https://clawhub.ai/user/l1angjy)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal creators and operators use this skill to guide an agent through uploading a local video to Douyin, filling in title and visibility settings, and publishing only after explicit confirmation.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can publish through a logged-in Douyin creator account.\n\nMitigation: Require the agent to show the file name, title, and visibility and obtain explicit user confirmation before every publish.\n\nRisk: A persistent browser profile can retain account access between sessions.\n\nMitigation: Use the sandbox browser target when stronger isolation is needed, accepting that the user may need to log in each time.\n\nRisk: Unsafe file-staging instructions may be risky for unusual or untrusted file paths.\n\nMitigation: Use only trusted local video paths and verify the staged file before upload.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/l1angjy/skills/douyin-auto-publish)\n- [OpenClaw documentation](https://docs.openclaw.ai)\n- [Douyin Creator Platform](https://creator.douyin.com/creator-micro/home)\n- [Douyin upload page](https://creator.douyin.com/creator-micro/content/upload)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with browser-tool actions and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires user-provided video path, title, visibility selection, and explicit confirmation before publishing.]\n\n## Skill Version(s):\n\n2.2.7 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."},{"path":"config.json","content":"{}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台 Skill: Douyin Auto Publish 抖音自动上传发布 Owner: l1angjy Summary: 抖音创作者平台视频上传发布。触发条件：用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台 Tags: latest:2.2.7 Version history: v2.2.7 | 2026-05-04T00:27:49.336Z | user **所有版本用户请注意：本次强制要求每次均需手动确认发布，移除自动发布功能。** - 现在每次发布前，必须向用户展示视频信息并获得明确确认后才能发布，不能跳过确认。 - 移除了 require_confirmation/自动发布偏好配置说明与流程，整个流程只支持人工确认后发布。 - 保留可见范围（公开/好友/仅自己可见）偏好，自动选择但每次都需确认。 - 工作流程和常见问题部分同步收紧为仅支持人工确认后发布的流程和说明。 - 其它功能保持不变；安全和隔离机","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":921,"uniquenessScore":50,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T04:21:19.088Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T04:21:19.088Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T04:43:45.566Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}