通过客户端js或.m3u8文件扩展名下载VKontakte音频

这一切是如何开始的...


和往常一样,我决定挂在VKontakte上,将一些新的录音下载到计算机上。 但是我很失望:录音以某种奇怪的格式返回:m3u8。 这种格式甚至没有播放vlc媒体播放器,我开始考虑该怎么做...

实际做什么?


谷歌搜索它是哪种.m3u8格式,我意识到这是.m3u格式的音频。 好的,下载此.m3u8文件,使用文本编辑器将其打开,然后看到类似以下内容的内容:

文字内容
#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST 


我们进一步了解

 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh 

-录音路径。 也就是说,您需要为每个路径替换一个主机,并且很可能该音频将变为可播放。 在python上快速抛出了几行代码后,我们实现了这一点:

代号
 import re text='''#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST''' host='https://cs9-5v4.vkuseraudio.net/p16/d5fce44eae6dbc/' al = re.findall('\n.+?\.ts\?extra\=.+?\n',text) for r in al: text=text.replace(r,'\n'+host+r.strip('\n')+'\n') print(text) input() nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh import re text='''#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST''' host='https://cs9-5v4.vkuseraudio.net/p16/d5fce44eae6dbc/' al = re.findall('\n.+?\.ts\?extra\=.+?\n',text) for r in al: text=text.replace(r,'\n'+host+r.strip('\n')+'\n') print(text) input() nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh import re text='''#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST''' host='https://cs9-5v4.vkuseraudio.net/p16/d5fce44eae6dbc/' al = re.findall('\n.+?\.ts\?extra\=.+?\n',text) for r in al: text=text.replace(r,'\n'+host+r.strip('\n')+'\n') print(text) input() nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh import re text='''#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST''' host='https://cs9-5v4.vkuseraudio.net/p16/d5fce44eae6dbc/' al = re.findall('\n.+?\.ts\?extra\=.+?\n',text) for r in al: text=text.replace(r,'\n'+host+r.strip('\n')+'\n') print(text) input() nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh import re text='''#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST''' host='https://cs9-5v4.vkuseraudio.net/p16/d5fce44eae6dbc/' al = re.findall('\n.+?\.ts\?extra\=.+?\n',text) for r in al: text=text.replace(r,'\n'+host+r.strip('\n')+'\n') print(text) input() 


我们得到了一个已经可以播放的.m3u文件。

但是! 问题是:

  • 仅在指向音频间隙的链接有效时才能播放此文件。
  • 您还可以仅在链接有效的情况下转换文件
  • 您只能在接收文件的计算机上转换文件。 链接绑定到PC的IP地址。

了解了所有这些之后,我决定在客户端js上编写一个程序,以便可以在命令行上执行它。 这是我得到的:

程序
 class music_get{ constructor(){ this.el=document.getElementsByClassName("audio_row"); this.str_param=[]; this.json=[]; this.last_len=this.el.length; this.make_str(this.el); this.load_audio_to_json(0,this.str_param[0]); } parse(element_){ //,  id ,     ,   . //let i=JSON.parse(element_.attributes['data-audio'].nodeValue),s1=i[13].split("/"); //return i[1]+"_"+i[0]+"_"+s1[2]+"_"+s1[s1.length-2]; let i = AudioUtils.asObject(JSON.parse(element_.getAttribute('data-audio'))); return i.fullId+"_"+i.actionHash+"_"+i.urlHash; } encode_url(t) { //,     let c = {v:(t)=> { return t.split('').reverse().join('')},r: (t, e) => {t = t.split('');for (let i, o = _ + _, a = t.length; a--; ) ~(i = o.indexOf(t[a])) && (t[a] = o.substr(i - e, 1));return t.join('')}, s: (t,e)=> { let i = t.length;if (i) { let o = function(t, e) {let i = t.length,o = [];if (i) {let a = i;for (e = Math.abs(e); a--; ) e = (i * (a + 1) ^ e + a) % i,o[a] = e }return o}(t, e), a = 0;for (t = t.split(''); ++a < i; ) t[a] = t.splice(o[i - 1 - a], 1, t[a]) [0];t = t.join('')}return t}, i:(t, e)=> {return cs(t, e ^ vk.id)},x: (t, e)=> {let i = [];return e = e.charCodeAt(0),each(t.split(''), (t, o) => {i.push(String.fromCharCode(o.charCodeAt(0) ^ e))}),i.join('')} },_ = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789+/=',h=(t)=>{ if (!t || t.length % 4 == 1) return !1;for (var e, i, o = 0, a = 0, s = ''; i = t.charAt(a++); ) ~(i = _.indexOf(i)) && (e = o % 4 ? 64 * e + i : i, o++ % 4) && (s += String.fromCharCode(255 & e >> ( - 2 * o & 6)));return s}; if ((!window.wbopen || !~(window.open + '').indexOf('wbopen')) && ~t.indexOf('audio_api_unavailable')) { let e = t.split('?extra=')[1].split('#'),i=''===e[1]?'':h(e[1]); if (e = h(e[0]), 'string' != typeof i || !e) return t;for (var o, a, s = (i = i ? i.split(String.fromCharCode(9)) : []).length; s--; ) {if (o = (a = i[s].split(String.fromCharCode(11))).splice(0, 1, e) [0], !c[o]) return t; e = c[o].apply(null, a)}if (e && 'http' === e.substr(0, 4)) return e}return t } end(){ //    html    each(this.json,(_,item)=>{ let els = document.querySelectorAll('[data-full-id="'+item.fullId+'"]')[0]; if(els.children[0].children[6].children.length===3)return; els.children[0].children[6].innerHTML+="<div onclick='new music_download().download(this);' style='float:right;height:40px;width:40px;background:url(/doc472427950_504561254) no-repeat 5px 5px;'></div>" els.children[0].children[6].children[2].attributes.info=item; }); } make_str(mass){ //,    str_param   id ,     . each(mass,(i,e)=>{ if(Math.floor(i/10)===i/10) this.str_param.push(this.parse(e)); else this.str_param[this.str_param.length-1]+=","+this.parse(e); }); } load_audio_to_json(i,l){ //    ,        , //       this.json ajax.post("/al_audio.php",{act:'reload_audio',al:'1',ids:l},{onDone:(a)=>{ //each - ,     vk.com -   array.forEach each(a,(_,c)=>{ c=AudioUtils.asObject(c); //   ,    ) c.url = this.encode_url(c.url); this.json.push(c); }); // if(this.str_param.length-1===i) this.end(); else this.load_audio_to_json(i+1,this.str_param[i+1]); }}); } _update_scroll(){ //,    . if(this.el.length===this.last_len)return; let c = this.el.length,offset=c-this.last_len; this.last_len=c; let arr = Array.from(this.el).splice(-offset); this._load_button(arr); } _load_button(list){ //,    . let leng=this.str_param.length-1; this.make_str(list); this.load_audio_to_json(leng,this.str_param[leng]); } } class music_download{ //constructor(){} download(e){ this.info = e.attributes.info; //   - .mp3,        if(this.info.url.indexOf(".mp3?")!==-1) window.open(this.info.url); else //       .m3u8,   (), //       .ts,    . //    response: fetch(this.info.url).then((e)=>e.text().then((e)=>this.response(e))); } response(data){ let alls = data.match(/\n.+?\.ts\?/ig), host=this.info.url.split("index.m3u8")[0]; each(alls,(_,e)=>data=data.replace(e,"\n"+host+e.replace('\n',''))); //   this.download_data(this.info.title.replace(/[-\/\\:*?"<>|]/gim,'')+".m3u8",data); } download_data(f_n, t) { let e = document.createElement('a'); e.setAttribute('href', //'data:text/plain;charset=utf-8,' 'data:text/html;base64,'+ btoa(t)); e.setAttribute('download', f_n); e.style.display = 'none'; document.body.appendChild(e); e.click(); document.body.removeChild(e); } } var mus = new music_get(); //  window.onscroll=()=>mus._update_scroll(); 

结果是这样的:


此外,将所有音频下载到一个文件夹中后,我编写了以下python代码,将所有.m3u8音频转换为.ts

代号
 import requests,re,os def convert_mp3(f): z=open(f).read() con=list(map(lambda e: e.rstrip('\n').rstrip('#EXT-X-ENDLIST').rstrip("\n") if '#EXTM3U' not in e else '' ,re.split('#EXTINF:\d+.\d+,\n',z))) z = b'' for r in con: if(r==''):continue; z+=requests.get(r).content open(f.strip(".m3u8")+".ts",'bw').write(z) z=set() for file in os.listdir(): if file.endswith(".m3u8"): z.add(file) convert_mp3(file) z=',\n'.join(z) input(f":{z} .\n Enter,  !") 


原则上,您可以尝试在js上合并.ts摘录,然后下载整个文件,但我没有成功(

PS成功的人-在评论中写下
PPS我忘了说Yandex.browser仍然会返回指向.mp3的链接)

更新:


如正确指出的nokimaro,您可以立即下载mp3:
代号
 class music_get{ constructor(){ this.el=document.getElementsByClassName("audio_row"); this.s=[]; this.j=[]; this.last_len=this.el.length; this.make_str(this.el); this.load_audio_to_json(0,this.s[0]); } parse(element_){ //,  id ,     ,   . //let i=JSON.parse(element_.attributes['data-audio'].nodeValue),s1=i[13].split("/"); //return i[1]+"_"+i[0]+"_"+s1[2]+"_"+s1[s1.length-2]; let i = AudioUtils.asObject(JSON.parse(element_.getAttribute('data-audio'))); return i.fullId+"_"+i.actionHash+"_"+i.urlHash; } encode_url(t) { //,     let c = {v:(t)=> { return t.split('').reverse().join('')},r: (t, e) => {t = t.split('');for (let i, o = _ + _, a = t.length; a--; ) ~(i = o.indexOf(t[a])) && (t[a] = o.substr(i - e, 1));return t.join('')}, s: (t,e)=> { let i = t.length;if (i) { let o = function(t, e) {let i = t.length,o = [];if (i) {let a = i;for (e = Math.abs(e); a--; ) e = (i * (a + 1) ^ e + a) % i,o[a] = e }return o}(t, e), a = 0;for (t = t.split(''); ++a < i; ) t[a] = t.splice(o[i - 1 - a], 1, t[a]) [0];t = t.join('')}return t}, i:(t, e)=> {return cs(t, e ^ vk.id)},x: (t, e)=> {let i = [];return e = e.charCodeAt(0),each(t.split(''), (t, o) => {i.push(String.fromCharCode(o.charCodeAt(0) ^ e))}),i.join('')} },_ = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789+/=',h=(t)=>{ if (!t || t.length % 4 == 1) return !1;for (var e, i, o = 0, a = 0, s = ''; i = t.charAt(a++); ) ~(i = _.indexOf(i)) && (e = o % 4 ? 64 * e + i : i, o++ % 4) && (s += String.fromCharCode(255 & e >> ( - 2 * o & 6)));return s}; if ((!window.wbopen || !~(window.open + '').indexOf('wbopen')) && ~t.indexOf('audio_api_unavailable')) { let e = t.split('?extra=')[1].split('#'),i=''===e[1]?'':h(e[1]); if (e = h(e[0]), 'string' != typeof i || !e) return t;for (var o, a, s = (i = i ? i.split(String.fromCharCode(9)) : []).length; s--; ) {if (o = (a = i[s].split(String.fromCharCode(11))).splice(0, 1, e) [0], !c[o]) return t; e = c[o].apply(null, a)}if (e && 'http' === e.substr(0, 4)) return e}return t } end(){ //    html    each(this.j,(_,i)=>{ let e = document.querySelectorAll('[data-full-id="'+i.fullId+'"]')[0],q=e.children[0].children[6]; if(q.children.length===3)return; q.innerHTML+="<a href='"+this._g(i)+"' target='_blank' style='float:right;height:40px;width:40px;background:url(/doc472427950_504561254) no-repeat 5px 5px;'></a>" }); } _g(info){ if(info.url.indexOf(".mp3?")!==-1) return info.url; else return info.url.replace("/index.m3u8",".mp3").replace(/\/\w{11}\//,'/'); } make_str(mass){ //,    s   id ,     . each(mass,(i,e)=>{ if(Math.floor(i/10)===i/10) this.s.push(this.parse(e)); else this.s[this.s.length-1]+=","+this.parse(e); }); } load_audio_to_json(i,l){ //    ,        , //       this.j ajax.post("/al_audio.php",{act:'reload_audio',al:'1',ids:l},{onDone:(a)=>{ //each - ,     vk.com -   array.forEach each(a,(_,c)=>{ c=AudioUtils.asObject(c); //   ,    ) c.url = this.encode_url(c.url); this.j.push(c); }); // if(this.s.length-1===i) this.end(); else this.load_audio_to_json(i+1,this.s[i+1]); }}); } _update_scroll(){ //,    . if(this.el.length===this.last_len)return; let c = this.el.length,offset=c-this.last_len; this.last_len=c; let arr = Array.from(this.el).splice(-offset); this._load_button(arr); } _load_button(list){ //,    . let leng=this.s.length-1; this.make_str(list); this.load_audio_to_json(leng,this.s[leng]); } } //  var m = new music_get(); window.onscroll=()=>m._update_scroll(); 

压缩代码:
 eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('8 p=7(){5.y=O.1a("1b");5.s=[];5.j=[];5.C=5.yo;5.J(5.y);5.D(0,5.s[0])};pqE=7(a){a=PQ(1c.E(a.1d("R-1e")));n a.S+"T"+a.1f+"T"+a.1g};pqU=7(a){8 b={v:7(a){n at("").1h().F("")},r:7(a,b){a=at("");A(8 k=1i 0,e=d+d,c=ao;c--;)~(k=eB(a[c]))&&(a[c]=eV(kb,1));n aF("")},s:7(a,b){8 c=ao;u(c){8 e=b,d=ao,f=[];u(d){8 g=d;A(e=W.1j(e);g--;)e=(d*(g+1)^e+g)%d,f[g]=e}e=0;A(a=at("");++e<c;)a[e]=aK(f[c-1-e],1,a[e])[0];a=aF("")}na},i:7(a,d){n bs(a,d^1k.X)},x:7(a,d){8 b=[];nd=dY(0),G(at(""),7(a,c){bL(HI(cY(0)^d))}),bF("")}},d="1l+/=",c=7(a){u(!a||1==ao%4)n!1;A(8 b,c,e=0,g=0,f="";c=a.1m(g++);)~(c=dB(c))&&(b=e%4?1n*b+c:c,e++%4)&&(f+=HI(1o&b>>(-2*e&6)));nf};u((!MZ||!~(M.1p+"").B("Z"))&&~aB("1q")){8 f=at("?1r=")[1].t("#"),g=""===f[1]?"":c(f[1]);u(f=c(f[0]),"1s"!=1t g||!f)na;A(8 h,l=(g=g?gt(HI(9)):[]).o;l--;){u(h=(c=g[l].t(HI(11))).K(0,1,f)[0],!b[h])na;f=b[h].1u(1v,c)}u(f&&"1w"===fV(0,4))nf}na};pq12=7(){8 a=5;G(5.j,7(b,d){8 c=O.1x(\'[R-1y-X="\'+d.S+\'"]\')[0].N[0].N[6];3!==cNo&&(c.1z+="<a 1A=\'"+a.13(d)+"\' 1B=\'1C\' 1D=\'1E:1F;1G:14;1H:14;1I:z(/1J) 1K-1L 15 15;\'></a>")})};pq13=7(a){n-1!==azB(".16?")?az:az17("/1M.1N",".16").17(/\\/\\w{11}\\//,"/")};pqJ=7(a){8 b=5;G(a,7(a,c){W.1O(a/10)===a/10?bsL(bE(c)):bs[bso-1]+=","+bE(c)})};pqD=7(a,b){8 d=5;1P.1Q("/1R.1S",{1T:"1U",1V:"1",1W:b},{1X:7(b){G(b,7(a,b){b=PQ(b);bz=dU(bz);djL(b)});dso-1===a?d.12():dD(a+1,ds[a+1])}})};pq18=7(){u(5.yo!==5.C){8 a=5.yo,b=a-5.C;5.C=a;a=1Y.1Z(5.y).K(-b);5.19(a)}};pq19=7(a){8 b=5.so-1;5.J(a);5.D(b,5.s[b])};8 m=20 p;M.21=7(){n m.18()};',62,126,'|||||this||function|var|||||||||||||||return|length|music_get|prototype|||split|if||||el|url|for|indexOf|last_len|load_audio_to_json|parse|join|each|String|fromCharCode|make_str|splice|push|window|children|document|AudioUtils|asObject|data|fullId|_|encode_url|substr|Math|id|charCodeAt|wbopen|||end|_g|40px|5px|mp3|replace|_update_scroll|_load_button|getElementsByClassName|audio_row|JSON|getAttribute|audio|actionHash|urlHash|reverse|void|abs|vk|abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789|charAt|64|255|open|audio_api_unavailable|extra|string|typeof|apply|null|http|querySelectorAll|full|innerHTML|href|target|_blank|style|float|right|height|width|background|doc472427950_504561254|no|repeat|index|m3u8|floor|ajax|post|al_audio|php|act|reload_audio|al|ids|onDone|Array|from|new|onscroll'.split('|'),0,{})) 

Source: https://habr.com/ru/post/zh-CN457438/


All Articles