
单文件 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 仍可访问。
原理
-
频道发现:
https://program-sc.miguvideo.com/live/v2/tv-data/<vomsID>(12 个原始分组,明文免签,约每分钟刷新)。按 pID 去重,归入优先级最高的 展示分组。原始分组归并为 4 个展示分组:展示分组 由哪些原始分组归并 央视频道央视 卫视频道卫视 地方频道地方 数字频道体育、影视、新闻、教育、少儿、纪实、综艺、热门 原始分组 熊猫(熊猫频道)整体过滤掉。
-
播放地址:
https://play.miguvideo.com/playurl/v1/play/playurl?sign=…&contId=<pID>(app 端 720p 签名接口)+ddCalcu变换,必要时跟随 302 到 CDN。 -
反代:列表写入
<base>/<slug>.m3u8(slug 为纯 ASCII:英文/数字原样 保留,汉字取拼音首字母,如CCTV1综合 → CCTV1zh、东方卫视 → dfws; 重名时追加-pID),播放时才实时解析并改写 m3u8 中的子列表/切片为<base>/<b64url>.<ext>,从而规避 token 过期与 403。 -
DNS:本机 DNS 可能把咪咕 CDN 解析到错误 IP,程序默认用国内 DoH (223.5.5.5 / 119.29.29.29)解析后按 IP 直连(等价 PHP 的
CURLOPT_RESOLVE)。 -
过滤:咪咕对游客有版权/登录限制的频道 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运行缓存(自动生成)
下载
请留言 本地下载
评论交流