📺 咪咕视频全部直播频道 · 反代服务 / M3U 生成器

migu 咪咕视频反代服务

单文件 Go 程序(migu.go),编译后为单个可执行文件,无外部依赖,支持 Windows / Linux(amd64、arm64);由 migu_live.php / migu.php 重构而来,反代方式参考 cctv_live.php。

快速开始

# Linux
./dist/migu-linux-amd64 serve -addr :8899
# 播放器打开:  http://127.0.0.1:8899/

# Windows
dist\migu-windows-amd64.exe serve -addr :8899

生成播放列表文件:

./dist/migu-linux-amd64 list -base http://<服务器IP>:8899 -out migu.m3u

命令

命令 说明
migu / migu serve 启动反代服务(默认 :8899)
migu list 生成播放列表
migu groups 输出分组列表(JSON)
migu go <slug> 打印该频道当前直连地址
migu version 版本

serve 参数

参数 默认 说明
-addr :8899 监听地址
-prefix 空 反向代理下的路径前缀
-base 空 覆盖生成的链接基地址
-epg 公开 EPG 列表 x-tvg-url
-rate 3 rateType(清晰度档位)
-h265 false 请求 H.265
-unique true 按 pID 去重

list 参数

参数 说明
-base 链接基地址;为空则输出直连地址
-out 输出文件;为空则打印到 stdout
-format m3u / json / txt
-group 仅指定分组(央视频道 / 卫视频道 / 地方频道 / 数字频道),逗号分隔
-ch 仅指定频道(slug,即拼音首字母),逗号分隔
-epg / -rate / -h265 / -unique / -refresh 同上
-direct 强制输出直连地址

HTTP 接口(服务模式)

<base> 为生成的链接基地址(默认同当前访问地址)。

请求 说明
/ M3U8 播放列表(全部 ~108 频道,链接为反代)
/?direct=1 链接为真实直连地址(较慢)
/?group=央视频道,卫视频道 仅指定分组
/?ch=CCTV1zh 仅指定频道(slug / pID,逗号分隔)
/?format=json|txt JSON / 名称,URL
/?groups=1 分组列表(JSON)
/?unique=0 不去重
/?h265=1 / /?refresh=1 / /?rate=N / /?epg=URL
/<slug>.m3u8 反代该频道(推荐);slug 为纯 ASCII 拼音首字母,如 /CCTV1zh.m3u8
/<slug>.m3u8?redir=1 302 直连该频道
/<b64url>.ts 反代切片 / 子列表(内部用)

兼容旧地址:/migu.php、/migu.php/<slug>.m3u8、?go=、?seg=;旧的 migu<pID>(如 /migu608807420.m3u8)与纯 pID 仍可访问。

原理

  1. 频道发现:https://program-sc.miguvideo.com/live/v2/tv-data/<vomsID> (12 个原始分组,明文免签,约每分钟刷新)。按 pID 去重,归入优先级最高的 展示分组。原始分组归并为 4 个展示分组:

    展示分组 由哪些原始分组归并
    央视频道 央视
    卫视频道 卫视
    地方频道 地方
    数字频道 体育、影视、新闻、教育、少儿、纪实、综艺、热门

    原始分组 熊猫(熊猫频道)整体过滤掉。

  2. 播放地址:https://play.miguvideo.com/playurl/v1/play/playurl?sign=…&contId=<pID> (app 端 720p 签名接口)+ ddCalcu 变换,必要时跟随 302 到 CDN。

  3. 反代:列表写入 <base>/<slug>.m3u8(slug 为纯 ASCII:英文/数字原样 保留,汉字取拼音首字母,如 CCTV1综合 → CCTV1zh、东方卫视 → dfws; 重名时追加 -pID),播放时才实时解析并改写 m3u8 中的子列表/切片为 <base>/<b64url>.<ext>,从而规避 token 过期与 403。

  4. DNS:本机 DNS 可能把咪咕 CDN 解析到错误 IP,程序默认用国内 DoH (223.5.5.5 / 119.29.29.29)解析后按 IP 直连(等价 PHP 的 CURLOPT_RESOLVE)。

  5. 过滤:咪咕对游客有版权/登录限制的频道 pID 由 excludePIDs 剔除; 分组 熊猫 整体过滤。

构建

./build.sh          # 生成 dist/ 下 4 个平台的可执行文件

或手动:

CGO_ENABLED=0 GOOS=linux   GOARCH=amd64 go build -trimpath -ldflags "-s -w" -o dist/migu-linux-amd64 .
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -trimpath -ldflags "-s -w" -o dist/migu-windows-amd64.exe .

缓存

首次运行会在可执行文件同目录生成 .migu_cache.json(频道列表 / 播放地址缓存); 若目录不可写则退回系统临时目录。

Linux 部署(作为服务,开机自启)

下面以 systemd 为例,把它做成一个开机自启的后台服务。示例约定:

  • 程序目录:/opt/migu(二进制 migu、缓存 .migu_cache.json 都在这里)
  • 监听端口::8899
  • 运行用户:migu(非 root;也可以直接用 root,把 User= / Group= 两行删掉)

注意:缓存文件写在可执行文件所在目录,所以运行用户必须对该目录有写权限, 否则会退回 /tmp。下文用 WorkingDirectory=/opt/migu + 目录属主 migu 满足这一点。

1. 准备目录与二进制

sudo useradd --system --no-create-home --shell /usr/sbin/nologin migu   # 已存在可跳过
sudo mkdir -p /opt/migu
sudo cp dist/migu-linux-amd64 /opt/migu/migu
sudo chmod 755 /opt/migu/migu
sudo chown -R migu:migu /opt/migu

2. 创建 systemd 服务单元

写入 /etc/systemd/system/migu.service:

[Unit]
Description=Migu Live reverse proxy (migu.go)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=migu
Group=migu
WorkingDirectory=/opt/migu
ExecStart=/opt/migu/migu serve -addr :8899
Restart=always
RestartSec=2

[Install]
WantedBy=multi-user.target

说明:

  • After/Wants=network-online.target:等网络就绪再启动(首次拉取频道列表需要联网)。
  • Restart=always + RestartSec=2:崩溃或被 OOM 杀掉后自动拉起。
  • WorkingDirectory:程序工作目录;缓存在二进制目录,写权限由 chown 保证。
  • 需要换端口 / 加参数时改 ExecStart,例如 ExecStart=/opt/migu/migu serve -addr :8899 -rate 4 -h265。

3. 启用并启动(开机自启)

sudo systemctl daemon-reload
sudo systemctl enable --now migu.service   # enable=开机自启, --now=立即启动
systemctl status migu.service              # 查看状态

systemctl is-enabled migu.service 返回 enabled 即表示开机自启已生效。

4. 日常管理

systemctl status migu.service      # 状态
systemctl restart migu.service     # 重启(改完配置/换二进制后)
systemctl stop migu.service        # 停止
systemctl disable migu.service     # 取消开机自启
journalctl -u migu -f              # 实时日志
journalctl -u migu --since today   # 今天的日志

5. 升级二进制

sudo systemctl stop migu.service
sudo cp dist/migu-linux-amd64 /opt/migu/migu
sudo chown migu:migu /opt/migu/migu
sudo systemctl start migu.service

6. 放行防火墙(局域网设备访问时需要)

# ufw (Ubuntu/Debian)
sudo ufw allow 8899/tcp

# firewalld (CentOS/RHEL)
sudo firewall-cmd --permanent --add-port=8899/tcp && sudo firewall-cmd --reload

# 查看监听
ss -ltnp | grep 8899

7. 生成播放列表(可选)

list 只是生成文本文件,不影响服务运行,可随时手动执行或放进 cron / timer:

/opt/migu/migu list -base http://<服务器IP>:8899 -out /opt/migu/migu.m3u

备选:用户级服务(无 root 权限)

若不想用 root 或系统级服务,可用 systemd --user(单元里 [Install] 改为 WantedBy=default.target,且不要写 User=/Group=):

mkdir -p ~/.config/systemd/user
cp migu.service ~/.config/systemd/user/       # 先改 [Install] 为 default.target
systemctl --user daemon-reload
systemctl --user enable --now migu.service
sudo loginctl enable-linger "$USER"           # 允许未登录时也常驻/开机自启

运行现状

以 systemd 方式部署后即为常驻服务,单元名为 migu.service (/etc/systemd/system/migu.service,ExecStart=/opt/migu/migu serve -addr :8899), enabled + active 后即可用:

systemctl status migu.service
journalctl -u migu -f

常见问题(WSL 环境)

若在 Windows + WSL2 镜像网络(mirrored) 下运行,注意:

  • Windows 本机浏览器 访问 http://<宿主机IP>:8899 会超时,这是 WSL 镜像网络 的已知回环限制(宿主机访问自己的外部 IP 不会转发进 WSL)。本机请用 http://127.0.0.1:8899/(localhost 可能解析到 IPv6 而超时)。
  • 局域网设备(电视盒子 / 手机 / 电视)访问 http://<宿主机IP>:8899/ 正常, 但需在 Windows 放行入站端口(二选一或都加):
# 普通 Windows 防火墙(管理员)
New-NetFirewallRule -DisplayName 'Migu 8899 inbound' -Direction Inbound -Action Allow `
  -Protocol TCP -LocalPort 8899 -Profile Any

# WSL 的 Hyper-V 防火墙(管理员;VMCreatorId 用 Get-NetFirewallHyperVVMSetting 查)
New-NetFirewallHyperVRule -Name 'Migu-8899-In' -Direction Inbound `
  -VMCreatorId '<你的 VMCreatorId>' `
  -Protocol TCP -LocalPorts 8899 -Action Allow

对应播放列表:migu.m3u(局域网 IP,给电视盒子用)、migu-local.m3u(127.0.0.1,给本机用)。

目录

  • migu.go 源码(单文件)
  • build.sh 交叉编译脚本
  • dist/ 编译产物(linux/windows × amd64/arm64)
  • migu.m3u 生成的播放列表
  • .migu_cache.json 运行缓存(自动生成)

下载

请留言 本地下载

评论 0 打赏 分享

相关推荐

评论交流