Communitygithub.com

zaddy99999/youtube-publish

从终端安全地将完成的视频或 Shorts 上传到 YouTube。在用户希望授权 YouTube 频道、上传一个或多个带标题、描述和标签的视频、安排发布时间或确保批次不会重复发布时使用。默认为私密上传并保留上传记录。

youtube-publish 是什么?

该技能是一个无需 SDK 依赖(使用纯 `fetch` 和可恢复分块上传)的 YouTube Data API v3 上传工具,专为批量上传设计。默认情况下上传内容为私密,并使用 sha256 记录防止重复发布,支持元数据检查、模拟运行和配额感知。它适用于 Claude Code、Cursor、Codex 等 AI 代理平台,帮助用户将录制好的视频或 Shorts 安全地上传到 YouTube。工作流程包括通过 `dry-run` 模拟验证元数据和配额消耗,然后执行上传,并提供灵活的 JSON 作业配置。关键安全措施包括:使用 OAuth 客户端 ID 和 PKCE 流程进行一次性授权,从不记录或暴露令牌和客户端密钥,以及通过上传记录确保不会重复发布。该技能还能处理配额限制(默认每天 10,000 单位,每次上传约 1,600 单位),并在超过配额时优雅停止,剩余任务可后续继续。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/zaddy99999/video-editing-skills/tree/main/skills/youtube-publish

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

youtube-publish 是做什么的?

YouTube Data API v3 上传器,无 SDK 依赖(使用纯 fetch,支持可恢复分块上传)。专为批量上传设计:默认私密上传,使用 sha256 记录防止重复发布,支持元数据检查、模拟运行和配额感知。

一次性设置(由用户完成,而非代理)

  1. Google Cloud Console:创建一个项目,启用 YouTube Data API v3,创建一个类型为 桌面应用 的 OAuth 客户端 ID。
  2. 将客户端提供给脚本,但不提交: export YOUTUBE_CLIENT_ID=... YOUTUBE_CLIENT_SECRET=...(或将下载的 JSON 文件放在仓库外部,并通过 --client-secrets 参数指定)。
  3. 一次性授权频道:
    node scripts/auth.mjs --token-file .youtube-token.json
    
    打开同意页面,在 127.0.0.1 上捕获重定向(PKCE + state 检查),以模式 600 存储刷新令牌。令牌永远不会被打印。

工作流程

# 1. 模拟运行:验证元数据,对文件进行哈希,显示跳过/上传计划以及配额成本
node scripts/upload.mjs --jobs jobs.json --dry-run

# 2. 上传(默认为私密)
node scripts/upload.mjs --jobs jobs.json --token-file .youtube-token.json

# 单个文件
node scripts/upload.mjs --file publish/short.mp4 --title "如何自动化我的编辑" --tags shorts,自动化 --privacy unlisted

jobs.json:

[
  { "file": "publish/short-01.mp4", "title": "...", "description": "...", "tags": ["shorts"], "privacy": "private" },
  { "file": "publish/short-02.mp4", "title": "...", "privacy": "private", "publishAt": "2026-11-01T17:00:00Z" }
]

相对 file 路径根据作业文件所在的文件夹解析。

规则

  • 只上传已通过 render-qc 且经用户批准的文件。
  • 默认隐私设置为 private。除非用户明确要求并且你传递了 --allow-public 参数,否则拒绝 public。计划发布的视频(publishAt)必须为 private;YouTube 会在计划时间将其转为公开。
  • 始终先进行 --dry-run 并向用户显示计划。
  • 绝不打印、记录或提交令牌、客户端密钥、.env* 文件或记录。仓库的 .gitignore 已经涵盖了 *token*.json、*credentials*.json、*client_secret*.json、.env* 和 *ledger*.json。
  • 记录(.youtube-upload-ledger.json)是已发布内容的权威来源。每次上传后都会保存它。不要删除它以“重试”;仅在用户确实想要第二个副本时使用 --force-duplicate。
  • 配额:默认情况下,一个项目每天获得 10,000 单位,历史上一次上传消耗 1,600 单位(约每天 6 次上传)。--max-uploads(默认为 6)可防止一次运行消耗完配额;--units-per-upload 可在 Google 更改成本时调整估算值。遇到 quotaExceeded 时,运行会停止,剩余作业可在第二天重新运行(记录会跳过已完成的作业)。
  • 标题:不能有占位符(TODO、untitled、{{...}}),最多 100 个字符,不能包含 < 或 >。标签总长度最多 500 个字符。lint 会强制执行这些规则。
  • 未经验证的 API 项目可能会强制上传为私密,直到 Google 审计应用;如果每次上传都返回私密状态,请告知用户。

验证

每个结果都有一个 videoId(当视频仍为私密时,可以打开 https://youtu.be/<id>)或一个 skipped 原因。node scripts/upload.mjs --check-auth 在不进行上传的情况下测试凭据。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能