Python调用YouTube API上传长视频触发ssl.SSLWantWriteError报错
问题根因
这个ssl.SSLWantWriteError是大文件上传场景的典型问题:1分钟短视频体积小、传输耗时短,默认配置下可以顺利跑完;1小时长视频体积大、传输周期长,默认HTTP客户端的超时阈值、传输模式不匹配长连接上传需求,SSL层写入缓冲区无法及时排空、连接被中途截断就会抛出这个错误。另外你现有代码里还有一处字段拼写错误,会导致视频分类参数不生效,需要一并修复。
修复步骤
- 修正snippet字段拼写错误
你当前request_body的snippet块中写的是categoryI(结尾为大写字母i),正确字段名是categoryId,该错误不会触发SSL报错,但会导致上传后视频分类配置失效,先修正该笔误。 - 开启可恢复分块上传,设置合理分块大小
不要使用默认的大块直传逻辑,显式指定分块大小为官方推荐的10MB,开启断点续传能力,替换原有的MediaFileUpload初始化代码:
# 替换原代码中 mediaFile = MediaFileUpload('output.mp4') 行 mediaFile = MediaFileUpload( 'output.mp4', chunksize=10*1024*1024, # 单块大小10MB,降低单次传输压力 resumable=True # 开启可恢复上传,避免网络波动导致全量重传 )
- 调整HTTP客户端超时配置
默认的httplib2客户端超时仅60秒,长视频上传过程中块传输等待很容易触发超时断连,先补全依赖导入:
import time import ssl import httplib2 from googleapiclient import errors
在创建service实例的代码后,替换默认HTTP实例,拉长超时阈值:
# 放在 service = Create_Service(CLIENT_SECRET_FILE, API_NAME, API_VERSION, SCOPES) 行之后 http = httplib2.Http( timeout=600, # 超时设置为10分钟,适配大文件块传输等待周期 disable_ssl_certificate_validation=False ) # 绑定认证凭证,替换service默认使用的http实例 http = service.http.credentials.authorize(http) service.http = http
- 替换上传执行逻辑,增加临时错误重试
不要直接调用.execute()做一次性上传,改成逐块上传、捕获临时SSL错误自动重试的逻辑,替换原有的视频上传代码块:
# 替换原代码中 response_upload = service.videos().insert(...).execute() 部分 request = service.videos().insert( part='snippet,status', body=request_body, media_body=mediaFile ) response_upload = None while response_upload is None: try: status, response_upload = request.next_chunk() if status: print(f"上传进度: {int(status.progress() * 100)}%") except ssl.SSLWantWriteError as e: print(f"临时SSL写入错误,2秒后重试当前块: {e}") time.sleep(2) continue except errors.HttpError as e: print(f"上传接口返回错误: {e}") raise
- 保留原有缩略图上传逻辑即可,注意要等视频上传完成拿到有效
videoId后再执行,避免抢占长视频上传的连接资源。
额外排查项
如果完成以上配置后仍然报错,按以下顺序排查:
- 检查本地网络是否存在长连接限制,比如家用路由器、公司防火墙会自动切断超过固定时长的TCP连接,可以切换到其他网络(如手机热点)测试
- 确认Python版本,你当前使用的Python3.8.0存在已知的SSL层缓冲区处理bug,可以升级到3.8.10及以上的3.8稳定分支,或升级到3.10稳定版
- 确认待上传的
output.mp4没有被其他进程占用(比如未关闭的视频剪辑软件),大文件读取IO阻塞也会触发SSL写入超时
内容的提问来源于stack exchange,提问作者absoluutly_begginer
相关产品推荐
相关产品推荐

