软件和源码

前言

之前写过一片文章: 关于突破咪咕视频付费限制的研究, 但是后来我发现评论说已经不能用了,我知道肯定是api修改了,写这种东西就是这样,不一定什么时候就变化了,然后就用不了了,我懒得继续维护了,但是为啥我现在又发了这篇文章呢?因为我用到了我之前写的软件(也是想水一片文章),所以花点时间研究了一下这次更新后的api
这次我会详细说明过程,有兴趣的可以研究研究。

这次修改后除了付费的看不了,其它功能和原来的软件功能一样,付费的看不了可能是因为后台加入cookie认证,因为我发现访问是404。

接口

接口还是和之前的一样 https://webapi.miguvideo.com/gateway/playurl/v3/play/playurl?contId=608807416&rateType=3&startPlay=true
返回:

urlInfo": {
"urlType": "tourist",
"url": "http://h5live.gslb.cmvideo.cn/migu/kailu/20200324/cctv4meihd/50/index.m3u8?msisdn=202107310205404d3783e723ed4d848d9320848e0d6def&mdspid=&spid=699004&netType=0&sid=2200179344&pid=2028597139&timestamp=20210731020540&Channel_ID=0116_25000000-99000-100300010010001&ProgramID=608807416&ParentNodeID=-99&assertID=2200179344&client_ip=60.17.111.77&SecurityKey=20210731020540&mvid=2200179344&mcid=500020&mpid=&playurlVersion=SJ-A1-4.7.1&userid=&jmhm=&videocodec=h264&bean=mgsph5&puData=30420c934501c1ee12542c78a90a8e16",
"mediaType": "12",
"usageCode": "50",
"codeRate": "75",
"mediaSize": 0,
"rateDesc": "标清 540P",
"contId": null,

访问这个 url 发现返回的是空白,所有问题就是出在这里,正常的情况下这里应该返回一个 m3u8链接地址(在加入crossdomain=www参数后,不是标准m3u8串流格式,而是以文本形式返回的,我原来的软件中加入了crossdomain=www)。
所以关键就是解决这个问题

用浏览器打开https://www.miguvideo.com/mgs/website/prd/detail.html?cid=608807416 通过 浏览器的 开发者工具 抓包这个url 应该为 https://gslbmgsplive.miguvideo.com/migu/kailu/20200324/cctv4meihd/51/index.m3u8?msisdn=0a4020443d8d2dc2a981f89b864a9eba&mdspid=&spid=699004&netType=0&sid=2200179344&pid=2028597139&timestamp=20210731020939&Channel_ID=0132_10010001005&ProgramID=608807416&ParentNodeID=-99&assertID=2200179344&client_ip=60.17.111.77&SecurityKey=20210731020939&mvid=2200179344&mcid=500020&mpid=&playurlVersion=SJ-A1-4.7.1&userid=&jmhm=&videocodec=h264&bean=mgspwww&puData=f9178e1694798e5c9aaf409e856cdad8&ddCalcu=8fd9ea13d78c816e5186e9940749f8aea59c&crossdomain=www

我采用在其他浏览器打开这个 url 发现依然可以返回m3u8链接地址,这就说明不是 cookie 验证,那么就应该检查请求头中的差距或者请求参数上的差距。

将浏览器抓包的这个 url 与我们通过接口获得的 url 参数进行对比发现:我们抓包得到的 url 多了一个参数 ddCalcu, 我们需要知道这个是如何产生的:

遇到这种情况,肯定选择 pcPlayer.js, 而不选 带 vue(vue是js的一个框架),这种逻辑不可能在框架里。 进入后格式化js(点击左下角的**{}**),然后搜索 ddCalcu :

一下子就找到了这个函数,简单阅读其逻辑得知 参数ddCalcu 是由其它几个参数 经过这个算法得到的,到此问题几乎已经解决了,剩下的就是用 python 仿写这部分逻辑了。

python 仿写:

from urllib import parse

def ddCalcu(url):
new_url = parse.urlparse(url)
para = dict(parse.parse_qsl(new_url.query))
userid = para.get("userid","")
timestamp = para.get("timestamp","")
ProgramID = para.get("ProgramID","")
Channel_ID = para.get("Channel_ID","")
puData = para.get("puData","")
t = userid if userid else "eeeeeeeee"
r = timestamp if timestamp else "tttttttttttttt"
n = ProgramID if ProgramID else "ccccccccc"
a = Channel_ID if Channel_ID else "nnnnnnnnnnnnnnnn"
o = puData if puData else ""
if not o:
return url
s = list("2624")
u = list(t)[int(s[0])] or "e"
l = list(r)[int(s[1])] or "t"
c = list(n)[int(s[2])] or "c"
f = list(a)[len(a)-int(s[3])] or "n"
d = list(o)
h = []
p = 0
while p*2 < len(d):
h.append(d[len(d)-p-1])
if p < len(d) - p -1:
h.append(o[p])
if p == 1:
h.append(u)
if p == 2:
h.append(l)
if p == 3:
h.append(c)
if p == 4:
h.append(f)
p += 1
v = "".join(h)
return url + "&ddCalcu=" + v if __name__ == '__main__':
url = "http://h5live.gslb.cmvideo.cn/migu/kailu/20200324/cctv4meihd/50/index.m3u8?msisdn=20210731022935c8b943821c7c432faed138160dd0b77f&mdspid=&spid=699004&netType=0&sid=2200179344&pid=2028597139&timestamp=20210731022935&Channel_ID=0116_25000000-99000-100300010010001&ProgramID=608807416&ParentNodeID=-99&assertID=2200179344&client_ip=60.17.111.77&SecurityKey=20210731022935&mvid=2200179344&mcid=500020&mpid=&playurlVersion=SJ-A1-4.7.1&userid=&jmhm=&videocodec=h264&bean=mgsph5&puData=4484cda45d696504453b9dc809dd5599"
new_url = ddCalcu(url)
print(new_url)

将从接口获得的 url地址 付给这个 url变量, 然后执行python 脚本,返回新的url, 用postman 测试一下:


发现已经可以正常返回 m3u8 url 了,问题解决, 剩下的就是将这部分逻辑整合回我原先写的软件里面,我就不详细说了。

其它

python 仿写部分:

a = Channel_ID if Channel_ID else "nnnnnnnnnnnnnnnn"

也可以这样写:

a = Channel_ID or "nnnnnnnnnnnnnnnn"

只不过我之前发现了 python 中有所谓的等价三元运算符的if else这种写法,所以想用这种写法练练手。

关于咪咕视频的m3u8再次解析的更多相关文章

  1. 将视频插入视频:CVPR2019论文解析

    将视频插入视频:CVPR2019论文解析 Inserting Videos into Videos 论文链接: http://openaccess.thecvf.com/content_CVPR_20 ...

  2. python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频

    最近发现一些网站,可以解析各大视频网站的vip.仔细想了想,这也算是爬虫呀,爬的是视频数据. 首先选取一个视频网站,我选的是 影视大全 ,然后选择上映不久的电影 “一出好戏” . 分析页面 我用的是c ...

  3. .ts 视频文件 .m3u8视频文件合并 转换为mp4

    1. 先把 .m3u8.zip 格式文件解压到文件夹D:\a. 2. 将文件夹内的 .ts文件名处理好. 一般均为按顺序排列. (殊情况需要根据.m3u8文件记录处理.) 举例,根据实际情况处理. ( ...

  4. HLS -- m3u8档案格式解析

    1. Playlist file 一个M3U的 Playlist 就是一个由多个独立行组成的文本文件,每行由回车/换行区分.每一行可以是一个URI.空白行或 是以”#“号开头的字符串,并且空格只能存在 ...

  5. FastJson将json解析成含有泛型对象,内部泛型对象再次解析出错的解决办法(Android)

    折腾小半天的问题,这里先感谢一下深圳的小伙子,远程帮我搞,虽然也没有搞出来==========FUCK 声明:Android开发下发生此异常,Java开发下并不会有这个问题 异常重现 简单说一下抛出异 ...

  6. CrackMe005-下篇 | 逆向破解分析 | 160个CrackMe(视频+图文)深度解析系列

    作者:逆向驿站微信公众号:逆向驿站知乎:逆向驿站 CrackMe005,上篇说了具体方法,下篇来发逆向分析过程,看看老夫是如何得到上篇的具体方法的! 准备 [环境和工具] win7/xp虚拟机环境 C ...

  7. 利用selenium和ffmpeg爬取m3u8 ts视频《进击的巨人》

    需求 想看下动漫<进击的巨人>,发现到处被和谐,找不到资源,但是在一个视频网站找到了在线播放,https://www.55cc.cc/dongman/17890/player-2-1.ht ...

  8. 打造m3u8视频(流视频)下载解密合并器(kotlin)

    本文是对我原创工具m3u8视频下载合并器关键代码解析及软件实现的思路的讲解,想要工具的请跳转链接 1.思路说明 思路挺简单,具体步骤如下: 下载m3u8文件 解析m3u8文件获得ts文件列表 根据文件 ...

  9. iiiLab提供的视频解析接口如何使用?转发个简单的使用教程

    iiiLab除了提供免费的在线视频解析下载工具,还提供了视频解析接口供有需要的个人和公司调用. iiiLab目前已支持解析下载今日头条.西瓜视频.内涵段子.微博.秒拍.小咖秀.晃咖.火山.快手.抖音. ...

  10. 【视频】ffmpeg mov mp4 m3u8 ts

    1.https://ffmpeg.zeranoe.com/builds/ 2.https://blog.csdn.net/psh18513234633/article/details/79312607 ...

随机推荐

  1. RabbitMQ之消息模式简单易懂,超详细分享~~~

    前言 上一篇对RabbitMQ的流程和相关的理论进行初步的概述,如果小伙伴之前对消息队列不是很了解,那么在看理论时会有些困惑,这里以消息模式为切入点,结合理论细节和代码实践的方式一起来学习. 正文 常 ...

  2. C#,根据路径获取某个数字开头的所有文件夹,并获取最新文件夹进行替换文件

    项目需求获取某路径下为1开头文件夹,并替换最新文件夹内容,话不多说,上代码 private void Form1_Load(object sender, EventArgs e) { try { st ...

  3. 【gRPC】C++异步服务端优化版,多服务接口样例

    官方的C++异步服务端API样例可读性并不好,理解起来非常的费劲,各种状态机也并不明了,整个运行过程也容易读不懂,因此此处参考网上的博客进行了重写,以求顺利读懂. C++异步服务端实例,详细注释版 g ...

  4. 使用kubeoperator安装k8s集群时自带的traefik-ingress-controller

    前提 承接上一篇文章:https://www.cnblogs.com/sanduzxcvbnm/p/15740596.html traefik-ingress-controller和nginx-ing ...

  5. ssh访问控制,阻断异常IP,防止暴力破解

    文章转载自:https://mp.weixin.qq.com/s/oktVy09zJAAH_MMKdXjtIA 由于业务需要将Linux服务器映射到公网访问,SSH 端口已经修改,但还是发现有很多IP ...

  6. 存储卷PersistentVolume

    概述 与管理计算资源相比,管理存储资源是一个完全不同的问题.为了更好的管理存储,Kubernetes 引入了 PersistentVolume 和 PersistentVolumeClaim 两个概念 ...

  7. [题解] Codeforces 1548 C The Three Little Pigs 组合数学,生成函数

    题目 首先令\(x=i\)时的答案为\(f_i\) ,令\(f_i\)对应的普通生成函数为\(F(x)\). 很容易发现\(F(x)=\sum_{i=0}^n (1+x)^{3i}\),sigma是在 ...

  8. 洛谷P1884 [USACO12FEB]Overplanting S (矩形切割)

    一种矩形切割的做法: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const in ...

  9. 实例分析Scheduled Thread Pool Executor与Timer的区别

    摘要:JDK 1.5开始提供Scheduled Thread PoolExecutor类,Scheduled Thread Pool Executor类继承Thread Pool Executor类重 ...

  10. rowkey设计原则和方法

    rowkey设计首先应当遵循三大原则: 1.rowkey长度原则 rowkey是一个二进制码流,可以为任意字符串,最大长度为64kb,实际应用中一般为10-100bytes,它以byte[]形式保存, ...