背景
前幾天給孩子買了一套《獅子老爸講三國》的付費音頻,講的不錯孩子很喜歡。 但有個問題只能在線聽,無法保存到本地播放讓我有點不爽,盤之
前提
當然是需要先購買了 ^_^ 。 如果你是超級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取出來就行了。這種方法有個問題需要一集一集的獲取,不過正好網站提供了下一集功能,那就模擬點擊,稍等幾秒鍾,獲取,下載。
這就是整個下載邏輯,當然,追求完美的你肯定感覺這種實現很丑陋,並且沒有自動停止邏輯。 那就加個浮層,控制一下,不過我也懶得寫了,聰明的你一定可以做的更好 。。。