我们徒手撸代码, 除了zip部分,都是原生代码
前言最近发现极客时间的有些课程不错,不贵还实惠。有一天有一个同事找到我说,你在看什么呢,不觉明历,能分享给我吗。 我说,是好东西要分享。可是这个网站不支持多地方登陆。
同事说,那把网页下载下来不就好了吗。
网页下载下来不就好了吗?网页下载下来不就好了吗?网页下载下来不就好了吗
这句话不听的在我脑中盘旋,我头都炸了, 午觉也没睡好,于是就打算下载下来。
下载下来的原始需求是什么:
无限看
免费看
断网看
其实,这个百度一下,也有破解的App.
github搜一搜,也有
此工具为下载极客时间已购课程方便离线观看
极客时间课程抓取脚本
极客时间视频下载
极客时间专栏转化为 gitbook 目录结构
极客时间专栏转换为PDF
这些优秀的开源项目。
当然,因为极客时间本身也在迭代,有些可能已经不能用了。
但是,再撸一个又何妨。
万恶之源,均是数据。那我们就先来看看分分析这个极客时间的原始数据。
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
就是一个课程的全部文章, 全部小节。 这里是摘要信息,不是文正或者视频本身。
接口地址: 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上,多线程等上。