使用IPTV應用軟體播放器觀看電視直播,能有清晰穩定的直播源無疑是最重要的。家庭寬頻的IPTV有運營商的支援維護,穩定性和清晰度都有保證。對普通家庭使用者來說,可以說是最理想的直播源。之前介紹一些IPTV直播源的抓取,也有許多朋友興趣。不同地區的IPTV不太一樣,但基本方法是一樣的。前一段回鄉探親,也嘗試使用OpenWrt路由器及Wireshark抓取了一個家裡IPTV的直播、回看及點播地址。記錄一下整個過程,有興趣的朋友可以參考。
先看家裡IPTV的網路情況。光貓上網是路由模式,LAN1口是上網口。IPTV是橋接模式,繫結光貓的LAN2網口。光貓也只有兩個網口。平時IPTV機頂盒直接網線連線到光貓LAN2口使用,透過HMDI連線電視。
再說抓包分析工具。抓包使用OpenWrt的路由器,一個WAN口,三個LAN口。為了透過路由器抓取,路由器使用兩根網線連線光貓。路由器WAN口連線光貓LAN1上網口,使用路由器LAN2口連線光貓LAN2 IPTV橋接繫結口。路由器的LAN3口使用網線連線IPTV機頂盒。因為IPTV機頂盒需要連線到光貓LAN2口,在路由器上建立br-iptv網橋橋接LAN2和LAN3口。
為了在家庭網路中測試訪問IPTV資源,在路由也建立IPTV介面。路由介面見下圖。
在路由器上安裝配置組播轉單播的Udpxy服務,方便下面做些實際播放測試。
在路由器上安裝tcpdump作為實際抓包工具。抓包分析工具依舊使用Wireshark。使用ssh遠端抓取方式。注意要抓取的遠端介面使用前面建立的IPTV網橋br-iptv。
環境準備好後,啟動Wireshark SSH remote capture抓包,開啟IPTV機頂盒,先抓取啟動過程。直至IPTV啟動完成進入直播畫面或者首頁。
在啟動過程中,往往IPTV機頂盒會向後臺請求頻道列表資訊。先重點看能不能有頻道列表資訊。介紹兩種方法,一是IPTV機頂盒與後臺的互動一般是透過HTTP協議進行,可以重點重一下啟動過程中的HTTP互動。可以想象,先會有認證互動,然後才後會請求資訊。
從上面的HTTP互動過程中可以看出前面的 .../Action=Login, getencrypttoken.jsp, auth.jsp, fucportalauth.jsp, frameset_judger.jsp等請求,從名字上就能猜測是認證授權的互動,從後臺獲取使用者令牌(UserToken)等。往下的內容就該重點關注了,比較幸運,下面的
/iptvepg/function/frameset_builder.jsp就是要找的資訊了。滑鼠右鍵點選對應請求繼續追蹤它的HTTP Stream
從追蹤資訊中可以找到頻道列表資訊。
一個例子的頻道資訊如下。其中ChannelName給出了頻道名稱(CCTV1高畫質),ChannelURL就是頻道直播地址(
igmp://239.253.248.77:8000),可以看出電視直播用的是組播方式。
jsSetConfig(Channel,ChannelID="ch00000000000000001128",ChannelName="CCTV1高畫質",UserChannelID="1",ChannelURL="igmp://239.253.248.77:8000",TimeShift="1",ChannelSDP="igmp://239.253.248.77:8000|rtsp://124.132.240.33:554/live/ch12122514263996485740.sdp?playtype=1&boid=001&clienttype=1&time=20240211145822+08&life=172800&ifpricereqsnd=1&vcdnid=001&userid=xxxxxxxxxxxx&mediaid=ch12122514263996485740&ctype=5&TSTVTimeLife=10800&authid=0&UserLiveType=1&stbid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nodelevel=3&terminalflag=1&profilecode=&AuthInfo=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&bitrate=8&distype=0&usersessionid=xxxxxxxxxx",TimeShiftURL="rtsp://124.132.240.33:554/live/ch12122514263996485740.sdp?playtype=1&boid=001&clienttype=1&time=20240211145822+08&life=172800&ifpricereqsnd=1&vcdnid=001&userid=xxxxxxxxxxxx&mediaid=ch12122514263996485740&ctype=5&TSTVTimeLife=10800&authid=0&UserLiveType=1&stbid=xxxxxxxxxxxxxxxxxxxxxxxxxxx&nodelevel=3&terminalflag=1&profilecode=&AuthInfo=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&bitrate=8&distype=0&usersessionid=xxxxxxxxxxx",ChannelLogURL="",PositionX="1",PositionY="1",BeginTime="0",Interval="-1",Lasting="0",ChannelType="2",ChannelPurchased="",LocalTimeShift="0",UserTeamChannelID="1",TimeShiftLength="10800",telecomcode="00000001000000050000000000000152",FCCEnable="1",FCCFunction="1",ChannelFCCIP="124.132.240.66",ChannelFCCPort="15970");
使用這個組播地址,利用路由器上的轉單播服務,在電腦上開啟單播地址(
http://192.168.124.1:4022/rtp/239.253.248.77:8000)用播放器試一下,是CCTV1。
把整個頻道資訊複製出來,在文字編輯器中使用正則表示式,或者就手工編輯一下,生成m3u或者txt直播列表檔案,IPTV的直播源就弄好了。在電腦用播放器開啟試一下,沒問題!
另一種在Wireshark中檢視頻道資訊的方法就是使用關鍵字搜尋。比如搜尋igmp://,如下圖。也能很快定位到對請求頻道資訊列表的請求。同方法一追蹤對應的HTTP流,獲取頻道列表資訊即可。
採用搜尋方式的關鍵是選擇合適的關鍵字。這裡是用的igmp://,但有些地方的IPTV並不是用的igmp組播,需要使用其它合適的關鍵詞。
下面看一下回看,開啟一個回看頻道試一下。同時抓一下包。
從之前的頻道列表資訊中,可以看到回看使用的是rtsp協議。因此在Wireshark抓包中重點看rtsp協議包即可。
從中可以看到,預設使用的是基於認證的rtsp地址,經過幾次跳轉,最後使用的rtsp地址其實並不需要認證,地址格式如下:
rtsp://119.180.21.48:1554/iptv/Tvod/iptv/001/001/ch12122514263996485740.rsc?tvdr=20240210043000GMT-20240210055100GMT
可以看到回看地址是使用tvdr引數定義回看時間段,注意使用的是GMT標準時間,不是北京時間。用電腦播放器開啟看一下,回看節目正確。
可以把有興趣的回看頻道繼續都抓取出來。編輯m3u播放列表檔案把回看資訊加進去。下面是一個頻道的例子。
#EXTM3U x-tvg-url="http://epg.51zmt.top:8000/e.xml.gz" catchup-correction="8"
#EXTINF:-1 tvg-id="CCTV1" tvg-name="CCTV1" group-title="央視-高畫質" catchup="default" catchup-source="rtsp://119.180.21.48:1554/iptv/Tvod/iptv/001/001/ch12122514263996485740.rsc?tvdr={utc:YmdHMS}GMT-{utcend:YmdHMS}GMT",CCTV-1 綜合
http://192.168.124.1:4022/rtp/239.253.248.77:8000
這樣就可以在支援回看IPTV電視直播應用(比如Kodi)啟用回看。更詳細的使用說明可以參考筆者的其它相關文章。
最後再一下點播,現在IPTV也有不少點播節目。使用IPTV開啟一個電影點播,同時抓一下包。
同樣重點看rtsp協議包就可以了。和前面的回看類似,開始使用認證rtstp地址,最後會跳轉到一個不需要認證的rtsp地址上。格式如下:
rtsp://119.180.21.45:1554/iptv/vod/iptv/001/001/894/00000050280003431558.mpg
在電腦上開啟地址看一下,沒問題,電影可以完整播放。
最後說明一下,在家庭網路中觀看IPTV回看和點播節目,需要走IPTV連線路由,因為運營商IPTV的地址大都會遮蔽網際網路的訪問。需要在路由器下定義靜態路由規則,IPTV地址段透過IPTV連線路由。注意不同運營商需要配置的路由規則不同,需要根據運營商的實際地址配置。
涉及內容比較多,感興趣的朋友也可以翻翻筆者其它的相關文章。