|
|
12 小時之前 | |
|---|---|---|
| .. | ||
| __pycache__ | 12 小時之前 | |
| platforms | 12 小時之前 | |
| utils | 15 小時之前 | |
| README.md | 12 小時之前 | |
| app.py | 12 小時之前 | |
| requirements.txt | 15 小時之前 | |
基于 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 目录
cd server\python
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
.\venv\Scripts\Activate.ps1
# 如果遇到执行策略问题,先运行:
# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
cd server\python
python -m venv venv
venv\Scripts\activate.bat
cd server/python
# 创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 确保已激活虚拟环境
pip install -r requirements.txt
# 安装 Playwright 浏览器
playwright install chromium
# 如果在 Linux 服务器上,还需要安装系统依赖
playwright install-deps chromium
# 默认启动(headless 模式,端口 5005)
python app.py
# 指定端口
python app.py --port 8080
# 显示浏览器窗口(调试用)
python app.py --headless false
# 调试模式
python app.py --debug
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": "时间戳"
}
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": "下一页游标"
}
如需添加新平台,请按以下步骤:
platforms/ 目录创建新文件,如 bilibili.pyBasePublisher 基类publish 方法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 服务中设置环境变量:
# .env 文件
PYTHON_PUBLISH_SERVICE_URL=http://localhost:5005
pm2 start app.py --name "publish-service" --interpreter python
pm2 logs publish-service
pm2 startup && pm2 save
[program:publish-service]
directory=/path/to/server/python
command=/path/to/venv/bin/python app.py
autostart=true
autorestart=true
environment=HEADLESS="true"
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"]
视频号使用 Chromium 可能出现 H264 编码错误,已在代码中配置使用 Chrome:
browser = await playwright.chromium.launch(headless=self.headless, channel="chrome")
pip install xhs -i https://pypi.tuna.tsinghua.edu.cn/simple
支持两种格式:
// JSON 数组格式
[
{"name": "sessionid", "value": "xxx", "domain": ".douyin.com"},
{"name": "token", "value": "xxx", "domain": ".douyin.com"}
]
// 字符串格式
"sessionid=xxx; token=xxx"
MIT