import requests
import time
import os
# ================= 配置区 =================
# ⚠️ 记得填入你的 API Key
API_KEY =
# 这是你刚刚生成的任务 ID (直接帮你填好了)
TASK_ID = "video_4f573cf0-b4ed-405c-8900-b39a416ef60a"
BASE_URL = "https://xxxx/v1/videos"
# =========================================
def check_and_download():
headers = {
"Authorization": f"Bearer {API_KEY}"
}
# 拼接查询地址: https://.../v1/videos/{id}
query_url = f"{BASE_URL}/{TASK_ID}"
print(f"🕵️♂️ 开始追踪任务: {TASK_ID}")
print("☕️ Sora 生成较慢 (预计 2-10 分钟),请耐心等待...")
while True:
try:
response = requests.get(query_url, headers=headers)
# 如果查不到任务 (404),可能是数据同步延迟,等一下再试
if response.status_code == 404:
print("...暂时未查到任务信息,继续等待...")
time.sleep(5)
continue
if response.status_code != 200:
print(f"⚠️ 查询接口返回异常: {response.status_code} - {response.text}")
time.sleep(10)
continue
data = response.json()
status = data.get("status") # 状态: queued, processing, completed, failed
progress = data.get("progress", 0) # 进度 (有的平台不返回这个)
# 1. 成功完成
if status == "completed":
print("\n🎉 任务完成!")
# 尝试获取视频链接,不同平台字段不一样,这里做个兼容
video_url = data.get("url") or data.get("output") or data.get("video_url")
# 有时候链接藏在 data 字段里
if not video_url and "data" in data and isinstance(data["data"], dict):
video_url = data["data"].get("url")
if video_url:
download_video(video_url)
else:
print(f"❌ 虽显示完成,但没找到视频链接。完整返回: {data}")
break
# 2. 失败
elif status == "failed":
print(f"\n❌ 生成失败。原因: {data.get('fail_reason') or data}")
break
# 3. 还在跑 (queued / processing)
else:
# 打印进度条动画
dots = "." * (int(time.time()) % 4)
print(f"\r🔄 状态: [{status}] 进度: {progress}% {dots}", end="")
time.sleep(5) # 每 5 秒查一次
except Exception as e:
print(f"\n💥 查询过程出错: {e}")
time.sleep(5)
def download_video(url):
print(f"\n📥 正在下载视频...")
filename = f"sora_{TASK_ID[:8]}.mp4"
try:
with requests.get(url, stream=True) as r:
r.raise_for_status()
with open(filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
print(f"✅ 视频已保存至当前目录: {os.path.abspath(filename)}")
except Exception as e:
print(f"❌ 下载失败: {e} \n视频链接是: {url}")
if __name__ == "__main__":
check_and_download()