批量上传发布视频的软件,小红书抖音快手哔哩哔哩,自动发布上传作品工具【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装饰器:简化代码的强大工具
151 92
|
29天前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
329 1
|
1月前
|
API 数据安全/隐私保护 Python
拼多多批量上架软件, 电商一键上货发布工具,python电商框架分享
多线程批量上传架构,支持并发处理商品数据 完整的拼多多API签名和token管理机制
|
6月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
3月前
|
Python
Python编程基石:整型、浮点、字符串与布尔值完全解读
本文介绍了Python中的四种基本数据类型:整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。整型表示无大小限制的整数,支持各类运算;浮点型遵循IEEE 754标准,需注意精度问题;字符串是不可变序列,支持多种操作与方法;布尔型仅有True和False两个值,可与其他类型转换。掌握这些类型及其转换规则是Python编程的基础。
212 33
|
2月前
|
数据采集 分布式计算 大数据
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
87 1
|
3月前
|
设计模式 安全 Python
Python编程精进:正则表达式
正则表达式是一种强大的文本处理工具,用于搜索、匹配和提取模式。本文介绍了正则表达式的语法基础,如`\d`、`\w`等符号,并通过实例展示其在匹配电子邮件、验证电话号码、处理日期格式等场景中的应用。同时,文章提醒用户注意性能、编码、安全性等问题,避免常见错误,如特殊字符转义不当、量词使用错误等。掌握正则表达式能显著提升文本处理效率,但需结合实际需求谨慎设计模式。
135 2
|
4月前
|
数据采集 安全 BI
用Python编程基础提升工作效率
一、文件处理整明白了,少加两小时班 (敲暖气管子)领导让整理100个Excel表?手都干抽筋儿了?Python就跟铲雪车似的,哗哗给你整利索!
115 11
|
6月前
|
人工智能 Java 数据安全/隐私保护
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
187 28
|
6月前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。

热门文章

最新文章

推荐镜像

更多