背景
前几天给孩子买了一套《狮子老爸讲三国》的付费音频,讲的不错孩子很喜欢。 但有个问题只能在线听,无法保存到本地播放让我有点不爽,盘之
前提
当然是需要先购买了 ^_^ 。 如果你是超级VIP可以听所有音频也没有问题,总之,可以听的才能下载,不是破解哦 。。。。
工具
传说中的浏览器扩展神器——游猴
安装方法就不说了,不会的请度娘伺候
还需要个下载工具aria2 (猛戳下载)
游猴脚本
先创建一个自己的脚本,代码如下
// ==UserScript== // @name 喜马拉雅my // @namespace https://www.ximalaya.com/*/*/* // @version 1.0 // @description try to take over the world! // @author You // @match https://www.ximalaya.com/*/*/* // @grant unsafeWindow // @grant GM_getValue // @grant GM_setValue // @grant GM_xmlhttpRequest // @grant GM_openInTab // @require https://code.jquery.com/jquery-1.12.4.min.js // ==/UserScript== (function() { 'use strict'; var win = window; var aria2_url = "http://127.0.0.1:6800/jsonrpc"; //Aria2 下载地址 var hasOpenAriac2Tab = false; $(document).ready(function(){ var urls=[]; console.log(urls); //绑定开始下载事件,有点随意,能下载就行了 $(document).bind('click',function(){
//延迟4秒,让浏览器把音频URL计算完再开始
setTimeout(function(){ getPlayer(); //开始下载 $(".xuicon-quanjubofangqi-xiayiqu")[0].click(); //点击下一个 },4000); }); }); function getPlayer(){ var win = unsafeWindow; var title= $(".fm-title").text(); if(!!win.$webPlayer && !!win.$webPlayer.webAudio){ var url = win.$webPlayer.webAudio._playSrc; sendDownloadTaskToAria2(url,title+'.m4a',"J:\Downloads\sanguo"); //传入地址,名称和本地保存路径 } } //自定义 log 函数 function mylog(param1,param2){ param1 = param1 ? param1 : ""; param2 = param2 ? param2 : ""; console.log("#--",param1,param2); } // 将下载链接发送到 Aria2 下载 function sendDownloadTaskToAria2(download_url,file_name,save_path){ var json_rpc = { id:'', jsonrpc:'2.0', method:'aria2.addUri', params:[ [download_url], { dir:save_path, out:file_name } ] }; GM_xmlhttpRequest({ url:aria2_url, method:'POST', data:JSON.stringify(json_rpc), onerror:function(response){ mylog(response); }, onload:function(response){ mylog(response); if (!hasOpenAriac2Tab){ GM_openInTab('http://aria2c.com/',{active:true}); hasOpenAriac2Tab = true; } } }); } })();
运行逻辑
由于喜马拉雅付费音频的下载地址是需要token验证的,每个都不一样,想要得到下载地址有两个办法,一是通过分析JS脚本把token加密算法提取出来自己实现一遍,但这个过程比较麻烦,二是让网页自己算出来,我们只需要把播放器的playSrc取出来就行了。这种方法有个问题需要一集一集的获取,不过正好网站提供了下一集功能,那就模拟点击,稍等几秒钟,获取,下载。
这就是整个下载逻辑,当然,追求完美的你肯定感觉这种实现很丑陋,并且没有自动停止逻辑。 那就加个浮层,控制一下,不过我也懒得写了,聪明的你一定可以做的更好 。。。