sharoon7171/111movies-stream-solver

GitHub: sharoon7171/111movies-stream-solver

一个零依赖的 Node.js 服务,用于从 111movies.net 加密页面中解析 HLS 视频流并提供带 m3u8 重写和 PNG 片段解包功能的本地代理。

Stars: 1 | Forks: 1

# 111movies Stream 解析器 用于 [111movies.net](https://111movies.net) HLS 流的 Node.js 解析器。沙盒化 VM 从加密的页面数据中解码站点播放器。镜像源并行竞速;HLS 代理重写 m3u8 播放列表,解包封装为 PNG 的传输片段,并使用站点 referer 头进行转发。 ## 功能 - 在 Node.js `vm` 中对 111movies 播放器进行 VM 解码 - 加密的 Next.js 页面 payload 解析 (`__NEXT_DATA__`) - 并行镜像源探测 —— 7 秒内获取首个可用流 - 剩余镜像源的后台探测 - 针对单个镜像源的流解析及服务器切换 - 带有 m3u8 URL 重写和 PNG 片段解包功能的 HLS 代理 - 零 npm 依赖 —— 仅使用 Node.js 内置模块 ## 环境要求 - Node.js 20.10+ 或 22+ (`fetch`, `AbortSignal.any`) ## 快速开始 ``` git clone https://github.com/sharoon7171/111movies-stream-solver.git cd 111movies-stream-solver npm start ``` 服务器运行在 `http://127.0.0.1:8788`(可通过 `PORT` 覆盖)。 ## 内容路径 | 类型 | 路径 | | ----- | ---- | | 电影 | `/movie/{id}` | | 电视 | `/tv/{id}/{season}/{episode}` | `{id}` 是 111movies URL 中的数字 ID(与 TMDB 路径上使用的数字相同)。 ## 环境变量 | 变量 | 默认值 | 用途 | | -------- | ------- | ------- | | `PORT` | `8788` | HTTP 监听端口 | | `MOVIES111_ORIGIN` | `https://111movies.net` | 用于页面和 API 请求的站点源 | ## API 除非另有说明,所有 JSON 路由均为 `POST`。成功时响应包含 `ok: true`,失败时包含 `ok: false` 以及 `stage` 和 `error`。 ### `POST /api/play` 解码页面并解析第一个可用的镜像源。 ``` { "contentPath": "/movie/533535", "type": "movie" } ``` 电视示例: ``` { "contentPath": "/tv/1396/1/1", "type": "tv" } ``` 可选的 `query` 字段:`id`、`_data`、`backdrop`、`ad`。当你已经拥有加密 payload 时,传入 `_data` 可跳过页面抓取。 成功时的字段:`streamUrl`、`apiPrefix`、`servers`、`selectedServer`、`streams`。 ### `POST /api/probe` 探测尚未解析的镜像源。在 `/api/play` 之后调用此接口以填充其余信息。 ``` { "contentPath": "/movie/533535", "apiPrefix": "…", "servers": […], "exclude": "ServerName", "known": ["ServerName"] } ``` 返回 `streams` —— 一个镜像源名称到 `{ streamUrl, source }` 的映射。 ### `POST /api/stream` 解析特定镜像源或刷新服务器列表。 ``` { "contentPath": "/movie/533535", "type": "movie", "apiPrefix": "…", "servers": […], "server": "ServerName", "probe": false, "refreshSr": false } ``` 设置 `probe: true`(默认)以竞速所有镜像源。设置 `probe: false` 和 `server` 以定位单个镜像源。设置 `refreshSr: true` 以从 `{apiPrefix}/sr` 重新加载列表。 ### `GET /api/hls?url={streamUrl}` 代理 HLS 播放列表或片段。播放列表会被重写,以便片段 URL 通过此端点进行路由。封装为 PNG 的 `.ts` payload 将被剥离为原始传输流。 代理播放 URL: ``` http://127.0.0.1:8788/api/hls?url={encoded_streamUrl} ``` ## Vendor 刷新 当 111movies 更新其 webpack chunks 时,刷新 vendor 播放器代码: ``` npm run vendor ``` 这会将 chunks 抓取到 `vendor/chunks/` 中,提取 VM 主体,并写入 `src/vm/body.js`。 ## 结构 ``` src/ server.mjs entry config/constants.js origin and request headers http/handler.js routes services/ decode.js page fetch + VM decode stream.js play, resolve, probeRest hls.js HLS proxy vm/ player sandbox public/index.html local player page vendor/chunks/ vendored site chunks scripts/vendor-chunks.js chunk fetch + VM extract ``` ## 流程 1. **解码** —— 抓取 `contentPath`(或使用 `_data`),解析 Next.js props,运行 VM → `apiPrefix` + `servers` 2. **解析** —— 在 `apiPrefix` 下竞速镜像源;每个镜像源请求 `{apiBase}/{server.data}` → HLS `streamUrl` 3. **探测** —— 并行解析剩余镜像源以供服务器切换 4. **代理** —— 通过 `/api/hls` 提供 HLS 服务,包含 referer 头和片段解包
标签:GNU通用公共许可证, HLS代理, MITM代理, Node.js, 云资产清单, 流媒体解析, 视频抓取, 逆向工程