Ethanfly a3ce30620a Implement new API endpoints for fetching works and comments 12 horas atrás
..
__pycache__ a3ce30620a Implement new API endpoints for fetching works and comments 12 horas atrás
platforms a3ce30620a Implement new API endpoints for fetching works and comments 12 horas atrás
utils 6a167646a2 fix 15 horas atrás
README.md a3ce30620a Implement new API endpoints for fetching works and comments 12 horas atrás
app.py a3ce30620a Implement new API endpoints for fetching works and comments 12 horas atrás
requirements.txt 6a167646a2 fix 15 horas atrás

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