极客时间离线课堂

我们徒手撸代码, 除了zip部分,都是原生代码

前言

最近发现极客时间的有些课程不错,不贵还实惠。有一天有一个同事找到我说,你在看什么呢,不觉明历,能分享给我吗。 我说,是好东西要分享。可是这个网站不支持多地方登陆。

同事说,那把网页下载下来不就好了吗。

网页下载下来不就好了吗?网页下载下来不就好了吗?网页下载下来不就好了吗

这句话不听的在我脑中盘旋,我头都炸了, 午觉也没睡好,于是就打算下载下来。

下载下来的原始需求是什么:

无限看

免费看

断网看

其实,这个百度一下,也有破解的App.
github搜一搜,也有

此工具为下载极客时间已购课程方便离线观看

极客时间课程抓取脚本

极客时间视频下载

极客时间专栏转化为 gitbook 目录结构

极客时间专栏转换为PDF

这些优秀的开源项目。
当然,因为极客时间本身也在迭代,有些可能已经不能用了。
但是,再撸一个又何妨。

数据之源 API分析

万恶之源,均是数据。那我们就先来看看分分析这个极客时间的原始数据。

API分析 - 1. 课程列表

https://time.geekbang.org/dashboard/course 这个页面就是你已经购买的课程列表。
获取这个课程的列表的接口地址为:https://time.geekbang.org/serv/v3/learn/product

参数:

{ "desc":true, "expire":1, "last_learn":0, "learn_status":0, "prev":0, "size":20, // 一页获取的大小 "sort":1, "type":"", "with_learn_count":1 }

结果:
比较重要的是products里面的id

{ code: number; data: { articles:[]; has_expiring_product: boolean; list: [{ pid: number }], products:[{ author: { name: "", intro: "", avatar: "", }, id: "", // 产品id, 这个比较重 intro: "", intro_html: "", is_audio: true is_column: true is_core: true is_dailylesson: false is_finish: true is_groupbuy: true is_onborad: true is_opencourse: false is_promo: false is_qconp: false is_sale: true is_shareget: false is_sharesale: true is_university: false is_video: false }] } error: { } extra: { } } API分析 - 2. 课程文章列表摘要信息

就是一个课程的全部文章, 全部小节。 这里是摘要信息,不是文正或者视频本身。
接口地址: https://time.geekbang.org/serv/v1/column/articles

参数:

{ cid: string, // 产品id order: "earliest" prev: 0 sample: false size: 100 }

结果:

{ code: 0, data: { list: [{ article_title: string, // 文章标题 id: number, // 文章id audio_download_url:string, column_cover: string; audio_time_arr: { h: "" m: "" s: " } }] }, error:[], extra:[] } API分析 - 3. 课程章节

课程会分几章,每章会有子文章。 在网页的体现就是导航。
地址:https://time.geekbang.org/serv/v1/chapters

参数:

{ "cid": number }

cid: 专栏ID

https://time.geekbang.org/serv/v1/article 返回结果的cid的值

https://time.geekbang.org/serv/v1/column/articles 返回 column_id

返回:

{ code: 0, data:[{ article_count: number; id: string; source_id: string; title: string; }] } API分析 - 4.课程文章内容

这就是真正的内容部分了
这里主要说两种, 一种是视频。

视频
网页上的播放地址是:
https://time.geekbang.org/course/detail/[xxxxx]-[yyyy]

xxxxx: 对应的产品ID
yyyy: 对应文章id,这个在 2.课程文章列表摘要信息的接口获得。

文章专栏
https://time.geekbang.org/column/article/[yyyy]
yyyy: 对应文章id,这个在 2.课程文章列表摘要信息的接口获得。

获取源数据接口地址是:
https://time.geekbang.org/serv/v1/article

参数:

{ id: string, // 文章ID include_neighbors: false, is_freelyread: true }

结果:

{ code: 0 data:{ article_content: string; // 文章内容,富文本 article_cover: string; article_sharetitle: string; column_cover: string; video_id: ""; // 视频id column_id: number; // 章节ID,决定该文章属于课程的哪个章节 audio_time_arr: { h: "" m: "" s: "" } } } API分析 - 5.课程评论

这个就没说的呢,所谓评论更精彩
地址:https://time.geekbang.org/serv/v1/comments

参数:

{ "aid": number, // 文章ID "prev":0, "size": 100 // 隐藏参数 }

结果:

{ code: 0, data: { list: [{ can_delete: false comment_content: "" comment_ctime: number comment_is_top: false discussion_count: 0 had_liked: false id: number like_count: 0 product_id: number product_type: "c1" // 产品类型 cl为专栏 score: string ucode: string uid: number user_header: string user_name: string }] } } 下载

最优解:服务脚本直接下载。当然cookie是关键。
次优解:无头浏览器。
无赖解:游猴脚本或者手帖脚本到浏览器。

那我们就从无赖解开始。有人就会说,你这不是带坏人吗,干嘛不从最优解开始。哈哈,因为从初级到高级,这个爽感,很享受。

实际上,无赖解,次优解,最优解绝大部分的逻辑代码是一致。
差别可能在文件存储,cookie上,多线程等上。

下载 - 1.入口

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjjgy.html