中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

云南個(gè)舊建設(shè)局網(wǎng)站深圳營(yíng)銷型網(wǎng)站定制

云南個(gè)舊建設(shè)局網(wǎng)站,深圳營(yíng)銷型網(wǎng)站定制,wordpress能干什么,黃crm在線js逆向爬取某音樂(lè)網(wǎng)站某歌手的歌曲一、分析網(wǎng)站1、案例介紹2、尋找列表頁(yè)Ajax入口(1)頁(yè)面展示圖。(2)尋找部分歌曲信息Ajax的token。(3)尋找歌曲鏈接(4)獲取歌曲名稱和id信息3、尋找…

js逆向爬取某音樂(lè)網(wǎng)站某歌手的歌曲

  • 一、分析網(wǎng)站
    • 1、案例介紹
    • 2、尋找列表頁(yè)Ajax入口
      • (1)頁(yè)面展示圖。
      • (2)尋找部分歌曲信息Ajax的token。
      • (3)尋找歌曲鏈接
      • (4)獲取歌曲名稱和id信息
    • 3、尋找網(wǎng)頁(yè)數(shù)據(jù)的加密邏輯
      • (1)尋找歌曲地址出處。
      • (2)查找表單數(shù)據(jù)中的關(guān)鍵字
      • (3)建立生成方法的js文件
      • (4)編輯“生成構(gòu)造歌曲地址的表單數(shù)據(jù)方法”的代碼
  • 二、開(kāi)始爬取工作
    • 1、構(gòu)建歌曲地址
    • 2、修改JS文件中的參數(shù)
    • 3、成功獲得歌曲鏈接的地址
  • 三、保存并總結(jié)

一、分析網(wǎng)站

1、案例介紹

  • 爬蟲(chóng)學(xué)習(xí)已經(jīng)結(jié)束了,再繼續(xù)練習(xí)鞏固。這一次拿某音樂(lè)網(wǎng)站某歌星的歌曲為例,進(jìn)行批量爬取。
  • 這里的前端javaScript帶有變量名混淆,也帶有字符串混淆,還帶有對(duì)象鍵名替換等技術(shù),所以爬取起來(lái),要花費(fèi)一定的時(shí)間去分析并理清里面的邏輯關(guān)系。
  • 這次的練習(xí),目的很簡(jiǎn)單,思路也不麻煩,就是找到歌曲的url地址和歌曲名稱,再爬取、保存。

2、尋找列表頁(yè)Ajax入口

(1)頁(yè)面展示圖。

在這里插入圖片描述

這里還是用右擊“檢查”的形式,對(duì)上面頁(yè)面進(jìn)行分析。雖然在“元素”這一欄能找到歌曲的鏈接及名字,但這次,源代碼里面是找不到的,那就意味著用requests爬取不到需要的信息。

(2)尋找部分歌曲信息Ajax的token。

  • 接著打開(kāi)“網(wǎng)絡(luò)”——“Fetch/XHR”,刷新之后,開(kāi)始查找列表,出現(xiàn)很多含有“token=”的列表項(xiàng),按照經(jīng)驗(yàn),找到“web?csrf_token=”,點(diǎn)擊“預(yù)覽”,找到想要的信息列表。如圖。
    在這里插入圖片描述
  • 在爬取類似歌曲信息的時(shí)候,需要注意的一點(diǎn)就是要關(guān)注這些列表中的id信息。
  • 在“標(biāo)頭”欄,找到請(qǐng)求頭“https://music.YouKnowde.com/weapi/cloudsearch/get/web?csrf_token=”,這個(gè)地址也要寫(xiě)入程序里面,而且看到下面的請(qǐng)求方法是POST方式。
  • 再打開(kāi)“載荷”欄,查看表單數(shù)據(jù)。如圖。
    在這里插入圖片描述
    上面表單數(shù)據(jù)的格式是通過(guò)加密后產(chǎn)生的,可以查看md5.cn網(wǎng)站,比較得出是哪一種加密方式。
  • 先用以上信息,寫(xiě)一段代碼,獲取一部分信息,再做進(jìn)一步的分析。
import requestsclass Music_Data(object):def __init__(self):super().__init__()self.url = "https://music.YouKnowde.com/weapi/cloudsearch/get/web?csrf_token="self.wangyi_url = 'https://music.YouKnowde.com/weapi/song/enhance/player/url/v1?csrf_token='self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36','origin': 'https://music.YouKnowde.com','referer': 'https://music.YouKnowde.com/search/'}self.data = {"params": "VcB5Z4BiekLvHcWYMKc78nXTiKKCn+6eAjm8yfLksGSJr9rPpDKZP8HPJG9BYL33uYq97UL2UDkQdhq6QoKm8d+bzvJstjrmn8PDCUwE6azkPUCIhiMnCE5sonqHw8D0OGvEk0N/v3PYGqcc/Cp4HvJmrQoS50BlcA8h7X7Djcal1ku2A03QrOqT4Zkai78O4c95I5rHDxecBZbi8pvA7jji9Gf7mPmOJ1ZqaLvtsbSg+CbtyFBUWvzfQqWXKejd8hgFePlM4i/yEWb6Ug5BQg==","encSecKey": "c2dfcdf582d19c7ec069d8315befe647a0a91af398a44bb994cf69386977115df512627a4f7c4c82ec9a608fe0ea6de0e4063a4bea2a6af703615133b0b64e22adb20484dfa5db22b72866c0ab9529237cfdf9b4eaa8d67294c896de380658fa859167b67c73a35c5d65c97ba839d1a6d1feca697eedf6ef9b6bf2663fc561e3"}def get_data_index(self):resp = requests.post(url=self.url, data=self.data, headers=self.headers)print(resp.text)def run(self):self.get_data_index()if __name__ == '__main__':music = Music_Data()music.run()
  • 上面代碼,自然獲取到了歌曲的一些信息代碼。如圖。
    在這里插入圖片描述
    從上面獲得結(jié)果看,剛才亂碼形式的表單數(shù)據(jù),可以不用理會(huì)。

(3)尋找歌曲鏈接

  • 點(diǎn)擊“媒體”——點(diǎn)擊播放,看到如下結(jié)果。
    在這里插入圖片描述

  • 點(diǎn)擊這條記錄,再點(diǎn)擊“標(biāo)頭”欄看到請(qǐng)求網(wǎng)址信息,復(fù)制到地址欄“轉(zhuǎn)到”,就能聽(tīng)到歌曲播放。
    在這里插入圖片描述

在這里插入圖片描述
那么,剛才請(qǐng)求網(wǎng)址的鏈接,就是這首歌的播放地址。也就是說(shuō),這樣就成功的找到一首歌的地址鏈接了。

  • 然后我們看到,請(qǐng)求網(wǎng)址的地址比較亂,無(wú)規(guī)則的字符摻雜其中,那它到底是怎么來(lái)的。

(4)獲取歌曲名稱和id信息

  • 還是在開(kāi)發(fā)者工具界面,點(diǎn)擊“網(wǎng)絡(luò)”——“Fetch/XHR”——刷新網(wǎng)頁(yè)并選擇“web?csrf_token=”——預(yù)覽,就看到字典格式的內(nèi)容,用json中的方法loads改成字典格式,進(jìn)一步獲得歌曲名稱和id信息。
    在這里插入圖片描述
  • 改寫(xiě)程序中的get_data_index方法,由獲取源代碼,進(jìn)一步改成獲取歌曲名稱和id的方法。
  • 代碼如下:
    def get_data_index(self):resp = requests.post(url=self.url, data=self.data, headers=self.headers)# print(resp.text)# 此處根據(jù)web?csrf_token=鏈接匯總的預(yù)覽欄,找到字典形式的信息,獲取相應(yīng)歌曲名dict_data = json.loads(resp.text)["result"]["songs"]# 而后遍歷所有歌曲,獲取name和idfor data in dict_data:name = data["name"]id = data["id"]print(name, id)
    
    • 運(yùn)行之后,成功獲取到想要的信息。如圖。
      在這里插入圖片描述

3、尋找網(wǎng)頁(yè)數(shù)據(jù)的加密邏輯

(1)尋找歌曲地址出處。

  • 在上面請(qǐng)求網(wǎng)址的地址代碼中,復(fù)制一小段,然后搜索即得到兩個(gè)結(jié)果。如圖。
    在這里插入圖片描述
    經(jīng)過(guò)分析,點(diǎn)擊第二個(gè)結(jié)果的鏈接,再點(diǎn)擊預(yù)覽,看到下面字典格式的信息里面,就有歌曲信息的鏈接。如圖。
    在這里插入圖片描述
    再繼續(xù)點(diǎn)開(kāi)上圖所示的開(kāi)發(fā)者工具中的“標(biāo)頭”,它里面的請(qǐng)求網(wǎng)址,就是產(chǎn)生這首歌曲地址的請(qǐng)求地址。而且是以POST的請(qǐng)求方式。如圖。
    在這里插入圖片描述
  • 再按以上方式,找到一首歌曲的地址。即:媒體——播放——選中,復(fù)制一段代碼搜索——找到請(qǐng)求網(wǎng)址。然后,再點(diǎn)“載荷”一欄,得到表單數(shù)據(jù),也是params和encSecKey兩項(xiàng),不過(guò)此時(shí)的字符串變了。也就是說(shuō),換了不同的歌曲,就更換了不同的表單數(shù)據(jù)
  • 顯然,每次爬取歌曲,都要更換此處的表單數(shù)據(jù),確實(shí)是挺麻煩的事。那么接下來(lái),應(yīng)該怎么做呢?
  • 答案就是,表單數(shù)據(jù)是網(wǎng)頁(yè)中JavaScript代碼產(chǎn)生的,咱們應(yīng)該繼續(xù)網(wǎng)頁(yè)表單數(shù)據(jù)中params和encSecKey兩項(xiàng)的生成機(jī)制。即,分析明白,網(wǎng)頁(yè)中的這一加密邏輯。

(2)查找表單數(shù)據(jù)中的關(guān)鍵字

  • 通過(guò)如下方式,在源代碼js邏輯代碼中,尋找表單數(shù)據(jù)中的encSecKey的代碼段。步驟如下圖。
    在這里插入圖片描述
    點(diǎn)開(kāi)上面,會(huì)進(jìn)入源代碼里面,繼續(xù)搜索“encSecKey”,會(huì)找到下圖的地方,這里就是表單數(shù)據(jù)生成的代碼塊。
    在這里插入圖片描述

顯然,上面代碼中使用了字符串混淆和對(duì)象鍵名替換的技術(shù)。然后我們分析發(fā)現(xiàn),params和encSecKey兩個(gè)鍵對(duì)應(yīng)的值里面有一個(gè)bMr1x,而bMr1x又在上面被var定義好了。再看bMr1x的定義,里面又用到了window.asrsea這個(gè)方法,接著繼續(xù)搜索關(guān)鍵字window.asrsea,看看別處有沒(méi)有定義。搜索完成,就兩個(gè)結(jié)果,除了當(dāng)前應(yīng)用的這個(gè)地方,上面不遠(yuǎn)處,就是定義的地方。如圖。
在這里插入圖片描述

  • 在這里我們發(fā)現(xiàn),d就是上面定義的函數(shù)(方法),在這里給d函數(shù)斷點(diǎn),再播放歌曲。因?yàn)橛袛帱c(diǎn),所以歌曲沒(méi)有播放,馬上暫停了,得到一系列參數(shù)。如圖。
    在這里插入圖片描述
    我們看到,上面代碼中,又應(yīng)用了變量名混淆的技術(shù),變量名或函數(shù)名全部是a、b、c這樣的字眼。因?yàn)槲覀冃枰氖?#xff0c;生成表單數(shù)據(jù)的功能,此時(shí)只要把這部分代碼拿出來(lái),形成一個(gè)js文件,就能為我所用。所以,我們復(fù)制實(shí)現(xiàn)這個(gè)功能的這一整個(gè)函數(shù)即可,如圖。
    在這里插入圖片描述在這里插入代碼片段。

(3)建立生成方法的js文件

  • 在PyCharm平臺(tái),新建一個(gè)wyy.js文件,把上面復(fù)制的JavaScript函數(shù)代碼,粘貼進(jìn)來(lái),再進(jìn)行適當(dāng)?shù)脑鰟h,把它的功能重建。
!function() {function a(a) {var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";for (d = 0; a > d; d += 1)e = Math.random() * b.length,e = Math.floor(e),c += b.charAt(e);return c}function b(a, b) {var c = CryptoJS.enc.Utf8.parse(b), d = CryptoJS.enc.Utf8.parse("0102030405060708"), e = CryptoJS.enc.Utf8.parse(a), f = CryptoJS.AES.encrypt(e, c, {iv: d,mode: CryptoJS.mode.CBC});return f.toString()}function c(a, b, c) {var d, e;return setMaxDigits(131),d = new RSAKeyPair(b,"",c),e = encryptedString(d, a)}function d(d, e, f, g) {var h = {}, i = a(16);return h.encText = b(d, g),h.encText = b(h.encText, i),h.encSecKey = c(i, e, f),h}function e(a, b, d, e) {var f = {};return f.encText = c(a + e, b, d),f}asrsea = d
}();
  • 分析上面可知,里面定義了a、b、c、d四個(gè)函數(shù),然后運(yùn)行完之后,得到四個(gè)結(jié)果。如上圖右側(cè)的紅色部分。繼續(xù)分析可以看出,經(jīng)過(guò)混淆后,代碼里面的下面這段,其中bMr1x定義完成的功能,就是上面js程序的d函數(shù)調(diào)用完成的功能。

    var bMr1x = window.asrsea(JSON.stringify(i0x), bsg8Y(["流淚", "強(qiáng)"]), bsg8Y(TH5M.md), bsg8Y(["愛(ài)心", "女孩", "驚恐", "大笑"]));e0x.data = j0x.cr0x({params: bMr1x.encText,encSecKey: bMr1x.encSecKey
    
  • 這樣,在同一個(gè)wyy.js文件里面,再寫(xiě)一個(gè)函數(shù)。因?yàn)樯鲜龃a里面,摻入了變量名混淆、對(duì)象鍵名替換等技術(shù),仔細(xì)分析,就是一個(gè)函數(shù)調(diào)用函數(shù),再依次返回?cái)?shù)據(jù)(得到返回值)的過(guò)程。由此可以建立如下代碼:

    function start() {d:"{\"id\":\"190072\",\"c\":\"[{\\\"id\\\":\\\"190072\\\"}]\",\"csrf_token\":\"\"}"e:"010001"f:"00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"g:"0CoJUm6Qyw8W8jud"var bMr1x = asrsea(JSON.stringify(d),e,f,g)return bMr1x
    }
    
  • 上面兩段代碼,是從網(wǎng)頁(yè)源代碼中剝離出來(lái),放到wyy.js里面,對(duì)函數(shù)內(nèi)部運(yùn)作方法稍加分析之后,重新整理合適的代碼,整個(gè)wyy.js代碼改成如下形式:

!function() {function a(a) {var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";for (d = 0; a > d; d += 1)e = Math.random() * b.length,e = Math.floor(e),c += b.charAt(e);return c}function b(a, b) {var c = CryptoJS.enc.Utf8.parse(b), d = CryptoJS.enc.Utf8.parse("0102030405060708"), e = CryptoJS.enc.Utf8.parse(a), f = CryptoJS.AES.encrypt(e, c, {iv: d,mode: CryptoJS.mode.CBC});return f.toString()}function c(a, b, c) {var d, e;return setMaxDigits(131),d = new RSAKeyPair(b,"",c),e = encryptedString(d, a)}function d(d, e, f, g) {var h = {}, i = a(16);return h.encText = b(d, g),h.encText = b(h.encText, i),h.encSecKey = c(i, e, f),h}function e(a, b, d, e) {var f = {};return f.encText = c(a + e, b, d),f}asrsea = d
}();function start() {var d = {"ids":"[1894007406]","level":"standard","encodeType":"aac","csrf_token":""}var e = "010001"var f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"var g = "0CoJUm6Qyw8W8jud"var bMr1x = asrsea(JSON.stringify(d),e,f,g)return bMr1x
}

(4)編輯“生成構(gòu)造歌曲地址的表單數(shù)據(jù)方法”的代碼

  • 上面得到了歌曲名稱和id,下面就構(gòu)建歌曲地址。在程序中,重新定義一個(gè)函數(shù)get_music_url_index,然后運(yùn)行。
    在這里插入圖片描述
  • 上面的代碼運(yùn)行后,得到錯(cuò)誤。這是因?yàn)榍懊娴膚yy.js中有一個(gè)函數(shù)變量,沒(méi)有寫(xiě)入wyy.js程序中,還有下面的setMaxDigits等函數(shù),如圖黃色方框內(nèi)的方法。
    在這里插入圖片描述
  • 因此索性,把CryptoJS開(kāi)頭定義的代碼,一直復(fù)制到與前面函數(shù)交界的地方。這里有個(gè)技巧,選擇就容易許多。就是在源代碼中的下方,有一隊(duì)大括號(hào){},點(diǎn)擊一下,一個(gè)函數(shù)的代碼就收縮起來(lái),此處選擇三個(gè)方法CryptoJS、RSAKeyPair和encryptedString,正好和前面d函數(shù)所在的函數(shù)緊挨著。選擇好之后,復(fù)制粘貼到wyy.js的開(kāi)端。整個(gè)代碼如下:
    var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data")}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this.i0x=new r.init;this.yE7x=0},Ap8h:function(a){"string"==typeof a&&(a=x.parse(a));this.i0x.concat(a);this.yE7x+=a.sigBytes},mD4H:function(a){var c=this.i0x,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this.UZ5e,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this.tt6n(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);a.i0x=this.i0x.clone();return a},UZ5e:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this.mk4o()},update:function(a){this.Ap8h(a);this.mD4H();return this},finalize:function(a){a&&this.Ap8h(a);return this.nZ4d()},blockSize:16,mO4S:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},yD7w:function(a){return function(b,e){return(new n.HMAC.init(a,e)).finalize(b)}}});var n=d.algo={};return d}(Math);(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this.bD0x;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this.bD0x,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},bD0x:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({mk4o:function(){this.cT1x=new w.init([1732584193,4023233417,2562383102,271733878])},tt6n:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this.cT1x.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},nZ4d:function(){var b=this.i0x,n=b.words,a=8*this.yE7x,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this.mD4H();b=this.cT1x;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b.cT1x=this.cT1x.clone();return b}});t.MD5=v.mO4S(r);t.HmacMD5=v.yD7w(r)})(Math);(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,l)}})();CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this.If2x,e,a)},createDecryptor:function(e,a){return this.create(this.brx8p,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this.UA5F=e;this.J0x=a;this.reset()},reset:function(){t.reset.call(this);this.mk4o()},process:function(e){this.Ap8h(e);return this.mD4H()},finalize:function(e){e&&this.Ap8h(e);return this.nZ4d()},keySize:4,ivSize:4,If2x:1,brx8p:2,mO4S:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({nZ4d:function(){return this.mD4H(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this.tC6w;c?this.tC6w=u:c=this.DV9M;for(var d=0;d<b;d++)e[a+d]^=c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this.ua6U=e;this.tC6w=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this.ua6U,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this.DV9M=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this.ua6U,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,e,a,c);this.DV9M=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this.UA5F==this.If2x)var c=a.createEncryptor;else c=a.createDecryptor,this.UZ5e=1;this.eR1x=c.call(a,this,b&&b.words)},tt6n:function(a,b){this.eR1x.processBlock(a,b)},nZ4d:function(){var a=this.cfg.padding;if(this.UA5F==this.If2x){a.pad(this.i0x,this.blockSize);var b=this.mD4H(!0)}else b=this.mD4H(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this.HX2x(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},HX2x:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this.HX2x(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,16,32,64,128,27,54],d=d.AES=p.extend({mk4o:function(){for(var a=this.J0x,c=a.words,d=a.sigBytes/4,a=4*((this.bgi6c=d+6)+1),e=this.brW8O=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this.bse8W=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this.DW9N(a,b,this.brW8O,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this.DW9N(a,c,this.bse8W,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},DW9N:function(a,b,c,d,e,j,l,f){for(var m=this.bgi6c,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p.mO4S(d)})();
    function RSAKeyPair(a,b,c){this.e=biFromHex(a),this.d=biFromHex(b),this.m=biFromHex(c),this.chunkSize=2*biHighIndex(this.m),this.radix=16,this.barrett=new BarrettMu(this.m)}function twoDigit(a){return(10>a?"0":"")+String(a)}function encryptedString(a,b){for(var f,g,h,i,j,k,l,c=new Array,d=b.length,e=0;d>e;)c[e]=b.charCodeAt(e),e++;for(;0!=c.length%a.chunkSize;)c[e++]=0;for(f=c.length,g="",e=0;f>e;e+=a.chunkSize){for(j=new BigInt,h=0,i=e;i<e+a.chunkSize;++h)j.digits[h]=c[i++],j.digits[h]+=c[i++]<<8;k=a.barrett.powMod(j,a.e),l=16==a.radix?biToHex(k):biToString(k,a.radix),g+=l+" "}return g.substring(0,g.length-1)}function decryptedString(a,b){var e,f,g,h,c=b.split(" "),d="";for(e=0;e<c.length;++e)for(h=16==a.radix?biFromHex(c[e]):biFromString(c[e],a.radix),g=a.barrett.powMod(h,a.d),f=0;f<=biHighIndex(g);++f)d+=String.fromCharCode(255&g.digits[f],g.digits[f]>>8);return 0==d.charCodeAt(d.length-1)&&(d=d.substring(0,d.length-1)),d}function setMaxDigits(a){maxDigits=a,ZERO_ARRAY=new Array(maxDigits);for(var b=0;b<ZERO_ARRAY.length;b++)ZERO_ARRAY[b]=0;bigZero=new BigInt,bigOne=new BigInt,bigOne.digits[0]=1}function BigInt(a){this.digits="boolean"==typeof a&&1==a?null:ZERO_ARRAY.slice(0),this.isNeg=!1}function biFromDecimal(a){for(var d,e,f,b="-"==a.charAt(0),c=b?1:0;c<a.length&&"0"==a.charAt(c);)++c;if(c==a.length)d=new BigInt;else{for(e=a.length-c,f=e%dpl10,0==f&&(f=dpl10),d=biFromNumber(Number(a.substr(c,f))),c+=f;c<a.length;)d=biAdd(biMultiply(d,lr10),biFromNumber(Number(a.substr(c,dpl10)))),c+=dpl10;d.isNeg=b}return d}function biCopy(a){var b=new BigInt(!0);return b.digits=a.digits.slice(0),b.isNeg=a.isNeg,b}function biFromNumber(a){var c,b=new BigInt;for(b.isNeg=0>a,a=Math.abs(a),c=0;a>0;)b.digits[c++]=a&maxDigitVal,a>>=biRadixBits;return b}function reverseStr(a){var c,b="";for(c=a.length-1;c>-1;--c)b+=a.charAt(c);return b}function biToString(a,b){var d,e,c=new BigInt;for(c.digits[0]=b,d=biDivideModulo(a,c),e=hexatrigesimalToChar[d[1].digits[0]];1==biCompare(d[0],bigZero);)d=biDivideModulo(d[0],c),digit=d[1].digits[0],e+=hexatrigesimalToChar[d[1].digits[0]];return(a.isNeg?"-":"")+reverseStr(e)}function biToDecimal(a){var c,d,b=new BigInt;for(b.digits[0]=10,c=biDivideModulo(a,b),d=String(c[1].digits[0]);1==biCompare(c[0],bigZero);)c=biDivideModulo(c[0],b),d+=String(c[1].digits[0]);return(a.isNeg?"-":"")+reverseStr(d)}function digitToHex(a){var b=15,c="";for(i=0;4>i;++i)c+=hexToChar[a&b],a>>>=4;return reverseStr(c)}function biToHex(a){var d,b="";for(biHighIndex(a),d=biHighIndex(a);d>-1;--d)b+=digitToHex(a.digits[d]);return b}function charToHex(a){var h,b=48,c=b+9,d=97,e=d+25,f=65,g=90;return h=a>=b&&c>=a?a-b:a>=f&&g>=a?10+a-f:a>=d&&e>=a?10+a-d:0}function hexToDigit(a){var d,b=0,c=Math.min(a.length,4);for(d=0;c>d;++d)b<<=4,b|=charToHex(a.charCodeAt(d));return b}function biFromHex(a){var d,e,b=new BigInt,c=a.length;for(d=c,e=0;d>0;d-=4,++e)b.digits[e]=hexToDigit(a.substr(Math.max(d-4,0),Math.min(d,4)));return b}function biFromString(a,b){var g,h,i,j,c="-"==a.charAt(0),d=c?1:0,e=new BigInt,f=new BigInt;for(f.digits[0]=1,g=a.length-1;g>=d;g--)h=a.charCodeAt(g),i=charToHex(h),j=biMultiplyDigit(f,i),e=biAdd(e,j),f=biMultiplyDigit(f,b);return e.isNeg=c,e}function biDump(a){return(a.isNeg?"-":"")+a.digits.join(" ")}function biAdd(a,b){var c,d,e,f;if(a.isNeg!=b.isNeg)b.isNeg=!b.isNeg,c=biSubtract(a,b),b.isNeg=!b.isNeg;else{for(c=new BigInt,d=0,f=0;f<a.digits.length;++f)e=a.digits[f]+b.digits[f]+d,c.digits[f]=65535&e,d=Number(e>=biRadix);c.isNeg=a.isNeg}return c}function biSubtract(a,b){var c,d,e,f;if(a.isNeg!=b.isNeg)b.isNeg=!b.isNeg,c=biAdd(a,b),b.isNeg=!b.isNeg;else{for(c=new BigInt,e=0,f=0;f<a.digits.length;++f)d=a.digits[f]-b.digits[f]+e,c.digits[f]=65535&d,c.digits[f]<0&&(c.digits[f]+=biRadix),e=0-Number(0>d);if(-1==e){for(e=0,f=0;f<a.digits.length;++f)d=0-c.digits[f]+e,c.digits[f]=65535&d,c.digits[f]<0&&(c.digits[f]+=biRadix),e=0-Number(0>d);c.isNeg=!a.isNeg}else c.isNeg=a.isNeg}return c}function biHighIndex(a){for(var b=a.digits.length-1;b>0&&0==a.digits[b];)--b;return b}function biNumBits(a){var e,b=biHighIndex(a),c=a.digits[b],d=(b+1)*bitsPerDigit;for(e=d;e>d-bitsPerDigit&&0==(32768&c);--e)c<<=1;return e}function biMultiply(a,b){var d,h,i,k,c=new BigInt,e=biHighIndex(a),f=biHighIndex(b);for(k=0;f>=k;++k){for(d=0,i=k,j=0;e>=j;++j,++i)h=c.digits[i]+a.digits[j]*b.digits[k]+d,c.digits[i]=h&maxDigitVal,d=h>>>biRadixBits;c.digits[k+e+1]=d}return c.isNeg=a.isNeg!=b.isNeg,c}function biMultiplyDigit(a,b){var c,d,e,f;for(result=new BigInt,c=biHighIndex(a),d=0,f=0;c>=f;++f)e=result.digits[f]+a.digits[f]*b+d,result.digits[f]=e&maxDigitVal,d=e>>>biRadixBits;return result.digits[1+c]=d,result}function arrayCopy(a,b,c,d,e){var g,h,f=Math.min(b+e,a.length);for(g=b,h=d;f>g;++g,++h)c[h]=a[g]}function biShiftLeft(a,b){var e,f,g,h,c=Math.floor(b/bitsPerDigit),d=new BigInt;for(arrayCopy(a.digits,0,d.digits,c,d.digits.length-c),e=b%bitsPerDigit,f=bitsPerDigit-e,g=d.digits.length-1,h=g-1;g>0;--g,--h)d.digits[g]=d.digits[g]<<e&maxDigitVal|(d.digits[h]&highBitMasks[e])>>>f;return d.digits[0]=d.digits[g]<<e&maxDigitVal,d.isNeg=a.isNeg,d}function biShiftRight(a,b){var e,f,g,h,c=Math.floor(b/bitsPerDigit),d=new BigInt;for(arrayCopy(a.digits,c,d.digits,0,a.digits.length-c),e=b%bitsPerDigit,f=bitsPerDigit-e,g=0,h=g+1;g<d.digits.length-1;++g,++h)d.digits[g]=d.digits[g]>>>e|(d.digits[h]&lowBitMasks[e])<<f;return d.digits[d.digits.length-1]>>>=e,d.isNeg=a.isNeg,d}function biMultiplyByRadixPower(a,b){var c=new BigInt;return arrayCopy(a.digits,0,c.digits,b,c.digits.length-b),c}function biDivideByRadixPower(a,b){var c=new BigInt;return arrayCopy(a.digits,b,c.digits,0,c.digits.length-b),c}function biModuloByRadixPower(a,b){var c=new BigInt;return arrayCopy(a.digits,0,c.digits,0,b),c}function biCompare(a,b){if(a.isNeg!=b.isNeg)return 1-2*Number(a.isNeg);for(var c=a.digits.length-1;c>=0;--c)if(a.digits[c]!=b.digits[c])return a.isNeg?1-2*Number(a.digits[c]>b.digits[c]):1-2*Number(a.digits[c]<b.digits[c]);return 0}function biDivideModulo(a,b){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,c=biNumBits(a),d=biNumBits(b),e=b.isNeg;if(d>c)return a.isNeg?(f=biCopy(bigOne),f.isNeg=!b.isNeg,a.isNeg=!1,b.isNeg=!1,g=biSubtract(b,a),a.isNeg=!0,b.isNeg=e):(f=new BigInt,g=biCopy(a)),new Array(f,g);for(f=new BigInt,g=a,h=Math.ceil(d/bitsPerDigit)-1,i=0;b.digits[h]<biHalfRadix;)b=biShiftLeft(b,1),++i,++d,h=Math.ceil(d/bitsPerDigit)-1;for(g=biShiftLeft(g,i),c+=i,j=Math.ceil(c/bitsPerDigit)-1,k=biMultiplyByRadixPower(b,j-h);-1!=biCompare(g,k);)++f.digits[j-h],g=biSubtract(g,k);for(l=j;l>h;--l){for(m=l>=g.digits.length?0:g.digits[l],n=l-1>=g.digits.length?0:g.digits[l-1],o=l-2>=g.digits.length?0:g.digits[l-2],p=h>=b.digits.length?0:b.digits[h],q=h-1>=b.digits.length?0:b.digits[h-1],f.digits[l-h-1]=m==p?maxDigitVal:Math.floor((m*biRadix+n)/p),r=f.digits[l-h-1]*(p*biRadix+q),s=m*biRadixSquared+(n*biRadix+o);r>s;)--f.digits[l-h-1],r=f.digits[l-h-1]*(p*biRadix|q),s=m*biRadix*biRadix+(n*biRadix+o);k=biMultiplyByRadixPower(b,l-h-1),g=biSubtract(g,biMultiplyDigit(k,f.digits[l-h-1])),g.isNeg&&(g=biAdd(g,k),--f.digits[l-h-1])}return g=biShiftRight(g,i),f.isNeg=a.isNeg!=e,a.isNeg&&(f=e?biAdd(f,bigOne):biSubtract(f,bigOne),b=biShiftRight(b,i),g=biSubtract(b,g)),0==g.digits[0]&&0==biHighIndex(g)&&(g.isNeg=!1),new Array(f,g)}function biDivide(a,b){return biDivideModulo(a,b)[0]}function biModulo(a,b){return biDivideModulo(a,b)[1]}function biMultiplyMod(a,b,c){return biModulo(biMultiply(a,b),c)}function biPow(a,b){for(var c=bigOne,d=a;;){if(0!=(1&b)&&(c=biMultiply(c,d)),b>>=1,0==b)break;d=biMultiply(d,d)}return c}function biPowMod(a,b,c){for(var d=bigOne,e=a,f=b;;){if(0!=(1&f.digits[0])&&(d=biMultiplyMod(d,e,c)),f=biShiftRight(f,1),0==f.digits[0]&&0==biHighIndex(f))break;e=biMultiplyMod(e,e,c)}return d}function BarrettMu(a){this.modulus=biCopy(a),this.k=biHighIndex(this.modulus)+1;var b=new BigInt;b.digits[2*this.k]=1,this.mu=biDivide(b,this.modulus),this.bkplus1=new BigInt,this.bkplus1.digits[this.k+1]=1,this.modulo=BarrettMu_modulo,this.multiplyMod=BarrettMu_multiplyMod,this.powMod=BarrettMu_powMod}function BarrettMu_modulo(a){var i,b=biDivideByRadixPower(a,this.k-1),c=biMultiply(b,this.mu),d=biDivideByRadixPower(c,this.k+1),e=biModuloByRadixPower(a,this.k+1),f=biMultiply(d,this.modulus),g=biModuloByRadixPower(f,this.k+1),h=biSubtract(e,g);for(h.isNeg&&(h=biAdd(h,this.bkplus1)),i=biCompare(h,this.modulus)>=0;i;)h=biSubtract(h,this.modulus),i=biCompare(h,this.modulus)>=0;return h}function BarrettMu_multiplyMod(a,b){var c=biMultiply(a,b);return this.modulo(c)}function BarrettMu_powMod(a,b){var d,e,c=new BigInt;for(c.digits[0]=1,d=a,e=b;;){if(0!=(1&e.digits[0])&&(c=this.multiplyMod(c,d)),e=biShiftRight(e,1),0==e.digits[0]&&0==biHighIndex(e))break;d=this.multiplyMod(d,d)}return c}var maxDigits,ZERO_ARRAY,bigZero,bigOne,dpl10,lr10,hexatrigesimalToChar,hexToChar,highBitMasks,lowBitMasks,biRadixBase=2,biRadixBits=16,bitsPerDigit=biRadixBits,biRadix=65536,biHalfRadix=biRadix>>>1,biRadixSquared=biRadix*biRadix,maxDigitVal=biRadix-1,maxInteger=9999999999999998;setMaxDigits(20),dpl10=15,lr10=biFromNumber(1e15),hexatrigesimalToChar=new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"),hexToChar=new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"),highBitMasks=new Array(0,32768,49152,57344,61440,63488,64512,65024,65280,65408,65472,65504,65520,65528,65532,65534,65535),lowBitMasks=new Array(0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535);
    
  • 上面代碼補(bǔ)充進(jìn)wyy.js中之后,就可以運(yùn)行生成params和encSecKey,這樣每首歌曲都會(huì)生成這樣一對(duì)表單數(shù)據(jù)作為參數(shù),再由這些參數(shù)構(gòu)架歌曲的地址了。如圖所示。
    在這里插入圖片描述
  • 顯然,上面得到的結(jié)果,分別是params的值encText,以及encSecKey的值encSecKey,這也是表單數(shù)據(jù)里面的形式。經(jīng)過(guò)一系列操作,把表單數(shù)據(jù)信息的加密邏輯分析明白后,再逆向讀取,用Python重新模擬生成了。再看看下面的代碼,是不是覺(jué)得,也不十分陌生了吧。
    在這里插入圖片描述

二、開(kāi)始爬取工作

1、構(gòu)建歌曲地址

  • 改寫(xiě)get_music_url_index方法,把歌曲id和名稱都加入。代碼如下:
        def get_data_index(self):resp = requests.post(url=self.url, data=self.data, headers=self.headers)# print(resp.text)# 此處根據(jù)web?csrf_token=鏈接匯總的預(yù)覽欄,找到字典形式的信息,獲取相應(yīng)歌曲名dict_data = json.loads(resp.text)["result"]["songs"]# 而后遍歷所有歌曲,獲取name和idfor data in dict_data:name = data["name"]id = data["id"]# print(name, id)self.get_music_url_index(id, name)# 定義獲取歌曲地址信息的方法,注意這里加入歌曲的參數(shù)iddef get_music_url_index(self, id, name):content = open("wyy.js", "r", encoding="utf-8").read()data_js = execjs.compile(content)sign = data_js.call("start", id)# 通過(guò)下面打印輸出的結(jié)果,看出來(lái)表單數(shù)據(jù)的構(gòu)造方法成功了# print(sign)# 應(yīng)用上面構(gòu)造的方法,生成表單數(shù)據(jù)data = {"params": sign["encText"],"encSecKey": sign["encSecKey"]}# 定義歌曲鏈接,獲取源代碼resp = requests.post(url=self.music_url, data=data, headers=self.headers).textmusic_url = json.loads(resp)["data"][0]["url"]print(music_url, name)
    

2、修改JS文件中的參數(shù)

  • 上面代碼寫(xiě)完后,相應(yīng)的,wyy.js里面的start函數(shù)里面,也要加上id參數(shù)。如圖。
    在這里插入圖片描述

3、成功獲得歌曲鏈接的地址

  • 效果如圖。
    在這里插入圖片描述

三、保存并總結(jié)

  • 由兩段代碼構(gòu)成,首先在Music_Data類的前面寫(xiě)一個(gè)判斷,判斷根目錄下有沒(méi)有文件夾,沒(méi)有的話就創(chuàng)建。
    file_name = input("請(qǐng)手動(dòng)創(chuàng)建保存歌曲的文件夾:")
    if not os.path.exists(file_name):os.mkdir(file_name)
    
  • 再到Music_Data類的里面,寫(xiě)一個(gè)保存的方法write_music,代碼如下:
    # 保存
    def write_music(self, music_url, name):try:with open(f"./{file_name}/"+name+".mp3", "wb") as f:resp = requests.get(music_url).contentf.write(resp)print(name, "----保存成功")except Exception as e:print(e)
    
  • 運(yùn)行一下程序,得到想要的結(jié)果。如圖。
    在這里插入圖片描述
  • 打開(kāi)歌曲所在的文件夾,也能看到,成功。
    在這里插入圖片描述
  • 總結(jié)如下:
    • 以上是用js逆向的方法完成歌曲的爬取下載。用到了JavaScript技術(shù),那么這個(gè)技術(shù)也需要熟練掌握,不然爬蟲(chóng)技術(shù)也是無(wú)法突破。
    • 本例中,首先找到token的信息,把里面歌曲的鏈接地址,包括生成這個(gè)地址的加密形式的表單數(shù)據(jù),以及歌曲的id和name都找到。然后,進(jìn)一步尋找表單數(shù)據(jù)的加密邏輯,創(chuàng)建相應(yīng)的js文件。最后,繼續(xù)編寫(xiě)主程序代碼,把構(gòu)建歌曲地址的方法,以及保存歌曲的方法寫(xiě)入,最后成功運(yùn)行。
    • 當(dāng)然,不用逆向,通過(guò)分析網(wǎng)頁(yè),預(yù)覽源代碼,用json方法獲取字典形式的歌曲url,也是能實(shí)現(xiàn)爬取歌曲的目的。不過(guò)本節(jié)學(xué)習(xí)逆向方法,就繞了這么一大彎。
    • 真正遇到加密性強(qiáng)的網(wǎng)站,本節(jié)練習(xí)的內(nèi)容,權(quán)當(dāng)是爬蟲(chóng)逆向的入門知識(shí)了。
    • 注:想要源碼的問(wèn)一下anqiuxiguanli
http://www.risenshineclean.com/news/66229.html

相關(guān)文章:

  • 公司網(wǎng)站怎么做店鋪seo是什么意思
  • 重慶做營(yíng)銷型網(wǎng)站建設(shè)公司關(guān)鍵詞優(yōu)化一年的收費(fèi)標(biāo)準(zhǔn)
  • 商業(yè)網(wǎng)站建設(shè)案例教程seo是干什么的
  • 怎么制作網(wǎng)站客服百度網(wǎng)頁(yè)版鏈接地址
  • 網(wǎng)站建設(shè)報(bào)價(jià)單表格深圳網(wǎng)站seo推廣
  • 做網(wǎng)站的人怎么上傳內(nèi)容的湖南網(wǎng)站建站系統(tǒng)哪家好
  • 溫州網(wǎng)站建設(shè)方案報(bào)價(jià)seo優(yōu)化排名易下拉用法
  • 四川省網(wǎng)站建設(shè)百度網(wǎng)頁(yè)打不開(kāi)
  • 建筑工程信息頻道寧波受歡迎全網(wǎng)seo優(yōu)化
  • 網(wǎng)站開(kāi)發(fā)php怎么樣百度推廣代理商加盟
  • wordpress菜譜網(wǎng)站站長(zhǎng)之家ip地址查詢
  • github 建網(wǎng)站行業(yè)網(wǎng)站有哪些平臺(tái)
  • 網(wǎng)站怎么做播放器促銷活動(dòng)推廣語(yǔ)言
  • 設(shè)計(jì)素材網(wǎng)站源碼seo谷歌外貿(mào)推廣
  • 自己的簡(jiǎn)歷網(wǎng)站怎么做百度收錄查詢工具官網(wǎng)
  • 做網(wǎng)站建設(shè)的電話銷售免費(fèi)建立網(wǎng)站
  • 網(wǎng)站服務(wù)器要多少錢南寧推廣軟件
  • 做電氣設(shè)計(jì)有哪些好的網(wǎng)站四川省人民政府官網(wǎng)
  • 網(wǎng)站首頁(yè)不被收錄上海廣告公司
  • 香港公司能在國(guó)內(nèi)做網(wǎng)站個(gè)人免費(fèi)網(wǎng)上注冊(cè)公司
  • 企業(yè)網(wǎng)站的建設(shè)流程南昌seo數(shù)據(jù)監(jiān)控
  • 帝國(guó)cms怎么做網(wǎng)站谷歌ads
  • 電腦哪里做模板下載網(wǎng)站查找關(guān)鍵詞的工具叫什么
  • 德陽(yáng)市住房和城鄉(xiāng)建設(shè)局網(wǎng)站首頁(yè)網(wǎng)站推廣上首頁(yè)
  • 做網(wǎng)站的不給源文件搜索引擎網(wǎng)站
  • 網(wǎng)站備案到公司搜狗搜索網(wǎng)
  • wordpress將用戶鎖在前臺(tái)seo如何優(yōu)化網(wǎng)站
  • 網(wǎng)站建設(shè)需求分析報(bào)告seo搜索引擎優(yōu)化推廣專員
  • 淘客網(wǎng)站模版泉州seo培訓(xùn)
  • 哪個(gè)網(wǎng)站可以做信用社的題百度宣傳廣告要多少錢