美文网首页
JS下载喜马拉雅非付费音频

JS下载喜马拉雅非付费音频

作者: 码农先生 | 来源:发表于2019-01-10 22:17 被阅读37次

前几天分析了喜马拉雅音频的接口方法,使用java实现了整个专辑的单线程下载,最后说好的可以用ajax的方法来试一下,所以今天一下班便花了点时间做了个简单的demo。

1 Demo“成品”及GitHub地址

首先先看demo”成品“:

image

GitHub源码

2 数据分析

数据分析请看这篇:Java爬取喜马拉雅非付费音频

从上面文章的数据分析可以看出来,一个音频专辑的主要信息在 https://www.ximalaya.com/revision/album?albumId=4756811这个get请求中

image

而音频列表、下载链接则在下面这个请求中:

https://www.ximalaya.com/revision/play/album?albumId=4756811&pageNum=1&sort=-1&pageSize=30

3 JS下载文件流

因此,我们可以来写代码啦~

因为音频下载链接中音频的名称是这样子的~

http://audio.xmcdn.com/group17/M04/31/68/wKgJKVeLoPTADT0IAFbubI--Ykg766.m4a

所以需要知道如何使用js来处理文件流:

  function download(){
    //文件下载
    var obj = "http://audio.xmcdn.com/group22/M05/16/B6/wKgJM1gYvDKgP4bBAFO7CGP_MIk161.m4a";
    var blob = new Blob([obj], { type: 'application/octet-stream' }),
    fileName = "《摸金天师》第416章 六地火.m4a";
    downFile(blob, fileName);

  }
    //js下载文件流
    function downFile(blob, fileName) {
        if (window.navigator.msSaveOrOpenBlob) {
            navigator.msSaveBlob(blob, fileName);
        } else {
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download = fileName;
            link.click();
            window.URL.revokeObjectURL(link.href);
        }
    }

4 搜索列表,下载音频

页面布局:

<html>

<head>
  <title>喜马拉雅音频JS版</title>
  <script type="text/javascript" src="js/jquery.min.js"></script>
</head>

<body>
  <input id="albumId" />
  <button onclick="search()">搜索</button>
  <button onclick="download()">下载</button>
  <div id="fileList">
</body>

</html>

JS:

<script type="text/javascript">

  function search() {
    var albumId = $("#albumId").val();
    $.ajax({
      type: "GET",
      url: "https://www.ximalaya.com/revision/album",
      data: { "albumId": albumId },//4756811
      dataType: "json",
      success: function (data) {
        if (data && data.data && data.ret == 200) {
          var pageNum = data.data.tracksInfo.pageNum;
          var pageSize = data.data.tracksInfo.pageSize;
          var total = data.data.tracksInfo.trackTotalCount;

          //总页数
          var totalPage = total / pageSize + 1;
          for(var i = 1 ; i <= totalPage ; i++){
            $.ajax({
              type: "GET",
              url: "https://www.ximalaya.com/revision/play/album",
              data: { 
                "albumId": albumId,
                "pageNum": i,
                "sort":-1,
                "pageSize":pageSize
                },
              dataType: "json",
              success: function (data) {
                if (data && data.data && data.ret == 200) {
                  var result = data.data.tracksAudioPlay;
                  var listHtml = "";
                  for(var j=0; j <result.length; j++){
                    listHtml+="<a href="+result[j].src+">"+result[j].trackName+"</a></br>"
                  }
                  $("#fileList").append(listHtml);
                }
              }

            });
          }

        }
        console.log(data);
      }

    });
  }

  function download(){
    //文件下载
    var obj = "http://audio.xmcdn.com/group22/M05/16/B6/wKgJM1gYvDKgP4bBAFO7CGP_MIk161.m4a";
    var blob = new Blob([obj], { type: 'application/octet-stream' }),
    fileName = "《摸金天师》第416章 六地火.m4a";
    downFile(blob, fileName);

  }
    //js下载文件流
    function downFile(blob, fileName) {
        if (window.navigator.msSaveOrOpenBlob) {
            navigator.msSaveBlob(blob, fileName);
        } else {
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download = fileName;
            link.click();
            window.URL.revokeObjectURL(link.href);
        }
    }

</script>

5 总结

这是个很简单的项目,还有很多的细节可以优化,如专辑ID的自动获取、批量下载等,原理无非就是调喜马拉雅后台的接口,拿到数据在自己的网页上显示出来。以后有时间可能会去优化一下~

我觉得身为程序员最大的享受就是能用技术去实现大量相同数据的统一存储,如某些网站种子链接的统一存储,咳咳咳,我是个正经的程序员~

我的CSDN传送门

相关文章

网友评论

      本文标题:JS下载喜马拉雅非付费音频

      本文链接:https://www.haomeiwen.com/subject/wuvzrqtx.html