Ethanfly a3ce30620a Implement new API endpoints for fetching works and comments 12 시간 전
..
__pycache__ a3ce30620a Implement new API endpoints for fetching works and comments 12 시간 전
platforms a3ce30620a Implement new API endpoints for fetching works and comments 12 시간 전
utils 6a167646a2 fix 15 시간 전
README.md a3ce30620a Implement new API endpoints for fetching works and comments 12 시간 전
app.py a3ce30620a Implement new API endpoints for fetching works and comments 12 시간 전
requirements.txt 6a167646a2 fix 15 시간 전

README.md

多平台视频发布服务

基于 matrix 项目,使用 Python + Playwright 实现多平台视频发布功能。

支持平台

平台 模块 发布方式 说明
抖音 platforms/douyin.py Playwright 浏览器自动化
小红书 platforms/xiaohongshu.py API + Playwright 优先使用 xhs SDK,更稳定
视频号 platforms/weixin.py Playwright 需要 Chrome 浏览器
快手 platforms/kuaishou.py Playwright 浏览器自动化

项目结构

server/python/
├── app.py                  # Flask 统一入口
├── requirements.txt        # 依赖文件
├── README.md              # 说明文档
├── platforms/             # 平台发布模块
│   ├── __init__.py        # 模块入口
│   ├── base.py            # 发布器基类
│   ├── douyin.py          # 抖音发布器
│   ├── xiaohongshu.py     # 小红书发布器
│   ├── weixin.py          # 视频号发布器
│   └── kuaishou.py        # 快手发布器
└── utils/                 # 工具模块
    ├── __init__.py
    └── helpers.py         # 工具函数

环境要求

  • Python 3.8 或更高版本
  • Windows 10+, macOS 12+, 或 Linux (Ubuntu 20.04+)

安装步骤

1. 创建虚拟环境

Windows (PowerShell)

# 进入 python 目录
cd server\python

# 创建虚拟环境
python -m venv venv

# 激活虚拟环境
.\venv\Scripts\Activate.ps1

# 如果遇到执行策略问题,先运行:
# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Windows (CMD)

cd server\python
python -m venv venv
venv\Scripts\activate.bat

Linux / macOS

cd server/python

# 创建虚拟环境
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate

2. 安装依赖

# 确保已激活虚拟环境
pip install -r requirements.txt

# 安装 Playwright 浏览器
playwright install chromium

# 如果在 Linux 服务器上,还需要安装系统依赖
playwright install-deps chromium

3. 启动服务

# 默认启动(headless 模式,端口 5005)
python app.py

# 指定端口
python app.py --port 8080

# 显示浏览器窗口(调试用)
python app.py --headless false

# 调试模式
python app.py --debug

API 接口

健康检查

GET /health

响应:
{
  "status": "ok",
  "xhs_sdk": true,
  "supported_platforms": ["douyin", "xiaohongshu", "weixin", "kuaishou"],
  "headless_mode": true
}

发布视频

POST /publish
Content-Type: application/json

{
  "platform": "douyin",              // douyin | xiaohongshu | weixin | kuaishou
  "cookie": "cookie字符串或JSON数组",
  "title": "视频标题",
  "description": "视频描述(可选)",
  "video_path": "E:/videos/test.mp4", // 视频绝对路径
  "cover_path": "E:/images/cover.jpg", // 封面绝对路径(可选)
  "tags": ["话题1", "话题2"],
  "post_time": "2024-01-20 12:00:00",  // 定时发布(可选)
  "location": "重庆市"                   // 位置(可选)
}

响应:
{
  "success": true,
  "platform": "douyin",
  "video_id": "xxx",
  "video_url": "xxx",
  "message": "发布成功"
}

批量发布(多平台)

POST /publish/batch
Content-Type: application/json

{
  "platforms": ["douyin", "xiaohongshu"],
  "cookies": {
    "douyin": "cookie字符串",
    "xiaohongshu": "cookie字符串"
  },
  "title": "视频标题",
  "video_path": "E:/videos/test.mp4",
  "tags": ["话题1", "话题2"]
}

响应:
{
  "success": true,
  "total": 2,
  "success_count": 2,
  "fail_count": 0,
  "results": [
    {"platform": "douyin", "success": true, "message": "发布成功"},
    {"platform": "xiaohongshu", "success": true, "message": "发布成功"}
  ]
}

小红书签名

POST /sign
Content-Type: application/json

{
  "uri": "API路径",
  "data": "请求数据",
  "a1": "a1 cookie",
  "web_session": "web_session cookie"
}

响应:
{
  "x-s": "签名值",
  "x-t": "时间戳"
}

检查 Cookie

POST /check_cookie
Content-Type: application/json

{
  "platform": "xiaohongshu",
  "cookie": "cookie字符串"
}

响应:
{
  "valid": true,
  "user_info": {
    "user_id": "xxx",
    "nickname": "昵称",
    "avatar": "头像URL"
  }
}

获取作品列表

POST /works
Content-Type: application/json

{
  "platform": "douyin",           // douyin | xiaohongshu | kuaishou | weixin
  "cookie": "cookie字符串或JSON",
  "page": 0,                      // 页码(从0开始,可选,默认0)
  "page_size": 20                 // 每页数量(可选,默认20)
}

响应:
{
  "success": true,
  "platform": "douyin",
  "works": [
    {
      "work_id": "作品ID",
      "title": "作品标题",
      "cover_url": "封面URL",
      "video_url": "视频URL",
      "duration": 60,
      "status": "published",      // published | reviewing | rejected | draft
      "publish_time": "2024-01-20 12:00:00",
      "play_count": 1000,
      "like_count": 100,
      "comment_count": 50,
      "share_count": 20,
      "collect_count": 10
    }
  ],
  "total": 100,
  "has_more": true
}

获取作品评论

POST /comments
Content-Type: application/json

{
  "platform": "douyin",           // douyin | xiaohongshu | kuaishou | weixin
  "cookie": "cookie字符串或JSON",
  "work_id": "作品ID",
  "cursor": ""                    // 分页游标(可选,用于翻页)
}

响应:
{
  "success": true,
  "platform": "douyin",
  "work_id": "作品ID",
  "comments": [
    {
      "comment_id": "评论ID",
      "work_id": "作品ID",
      "content": "评论内容",
      "author_id": "作者ID",
      "author_name": "作者昵称",
      "author_avatar": "作者头像",
      "like_count": 10,
      "reply_count": 5,
      "create_time": "2024-01-20 12:00:00",
      "is_author": false,
      "replies": [
        {
          "comment_id": "子评论ID",
          "content": "回复内容",
          ...
        }
      ]
    }
  ],
  "total": 50,
  "has_more": true,
  "cursor": "下一页游标"
}

扩展新平台

如需添加新平台,请按以下步骤:

  1. platforms/ 目录创建新文件,如 bilibili.py
  2. 继承 BasePublisher 基类
  3. 实现 publish 方法
  4. platforms/__init__.py 中注册

示例:

# platforms/bilibili.py
from .base import BasePublisher, PublishParams, PublishResult

class BilibiliPublisher(BasePublisher):
    platform_name = "bilibili"
    login_url = "https://account.bilibili.com/"
    publish_url = "https://member.bilibili.com/platform/upload/video/frame"
    cookie_domain = ".bilibili.com"
    
    async def publish(self, cookies: str, params: PublishParams) -> PublishResult:
        # 实现发布逻辑
        ...
# platforms/__init__.py 添加
from .bilibili import BilibiliPublisher

PLATFORM_MAP = {
    ...
    'bilibili': BilibiliPublisher,
}

与 Node.js 服务集成

在 Node.js 服务中设置环境变量:

# .env 文件
PYTHON_PUBLISH_SERVICE_URL=http://localhost:5005

部署建议

PM2 管理

pm2 start app.py --name "publish-service" --interpreter python
pm2 logs publish-service
pm2 startup && pm2 save

Supervisor (Linux)

[program:publish-service]
directory=/path/to/server/python
command=/path/to/venv/bin/python app.py
autostart=true
autorestart=true
environment=HEADLESS="true"

Docker

FROM python:3.11-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
RUN playwright install chromium && playwright install-deps chromium

COPY . .
EXPOSE 5005
CMD ["python", "app.py"]

常见问题

视频号需要 Chrome 浏览器

视频号使用 Chromium 可能出现 H264 编码错误,已在代码中配置使用 Chrome:

browser = await playwright.chromium.launch(headless=self.headless, channel="chrome")

小红书 SDK 安装

pip install xhs -i https://pypi.tuna.tsinghua.edu.cn/simple

Cookie 格式

支持两种格式:

// JSON 数组格式
[
  {"name": "sessionid", "value": "xxx", "domain": ".douyin.com"},
  {"name": "token", "value": "xxx", "domain": ".douyin.com"}
]

// 字符串格式
"sessionid=xxx; token=xxx"

参考项目

  • matrix - 视频矩阵内容分发系统
  • xhs - 小红书 Python SDK

License

MIT