一个轻量级 Node.js 服务,通过伪装成标准 DLNA 媒体渲染器(智能电视),接收局域网内支持 DLNA 投屏的 App 发送的媒体流地址,并在控制台输出捕获的 URL,可选自动下载媒体文件。
┌──────────┐ SSDP 设备发现 ┌──────────────┐
│ 手机 │ ──────────────────► │ │
│ App │ │ dlna-sniffer │
│ (支持 │ ◄────────────────── │ (伪装电视) │
│ DLNA) │ "我是一台智能电视" │ │
│ │ │ │
│ │ SetAVTransportURI │ │
│ │ ──────────────────► │ ┌────────┐ │
│ │ (媒体 URL 在里面) │ │ 打印 │ │
│ │ │ │ URL │ │
│ │ ◄────────────────── │ └────────┘ │
│ │ "好的,播放中" │ ┌────────┐ │
│ │ │ │ 下载 │ │
│ │ 心跳/状态查询 │ │(可选) │ │
│ │ ◄──────────────────► │ └────────┘ │
└──────────┘ "PLAYING"(伪造) └──────────────┘
- SSDP 广播 — 在局域网中广播自身为 DLNA 媒体渲染器(UDP 1900)
- 设备描述 — 提供标准 UPnP XML 描述文件,让 App 识别为合法渲染器
- URL 拦截 — 捕获
SetAVTransportURISOAP 指令,提取媒体真实地址 - 状态伪造 — 对心跳查询返回 "PLAYING" 状态,保持连接不断开
- 自动下载(可选) — 流式下载媒体文件,支持自定义请求头
- Node.js >= 18
- 运行设备与手机处于同一局域网
git clone https://github.com/yourname/dlna-sniffer.git
cd dlna-sniffer
npm install嗅探模式 — 仅打印捕获的 URL:
node index.js下载模式 — 打印 URL 并自动下载:
node index.js --download
# 或简写
node index.js -d╔══════════════════════════════════════════╗
║ DLNA 伪装渲染器已启动 ║
║ 设备名称: Living Room TV ║
║ 本机地址: http://192.168.1.100:8080 ║
║ 下载模式: 已开启 ║
╚══════════════════════════════════════════╝
等待投屏连接...
========================================
[捕获] 视频 URL:
https://example.com/video/stream/...
========================================
[捕获] 视频标题: 某个视频标题
[下载] 某视频.mp4 |████████████░░░░░░░░| 60% | 12.3MB/20.5MB | 速度: 2.1MB/s
[下载] 完成: 某视频.mp4 (20.5MB)
dlna-sniffer/
├── index.js # 主入口,Express HTTP 服务器
├── package.json
└── src/
├── utils.js # 本机 IP 检测、设备配置
├── ssdp.js # SSDP 发现与广播
├── description.js # UPnP 设备/服务 XML 描述
├── control.js # SOAP 指令拦截与状态伪造
└── downloader.js # 流式下载与进度条显示
- 端口 1900:确保 UDP 1900 未被其他 DLNA 服务占用(如 Windows Media Player)。Windows 下可能需要停止 SSDP Discovery 服务。
- 防火墙:需放行 UDP 1900 和 TCP 8080 入站规则。
- 同一网段:手机和本服务必须在同一子网下。Docker 部署需使用
--network host模式。 - 免责声明:本项目仅供学习和研究 DLNA 协议使用,请勿用于任何侵犯版权的用途。使用者需自行承担法律责任。
MIT