轻松抓取并解析广东电信 IPTV 全部直播源

2021-04-12
2分钟阅读时长

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行)删掉

image-20220628213725092

保存,然后用浏览器打开就会提示你下载解析好的 m3u8 了。这些 RTSP 或者 HLS 播放地址里面都带有你机顶盒的用户鉴权信息,所以建议不要随便分享给别人,自己抓自己用就好。

最后,使用 PotPlayer 即可正常播放,其中有个别台看不了属于正常现象,因为它们用的是AVS+和AVS2编码(比如CCTV5超清、广东综艺宽色域AVS2)。关于这一点,我做过测试:gitee 上有人编译的支持 AVS2 的 FFMPEG 和 VLC 也依然不能正确转码、播放这些台。如果有人测试成功了,欢迎留言告诉我你是怎么在电脑上正常播放的。目前来看,只有使用国产SoC的电视盒子才能正常硬解观看这些频道。

在安卓上可以用 DIYP 播放器看,抓出来之后加个 EGP 甚至能支持回看,完美替代电信的机顶盒。

整个过程得到了子安大佬的大力支持和帮助,特别感谢。

一些补充:广东电信 IPTV 在省内电信移动数据网络、宽带公网(@163.gd拨号)和IPTV私网(@iptv.gd拨号)都能看,如果你不想占用公网宽带速度可以自己做分流;宽带速度足够或者不在意的可以直接看。

Avatar

蚊子

幸福往往是摸得透彻,而堇业的心却常常隐藏