hinet hichannel 取得 index.m3u8 播放路徑

2 月 8, 2017

2020/8/11 停止維護

hichannel 更改了 token ,現在只需要一個 token 和一個 expires ,因為沒有實際利益 Hoyo 本人也沒在使用這個收聽功能,因此停止維護

--

實際運作結果

--

先看一下可播放的實際案例網址

解讀

  1. ra-000073 是頻道的代號名稱,ra-000073 是 NEWS98 ,KissRadio 是 ra-000042
  2. index.m3u8 表示使用 HTTP HLS 串流技術
  3. expire1 & expire2 表示可以執行播放的時間區間,你拿一個早上八點到下午四點的播放網址在晚上執行是不能播放的
  4. token1 & token2 和 expire 是相呼應的,意思就是如果 expire 的數值為 1000 算出 token 是 ABC999 ,那一樣的執行環境算出的 token 就會相同

--

參考資料

寫 PHP 的人轉到 python 會遇到的問題有

  1. 結束不用加分號
  2. \t 和空白是坑爹的不一樣
  3. 縮行不是爽縮就可以縮
  4. 相同功能的 function 預設的輸出和 PHP 不同

 

好好研究一下網頁是如何運作,追到了 radio_proxy.swf 這個檔案,網頁的播放最後就是由這個 Flash 檔案生成播放路徑,這時又要尋找「反組譯」黑科技

可惜的是,閃客 Sothink SWF Decompile 解不開,大概也有反制黑科技的技術吧

還好這種東西有線上版可以用!?...

不知道當時哪來的腦洞想到上網找 online 版,不過結果是美好的,至少是解開有看到類似 ActionScript 的輸出了。

下面是有關產生 token 的片段程式

基本上和 python 架構是一樣的,只是反組譯有少東西,最關鍵的 KEYS 沒有解開,只好回頭繼續研究 python

後來證實 python 有關 token 的演算法是正確的

--

Token 演算法

token1 字串組成

token2 字串組成

token1 範例,token2 只要將最後的 1 改成 2 即可

然後拿去 md5() 再跑 base64_encode() 就可以得到 Token 了

--

index.m3u8 內容

--

PHP 程式碼

--

 更新

  • 2019-02-20 網址改為 https:// 以及又改為 index.m3u8 的檔名
  • 2018-06-29 最後 m3u8 產出時, index.m3u8 檔案名稱必須改成 ra-hls/hich-ra000073-audio_track=128000.m3u8 這種格式的檔案名稱

--

 8,542 total views,  2 views today

23 thoughts on “hinet hichannel 取得 index.m3u8 播放路徑”
  1. 您好,

    請問path + expire timestamp + IP + Key + 1/2, 其中的key value是怎麼來的?constant?
    後面1/2又是什麼意思?在範例中的字串內容, 最後的#t1好像又跟1/2沒什麼關聯.

    謝謝

  2. Key 必須從 Flash swf 反組譯得到,hoyo 沒得到,因為反不出來 ...

    那個 1/2 是當初省略亂寫的,代表 token1 和 token2 ,已經把文件修改成更容易閱讀了。

  3. 你好
    想請問一下
    有辦法追到前幾天的紀錄
    把之前的內容載下來嗎

  4. 除非有提供相關的服務或選項,要不然是不可能的。

    真的喜歡該節目不妨直接和節目組聯絡,說不定會有額外驚喜呦... (瞎唬爛的)

  5. 沒有喔,剛剛 (2017-09-14 13:44) 測試還是可以的

  6. 那個 KEYS "據說"是某 standard 中的 test vector key
    hichannel 搞這一大圈,是想要留大家在他網頁上賺廣告費嗎 XDD

  7. 請問這個方法還有用嗎?我 run 了但是抓出來的 url 都是顯示 403 forbidden.

  8. 有用,不過最後的 m3u8 檔案名稱有更改,內容已經更新

    改天再寫一個 API 直接提供收聽網址好了

  9. 謝謝大大分享,確實可以用.
    另外 mplayer 記得要安裝.

  10. 你好,有辦法從https://hichannel.hinet.net/radio/index.do 取得某個廣播的串流ip嗎?
    謝謝

  11. 我不會,或者是不可能會知道

    試想,今天你直播到 youtube ,youtube 如果不特別提供,有辦法知道你推流的 ip 嗎?

  12. 你好,在ubuntu16可否用ffplay播放呢?使用您程式中ffmpeg指令播放出現 No trailing CRLF found in HTTP header,加上header參數後沒有錯誤訊息但沒有聲音,一樣環境使用ffplay播放mp3有聲音,可能還要甚麼參數嗎?
    謝謝

  13. Hoyo 沒那麼熱血用 Linux 來當作主力機,不用過 Windows 的 ffplay 播放 Hinet 的 m3u8 也是會有錯誤,不過是 SDL 的問題不是 HTTP Header 網路方面的
    有可能是連結網址需要更新,剛剛把提供網址的小工具更新了一下,請用新網址再試試看
    https://hoyo.idv.tw/?a=Tools/HinetRadio

  14. python3.5+我做了一些修正就可以執行,不過,瑕不掩瑜,it's working perfectly !

    def myIP():
    resp=urllib.request.urlopen('http://ipinfo.io/ip')
    html=resp.read()
    return html.strip().decode()
    def gen_token(path, timestamp, ip_addr, token_ord):
    const_str = 'radio@himediaservice#t'
    cat_str = path + str(timestamp) + ip_addr + const_str + str(token_ord)
    hashed = hashlib.md5(cat_str.encode(encoding='utf-8')).digest()
    b64_md5hash = base64.b64encode(hashed)
    return b64_md5hash.decode().replace('+', '-').replace('/', '_').replace('=', '')
    def build_radio_url(radioid="ra000040"):
    base_url = 'https://radio-hichannel.cdn.hinet.net/'
    ip_addr = myIP()
    path = '/live/pool/hich-{0}/ra-hls/'.format(radioid)
    expire1 = int(time.time())
    expire2 = expire1 + (60 * 60 * 8)
    params = OrderedDict([
    ('token1', gen_token(path, expire1, ip_addr, 1)),
    ('token2', gen_token(path, expire2, ip_addr, 2)),
    ('expire1', expire1),
    ('expire2', expire2)
    ])
    params_str = urllib.parse.urlencode(params)
    return urllib.parse.urljoin(base_url, path + 'hich-{0}-audio_track=128000.m3u8'.format(radioid)) + '?' + params_str

  15. 貓爸,可能是 WP 回覆有限制,所以程式碼被裁切,格式也跑掉了

    如果有網友有詢問到 py 3.5 的需求我再讓網友去問貓爸好了 哈哈哈

  16. 来自洛杉矶的你好。 对不起,我的中文很糟糕。 我可以获得频道9,但频道73(news98)不再有效。 我想知道为什么?

  17. 非常感谢你。 news98和ufo现在都很容易下载。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。