Python无开箱即用流媒体上传能力,需按平台定制:YouTube须OAuth2认证、分块上传并设privacyStatus;Bilibili需模拟登录、分片上传并提交,注意反爬与超时处理。

直接说结论:Python 本身不提供对接主流流媒体平台(如 YouTube、Bilibili、Twitch)上传接口的“开箱即用”能力,必须调用各平台官方 API,并手动处理认证、分片、状态轮询等逻辑——没有通用脚本,只有按平台定制的实现。
YouTube Data API v3 上传视频需先完成 OAuth2 授权
YouTube 不接受简单 POST 文件,必须走 oauth2 流程获取 access_token,且该 token 有有效期(通常 3600 秒),刷新需 refresh_token。本地脚本若无人值守运行,必须持久化并自动刷新凭证。
- 使用
google-auth-oauthlib+google-api-python-client,别用已废弃的googleapiclient旧版 auth 模块 -
upload.py第一次运行会打开浏览器授权,生成token.json;后续复用该文件,但要捕获RefreshError并重走流程 - 上传必须用
resumable upload方式(通过MediaFileUpload(resumable=True)),否则大于 5MB 的视频会直接失败 - metadata(标题、描述、分类等)需拼成 dict 传入
body参数,privacyStatus必须显式设为"public"、"private"或"unlisted",缺省值不存在
Bilibili API 需模拟登录 + 上传分片 + 合并提交
Bilibili 官方无公开文档化的上传 API,主流做法是复用其网页端行为:先用账号密码或 cookie 登录获取 bili_jct 和 SESSDATA,再调用 /x/vup/upload 系列接口分片上传,最后 /x/vup/upload/submit 提交稿件。
- 不能直接发
requests.post(..., files={...}),必须按 Bilibili 要求的分片格式(chunk、chunks、md5等字段)构造 multipart 表单 - 每个分片需带
headers["X-Bili-Upload-Data"](base64 编码的 JSON 元数据),漏掉就返回412 Precondition Failed - 上传完成后必须调用
/x/vup/upload/submit,传入所有分片upload_id和视频信息(title、desc、tag),否则视频不会出现在个人稿件中 - 注意反爬:请求头必须含
User-Agent、Referer: https://member.bilibili.com/,否则412或403
上传大文件时容易卡在“连接重置”或“超时”,根本原因是平台限制
YouTube 默认单次上传超时 15 分钟,Bilibili 分片超时约 5 分钟;Python 默认 requests 连接/读取超时是 None,看似安全,实则可能卡死进程。
- 务必给
requests设置timeout=(30, 300)(连接 30 秒,读取 5 分钟),并在捕获Timeout或ConnectionError后重试当前分片,而非整个文件 - YouTube resumable 上传支持断点续传:从响应头
locationURL 继续 PUT,无需重传已成功部分;Bilibili 分片失败只需重传对应 chunk,upload_id复用即可 - 不要用
open(file, "rb").read()加载整个视频到内存——1GB 视频会吃光内存;改用open(file, "rb")直接传 file object,让 requests 流式发送
真正难的不是写几行上传代码,而是每个平台的边界条件:YouTube 的 quota 消耗(每次上传扣 1600 单位)、Bilibili 的 daily upload limit(新号首日限 1 条)、Twitch 的 video ingest endpoint 动态分配机制……这些不查平台文档、不看实际响应头和错误码,脚本跑十次崩八次。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











