上文中提到了广东电信的 IPTV 验证过程。虽然知道了验证方法,并且实现了自动提取频道列表,但是由于提取的 rtsp 链接是带验证而且有过期时间的,所以需要定期手动给直播软件更新源。某些直播软件能使用在线源,但是很多是不行的,这就很麻烦了。于是写了一个小程序实现 IPTV 源代理,每天自动刷新源。
首先需要让 IPTV 走专线,不干扰互联网链接。首先需要在路由器进行 IPTV 专线拨号。广东电信的 IPTV 是 VLAN ID 为 45 的 PPPoE 验证。在 Openwrt 中直接创建 iface.45 的接口既可以让 PPPoE 在 VLAN 45 上拨号。但是这里发现,如果已经拨号了互联网,即 VLAN 41 的 PPPoE 拨号,IPTV 拨号会失败。这是因为 MAC 地址和互联网拨号相同,需要给 VLAN 45 的虚拟接口设置另一个 MAC 地址。拨号之后可以获得一个内网地址。
这里给出配置示例,实际上在 luci 中手动添加适配即可:
config device
option type '8021q'
option ifname 'enp4s0f1'
option vid '45'
option name 'enp4s0f1.45'
option macaddr '12:34:56:78:9A:BC' # 这里跟 WAN 不一样即可
然后需要让 IPTV 的 IP 走 IPTV 接口。然后可以配置静态路由:
config route
option interface 'iptv'
option target '202.105.0.0/16'
config route
option interface 'iptv'
option target '183.59.0.0/16'
config route
option interface 'iptv'
option target '125.88.52.0/24'
config route
option interface 'iptv'
option target '59.37.208.0/24'
这里我的互联网接口叫 wan
,IPTV 的接口叫 iptv
。根据实际情况修改即可。至于分流的 IP 段可以自己用提取的 rtsp 链接跑跑看,然后确定出来的 302 目标。
创建 IPTV 拨号之后我才发现,我的 miniupnp 坏掉了,原来是因为 miniupnp 跑去用 iptv 的接口当外网接口了,然后发现是内网 IP 就凉了。
修复很简单,手动改 upnp 的 wan 的接口:
config upnpd 'config'
option external_iface 'wan'
这里我使用 upnpclient 进行测试。
由于爬出来的 RTSP 链接有期限,所以这里使用写了个 rust 程序验证 IPTV 账号,爬取链接,缓存起来,开一个简单的 RTSP 服务,然后把所有请求 302 过去真实目标。
具体逻辑如下:
192.168.1.1:7878
rtsp://192.168.1.1:7878/{id}
{id}
的频道的真实 RTSP 链接这样下来,只要频道 ID 是稳定的,那就能让局域网的播放器始终使用 rtsp://192.168.1.1:7878/{id}
链接,然后就能获取最新的有效的 RTSP 播放地址了。另外为了避免转台就获取频道列表,可以懒加载频道列表并且缓存起来,一天更新一次。
这里开源了一个实现 https://github.com/yujincheng08/rust-iptv-proxy ,编译(README 有 x86_64 的 openwrt 编译的方法)之后放到 openwrt 下,提供账号密码 MAC 地址和监听地址即可。至于 IPTV 频道列表导出(比如要导出 m3u 文件导入到播放器),可以改改 https://github.com/yujincheng08/tellyget-gd ,把输出链接成 rtsp://{bind_addr}/{channel_id}
即可。
Openwrt感觉有点难用,本来准备用N1当旁路,直接给我劝退了
看不懂啊能不能能不能给分解下步骤操作理由,多截图,配置看不懂
可以把2个GitHub上的代码发布到openwrt的源里面再配上luci给大家直接安装使用吗?感觉缺少编译方法,不大方便自己编译呀。
rstp地址可以回放吗