[m3u8]解析某个视频网站播放

m3u8视频格式,其实请求下来的是一个文本,里面记载了一串ts视频片段以及时间戳;有些还包含视频加密的key。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-KEY:METHOD=AES-128,URI="http://hls.videocc.net/8b0a2fa267/0/8b0a2fa267c027bc31a2675e51780d00_2.key?pid=1529814332630X1997867&ts=1529814332000&sign=98271bf3deabebb179b9d0476a30f123&ms=5d88e9afe50d7c8248b52b26c15ef328",IV=0xae98961dd802f860ae9b67dd75136a18
#EXT-X-TARGETDURATION:13
#EXTINF:5.080000,
http://ab-mts.videocc.net/8b0a2fa267/48/1527235156000/0/78/0d/00_2/8b0a2fa267c027bc31a2675e51780d00_2_0.ts?pid=1529814332630X1997867&ts=1529814332000&sign=5d88e9afe50d7c8248b52b26c15ef328
#EXTINF:5.000000,
http://ab-mts.videocc.net/8b0a2fa267/48/1527235156000/0/78/0d/00_2/8b0a2fa267c027bc31a2675e51780d00_2_1.ts?pid=1529814332630X1997867&ts=1529814332000&sign=5d88e9afe50d7c8248b52b26c15ef328
#EXTINF:10.000000,
http://ab-mts.videocc.net/8b0a2fa267/48/1527235156000/0/78/0d/00_2/8b0a2fa267c027bc31a2675e51780d00_2_2.ts?pid=1529814332630X1997867&ts=1529814332000&sign=5d88e9afe50d7c8248b52b26c15ef328
#EXTINF:10.000000,
http://ab-mts.videocc.net/8b0a2fa267/48/1527235156000/0/78/0d/00_2/8b0a2fa267c027bc31a2675e51780d00_2_3.ts?pid=1529814332630X1997867&ts=1529814332000&sign=5d88e9afe50d7c8248b52b26c15ef328
#EXTINF:10.000000,
http://ab-mts.videocc.net/8b0a2fa267/48/1527235156000/0/78/0d/00_2/8b0a2fa267c027bc31a2675e51780d00_2_4.ts?pid=1529814332630X1997867&ts=1529814332000&sign=5d88e9afe50d7c8248b52b26c15ef328
#EXTINF:10.000000,
http://ab-mts.vid+eocc.net/8b0a2fa267/48/1527235156000/0/78/0d/00_2/8b0a2fa267c027bc31a2675e51780d00_2_5.ts?pid=1529814332630X1997867&ts=1529814332000&sign=5d88e9afe50d7c8248b52b26c15ef328
#EXTINF:12.760000,
http://ab-mts.videocc.net/8b0a2fa267/48/1527235156000/0/78/0d/00_2/8b0a2fa267c027bc31a2675e51780d00_2_6.ts?pid=1529814332630X1997867&ts=1529814332000&sign=5d88e9afe50d7c8248b52b26c15ef328
#EXTINF:0.200000,
http://ab-mts.videocc.net/8b0a2fa267/48/1527235156000/0/78/0d/00_2/8b0a2fa267c027bc31a2675e51780d00_2_7.ts?pid=1529814332630X1997867&ts=1529814332000&sign=5d88e9afe50d7c8248b52b26c15ef328
#EXT-X-ENDLIST

某个视频网站只提供在线播放,并且只能用它的js播放,通过请求ts和sign以及验证parent.origin来源限制domain是视频拥有者设置好的域名来源。

原本计划拿到视频vid,可以直接请求ts和sign,再本地改改hosts映射就可以播放了;
后来想了一下,m3u8视频播放是一个公用标准,应该将key和ts片段下载了,就能自建server播放。
So,试试看。

1、首先在Github上淘一淘,有hls.js:
https://video-dev.github.io/hls.js/docs/html/
噢,居然还有m3u8的python解析:
https://github.com/globocom/m3u8
这下播放和修改m3u8替换url都方便了。
2、计划任务:
通过mitmproxy代理,获取svideoid的列表,是json数据;
通过svideo得到sign、ts
构建m3u8的下载地址,还需要生成pid

    e.getPid = function t() {
        var e = new Date;
        var t = e.getTime() + "";
        var n = parseInt(Math.random() * 1e6 + 1e6) + "";
        var i = t + "X" + n;
        if (typeof updatePid == "function") {
            updatePid(i)
        }
        return i
    }

下载原生的m3u8文件后,用上面的工具解析,然后替换url,保存到自己server的路径;
下载每一条ts文件,保存到自定义路径;
这里可以用video的唯一编码来作为文件夹,以清晰度为文件名前缀,ts分片索引保存;
3、数据到位之后,编写html播放页面

<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<!-- Or if you want a more recent canary version -->
<!-- <script src="https://cdn.jsdelivr.net/npm/hls.js@canary"></script> -->
<video id="video"></video>
<script>
  var video = document.getElementById('video');
  if(Hls.isSupported()) {
    var hls = new Hls();
    hls.loadSource('https://video-dev.github.io/streams/x36xhzz/x36xhzz.m3u8');
    hls.attachMedia(video);
    hls.on(Hls.Events.MANIFEST_PARSED,function() {
      video.play();
  });
 }
 // hls.js is not supported on platforms that do not have Media Source Extensions (MSE) enabled.
 // When the browser has built-in HLS support (check using `canPlayType`), we can provide an HLS manifest (i.e. .m3u8 URL) directly to the video element throught the `src` property.
 // This is using the built-in support of the plain video element, without using hls.js.
 // Note: it would be more normal to wait on the 'canplay' event below however on Safari (where you are most likely to find built-in HLS support) the video.src URL must be on the user-driven
 // white-list before a 'canplay' event will be emitted; the last video event that can be reliably listened-for when the URL is not on the white-list is 'loadedmetadata'.
  else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    video.src = 'https://video-dev.github.io/streams/x36xhzz/x36xhzz.m3u8';
    video.addEventListener('loadedmetadata',function() {
      video.play();
    });
  }
</script>

经过自建Server的验证,确实key文件和ts文件内容是不变化的,可以下载下来播放;
那么只剩下一个问题:如果从videoId找到m3u8的下载地址?需要研究一下该网站的视频播放器js文件了,筛选可疑的代码如下:

        function Y(t) {
            var n = (new Date).getTime();
            var r = o.vid + n + "polyv";
            var a = CryptoJS.MD5(r);
            var s = "";
            if (o.hlstest) {
                s = i + "hlstest.videocc.net/event/switch_bitrate?sign=" + a + "&ts=" + n + "&vid=" + o.vid + "&mt=" + o.ts + "&ms=" + o.sign
            } else {
                s = i + "hls.videocc.net/event/switch_bitrate?sign=" + a + "&ts=" + n + "&vid=" + o.vid + "&mt=" + o.ts + "&ms=" + o.sign
            }
            e.ajax({
                url: s,
                dataType: "text",
                success: function(e) {
                    if (e == "success") {
                        var n = J(function(e) {
                            t.src = e;
                            t.play()
                        })
                    }
                },
                error: function() {}
            })
        }

这里的i是http协议

            var i = "http://";
            if (window.location.protocol == "https:") {
                i = "https://"
            }

通过Postman发送构建的m3u8的url,视频文件url居然都是相同的层级,OK,这下都不用查找m3u8真实地址了,直接修改videoId即可。
开始编写Python代码:
1、解析VideoList中的svideoId字段
2、获取该svideoId的当前ts、sign
3、构建m3u8下载地址,下载m3u8文本,修改url并存到指定路径
4、下载m3u8中的ts片段,并存到指定路径
5、创建模板html,建立title到svideoId的超链接,点击即可播放。

[转载][人民日报]北京:非京牌车要管起来

北京:非京牌车要管起来
本报记者 朱竞若 王昊男

街头驶过 9 台小轿车,就可能有一台是非京牌的,这就是当下的北京。
数据显示:截至今年4月,北京全市机动车保有量,即北京号牌的机动车达596.8万辆;而目前平均每周,6环内通过办理“进京证”在京使用的外地号牌车辆超70万辆。
北京对非京牌车要不要管起来?这个问题,争论多年。现在,外地车的过度增长 ,“进京证”演变为不用摇号的日常行驶证的现实,使“政府该出手”渐成各界共识。
要不要管?
到了非管不可的时候了
70万辆是什么概念?相当于香港全部汽车保有量。
北京外地车牌高速增长,一是源自本地市民内需,绕过摇号得方便。据北京市交管局统计,这种情况约占总量的15.67%。
“中签太难了,外地牌照办起来简单还不贵。”北京地铁4号线的终点,紧邻北五环。周边几个停车场 ,已停满了车,冀、蒙、晋、豫 ……各地车牌随处可见。开河北牌照车的熊先生告诉记者,2016年,通过熟人介绍,他花4500元办了一张河北牌照,成为有车一族。
据记者了解,目前北京代办外地牌照市场很活跃,根据地域和获得牌照时间不同,一般收费5000元到6000元不等,甚至有些4S店也提供此类服务。
更多的使用者,是在北京打拼的外地人。在老家买个车,开到北京用。
2015年,北京市日均办理车辆进京通行证达5万张。2016年5月,北京市公安局交管局出台便民措施,规定外地客车通过“北京交警”APP,在网上就能办理“进京证”,持电子凭证就可行驶。此后,日均办证迅速增长到10万张以上。2017年以来,平均每周办理72.5万张。
摇不到号的“刚需”,扎根北京的“北漂”;上外地牌门槛低,违法上路成本低。高需求与低成本叠加,在诸多因素的影响下,外地车在北京有了生长的土壤。
据介绍,如果算上北京未加限制的六环外的车辆,在京的非京牌车,实际总数达到100多万辆的惊人数量。作为超大型城市,交通问题没法回避,也不能回避,所以,这一问 题已到了非管不可的时候了。
该不该管?
相关管理措施呼之欲出
机动车调控有序、“进京”无序的现状,必须改变。记者在采访中了解到,北京市政府在倾听各方意见、经过反复论证后,相关管理 措施已呼之欲出。
“进京证”的使用,始于 1973 年,是为了方便进京办事的外地车辆,属于行政许可事项。现在,数量庞大的“进京证”已变了味。
一是挑战摇号政策,影响社会公平“。在京长期使用外地车的情况如此普遍,已经对北京市小客车数量调控暂行规定》政策的执行构成挑战。”一位北京市政协委员告诉记者。
“北京有限的道路资源和城市承载能力 决定了对机动车进行调控是必须的,也是世 界大城市管理的共同措施。”交通运输部公路 科学研究院首席工程师袁茂存说。按照《北京市“十三五”时期交通发展建设规划》和《北京市城市总体规划实施工作方案(2017 年— 2020年)》要求,到2020年底,北京全市机动 车保有量要控制在 630 万辆以内。这是从城市发展和资源承受能力等多方面考虑提出的硬指标。
二是影响大气污染治理硬措施。进入 2018 年,北京机动车排放已成为 PM2.5 的最 大“贡献”者;而 100 多万辆车的计划外贡献, 极大地增加了治理难度。
三是停车难矛盾增加。机动车年均增长 远高于道路建设里程的增速,按在册数统计,北京城镇地区居住停车位缺口总数高达 129 万。“我们小区停车位本来就紧张,现在还有很多外地牌照的汽车长期不上路占着车位。” 家住海淀区的刘女士说。
在近两年的北京市两会上,不断有代表委员提出强化外地车辆管理的建议。社会公众问卷调查显示,93%的北京市民支持加强 外地车辆管控。
怎么管?
宽严相济,刚性政策,柔性执行
对这么多“本地化”的非京牌车辆,怎么管起来,确实是个难题。
记者了解到,为了制定管理政策,北京市政府有关部门听取各方面意见,深入了解群众的实际困难,诸如用车者孩子上学、老人看病等实际需求。因此,即将推出的新政策,将是一个管理目标明确、又宽严相济的措施。
所谓宽,就是考虑到汽车是个大件,将给 足市民处置时间。据了解,管理措施发布后,会有一个一年半左右的过渡期,过了过渡期,才会限制使用。
所谓严,就是未来将限制每台车每年在京通行时间,就是一年只能申请几次“进京证”,不能无限制使用。而停放,也有细致规定,纳入限制。而北京市的交通管理系统也会升级,电子眼的功能将多样化。总之,“随便买,无限用”,是不可能了。原来的非京牌有车族,要早做打算。
与此同时,北京市正进一步加大公交、轨道交通建设力度,以多种措施服务市民出行。