商城首页欢迎来到中国正版软件门户

您的位置:首页 >如何用Python脚本批量上传本地视频到流媒体平台

如何用Python脚本批量上传本地视频到流媒体平台

  发布于2026-05-03 阅读(0)

扫一扫,手机访问

如何用Python脚本批量上传本地视频到流媒体平台

如何用Python脚本批量上传本地视频到流媒体平台

开门见山,先说一个核心结论:Python本身并没有提供一种“开箱即用”的能力,让你能直接对接YouTube、Bilibili或Twitch这类主流流媒体平台的上传接口。要实现自动化上传,唯一的路径就是调用各个平台自己那套官方API,并且手动处理好认证、文件分片、状态轮询等一系列逻辑。换句话说,不存在一个通用的万能脚本,只有针对不同平台“量身定制”的具体实现。

YouTube Data API v3 上传视频需先完成 OAuth2 授权

想往YouTube传视频?事情没那么简单,它可不接受一个简单的POST文件请求。整个流程必须走标准的OAuth2授权,先拿到那个有时效性的access_token(通常只有3600秒)。对于需要无人值守运行的本地脚本来说,这就意味着你必须把凭证持久化保存,并设置好自动刷新机制,否则脚本跑一半就可能因为令牌过期而中断。

  • 库的选择很重要:推荐使用google-auth-oauthlib配合google-api-python-client。注意,别再用那些已经废弃的旧版googleapiclient认证模块了。
  • 授权流程有讲究:你的upload.py脚本在第一次运行时,会弹开浏览器让你完成授权,然后生成一个token.json文件。后续运行虽然可以复用这个文件,但一定要记得捕获可能出现的RefreshError,并准备好重新走一遍授权流程。
  • 上传方式必须选对:上传时务必使用“可恢复上传”模式(通过MediaFileUpload(resumable=True)设置)。这是硬性要求,否则超过5MB的视频文件基本都会直接上传失败。
  • 元数据不能遗漏:标题、描述、分类这些信息需要组装成一个字典,传入body参数。尤其要注意privacyStatus这个字段,你必须明确地把它设为"public""private""unlisted"中的一个,平台没有默认值给你。

Bilibili API 需模拟登录 + 上传分片 + 合并提交

B站的情况又有所不同。它没有提供官方文档化的上传API,所以目前主流的做法是模拟其网页端的行为。整个过程可以拆解为三步:先用账号密码或Cookie登录,获取关键的bili_jctSESSDATA;然后调用/x/vup/upload系列接口进行文件分片上传;最后,必须再调用/x/vup/upload/submit来提交稿件,整个流程才算完成。

  • 请求构造不能想当然:你不能简单地用requests.post(..., files={...})。必须严格按照B站的要求,构造包含chunkchunksmd5等特定字段的multipart表单数据。
  • 请求头里藏玄机:每个分片请求的头部,都必须携带一个X-Bili-Upload-Data字段,其值是经过Base64编码的JSON元数据。漏掉它,等待你的很可能就是一个412 Precondition Failed错误。
  • 提交步骤是关键:所有分片上传成功后,千万别忘了调用提交接口。你需要把全部分片的upload_id以及视频的titledesctag等信息传过去,否则视频只会躺在后台,不会出现在你的稿件列表里。
  • 反爬策略要应对:基本的反爬措施必须到位,请求头里务必包含合理的User-Agent,并将Referer设置为https://member.bilibili.com/,不然412403状态码随时可能找上门。

上传大文件时容易卡在“连接重置”或“超时”,根本原因是平台限制

上传大文件时,脚本动不动就卡住,提示连接重置或超时?这背后的根本原因,其实是平台自身的限制。例如,YouTube默认的单次上传超时大约是15分钟,而B站的分片上传超时则在5分钟左右。Python的requests库默认不设置超时(timeout=None),看起来“安全”,实则可能导致进程无限期挂起。

这里有个小提示:可以搜索“Python免费学习笔记(深入)”来系统学习相关知识。

  • 超时设置是必修课:务必为requests请求设置timeout=(30, 300)(连接超时30秒,读取超时5分钟)。并且在捕获到TimeoutConnectionError异常后,应该重试当前失败的分片,而不是傻傻地重新上传整个文件。
  • 利用好断点续传:YouTube的可恢复上传支持断点续传,你可以从响应头里的location URL继续PUT数据,无需重复已成功的部分。B站同理,某个分片失败,只需重传那个特定的chunk,复用之前的upload_id即可。
  • 内存管理要警惕:千万不要用open(file, "rb").read()这种方式把整个视频文件一次性读进内存。一个1GB的文件就足以吃光大量内存。正确的做法是使用open(file, "rb")获取文件对象,让requests库以流式方式发送数据。

说到底,真正的难点往往不在于那几行核心的上传代码怎么写,而在于每个平台那些琐碎却又至关重要的“边界条件”:比如YouTube每次上传操作会消耗1600单位的配额(quota),B站新账号首日可能有上传条数限制,Twitch的video ingest endpoint是动态分配的……这些细节如果不仔细查阅平台文档、不认真分析实际的响应头和错误码,那么你的脚本很可能跑十次,就得崩八次。

本文转载于:https://www.php.cn/faq/2314327.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注