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不知道能用多久,且用且珍惜;不能用了我会尽力去修复,如果在我能力之外,就很难再挖到了。

暂无评论

发送评论 编辑评论


上一篇
下一篇