轻松抓取并解析广东电信 IPTV 全部直播源
2023年6月25日更新:广东电信似乎废弃了 ChannelURL 属性,这个属性下的 RTSP 地址经测试无法播放。需改用 ChannelSDP 属性,后文代码已经同步更新,请放心使用。
老爸说想在卧室看电视,网上的电视直播软件大多都不怎么稳定,还有广告。而 GitHub 上的 IPTV 项目里的源清晰度也都不咋地。自己动手,丰衣足食,自己从机顶盒里抓吧!
首先我们需要抓取机顶盒从开机到进入电视播放的所有数据包,怎么抓随你,网上有很多,在这里我就提供一个非常简单的思路。
- 保证你的机顶盒和电脑在同一个局域网
- 电脑打开 网络连接 - 属性 - 共享,开启 “允许其他网络用户通过此计算机的 Internet 连接来连接”
- 机顶盒 - 设置 - 网络 - 静态 IP - 网关 设置为你的电脑 IP
- 打开人见人爱的 Wireshark
当然你想用路由器抓包之类的什么方法都可以,总之抓到包就行。
抓到完整过程的包之后,找到 POST /EPG/jsp/getchannellistHWCTC.jsp 这个请求
然后跟着下面找到返回包,在 Line-based text data 上右键,导出分组字节流。导出文件名就叫 channel.html
用记事本或者什么编辑软件打开 channel.html ,在开头加上以下代码。
<script>
const goServicesEntry=function(){};
var Authentication={};
var m3u8Channels="";
Authentication['CTCSetConfig']=function(){
const regex = /,?(.+?)="(.*?)"/gm;
if(arguments[0]=='Channel'){
var info={};
while ((m = regex.exec(arguments[1])) !== null) {
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
if(m[1]=="ChannelName"){
m3u8Channels+="#EXTINF:-1 tvg-name=\"" + m[2] + "\"," + m[2] + "\n"
}
if(m[1]=="ChannelSDP"){
m3u8Channels+=m[2]+"\n"
}
}
}
}
setTimeout(function(){
var a = window.document.createElement('a');
a.href = window.URL.createObjectURL(new Blob([m3u8Channels], {type: 'application/x-mpegURL'}));
a.download = 'IPTV.m3u8';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
},1000);
</script>
然后拉到文件最下面找到 goServicesEntry()
,把整个函数(如下图中的1178 - 1181行)删掉
保存,然后用浏览器打开就会提示你下载解析好的 m3u8 了。这些 RTSP 或者 HLS 播放地址里面都带有你机顶盒的用户鉴权信息,所以建议不要随便分享给别人,自己抓自己用就好。
最后,使用 PotPlayer 即可正常播放,其中有个别台看不了属于正常现象,因为它们用的是AVS+和AVS2编码(比如CCTV5超清、广东综艺宽色域AVS2)。关于这一点,我做过测试:gitee 上有人编译的支持 AVS2 的 FFMPEG 和 VLC 也依然不能正确转码、播放这些台。如果有人测试成功了,欢迎留言告诉我你是怎么在电脑上正常播放的。目前来看,只有使用国产SoC的电视盒子才能正常硬解观看这些频道。
在安卓上可以用 DIYP 播放器看,抓出来之后加个 EGP 甚至能支持回看,完美替代电信的机顶盒。
整个过程得到了子安大佬的大力支持和帮助,特别感谢。
一些补充:广东电信 IPTV 在省内电信移动数据网络、宽带公网(@163.gd拨号)和IPTV私网(@iptv.gd拨号)都能看,如果你不想占用公网宽带速度可以自己做分流;宽带速度足够或者不在意的可以直接看。