KBS直播直链获取API上线的折腾过程

KBS直播直链获取API上线的折腾过程

作为一个短波爱好者和广播爱好者,我比较喜欢收听境外的国际广播,因为没有广告,内容相较国内本地调频丰富充实;兼听则明,也能够听到跟国内不一样的声音,有助于独立思考。很多时候短波传播条件不好,在加上人为干扰和城市中的电磁干扰,直接从短波广播中获取内容变得越来越难;不在家中时也很难拿短波收音机去各处。

因此我收集了我常听的几个国际广播电台的直播串流,并把它们分享出来,这样只要有网络,我就能随时随地听直播了。

各家的直播源中,最难挖的当属KBS的直播源了。一开始,官网上通过F12根本找不到playlist.m3u8,最终是通过对比多个电台直播所使用的流媒体服务器,发现KBS和RTI使用的都是Wowza Media Server 3,才成功找到直播源的。

最近两个月,之前好不容易抓到的KBS源还是失效了,404了。或许是为了防止爬虫转录节目?现在从KBS官网上抓到的m3u8源都被加上了动态请求参数,几分钟内就会失效,刷新KBS官网,又会生成新的请求参数。而且这个参数是直接写从服务器动态写入HTML中的,并不是js请求后端接口得到的。想要拿到有效的动态请求参数,只能刷新网页,从网页上获取。但我需要的是一个m3u8直播源,能够直接从浏览器或播放器中播放,每次都要去KBS官网获取这个参数,再打开加上参数的m3u8直播源,就失去了挖直播源的意义了。

从官网挖

其实挖到这一步也不是很容易:KBS的整个播放器模块是通过Jquery加到页面中的,原始的http://world.kbs.co.kr/service/index.htm?lang=c中的源代码,关于播放器模块完全是一个空的div:

官网html页面源码

通过翻阅js文件,终于找到了一个“接口”:每次加载页面,都会通过Jquery向http://world.kbs.co.kr/service/inc/aod.htm?lang=c发起Ajax请求,获取到播放器的结构。

通过JS挖出“接口”

而动态生成的参数也是藏在http://world.kbs.co.kr/service/inc/aod.htm?lang=c中的,每次刷新都会返回一个不同的参数值。思路之一就是获取整个html文件,然后从里面解析出实时的直播源地址。

挖到的接口

从APP挖

然而我发现了KBS是有移动应用的,名字叫KBS WORLD Radio On-Air。这个APP肯定不会每次都得解析HTML页面,应该有一个专门的API接口给APP调用。能不能把这个API接口挖出来呢?答案是能。我装上了KBS WORLD Radio On-Air APP和HttpCanary,准备进行抓包,尝试抓包抓出来。导入https证书后,抓包进行的异常顺利,很轻松的就抓到了接口。只要是带上请求onair=truelang=c,就能返回正确的json数据。因为少带了几个参数,所以这样特征比较明显,以后咱们后期也可以把其他能带的参数都带上,伪装性更好。

从APP挖接口

继续点进去,就是这个啦!

APP中挖到的接口

我一开始的思路是用写一个Vue项目,接口对跨域做出了限制,因此可以使用Nginx开启一个反向代理来解决跨域问题。这样访客需要每次访问我的Vue项目,然后访问我的反向代理获取直播源。由于期末考试比较忙,这个工作就只能放到考试之后来做了。


考试结束后我突然想到了一点:为何不用PHP写一个小接口,用PHP向KBS的接口发起GET请求,然后用PHP对返回的json进行格式化,直接302返回获取到的最新直链源呢?这也每次只需要访问我的接口,就能返回官方直链源,这样可以很大的方便使用者,代码量应该也比创建一个Vue项目少得多。因此就有了现在的KBS直播直链获取API:https://xmgspace.me/api/kbs-stream
源代码在此,非常简单~

<?php
    $cdn = 0;//定义CDN参数
    if (isset($_GET['cdn'])){//判断是否传入CDN参数
        $cdn = $_GET['cdn'];
    }
    $url = "http://world.kbs.co.kr/ipod/radio/getAudioPlaylist.php?lang=c&onair=true";//KBS直播源官方API
    $result = file_get_contents($url);//使用PHP发起get请求,实际上就相当于下载文件,所以用file_get_contents
    $result_array = json_decode($result,true);//json解码,解码成普通的Object
    $play_url = $result_array["playurl"];//根据CDN值,返回不同URL
    if($cdn == 1) {
        $play_url = str_replace("http://live.world.kbs.gscdn.com/","https://bbx.xmgspace.me/radio/kbs/",$play_url);
    }
    header("Location:$play_url",true, 302);//返回302,不要返回301,301是永久重定向,302是临时重定向
    exit;
?>

KBS一向对直播源管理严格。我很早就想要挖出来,碍于当时技术太菜挖不出来;一年前通过类比阴差阳错,很不容易挖出来的直播源没用多长时间就挂掉了。这次挖出的API不知道能用多久,且用且珍惜;不能用了我会尽力去修复,如果在我能力之外,就很难再挖到了。

本文永久链接:https://blog.xmgspace.me/archives/get-kbs-stream.html
本文文章标题:KBS直播直链获取API上线的折腾过程
如文章内无特殊说明,只要您标明转载/引用自Xiaomage's Blog,您就可以自由的转载/引用文章。禁止CSDN/采集站采集转载。
授权协议:署名-非商业性使用-相同方式共享 4.0 国际(CC BY 4.0)

评论

  1. Bella
    Windows Chrome
    2周前
    2020-10-17 11:11:13

    你点开上述链接试听一下,然后跟官网或你提供的链接收听对比一下,就知道结果了。我这边都是实时内容,不是30秒的片段。

    • Xiaomage 博主
      Windows Edge
      2周前
      2020-10-18 9:32:42

      上面的那个链接是可以的,如果能用的时间长,还是会添加到直播源里的~ 当初挖的时候看着不是playlist.m3u8活着index.m3u8,就没有去深挖

  2. Bella
    Windows Chrome
    2周前
    2020-10-16 23:14:21

    测试了下,F12还是可挖的,http://live.world.kbs.gscdn.com/sec_cocotv/_definst_/CH00002/chunklist_w1055425798.m3u8?tid=e5991ddaffea7ec2cff8689d11aae3c0

  3. Bella
    Windows Chrome
    2周前
    2020-10-16 23:06:34

    对比了下,应该是实时内容,还是有效的。

  4. Bella
    Windows Chrome
    2周前
    2020-10-16 22:45:33
    • Bella
      Windows Chrome
      2周前
      2020-10-16 22:58:42

      汗,搞错了,不行。

      • Xiaomage 博主
        Windows Edge
        2周前
        2020-10-17 9:13:50

        不行的,这个是一个30秒的片段,任何时候打开都是同一段,不是直播源。一般直播源都是index.m3u8,playlist.m3u8之类的,官网上面加了参数,我这个直连获取的原理也是先利用官方的接口拿到这个动态参数,加到直播源后面的。

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇