效率工具

给全家做一份 Disney+ 网速和流量规划

给全家做一份 Disney+ 网速和流量规划:用实测网速对照官方推荐速度,判断两路同时看能不能上 4K;再按每台设备的画质设置和每周观看时长,估算每月要用多少流量,接近宽带或手机套餐上限时给出警告。所有数字都抄自 Disney+ 帮助中心,放在 official.json 里,来源写在文件里,方便以后核对和更新。

BINBHO · 图文教程

给全家做一份 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,并写明来源

模板规则

  • 官方数字集中放在一个文件里,写明来源页面和抄录日期。
  • 估算结果只当参考,不要写成承诺。
  • 不要通过切换地区来获得更高画质或其他内容。

项目资源

用途 地址
推荐网速 https://help.disneyplus.com/article/disneyplus-recommended-speeds
流量用量 https://help.disneyplus.com/article/disneyplus-data-usage
测速(帮助中心推荐) https://speedof.me
Disney+ 订阅协议 https://www.disneyplus.com/legal/subscriber-agreement

规划工具不用 API 也能做:把官方数字整理成数据,再交给代码计算。真正要维护的只有 official.json 这一个文件。