给全家做一份 Disney+ 网速和流量规划:用实测网速对照官方推荐速度,判断两路同时看能不能上 4K;再按每台设备的画质设置和每周观看时长,估算每月要用多少流量,接近宽带或手机套餐上限时给出警告。所有数字都抄自 Disney+ 帮助中心,放在
official.json里,来源写在文件里,方便以后核对和更新。
先看清成品
pytest 跑了 2 个测试,全部通过;用示例家庭(3 台设备、最多 2 路同时观看)和 40 Mbps 运行,输出“每路约 20.0 Mbps,满足:HD, live”,合计约 239.8 GB/月。
--measure在 box 上实测过一次,得到约 953.6 Mbps(box 是数据中心的机器,不代表家庭宽带)。数字是 2026-10-21 从帮助中心页面抄录的,当时页面显示的地区是 JP,另外查看的 UK 页面没有“直播”这一项。不同地区可能不同,请以你所在地区的页面为准。
注意:Disney+ 没有面向个人开发者的公开 API。本系列只用官方帮助中心公布的数字和规则,以及你自己填写的数据。不要用 VPN 或代理切换地区,不要绕过 DRM、不要录屏或导出下载文件,不要在家庭以外共享账号(以订阅协议为准)。套餐价格和可用地区以官方页面为准,本文不列数字。
做完之后你会得到什么?
| 成果 | 说明 |
|---|---|
official.json |
官方推荐速度(HD 5.0 / 直播 8.0 / 4K 25.0 Mbps)和各设备每小时流量 |
plan.py |
判断画质、估算月流量、超过上限 80% 时警告,可选粗测网速 |
household.json |
你家的设备、设置和每周时长 |
需要准备哪些环境?
| 项目 | 要求 | 说明 |
|---|---|---|
| Python | 3.8 以上 | 只用标准库 |
| curl | 可选 | 用于 --measure 粗测 |
| 网速数据 | 自己测 | 帮助中心推荐的是 speedof.me |
文件结构
34-disney-plus-A-src/
├── official.json
├── plan.py
├── household.json
└── test_plan.py
第 1 步:把官方数字放进一个文件
official.json:
{
"_source": "Disney+ Help Center: disneyplus-recommended-speeds(2024-09-30 版,US)与 disneyplus-data-usage,2026-10-21 抄录。不同地区页面可能不同,以你所在地区的页面为准。",
"speeds_mbps": {"HD": 5.0, "live": 8.0, "4K UHD": 25.0},
"gb_per_hour": {
"mobile": {"Wi-Fi only (1080p)": 2.5, "Automatic (HD)": 2.0, "Save data (SD)": 0.6},
"tv": {"Automatic (4K UHD & HDR)": 7.7, "Moderate (1080p)": 2.0, "Save data (SD)": 0.7},
"browser": {"Automatic (720p)": 4.2, "Save data (SD)": 0.6}
}
}
设置名称照抄帮助页面上的英文,这样以后页面更新时,可以逐项对照。按页面说明,同时观看的每一路都需要单独达到推荐速度,所以脚本会先用总网速除以路数。
第 2 步:脚本
plan.py:
"""家庭 Disney+ 网速与流量规划:
1) 用实测网速对照官方推荐,判断能看什么画质(同时观看的路数要分摊带宽);
2) 按每人每周观看时长和设备设置,估算每月流量。
用法:python plan.py household.json [实测Mbps] 不给网速时可加 --measure 用 curl 粗测下载速度"""
import json, subprocess, sys
from pathlib import Path
OFF = json.loads(Path(__file__).with_name("official.json").read_text(encoding="utf-8"))
def quality_for(mbps, streams=1):
per = mbps / max(streams, 1)
ok = [q for q, need in sorted(OFF["speeds_mbps"].items(), key=lambda x: x[1]) if per >= need]
return per, ok
def monthly_gb(household, weeks=4.345):
rows, total = [], 0.0
for m in household["members"]:
table = OFF["gb_per_hour"].get(m["device"])
if table is None: raise ValueError(f"{m['name']}:device 只能是 {list(OFF['gb_per_hour'])}")
if m["setting"] not in table: raise ValueError(f"{m['name']}:{m['device']} 的设置只能是 {list(table)},收到 {m['setting']!r}")
rate = table[m["setting"]]
gb = rate * m["hours_per_week"] * weeks
rows.append((m["name"], m["device"], m["setting"], round(gb, 1))); total += gb
return rows, round(total, 1)
def measure(url="https://speed.cloudflare.com/__down?bytes=25000000"):
"""粗测:下载 25MB,取 curl 报告的平均下载速度。结果只供参考,以 Disney+ 帮助中心推荐的测速方式为准。"""
out = subprocess.run(["curl", "-s", "-o", "/dev/null", "-w", "%{speed_download}", "--max-time", "60", url],
capture_output=True, text=True, check=True).stdout
return float(out) * 8 / 1e6
if __name__ == "__main__":
hh = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
mbps = measure() if "--measure" in sys.argv else float(sys.argv[2])
per, ok = quality_for(mbps, hh.get("max_simultaneous_streams", 1))
print(f"网速 {mbps:.1f} Mbps,{hh.get('max_simultaneous_streams', 1)} 路同时观看 → 每路约 {per:.1f} Mbps,满足:{', '.join(ok) or '都不满足(建议降低画质或减少同时观看)'}")
rows, total = monthly_gb(hh)
for r in rows: print(f" {r[0]}:{r[1]} / {r[2]} → 约 {r[3]} GB/月")
print(f"合计约 {total} GB/月(按每月 4.345 周估算)")
cap = hh.get("monthly_cap_gb")
if cap and total > cap * 0.8: print(f"警告:超过流量上限 {cap} GB 的 80%")
household.json:
{
"max_simultaneous_streams": 2,
"monthly_cap_gb": 300,
"members": [
{"name": "客厅电视", "device": "tv", "setting": "Automatic (4K UHD & HDR)", "hours_per_week": 6},
{"name": "孩子平板", "device": "mobile", "setting": "Save data (SD)", "hours_per_week": 5},
{"name": "通勤手机", "device": "mobile", "setting": "Automatic (HD)", "hours_per_week": 3}
]
}
第 3 步:测试和运行
import pytest
from plan import quality_for, monthly_gb
def test_quality():
assert quality_for(30, 1)[1] == ["HD", "live", "4K UHD"]
per, ok = quality_for(30, 2); assert per == 15 and ok == ["HD", "live"]
assert quality_for(4, 1)[1] == []
def test_monthly():
rows, total = monthly_gb({"members": [{"name": "a", "device": "tv", "setting": "Automatic (4K UHD & HDR)", "hours_per_week": 1}]}, weeks=4)
assert total == 30.8
with pytest.raises(ValueError, match="设置只能是"):
monthly_gb({"members": [{"name": "a", "device": "tv", "setting": "4K", "hours_per_week": 1}]})
$ python -m pytest -q
2 passed
$ python plan.py household.json 40
网速 40.0 Mbps,2 路同时观看 → 每路约 20.0 Mbps,满足:HD, live
客厅电视:tv / Automatic (4K UHD & HDR) → 约 200.7 GB/月
孩子平板:mobile / Save data (SD) → 约 13.0 GB/月
通勤手机:mobile / Automatic (HD) → 约 26.1 GB/月
合计约 239.8 GB/月(按每月 4.345 周估算)
检查点:每路 20 Mbps 没有达到 4K 要求的 25 Mbps,所以这个家庭如果两路同时看,电视的 4K 不一定稳定。另外,电视一台就占了约 200 GB,是流量的大头。把电视改成 Moderate (1080p) 后再运行一次,合计会降到约 91 GB。
调试示例:设置名写成了中文
第一版直接用 OFF[...][m["setting"]] 查表。我把孩子平板的设置写成了“省流量”,结果只得到:
KeyError: '省流量'
报错没有说明是哪台设备,也没有列出可选的设置。现在的版本会先检查,再给出能直接照着改的提示:
ValueError: 孩子平板:mobile 的设置只能是 ['Wi-Fi only (1080p)', 'Automatic (HD)', 'Save data (SD)'],收到 '省流量'
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 实测网速高,看的时候还是卡 | 测的是到测速服务器的速度,Wi-Fi 信号弱,或者有多路同时观看 | 用帮助中心推荐的测速方式,在播放设备上测 |
| 流量估算和账单对不上 | 官方数字是平均值,实际画质会随网络自动调整 | 当作上限参考,按账单校正 |
| 你所在地区的页面数字不同 | 各地区页面会单独更新 | 改 official.json,并写明来源 |
模板规则
- 官方数字集中放在一个文件里,写明来源页面和抄录日期。
- 估算结果只当参考,不要写成承诺。
- 不要通过切换地区来获得更高画质或其他内容。
项目资源
规划工具不用 API 也能做:把官方数字整理成数据,再交给代码计算。真正要维护的只有 official.json 这一个文件。