如何在不查看m3u8文件的情况下,解析i春秋平台的Python爬虫加密的m3u8文件?

2026-05-21 14:291阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计850个文字,预计阅读时间需要4分钟。

如何在不查看m3u8文件的情况下,解析i春秋平台的Python爬虫加密的m3u8文件?

@[toc] 🌟 实战场景 & 本次实战目标站点:https://www.ichunqiu.com/courses/qmxc随机选择一门课程点击播放,然后通过开发者工具获取视频文件地址。本次测试的课程ID与地址为:ht...

@[toc]

⛳️ 实战场景

本次实战目标站点为 www.ichunqiu.com/courses/qmxc,随机寻找一门课程点击播放,然后通过开发者工具获取视频文件地址。

这次我们测试的的课程 ID 与地址为:www.ichunqiu.com/course/298,你可以选择其它的,重点是用工具捕捉到 m3u8 文件。

请求网址: www.ichunqiu.com/video/info/338.m3u8?type=2请求方法: POST

请求表单数据如下所示:

  • rs: 6d896ff4dec07103fad79c1b010286b8
  • type: 2
  • section_id: 338
  • time: 1653371562000

其中出现了第一个加密参数 rs,首先从其入手。

编写简单的测试代码,竟然出现了招聘启事。

import requests headers = { "Host": "www.ichunqiu.com", "Origin": "www.ichunqiu.com", "Referer": "www.ichunqiu.com/course/298" } form_data = { "rs": "6d896ff4dec07103fad79c1b010286b8", "type": "2", "section_id": "338", "time": "1653371562000" } res = requests.post('www.ichunqiu.com/video/info/338.m3u8?type=2', data=form_data, headers=headers) print(res.text)

问题应该出在 ts 参数,下面就通过断点分析该值,目测上猜测应该是 md5 。

断点调试,得到加密关键点代码如下:

u = new Rusha, c = sectionID + "icq", d = u.digest(c).substr(0, 32),

其中涉及的核心函数是 Rusha 和 u.digest(c),接下来就是漫长的扣取过程了。

⛳️ digest 实战扣取过程

为了扣取 Rusha 文件,我们找到了其定义位置,代码如下。

window.Rusha = y;

然后扣取第 1 行~399 行附近相关代码(截止 5 月 24 日可用)。

在接下来对扣取的结果进行改造和删减,例如下图。

接下来在删除 y 相关导出部分代码,如果你扣取失败,可以点击文末卡片,联系橡皮擦。

测试加密之后的结果,使用下述代码。

a.digest("338icq"); // '6d896ff4dec07103fad79c1b010286b8431b8fbe'

很明显官方截取的前 32 位,此时第一个步骤成功解决了。

但是也发现了一个问题,其实这个参数并没有动态值的加入,也就是说,它是固定的。

如何在不查看m3u8文件的情况下,解析i春秋平台的Python爬虫加密的m3u8文件?

继续寻找被反爬原因,在请求头中又发现了 Sign 参数,但是还没等测试,再次被封了。

更换浏览器,再次尝试,发现就在 rs 参数之后,就是 Sign 参数。

这里的参数都可以直接获取到,不在进行或多说明,下面查看请求 m3u8 之后的响应内容。

其中 data 也被加密了。

再次跟进请求之后,发现 Ci 函数中存在解析代码,其逻辑在图片下。

果然最终解析出来的是 m3u8 文件内容,有目标就变得简单多了。

r = xxtea.toString(xxtea.decrypt(n.data.data, xxtea.toBytes(i + sectionID)));

后续扣取 JS 部分的代码,参考上文一点点来就行。

本文共计850个文字,预计阅读时间需要4分钟。

如何在不查看m3u8文件的情况下,解析i春秋平台的Python爬虫加密的m3u8文件?

@[toc] 🌟 实战场景 & 本次实战目标站点:https://www.ichunqiu.com/courses/qmxc随机选择一门课程点击播放,然后通过开发者工具获取视频文件地址。本次测试的课程ID与地址为:ht...

@[toc]

⛳️ 实战场景

本次实战目标站点为 www.ichunqiu.com/courses/qmxc,随机寻找一门课程点击播放,然后通过开发者工具获取视频文件地址。

这次我们测试的的课程 ID 与地址为:www.ichunqiu.com/course/298,你可以选择其它的,重点是用工具捕捉到 m3u8 文件。

请求网址: www.ichunqiu.com/video/info/338.m3u8?type=2请求方法: POST

请求表单数据如下所示:

  • rs: 6d896ff4dec07103fad79c1b010286b8
  • type: 2
  • section_id: 338
  • time: 1653371562000

其中出现了第一个加密参数 rs,首先从其入手。

编写简单的测试代码,竟然出现了招聘启事。

import requests headers = { "Host": "www.ichunqiu.com", "Origin": "www.ichunqiu.com", "Referer": "www.ichunqiu.com/course/298" } form_data = { "rs": "6d896ff4dec07103fad79c1b010286b8", "type": "2", "section_id": "338", "time": "1653371562000" } res = requests.post('www.ichunqiu.com/video/info/338.m3u8?type=2', data=form_data, headers=headers) print(res.text)

问题应该出在 ts 参数,下面就通过断点分析该值,目测上猜测应该是 md5 。

断点调试,得到加密关键点代码如下:

u = new Rusha, c = sectionID + "icq", d = u.digest(c).substr(0, 32),

其中涉及的核心函数是 Rusha 和 u.digest(c),接下来就是漫长的扣取过程了。

⛳️ digest 实战扣取过程

为了扣取 Rusha 文件,我们找到了其定义位置,代码如下。

window.Rusha = y;

然后扣取第 1 行~399 行附近相关代码(截止 5 月 24 日可用)。

在接下来对扣取的结果进行改造和删减,例如下图。

接下来在删除 y 相关导出部分代码,如果你扣取失败,可以点击文末卡片,联系橡皮擦。

测试加密之后的结果,使用下述代码。

a.digest("338icq"); // '6d896ff4dec07103fad79c1b010286b8431b8fbe'

很明显官方截取的前 32 位,此时第一个步骤成功解决了。

但是也发现了一个问题,其实这个参数并没有动态值的加入,也就是说,它是固定的。

如何在不查看m3u8文件的情况下,解析i春秋平台的Python爬虫加密的m3u8文件?

继续寻找被反爬原因,在请求头中又发现了 Sign 参数,但是还没等测试,再次被封了。

更换浏览器,再次尝试,发现就在 rs 参数之后,就是 Sign 参数。

这里的参数都可以直接获取到,不在进行或多说明,下面查看请求 m3u8 之后的响应内容。

其中 data 也被加密了。

再次跟进请求之后,发现 Ci 函数中存在解析代码,其逻辑在图片下。

果然最终解析出来的是 m3u8 文件内容,有目标就变得简单多了。

r = xxtea.toString(xxtea.decrypt(n.data.data, xxtea.toBytes(i + sectionID)));

后续扣取 JS 部分的代码,参考上文一点点来就行。