批量上传发布视频的软件,小红书抖音快手哔哩哔哩,自动发布上传作品工具【python】

简介: 这个项目包含完整的视频批量上传功能,支持多个平台,包含视频处理、配置管理和错误处理等功能

下载地址:https://www.pan38.com/yun/share.php?code=JCnzE 提取密码:h7789

这个项目包含完整的视频批量上传功能,支持多个平台,包含视频处理、配置管理和错误处理等功能。使用时需要安装moviepy、requests、pyyaml等依赖库。

import os
import time
from platforms import (
XiaohongshuUploader,
DouyinUploader,
KuaishouUploader,
BilibiliUploader
)
from video_processor import VideoProcessor
from config_loader import load_config

def batch_upload_videos(config_path):

# 加载配置文件
config = load_config(config_path)

# 初始化视频处理器
processor = VideoProcessor(
    max_duration=config['video']['max_duration'],
    watermark_path=config['video']['watermark']
)

# 初始化各平台上传器
platforms = {
    'xiaohongshu': XiaohongshuUploader(config['xiaohongshu']),
    'douyin': DouyinUploader(config['douyin']),
    'kuaishou': KuaishouUploader(config['kuaishou']),
    'bilibili': BilibiliUploader(config['bilibili'])
}

# 处理视频目录
video_dir = config['video']['source_dir']
for video_file in os.listdir(video_dir):
    if video_file.endswith(('.mp4', '.mov', '.avi')):
        video_path = os.path.join(video_dir, video_file)

        # 处理视频
        processed_path = processor.process(video_path)

        # 上传到各平台
        for platform_name, uploader in platforms.items():
            if config['platforms'][platform_name]['enable']:
                try:
                    print(f"开始上传 {video_file} 到 {platform_name}")
                    uploader.upload(
                        video_path=processed_path,
                        title=config['video']['title_template'].format(
                            filename=os.path.splitext(video_file)[0]
                        ),
                        description=config['video']['description_template'],
                        tags=config['video']['tags']
                    )
                    print(f"{video_file} 上传到 {platform_name} 成功")
                    time.sleep(config['platforms'][platform_name]['interval'])
                except Exception as e:
                    print(f"上传到 {platform_name} 失败: {str(e)}")

print("所有视频上传完成")

if name == "main":
batch_upload_videos("config.yaml")

import requests
import json
from abc import ABC, abstractmethod

class BaseUploader(ABC):
def init(self, config):
self.config = config
self.session = requests.Session()
self._login()

@abstractmethod
def _login(self):
    pass

@abstractmethod
def upload(self, video_path, title, description, tags):
    pass

class XiaohongshuUploader(BaseUploader):
def _login(self):
login_url = "https://edith.xiaohongshu.com/api/sns/web/user/login"
payload = {
"mobile": self.config['username'],
"password": self.config['password'],
"deviceId": self.config['device_id']
}
response = self.session.post(login_url, json=payload)
if response.status_code != 200:
raise Exception("小红书登录失败")
self.cookies = response.cookies

def upload(self, video_path, title, description, tags):
    # 获取上传凭证
    token_url = "https://edith.xiaohongshu.com/api/sns/web/upload/token"
    token_resp = self.session.get(token_url, cookies=self.cookies)
    upload_token = token_resp.json()['data']['token']

    # 上传视频
    upload_url = "https://upload.xiaohongshu.com/api/media/upload"
    headers = {
        "Authorization": f"Bearer {upload_token}",
        "Content-Type": "multipart/form-data"
    }
    with open(video_path, 'rb') as f:
        files = {'file': (os.path.basename(video_path), f)}
        upload_resp = self.session.post(upload_url, headers=headers, files=files)

    if upload_resp.status_code != 200:
        raise Exception("视频上传失败")

    video_id = upload_resp.json()['data']['id']

    # 发布视频
    publish_url = "https://edith.xiaohongshu.com/api/sns/web/post/create"
    payload = {
        "type": "video",
        "title": title,
        "description": description,
        "tags": tags,
        "video_id": video_id,
        "visibility": self.config['visibility']
    }
    publish_resp = self.session.post(publish_url, json=payload, cookies=self.cookies)

    if publish_resp.status_code != 200:
        raise Exception("视频发布失败")

    return publish_resp.json()

class DouyinUploader(BaseUploader):

# 类似实现,省略部分代码...
pass

class KuaishouUploader(BaseUploader):

# 类似实现,省略部分代码...
pass

class BilibiliUploader(BaseUploader):

# 类似实现,省略部分代码...
pass

os
import subprocess
from moviepy.editor import VideoFileClip

class VideoProcessor:
def init(self, max_duration=300, watermark_path=None):
self.max_duration = max_duration
self.watermark_path = watermark_path

def process(self, video_path):
    # 检查视频时长
    clip = VideoFileClip(video_path)
    if clip.duration > self.max_duration:
        clip = clip.subclip(0, self.max_duration)

    # 添加水印
    if self.watermark_path and os.path.exists(self.watermark_path):
        watermark = (VideoFileClip(self.watermark_path)
                    .set_duration(clip.duration)
                    .resize(height=50)
                    .set_position(("right", "bottom")))
        clip = CompositeVideoClip([clip, watermark])

    # 保存处理后的视频
    output_path = os.path.join(
        os.path.dirname(video_path),
        "processed_" + os.path.basename(video_path)
    )
    clip.write_videofile(output_path, codec="libx264", audio_codec="aac")

    return output_path

def compress_video(self, input_path, output_path, crf=28):
    cmd = [
        'ffmpeg',
        '-i', input_path,
        '-vcodec', 'libx264',
        '-crf', str(crf),
        '-preset', 'fast',
        '-acodec', 'copy',
        output_path
    ]
    subprocess.run(cmd, check=True)
    return output_path

import yaml
from pathlib import Path

def load_config(config_path):
with open(config_path, 'r', encoding='utf-8') as f:
config = yaml.safe_load(f)

# 验证必要配置项
required_keys = [
    'video.source_dir',
    'video.title_template',
    'platforms.xiaohongshu.enable',
    'platforms.douyin.enable',
    'platforms.kuaishou.enable',
    'platforms.bilibili.enable'
]

for key in required_keys:
    keys = key.split('.')
    current = config
    for k in keys:
        if k not in current:
            raise ValueError(f"缺少必要配置项: {key}")
        current = current[k]

return config
相关文章
|
26天前
|
存储 缓存 测试技术
理解Python装饰器:简化代码的强大工具
理解Python装饰器:简化代码的强大工具
|
2月前
|
程序员 测试技术 开发者
Python装饰器:简化代码的强大工具
Python装饰器:简化代码的强大工具
158 92
|
14天前
|
机器学习/深度学习 编解码 Python
Python图片上采样工具 - RealESRGANer
Real-ESRGAN基于深度学习实现图像超分辨率放大,有效改善传统PIL缩放的模糊问题。支持多种模型版本,推荐使用魔搭社区提供的预训练模型,适用于将小图高质量放大至大图,放大倍率越低效果越佳。
|
2月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
437 1
|
24天前
|
算法 安全 数据安全/隐私保护
Python随机数函数全解析:5个核心工具的实战指南
Python的random模块不仅包含基础的随机数生成函数,还提供了如randint()、choice()、shuffle()和sample()等实用工具,适用于游戏开发、密码学、统计模拟等多个领域。本文深入解析这些函数的用法、底层原理及最佳实践,帮助开发者高效利用随机数,提升代码质量与安全性。
121 0
|
2月前
|
API 数据安全/隐私保护 Python
拼多多批量上架软件, 电商一键上货发布工具,python电商框架分享
多线程批量上传架构,支持并发处理商品数据 完整的拼多多API签名和token管理机制
|
2月前
|
安全 API 数据安全/隐私保护
|
2月前
|
Java API 数据安全/隐私保护
淘宝一键上货发布软件,淘宝批量发布上架工具, 淘宝批量上架脚本【python】
这个Python脚本实现了以下功能: 完整的淘宝API调用封装
|
2月前
|
Java API 数据处理
淘宝批量上架软件脚本,电商一键上货软件, 淘宝一键铺货软件【python】
核心功能:实现淘宝商品批量上传,包含登录认证、商品数据处理、图片处理和API调用 多线程处理
|
人工智能 Python
Python工具:将文件夹下的视频按照帧数输出图片文件(含代码)
Python工具:将文件夹下的视频按照帧数输出图片文件(含代码)
218 0

推荐镜像

更多