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, 云资产清单, 流媒体解析, 视频抓取, 逆向工程