Skill: hitjcl/social-video-publish (version 2.0.0)

--- name: hitjcl-social-video-publish description: | 多平台视频图文发布助手 — 支持抖音、快手、B站、小红书、微信视频号五大平台同步发布图文和视频内容。 触发场景："一键发布到小红书、抖音、快手、B站、视频号"、"帮我同步发多个平台"、"多平台发布视频"、"发布视频到抖音"等。 ⚠️ 本 skill 需要用户协助操作浏览器登录，所有发布操作均在用户本地浏览器中完成，不会自动登录或存储任何账户凭证。 keywords: - "视频发布" - "多平台发布" - "抖音发布" - "小红书发布" - "快手发布" - "B站发布" - "视频号发布" - "一键发布" - "同步发布" - "video publish" - "multi-platform" metadata: openclaw: emoji: "🎬" --- # 多平台视频图文发布助手 > **⚠️ 安全提示**：本 Skill 需要用户协助操作浏览器登录。所有发布操作均在用户本地浏览器中完成，不会自动登录或存储任何账户凭证。用户需自行承担账户操作责任。 ## 功能说明 帮助用户在多个视频平台（抖音、快手、B站、小红书、微信视频号）发布视频和图文内容。 **重要限制**： - 本 Skill 提供操作指导，实际浏览器自动化需要用户授权 - **不会自动登录任何账户** - 不会绕过任何平台的安全机制 - 用户需已在浏览器中手动登录目标平台 ## 触发条件 当用户说： - "帮我发布视频到[平台]" - "把视频发到抖音/快手/B站" - "多平台发布视频" - "一键发布到小红书、抖音、快手、B站、视频号" - "同步发多个平台" - 类似多平台视频发布需求 ## 使用前提 - 用户已在浏览器中手动登录目标平台 - 用户准备好要发布的视频文件 - 用户了解各平台的发布规则 ## 技术实现 本 Skill 使用 `xbrowser` skill 进行浏览器自动化。 ## 安全措施 - **用户授权**：每次浏览器操作都需要用户确认 - 会话隔离：使用用户自己的浏览器配置，不创建新会话 - 无凭证存储：不记录或存储任何登录信息 - 透明操作：所有操作步骤对用户可见 ## 工作流程 1. 用户请求发布视频 2. Agent 确认目标平台和视频文件 3. Agent 使用 xbrowser skill 打开目标平台（使用用户已登录的浏览器） 4. 引导用户完成发布流程（或自动化，需用户确认） ## 支持的平台 | 平台 | 说明 | |------|------| | 抖音 | 需要 PC 端创作者平台 | | 快手 | 支持 PC 端发布 | | B站 | 支持批量上传 | | 小红书 | 需要通过创作者平台 | | 微信视频号 | 需要微信扫码登录 | ## 安全最佳实践 - 使用测试账号先验证功能 - 不要在主力账号上直接测试 - 定期检查账户活动记录 - 发现异常立即停止使用并检查账户 --- 来源：https://clawhub.ai/hitjcl/social-publish

path: README.md
content: # 多平台视频图文发布助手

> **⚠️ 安全提示**：本 Skill 需要用户协助操作浏览器登录，所有发布操作均在用户本地浏览器中完成，不会自动登录或存储任何账户凭证。

## 功能说明

帮助用户在多个视频平台（抖音、快手、B站、小红书、微信视频号）发布视频和图文内容。

**重要限制**：
- 本 Skill 提供操作指导，实际浏览器自动化需要用户授权
- **不会自动登录任何账户**
- 不会绕过任何平台的安全机制
- 用户需已在浏览器中手动登录目标平台

## 触发条件

当用户说：
- "帮我发布视频到[平台]"
- "把视频发到抖音/快手/B站"
- "多平台发布视频"
- "一键发布到小红书、抖音、快手、B站、视频号"
- "同步发多个平台"
- 类似多平台视频发布需求

## 使用前提

- 用户已在浏览器中手动登录目标平台
- 用户准备好要发布的视频文件
- 用户了解各平台的发布规则

## 技术实现

本 Skill 使用 `xbrowser` skill 进行浏览器自动化。

## 安全措施

- **用户授权**：每次浏览器操作都需要用户确认
- 会话隔离：使用用户自己的浏览器配置，不创建新会话
- 无凭证存储：不记录或存储任何登录信息
- 透明操作：所有操作步骤对用户可见

## 工作流程

1. 用户请求发布视频
2. Agent 确认目标平台和视频文件
3. Agent 使用 xbrowser skill 打开目标平台（使用用户已登录的浏览器）
4. 引导用户完成发布流程（或自动化，需用户确认）

## 支持的平台

| 平台 | 说明 |
|------|------|
| 抖音 | 需要 PC 端创作者平台 |
| 快手 | 支持 PC 端发布 |
| B站 | 支持批量上传 |
| 小红书 | 需要通过创作者平台 |
| 微信视频号 | 需要微信扫码登录 |

## 安全最佳实践

- 使用测试账号先验证功能
- 不要在主力账号上直接测试
- 定期检查账户活动记录
- 发现异常立即停止使用并检查账户

---

来源：https://clawhub.ai/hitjcl/social-publish

path: scripts/platform_helper.py
content: #!/usr/bin/env python3
"""
多平台视频发布 - 平台配置和辅助函数

包含五大平台的发布URL、标签和建议配置
"""

# 平台配置字典
PLATFORM_CONFIGS = {
    'douyin': {
        'name': '抖音',
        'publish_url': 'https://creator.douyin.com/creator/micro/upload',
        'tags': ['抖音', '短视频', '创作', '生活', '分享'],
        'desc': '字节跳动旗下短视频平台，支持15分钟以内视频',
        'max_duration': 900,  # 15分钟
        'max_size': 4096,     # 4GB
        'aspect_ratio': '9:16, 16:9, 1:1',
    },
    'kuaishou': {
        'name': '快手',
        'publish_url': 'https://cp.kuaishou.com/profile',
        'tags': ['快手', '短视频', '记录生活', '真实'],
        'desc': '快手短视频平台，支持最长10分钟视频',
        'max_duration': 600,  # 10分钟
        'max_size': 2048,     # 2GB
        'aspect_ratio': '9:16, 16:9, 1:1, 4:3',
    },
    'bilibili': {
        'name': 'B站（哔哩哔哩）',
        'publish_url': 'https://member.bilibili.com/v/publish/spaces',
        'tags': ['bilibili', 'B站', '视频', '创作', 'UP主'],
        'desc': '国内知名视频社区，支持最长4小时视频，支持批量上传',
        'max_duration': 14400,  # 4小时
        'max_size': 4096,        # 4GB
        'aspect_ratio': '16:9, 4:3, 1:1',
    },
    'xiaohongshu': {
        'name': '小红书',
        'publish_url': 'https://creator.xiaohongshu.com/creator/post/create',
        'tags': ['小红书', '笔记', '种草', '分享', '生活方式'],
        'desc': '生活方式分享平台，支持图文和视频笔记',
        'max_duration': 300,  # 5分钟
        'max_size': 1024,     # 1GB
        'aspect_ratio': '9:16, 3:4, 1:1, 4:3',
    },
    'video': {
        'name': '微信视频号',
        'publish_url': 'https://channels.weixin.qq.com/login',
        'tags': ['视频号', '微信', '短视频', '朋友圈'],
        'desc': '微信视频号，需要微信扫码登录',
        'max_duration': 600,  # 10分钟
        'max_size': 1024,     # 1GB
        'aspect_ratio': '6:7, 16:9, 1:1',
    },
}


def get_publish_url(platform: str) -> str:
    """获取平台的发布页面URL"""
    config = PLATFORM_CONFIGS.get(platform, {})
    return config.get('publish_url', '')


def get_platform_name(platform: str) -> str:
    """获取平台显示名称"""
    config = PLATFORM_CONFIGS.get(platform, {})
    return config.get('name', platform)


def validate_video(video_path: str, platform: str) -> tuple[bool, str]:
    """
    验证视频是否符合平台要求
    
    Args:
        video_path: 视频文件路径
        platform: 平台标识符
    
    Returns:
        (是否有效, 错误信息或提示)
    """
    import os
    from pathlib import Path
    
    path = Path(video_path)
    
    # 检查文件是否存在
    if not path.exists():
        return False, f"视频文件不存在: {video_path}"
    
    # 获取文件信息
    size_mb = path.stat().st_size / (1024 * 1024)
    
    config = PLATFORM_CONFIGS.get(platform, {})
    max_size = config.get('max_size', 1024)  # 默认1GB
    
    if size_mb > max_size:
        return False, f"视频文件过大: {size_mb:.2f}MB，超过平台限制 {max_size}MB"
    
    return True, f"视频符合{config.get('name', platform)}要求"


def get_recommended_tags(platform: str, content_type: str = 'general') -> list:
    """
    获取平台推荐标签
    
    Args:
        platform: 平台标识符
        content_type: 内容类型 (general, vlog, tutorial, entertainment)
    
    Returns:
        推荐的标签列表
    """
    base_tags = PLATFORM_CONFIGS.get(platform, {}).get('tags', [])
    
    type_tags = {
        'vlog': ['vlog', '日常', '记录'],
        'tutorial': ['教程', '教学', '技巧', '干货'],
        'entertainment': ['搞笑', '娱乐', '有趣'],
        'general': []
    }
    
    return base_tags + type_tags.get(content_type, [])


def format_publish_info(platform: str, title: str, desc: str, tags: list) -> dict:
    """
    格式化发布信息
    
    Returns:
        包含发布信息的字典
    """
    config = PLATFORM_CONFIGS.get(platform, {})
    
    return {
        'platform': platform,
        'platform_name': config.get('name', platform),
        'title': title or '',
        'description': desc or '',
        'tags': tags or [],
        'publish_url': config.get('publish_url', ''),
        'restrictions': {
            'max_duration': config.get('max_duration', 0),
            'max_size': config.get('max_size', 0),
            'aspect_ratio': config.get('aspect_ratio', ''),
        }
    }


# 测试代码
if __name__ == '__main__':
    print("🧪 平台配置测试")
    print("=" * 50)
    
    for platform, config in PLATFORM_CONFIGS.items():
        print(f"\n{config['name']} ({platform}):")
        print(f"  发布URL: {config['publish_url']}")
        print(f"  说明: {config['desc']}")
        print(f"  标签: {', '.join(config['tags'])}")
        print(f"  最大时长: {config['max_duration']}秒")
        print(f"  最大文件: {config['max_size']}MB")
    
    print("\n" + "=" * 50)
    print("✅ 测试完成")

path: scripts/video-publish.py
content: #!/usr/bin/env python3
"""
多平台视频图文发布助手 - 主脚本
支持抖音、快手、B站、小红书、微信视频号五大平台

⚠️ 安全声明：
- 本脚本仅在用户明确授权时操作
- 所有操作都在用户本地浏览器中进行
- 不会自动登录或存储任何账户凭证
"""

import os
import sys
import json
import argparse
from pathlib import Path

# 尝试导入平台助手
try:
    from platform_helper import PLATFORM_CONFIGS, get_publish_url, validate_video
except ImportError:
    print("❌ 错误：找不到 platform_helper.py，请确保在同一目录下")
    sys.exit(1)


def parse_args():
    parser = argparse.ArgumentParser(description='多平台视频图文发布助手')
    parser.add_argument('--platform', '-p', nargs='+', 
                        choices=['douyin', 'kuaishou', 'bilibili', 'xiaohongshu', 'video'],
                        help='目标平台列表')
    parser.add_argument('--video', '-v', type=str, required=True,
                        help='视频文件路径')
    parser.add_argument('--title', '-t', type=str, default='',
                        help='视频标题')
    parser.add_argument('--desc', '-d', type=str, default='',
                        help='视频描述')
    parser.add_argument('--tags', '-g', nargs='*', default=[],
                        help='标签列表')
    parser.add_argument('--auto', '-a', action='store_true',
                        help='自动模式（需要浏览器已登录）')
    return parser.parse_args()


def check_video_file(video_path: str) -> tuple[bool, str]:
    """检查视频文件"""
    path = Path(video_path)
    
    if not path.exists():
        return False, f"视频文件不存在: {video_path}"
    
    if not path.is_file():
        return False, f"路径不是文件: {video_path}"
    
    # 检查文件大小
    size_mb = path.stat().st_size / (1024 * 1024)
    if size_mb < 0.1:
        return False, f"视频文件太小: {size_mb:.2f}MB"
    
    # 检查扩展名
    valid_exts = ['.mp4', '.mov', '.avi', '.mkv', '.flv', '.wmv']
    if path.suffix.lower() not in valid_exts:
        return False, f"不支持的视频格式: {path.suffix}，支持: {', '.join(valid_exts)}"
    
    return True, f"视频文件正常，大小: {size_mb:.2f}MB"


def print_platform_guide(platform: str):
    """打印平台发布指导"""
    config = PLATFORM_CONFIGS.get(platform, {})
    publish_url = config.get('publish_url', '')
    
    print(f"\n📤 发布到 {config.get('name', platform)}")
    print(f"   说明: {config.get('desc', '')}")
    if publish_url:
        print(f"   发布地址: {publish_url}")
    print(f"   标签: {', '.join(config.get('tags', []))}")


def generate_browser_commands(platform: str, video_path: str, title: str, desc: str, tags: list):
    """生成浏览器自动化命令（用于 xbrowser skill）"""
    config = PLATFORM_CONFIGS.get(platform, {})
    publish_url = config.get('publish_url', '')
    
    commands = []
    
    if publish_url:
        commands.append(f'open {publish_url}')
        commands.append('wait --load networkidle')
        commands.append('snapshot -i')
    
    # 生成说明文本
    guide = f"""
【{config.get('name', platform)} 发布步骤】
1. 点击"上传视频"按钮
2. 选择视频文件: {video_path}
3. 填写标题: {title}
4. 填写描述: {desc}
5. 添加标签: {', '.join(tags) if tags else '无'}
6. 设置封面（可选）
7. 检查平台特有选项
8. 点击发布
"""
    return commands, guide


def main():
    args = parse_args()
    
    print("🎬 多平台视频图文发布助手 v2.0.0")
    print("=" * 50)
    
    # 检查视频文件
    valid, msg = check_video_file(args.video)
    if not valid:
        print(f"❌ {msg}")
        sys.exit(1)
    print(f"✅ {msg}")
    
    # 确定目标平台
    platforms = args.platform or ['douyin']
    
    print(f"\n📋 目标平台: {', '.join(p for p in platforms)}")
    print(f"📝 标题: {args.title or '（未设置）'}")
    print(f"📖 描述: {args.desc or '（未设置）'}")
    print(f"🏷️  标签: {', '.join(args.tags) if args.tags else '（未设置）'}")
    
    # 生成各平台发布指导
    for platform in platforms:
        print_platform_guide(platform)
        
        if args.auto:
            cmds, guide = generate_browser_commands(platform, args.video, args.title, args.desc, args.tags)
            print(f"   浏览器命令: {cmds}")
            print(guide)
    
    print("\n" + "=" * 50)
    print("💡 提示：")
    print("   1. 请确保已在浏览器中登录目标平台账号")
    print("   2. 使用 --auto 参数可启用自动化模式")
    print("   3. 查看 --help 获取更多选项")
    print("\n⚠️  安全提示：所有操作都在本地浏览器完成，不会上传您的凭证")


if __name__ == '__main__':
    main()

Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)