我承认,我真的是个腾讯云的重度爱好者,谁叫他这么多云产品都是免费的呢,阿里云的价格我一个穷学生真是用不起。
今天在腾讯云发现了云函数,还有不少的免费额度,想尽办法也要薅薅羊毛。恰好赶上网友给我分享了一个爱奇艺和优酷的视频解析接口,是大佬自研并分享的。所以,我也在想要不要研究一下视频网站的接口,以云函数的形式在网页上分享。

考虑到爱奇艺优酷腾讯三家的技术实力实在太强,我这个初入茅庐的小白还是不要自不量力了,准备从芒果TV这个第四大视频平台入手。
· 芒果TV
先随便打开个视频网页,再F12一下,直接过滤m3u8关键字。

哇塞,真的是没啥技术实力啊,直接返回当前视频的M3U8连接,要是单纯的为了下载,目的就已经达到了,简直是分分钟的事情啊。
可如果要是制作接口的话,就要考虑各个清晰度的问题,还要找到片名等信息,一定要找到芒果服务器的接口才行。
那就换一种打开方式,过滤api关键字,简直不要太友好啊,接口命名太人性化了。
https://pcweb.api.mgtv.com/video/info?vid=xxx&cid=xxx&_support=10000000&callback=json

通过这个接口,可以直接获取到视频信息的json文档,我的接口只需这三个参数即可。
剧集名:dict[‘data’][‘info’][‘videoName’]
专辑名:dict[‘data’][‘info’][‘title’]
视频时长:dict[‘data’][‘info’][‘time’]
再往下翻一翻,情不自禁的笑出了声,这也太明显了吧,小学英语的难度
https://pcweb.api.mgtv.com/player/getSource?

测试一下,只需将stream_domain中的网址和清晰度中的url进行拼接,访问该网址返回的是json文档,文档中即为所求的M3U8连接。
这下四个清晰度的M3U8连接都能直接获取到了,剩下的就只需研究怎么获取getSource的方法了。这个接口只需pm2,tk2,video_id和type四个参数,其中只有pm2和tk2是未知的。
那就再过滤这两个关键字就好,过滤pm2,貌似没什么有效文件,再过滤tk2,发现了疑似文件,https://pcweb.api.mgtv.com/player/video?did=……
点开一看,又是个json文档。

佩服佩服,这两个参数竟然还同时给出来,哪怕分成两个接口分别返回呢,不然这样又有什么意义呢?实在是搞不懂芒果的操作。
分析这个这个接口,发现只有uuid和tk2两个未知参数,其中uuid是cookies中的__STKUUID,通过多次测试,该参数并无变化,所以认为该参数无需计算。
而这个tk2参数真的是找不到了,那就只能到js文件中找一下生成方法了,在vplayer.min.js文件中,发现了如下语句
![]()
根据大意,转换成python语句,

最后再将各参数,打包cookies以及header等,通过get的方式访问,再加个循环,最终即可获取到各清晰度M3u8信息,最终通过json的形式进行保存即可。
· 腾讯云函数SCF
之后的工作就是将该函数上传至腾讯云,这个过程也是有些繁琐的。
新建一个空白的HelloWord函数,将已有的函数代码粘贴至main_handler(event, context)函数下,即可正常执行。

由于还涉及到参数传递问题,需要绑定API网关,其中可以选择多项方式传递参数,我选择了最简单明了的通过url路径的方式传递待解析的视频网址。

而后,要通过main_handle()函数中的参数event获取通过url路径传输的参数,具体的方式参见event的接口信息,文档还是很清晰明了的。

至此,一个基于腾讯云函数的芒果TV视频解析接口已经实现,难度不算太大,非常建议手动尝试一遍,完成之后的满足感令人身心十分愉悦。
· 后记
需要特别说明的是,腾讯云函数的返回数据会以json格式进行格式化,而且还是以Unicode的格式,因而导致无法直接在网页上显示中文字符,所以我的接口是以Base64格式进行编码,对于想要直接获取M3U8的人而言真的是不太友好,毕竟涉及到视频名等不可避免的中文字符,也只能出此下策了。此处必须手动@腾讯云团队,希望能够尽快支持返回数据编码格式可选功能。
以上所提及的方法,都是需要伴随着芒果TV会员用户的Cookies完成的,如果想纯白嫖,那还是凑合着用我的接口吧。
最后的最后,以上仅供交流学习,请勿用于非法用途,侵删。
-
相关资料
