koa2实现全民k歌作品批量下载

界面

写在开始

今天在这里介绍下如何使用koa框架,结合js,实现k歌作品的『批量/单曲/试听』功能。

需求分析

当用户输入uid时,获取到全部的作品列表,并在页面上展示,包含歌曲名称、歌曲试听、单曲保存的功能, 并以弹窗的形式,给予用户明确的提示:是否下载全部歌曲。当用户点击『下载全部』按钮时,开始下载,并在控制台显示相关进度。当用户点击『取消』时,不影响作品列表的相关操作,点击『分析并下载』时,仍然可以下载全部作品。

相关数据获取

第一步的目的是获取到所有作品的列表,自然而然地从个人页开始分析,首先观察url,为以下形式:

个人中心

https://node.kg.qq.com/personal?uid=18位uid

接着发现页面默认加载八首歌,点击『查看更多』按钮会多加载八首歌,在Chrome-Nerwork中查看请求,多请求几页发现规律,用postman模拟请求,发现接口的每页返回数量做了限制,num最大值为15,start为页数,share_uid可从个人中心url获得。至此,我们可以循环请求,获取所有歌曲列表。

获取作品列表

https://node.kg.qq.com/cgi/fcgi-bin/kg_ugc_get_homepage?type=get_ugc&start=页数&num=8&share_uid=18位uid

最后是获取歌曲播放(下载)的url,在歌曲的播放页的script标签里,我们可以直接获取到一串加密的地址,如果使用这个地址,显然无法与我们之前所做的努力结合,所以我找到了其他网友分享的url,通过share_uid,我们可以获取下载url。

获取歌曲url

http://node.kg.qq.com/cgi/fcgi-bin/fcg_get_play_url?shareid=shareid

技术选型

本次项目选择了koa2框架,使用koa-generator生成带ejs模板项目,方便后续功能拓展。加上axios、jquery、sweetalert2等辅助库。
sweetalert2

整体流程

程序运行
整体流程如上图,具体的实现还需要考虑uid校验、node的fs文件流操作,测试过程中发现某用户有相同作品名,还需要加上相同文件名的判断,如果有相同文件名,加上随机数字串,不然创建文件时会覆盖之前的文件。



程序运行
程序运行

TODO

  • [X] 单曲试听
  • [X] 单曲下载
  • [X] 作品批量下载
  • 在前端显示下载进度

项目地址

github