前言

这几天收到很多回复,都是再说代码有问题,我很疑惑,经过反复几次回复我才知道,我的代码中一些关键的url被屏蔽掉了(imooc的网址),所以导致代码报错,我服了,所以我打算把代码放到压缩包里面.在这里

软件功能方面

linux平台上,软件可以下载imooc的视频并进行合成

windows平台需要ffmpeg并加入到环境变量里面

下面是原始文章

昨天心血来潮,突然想下载慕课网视频(免费视频),调试了几遍,得到了接口,接口很容易得到,只不过接口中的info字段是经过加密的,还有 m3u8的视频的AES-128秘钥也是经过加密的,还好他们用到的加密方法是一套,还不算费劲,后面我懒得写分析过程了(分析过程应该就属于浏览器调试的方法,后面我会单独出一篇文章)

慕课网的接口

{

"result": 1,

"data": {

"info": "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pTiPOMGyHRsJ",

"cdn": [

"aliyun",

"aliyun1",

"letv"

]

},

"msg": ""

}

这里面 info 里面字段就是加密(关于解密在后面)

这个url是获取 视频清晰度的, info字段就是3种清晰度的视频url

另外别的接口也都是有info字段的,所有的info字段都是经过加密的,主要的入口就是上面接口

获取视频的主要过程:

1.通过上面的接口——————返回3种清晰度视频的url

2.然后在请求其中一种清晰度url——————返回带有很多 .ts内容的url (其实就是相当于一个 index.m3u 文件,只不过也是将主要内容放到info字段进行加密了,是接口的形式,不是以文件的形式)

3.在第2步中返回值有秘钥的url(这个秘钥也是经过加密的放在info字段)请求这个秘钥url——————返回 秘钥在info字段中

4.请求多个ts文件并通过获取到的秘钥对ts视频进行解密

所以核心就是找到解密info的算法

解密info字段的js算法

简单调试找到了js的解密info的算法

function n(t, e) {

function r(t, e) {

var r = "";

if ("object" == typeof t)

for (var n = 0; n < t.length; n++)

r += String.fromCharCode(t[n]);

t = r || t;

for (var i, o, a = new Uint8Array(t.length), s = e.length, n = 0; n < t.length; n++)

o = n % s,

i = t[n],

i = i.toString().charCodeAt(0),

a[n] = i ^ e.charCodeAt(o);

return a

}

function n(t) {

var e = "";

if ("object" == typeof t)

for (var r = 0; r < t.length; r++)

e += String.fromCharCode(t[r]);

t = e || t;

var n = new Uint8Array(t.length);

for (r = 0; r < t.length; r++)

n[r] = t[r].toString().charCodeAt(0);

var i, o, r = 0;

for (r = 0; r < n.length; r++)

0 != (i = n[r] % 3) && r + i < n.length && (o = n[r + 1],

n[r + 1] = n[r + i],

n[r + i] = o,

r = r + i + 1);

return n

}

function i(t) {

var e = "";

if ("object" == typeof t)

for (var r = 0; r < t.length; r++)

e += String.fromCharCode(t[r]);

t = e || t;

var n = new Uint8Array(t.length);

for (r = 0; r < t.length; r++)

n[r] = t[r].toString().charCodeAt(0);

var r = 0,

i = 0,

o = 0,

a = 0;

for (r = 0; r < n.length; r++)

o = n[r] % 2,

o && r++,

a++;

var s = new Uint8Array(a);

for (r = 0; r < n.length; r++)

o = n[r] % 2,

s[i++] = o ? n[r++] : n[r];

return s

}

function o(t, e) {

var r = 0,

n = 0,

i = 0,

o = 0,

a = "";

if ("object" == typeof t)

for (var r = 0; r < t.length; r++)

a += String.fromCharCode(t[r]);

t = a || t;

var s = new Uint8Array(t.length);

for (r = 0; r < t.length; r++)

s[r] = t[r].toString().charCodeAt(0);

for (r = 0; r < t.length; r++) {

if (0 != (o = s[r] % 5) && 1 != o && r + o < s.length && (i = s[r + 1],

n = r + 2,

s[r + 1] = s[r + o],

s[o + r] = i,

(r = r + o + 1) - 2 > n)) {

for (; n < r - 2; n++) {

s[n] = s[n] ^ e.charCodeAt(n % e.length)

}

}

}

for (r = 0; r < t.length; r++)

s[r] = s[r] ^ e.charCodeAt(r % e.length);

return s

}

for (var a = {

data: {

info: t

}

}, s = {

q: r,

h: n,

m: i,

k: o

}, l = a.data.info, u = l.substring(l.length - 4).split(""), c = 0; c < u.length; c++)

u[c] = u[c].toString().charCodeAt(0) % 4;

u.reverse();

for (var d = [], c = 0; c < u.length; c++)

d.push(l.substring(u[c] + 1, u[c] + 2)),

l = l.substring(0, u[c] + 1) + l.substring(u[c] + 2);

a.data.encrypt_table = d,

a.data.key_table = [];

for (var c in a.data.encrypt_table)

"q" != a.data.encrypt_table[c] && "k" != a.data.encrypt_table[c] || (a.data.key_table.push(l.substring(l.length - 12)),

l = l.substring(0, l.length - 12));

a.data.key_table.reverse(),

a.data.info = l;

var f = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);

a.data.info = function(t) {

var e, r, n, i, o, a, s;

for (a = t.length,

o = 0,

s = ""; o < a;) {

do {

e = f[255 & t.charCodeAt(o++)]

} while (o < a && -1 == e);

if (-1 == e)

break;

do {

r = f[255 & t.charCodeAt(o++)]

} while (o < a && -1 == r);

if (-1 == r)

break;

s += String.fromCharCode(e << 2 | (48 & r) >> 4);

do {

if (61 == (n = 255 & t.charCodeAt(o++)))

return s;

n = f[n]

} while (o < a && -1 == n);

if (-1 == n)

break;

s += String.fromCharCode((15 & r) << 4 | (60 & n) >> 2);

do {

if (61 == (i = 255 & t.charCodeAt(o++)))

return s;

i = f[i]

} while (o < a && -1 == i);

if (-1 == i)

break;

s += String.fromCharCode((3 & n) << 6 | i)

}

return s

}(a.data.info);

for (var c in a.data.encrypt_table) {

var h = a.data.encrypt_table[c];

if ("q" == h || "k" == h) {

var p = a.data.key_table.pop();

a.data.info = s[a.data.encrypt_table[c]](a.data.info, p)

} else{

a.data.info = s[a.data.encrypt_table[c]](a.data.info)

}

}

if (e)

return a.data.info;

var g = "";

for (c = 0; c < a.data.info.length; c++)

g += String.fromCharCode(a.data.info[c]);

return g

}

简单测试一下这个加密算法是不是正确,在代码后面加上两句

a = n("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pTiPOMGyHRsJ")

console.log(a)

这个测试的内容就是第一个接口响应返回info中的内容

用node 运行一下结果

#EXTM3U

#EXT-X-VERSION:3

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=512000, RESOLUTION=1280x720

https://www.imooc.com/video/58ddf665e420e5315c8b461a/medium.m3u8?cdn=aliyun1&ssl=1&hxk_uri=aHR0cHM6Ly93d3cuaW1vb2MuY29tL3ZpZGVvLzU4ZGRmNjY1ZTQyMGU1MzE1YzhiNDYxYS9tZWRpdW0uaHhrP3RpbWVzdGFtcD0xNTY2MDkzMzYyJnRva2VuPWltb29jJTNBWWpSalpEVmtOMkkxTXpneU4yWXpObVU1T1dNM016TTVNREk0T1RNMU1qZG1OekF4WldReU13JTNEJTNE×tamp=1566093362&token=imooc%3AZDY1NzcyNWU1NDRmMWMzZWFlMDE3MTk2OTVkZDVhNTY2ODAzZjAwMg%3D%3D

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=384000, RESOLUTION=1280x720

https://www.imooc.com/video/58ddf665e420e5315c8b461a/medium.m3u8?cdn=aliyun1&ssl=1&hxk_uri=aHR0cHM6Ly93d3cuaW1vb2MuY29tL3ZpZGVvLzU4ZGRmNjY1ZTQyMGU1MzE1YzhiNDYxYS9tZWRpdW0uaHhrP3RpbWVzdGFtcD0xNTY2MDkzMzYyJnRva2VuPWltb29jJTNBWWpSalpEVmtOMkkxTXpneU4yWXpObVU1T1dNM016TTVNREk0T1RNMU1qZG1OekF4WldReU13JTNEJTNE×tamp=1566093362&token=imooc%3AZDY1NzcyNWU1NDRmMWMzZWFlMDE3MTk2OTVkZDVhNTY2ODAzZjAwMg%3D%3D

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=256000, RESOLUTION=720x480

https://www.imooc.com/video/58ddf665e420e5315c8b461a/low.m3u8?cdn=aliyun1&ssl=1&hxk_uri=aHR0cHM6Ly93d3cuaW1vb2MuY29tL3ZpZGVvLzU4ZGRmNjY1ZTQyMGU1MzE1YzhiNDYxYS9sb3cuaHhrP3RpbWVzdGFtcD0xNTY2MDkzMzYyJnRva2VuPWltb29jJTNBWWpSalpEVmtOMkkxTXpneU4yWXpObVU1T1dNM016TTVNREk0T1RNMU1qZG1OekF4WldReU13JTNEJTNE×tamp=1566093362&token=imooc%3AMzM2MjRjMDc1ODI0NjFkNDA0NjgwNjk4ZTc0NDEzNmFjOWQ2YzA2ZQ%3D%3D

可以看到已经解析出来3中清晰度视频的url了,可以说我用python调用node来完成info字段的解密,是完全没有问题的,但是总是感觉调用node不如使用完全的python好,所以我用python又实现了一遍这个算法,没错自从上次用python实现怎么学校的js(500多行)算法后,我就一发不可收拾了

python实现:enc.py(在压缩包里面)

python下载视频代码:api.py(在压缩包里面)

这段代码我挺满意的,因为里面的函数返回值都是像接口一样封装的,我用到的下载视频功能只是调用了每个函数的返回值中的一小部分,还有很多有用的信息我也都提取出来了,这里的main函数就相当于一个测试示例, 提供一个url就可以下载一个视频下面所有小节的视频了,如果这篇文章帮到你,可以给我个评论,谢谢,因为完成这个算法真的花费了我很大的力气

python下载是免费的吗-关于python下载imooc的免费视频的方法相关推荐

  1. python基础教程第三版电子版百度云-《python基础教程第三版》高清版PDF免费下载...

    下载地址1:http://t.cn/EGxO1sW Python基础教程 第3版Python简明教程书籍 Python编程从入门到实践 灵程序设计丛书 <python基础教程第三版>高清版 ...

  2. python经典100例答案pdf-Python 入门 100 案例,PDF免费下载

    原标题:Python 入门 100 案例,PDF免费下载 大家好,我是振哥.在过去一年多时间,我先后打磨了几个Python类开源教程.所有教程力求通俗易懂,有趣,并结合一个一个的小例子.小案例讲解,让 ...

  3. python基础教程第三版电子版-《python基础教程第三版》PDF高清完整版-免费下载...

    <python基础教程第3版>高清PDF下载地址:http://t.cn/EGxO1sW Python基础教程 第3版Python简明教程书籍 Python编程从入门到实践 灵程序设计丛书 ...

  4. python编程免费小说_使用Python开发小说下载器,不再为下载小说而发愁

    有点荒废 这几天有点荒废,之前弃坑的网文<伏天氏>,这几天又给捡起来了.然后一发不可收拾的只想看小说,荒废了我的学习.在这里我要检讨啊..... 像我这样的穷人,看小说肯定是找免费的网站, ...

  5. Python学习工具第五期 — 免费使用,无须激活下载安装Pycharm教程

    Python学习工具第四期 - 免费使用,无须激活下载安装Pycharm教程 上一期我们详细介绍了Anaconda的下载.安装以及如何管理环境和软件包管理常用命令和操作,这期我们来介绍一下学生如何通过 ...

  6. 自从学会Python后,无视百度文库VIP,所有文档免费下载阅读

    最近要用到百度文库查资料,但是很多都需要付费VIP或者下载券,还不能复制,就有点苦逼! 还好小编会Python,在Python面前真的所有VIP都是小意思,啥视频网站,资料网站等等,统统无视收费机制! ...

  7. python·pygame小游戏--中国象棋(原码附上,免费下载)

    大家好我是小豪,今天给大家带来的是pygame小游戏-中国象棋 因为看到博客上面很多上传了的中国象棋py文件,都是收费的.所以我大胆的上传个免费的-已经把原码上传了,感兴趣的可以去下载. pygame ...

  8. 学习Python 免费电子书 TOP10(含下载)

    Python电子书 <简明 Python 教程> 中文版 <Python学习手册> <Python语言入门> <Learning Python>第5版 ...

  9. python视频教程从入门到精通全集-python从入门到精通视频(全60集)免费高速下载...

    Python是一种面向对象.解释型计算机程序设计语言,由 Guido van Rossum 于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU Gene ...

  10. python 由入门到精通,CHM格式文档手册免费下载

    本 Python参考手册手册非正式的向读者介绍了 Python 语言及其体系相关的基本知识与概念. 在学习实践中结合使用 Python 解释器是很有帮助的,不过所有的例子都是完整的,所以本手册亦可离线 ...

最新文章

  1. 《Visual Studio Hacks 》(十)
  2. JDK 11 马上就要来了!JDK 12 还会远吗?
  3. 如果能够让出资人了解更多的c++项目进程
  4. Python《搞事情==蜂-鸟-图-片(二)》
  5. linux内存管理:kmap、vmap、ioremap
  6. 网络通信协议八之UDP协议详解
  7. 加一度分享5大竞价经验,让流量更大更精准
  8. 2017级C语言大作业 - 合金弹头
  9. vue3.0 axios 引入及使用
  10. linux安全检查与加固报告,linux安全加固文档分析.doc
  11. 蓝宝石rx580怎么超频_吃鸡显卡优化差 只能用这个办法解决了
  12. 架构之美第八章-软件架构的含义
  13. 智能机器人机器人心得_你是机器人吗
  14. 手把手教你配置阿里云服务器搭建网站
  15. c语言龟兔赛跑程序,c语言龟兔赛跑
  16. label smooth标签平滑【ConvE(知识图谱补全-链接预测)中使用到】
  17. HEVC视频扩展解决方法
  18. 一切就绪,2019年新型智慧城市峰会将展现怎样的“新益阳”
  19. Python面向对象基本概述
  20. 如何使用DPABI 进行核磁共振数据结果统计分析?

热门文章

  1. 阿里国际站运营的核心指标是什么?
  2. Verilog分频器的设计(6分频和1.5分频)
  3. FPGA:偶分频、奇分频
  4. BAT文件的编写及使用
  5. python学后总结_学员 | 斥巨资学完数据分析后,给大家总结了7个小建议
  6. android 里面的颜色的RGB
  7. Oracle X$BH
  8. 诗鬼李贺:只活27岁,让我们争吵千年
  9. 算法复杂度 hdu1425
  10. 免费录屏软件有哪些?录屏软件下载,认准这3款软件