利用爬虫js逆向破解网易云制作播放器
目标网易云音乐
详情见B站教程https://www.bilibili.com/video/BV18V4y1T79F?p=14
还有这两篇https://blog.csdn.net/zly717216/article/details/113522474
https://blog.csdn.net/qq_36779888/article/details/90738012
抓包
喜爱页
https://music.163.com/weapi/v6/playlist/detail?csrf_token=880738687515b74fb700788c52270b8b

搜索页
https://music.163.com/#/search/m/?id=7053185814&s=陈奕迅&type=1

歌曲页
https://music.163.com/#/song?id=65800

辅助代码,下载喜爱歌曲到一个列表里面
import execjs
import requests
headers = {
'referer': 'https://music.163.com/',
'cookie':'_ga=GA1.1.18448714.1632904553; _ntes_nuid=9c0d0f8e61f12c731b6fb04a2d2e279b; _ga_C6TGHFPQ1H=GS1.1.1632904553.1.0.1632904615.0; NMTID=00Ozo1wJ1fXcNyV6kiHvvcOtt5D20kAAAF8ZQy0RA; WNMCID=wsqenr.1633782907500.01.0; WEVNSM=1.0.0; WM_TID=dI1C5xAE2t1AURUEBUI78DgnQaSfP1on; usertrack=ezq0J2LYu3quZhxDA9yVAg==; ntes_kaola_ad=1; _ntes_nnid=9c0d0f8e61f12c731b6fb04a2d2e279b,1664203664905; __snaker__id=FcswSyk2djPmoVxA; YD00000558929251%3AWM_TID=S6hdsgMkCj1BRAQUQELVSiqMIXGKybbE; _9755xjdesxxd_=32; hb_MA-93D5-9AD06EA4329A_source=www.baidu.com; __root_domain_v=.163.com; _qddaz=QD.351866958934376; WM_NI=0muVkpfNdOBVCkJVaAa%2FRcJak77OdnGHxOZhxcKgWNuswIp1NId%2BMR28EuoKp4V4WTfqCac3%2BW61WiioRfKkvvm5HMsdYH5Ww6122FHIXTAS5yBcz2CvHtsFIWN8vBYGZHo%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eea8e14489eea984f664f6bc8bb3d45a968f9b87c85287bac0d4b85b8a9ae5ccb52af0fea7c3b92af4b3bbb7ea7ca692acb0c15e81b586b7e44ba3f19e84c96ba9e9f9b0e7668598b8b0d964bcbd8588d646b7adb9aaf33b8e97acccd05af2e88b96ee41b4ec9ad5d660a6af8d82e239e989fad2d663abb19e87ca61b6aaa3d6cb47b1bc97a9b85db5eaffd3b14e8c9798b5c459f7a78e84f93a81aa8895f24e8b8982d9f54a9b9996a9ee37e2a3; gdxidpyhxdE=%5CSQfxqPLswGhHQkWaeqziJH113SBu%2B87SD%2ByEUsco%5CIL%2FpCYi8dfNwN6prCjgxD%2FL9uUnPAMaH9m7RItN7P%2F%5CjhdJ6s5yM54QznWjYDgDAabyvfiVtLb616m59%2F7REbBvqN9SxyrKjPI1NsEWpWy2YbmI%2B%5CqP%2B7Eecb7lsWE8lZ%5CQp%5Cu%3A1667012947397; YD00000558929251%3AWM_NI=d9l9PqWZ04W0cPm6nuaQkN2%2FR7Cix7xJrv6G8x8OxLYm2e73LzLf0hRTEzf5I6PbSYQ124M%2FDcE%2FKyU%2BYuM6qHPfogH1L%2FQcCHVWyHIHtWlqpmKBauFngIYmTLFIr9xNZXY%3D; YD00000558929251%3AWM_NIKE=9ca17ae2e6ffcda170e2e6eed9c84f889cafbae2259bb48aa7d15b839b8ab1d54783ef988fc953a38bae99c92af0fea7c3b92aa8e7a4dad37b958600d5d63ca190a3d7ed7fa38fa5afb12592e98d8afb3dbc96be97b54dfca8f8b0fb489bb3fe86b63990a68487b364928c8b9be53f8beaa083d25393effed5d02588bd8bd0ca7397f59796d03eb398a087ee6d8cef84d0d46981989ab8fc448b98bcb8ef7bb4b385a3e47f86b2a9aadc6798948aaaf133bc9296b9dc37e2a3; __csrf=880738687515b74fb700788c52270b8b; MUSIC_U=6acc1a5bb7fe3625dc22db7370d5570bbb40d86bd42b29f60c049e3db3398c4f993166e004087dd326a0f72a48558f6c6c17c85bdd7a8046672c525893c48e2b37ecc291c0801a2ad4dbf082a8813684; _iuqxldmzr_=32; playerid=98979907; JSESSIONID-WYYY=ReeUtuIMo5N4sNZQWIvASEdPBWwXp2Xvf3zGHnwm%5Csz2EAMOePH1qxiuJHyUZxErrcvSSntMzKc%2Fs88lzv7JPqtpvzftMTx6%2Fo4sTy4GvfiBPzdPomqXI%5CwQ%5C%5CbC0AGrR2zxyJFFiBH9Z3H0j8Hh2%2BOszJSxZO13fDuqukPQrigm1NzR%3A1667034584884',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
params = {
'csrf_token': 'c08dc13fbcff3a4a9285ed4250812a22',
}
ctx=open('Python/实战项目/爬虫网易云播放器/网易云.js','r').read()
song_list=[]
like_list=[]
# 个人喜爱歌单
def get_like_list():
like_encText=execjs.compile(ctx).call('get_like_encText')
like_encSecKey=execjs.compile(ctx).call('get_like_encSecKey')
like_data={
'params': like_encText,
'encSecKey': like_encSecKey,
}
like_url='https://music.163.com/weapi/v6/playlist/detail'
like_songs= requests.post(like_url, params=params,headers=headers, data=like_data).json()['playlist']['tracks']
for song in like_songs:
song_name=song['name']
id=song['id']
singer=song['ar'][0]['name']
song=get_song(id,song_name,singer)
like_list.append(song)
print(song)
with open('Python/实战项目/爬虫网易云播放器/我的喜欢.txt','w',encoding='utf-8') as f:
f.write(str(like_list)+",")
# 获取歌曲
def get_song(id,song_name,singer):
encText=execjs.compile(ctx).call('get_encText',id)
encSecKey=execjs.compile(ctx).call('get_encSecKey')
song_data = {
'params': encText,
'encSecKey': encSecKey,
}
song_url = 'https://music.163.com/weapi/song/enhance/player/url/v1'
song_data = requests.post(song_url, params=params,headers=headers, data=song_data).json()['data'][0]
song_id=song_data['id']
m4a_url=song_data['url']
song={
'id':song_id,
'name':song_name,
'singer':singer,
'url':m4a_url
}
if m4a_url !=None:
song['url']=f"http://music.163.com/song/media/outer/url?id={song_id}"
return song
主界面的代码
import random
import requests
import execjs
import requests
import tkinter as tk
import os
import pygame as py
from pydub import AudioSegment
from pydub.playback import play
from playsound import playsound
from Likedsongs import I_liked_songs
headers = {
'referer': 'https://music.163.com/',
'cookie':'_ga=GA1.1.18448714.1632904553; _ntes_nuid=9c0d0f8e61f12c731b6fb04a2d2e279b; _ga_C6TGHFPQ1H=GS1.1.1632904553.1.0.1632904615.0; NMTID=00Ozo1wJ1fXcNyV6kiHvvcOtt5D20kAAAF8ZQy0RA; WNMCID=wsqenr.1633782907500.01.0; WEVNSM=1.0.0; WM_TID=dI1C5xAE2t1AURUEBUI78DgnQaSfP1on; usertrack=ezq0J2LYu3quZhxDA9yVAg==; ntes_kaola_ad=1; _ntes_nnid=9c0d0f8e61f12c731b6fb04a2d2e279b,1664203664905; __snaker__id=FcswSyk2djPmoVxA; YD00000558929251%3AWM_TID=S6hdsgMkCj1BRAQUQELVSiqMIXGKybbE; _9755xjdesxxd_=32; hb_MA-93D5-9AD06EA4329A_source=www.baidu.com; __root_domain_v=.163.com; _qddaz=QD.351866958934376; WM_NI=0muVkpfNdOBVCkJVaAa%2FRcJak77OdnGHxOZhxcKgWNuswIp1NId%2BMR28EuoKp4V4WTfqCac3%2BW61WiioRfKkvvm5HMsdYH5Ww6122FHIXTAS5yBcz2CvHtsFIWN8vBYGZHo%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eea8e14489eea984f664f6bc8bb3d45a968f9b87c85287bac0d4b85b8a9ae5ccb52af0fea7c3b92af4b3bbb7ea7ca692acb0c15e81b586b7e44ba3f19e84c96ba9e9f9b0e7668598b8b0d964bcbd8588d646b7adb9aaf33b8e97acccd05af2e88b96ee41b4ec9ad5d660a6af8d82e239e989fad2d663abb19e87ca61b6aaa3d6cb47b1bc97a9b85db5eaffd3b14e8c9798b5c459f7a78e84f93a81aa8895f24e8b8982d9f54a9b9996a9ee37e2a3; gdxidpyhxdE=%5CSQfxqPLswGhHQkWaeqziJH113SBu%2B87SD%2ByEUsco%5CIL%2FpCYi8dfNwN6prCjgxD%2FL9uUnPAMaH9m7RItN7P%2F%5CjhdJ6s5yM54QznWjYDgDAabyvfiVtLb616m59%2F7REbBvqN9SxyrKjPI1NsEWpWy2YbmI%2B%5CqP%2B7Eecb7lsWE8lZ%5CQp%5Cu%3A1667012947397; YD00000558929251%3AWM_NI=d9l9PqWZ04W0cPm6nuaQkN2%2FR7Cix7xJrv6G8x8OxLYm2e73LzLf0hRTEzf5I6PbSYQ124M%2FDcE%2FKyU%2BYuM6qHPfogH1L%2FQcCHVWyHIHtWlqpmKBauFngIYmTLFIr9xNZXY%3D; YD00000558929251%3AWM_NIKE=9ca17ae2e6ffcda170e2e6eed9c84f889cafbae2259bb48aa7d15b839b8ab1d54783ef988fc953a38bae99c92af0fea7c3b92aa8e7a4dad37b958600d5d63ca190a3d7ed7fa38fa5afb12592e98d8afb3dbc96be97b54dfca8f8b0fb489bb3fe86b63990a68487b364928c8b9be53f8beaa083d25393effed5d02588bd8bd0ca7397f59796d03eb398a087ee6d8cef84d0d46981989ab8fc448b98bcb8ef7bb4b385a3e47f86b2a9aadc6798948aaaf133bc9296b9dc37e2a3; __csrf=880738687515b74fb700788c52270b8b; MUSIC_U=6acc1a5bb7fe3625dc22db7370d5570bbb40d86bd42b29f60c049e3db3398c4f993166e004087dd326a0f72a48558f6c6c17c85bdd7a8046672c525893c48e2b37ecc291c0801a2ad4dbf082a8813684; _iuqxldmzr_=32; playerid=98979907; JSESSIONID-WYYY=ReeUtuIMo5N4sNZQWIvASEdPBWwXp2Xvf3zGHnwm%5Csz2EAMOePH1qxiuJHyUZxErrcvSSntMzKc%2Fs88lzv7JPqtpvzftMTx6%2Fo4sTy4GvfiBPzdPomqXI%5CwQ%5C%5CbC0AGrR2zxyJFFiBH9Z3H0j8Hh2%2BOszJSxZO13fDuqukPQrigm1NzR%3A1667034584884',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
params = {
'csrf_token': 'c08dc13fbcff3a4a9285ed4250812a22',
}
ctx=open('Python/实战项目/爬虫网易云播放器/网易云.js','r').read()
song_list=[]
# 个人喜爱歌单
def get_like_list():
lab=tk.Label(root,text="猜你喜欢",font=('kaiti',16))
lab.grid(row=2,column=0,columnspan=4)
song_list=random.sample(I_liked_songs,10)
show(song_list)
# 搜索歌单
def get_song_list():
query=var.get()
list_encText=execjs.compile(ctx).call('get_list_encText',query)
list_encSecKey=execjs.compile(ctx).call('get_list_encSecKey')
list_data={
'params': list_encText,
'encSecKey': list_encSecKey,
}
search_url='https://music.163.com/weapi/cloudsearch/get/web'
songs= requests.post(search_url, params=params,headers=headers, data=list_data).json()['result']['songs']
for i,song in enumerate(songs):
song_name=song['name']
id=song['id']
singer=song['ar'][0]['name']
song=get_song(id,song_name,singer)
print(song)
song_list.append(song)
if i==9:
break
lab=tk.Label(root,text="以下是搜索结果",font=('kaiti',16))
lab.grid(row=2,column=0,columnspan=4)
show(song_list)
# 获取歌曲
def get_song(id,song_name,singer):
encText=execjs.compile(ctx).call('get_encText',id)
encSecKey=execjs.compile(ctx).call('get_encSecKey')
song_data = {
'params': encText,
'encSecKey': encSecKey,
}
song_url = 'https://music.163.com/weapi/song/enhance/player/url/v1'
song_data = requests.post(song_url, params=params,headers=headers, data=song_data).json()['data'][0]
song_id=song_data['id']
m4a_url=song_data['url']
song={
'id':song_id,
'name':song_name,
'singer':singer,
'url':m4a_url
}
if m4a_url:
song['url']=f"http://music.163.com/song/media/outer/url?id={song_id}"
return song
# 显示搜索结果
def show(song_list):
lab=tk.Label(root,width=10,text="歌曲ID",font=('heiti',12))
lab.grid(row=3,column=0)
lab=tk.Label(root,width=25,text="歌名",font=('heiti',12))
lab.grid(row=3,column=1)
lab=tk.Label(root,width=15,text="歌手",font=('heiti',12))
lab.grid(row=3,column=2)
btn=tk.Button(root,width=10,text="刷新列表",font=('heiti',12),command=get_like_list)
btn.grid(row=3,column=3)
for i,song in enumerate(song_list):
lab=tk.Label(root,width=10,text=song['id'],font=('songti',12))
lab.grid(row=4+i,column=0)
lab=tk.Label(root,width=25,text=song['name'],anchor='w',font=('songti',12))
lab.grid(row=4+i,column=1,sticky='w')
lab=tk.Label(root,width=15,text=song['singer'],anchor='w',font=('songti',12))
lab.grid(row=4+i,column=2,sticky='w')
if song['url'] is None:
btn=tk.Button(root,width=10,text="VIP尊享",font=('songti',12))
else:
btn=tk.Button(root,width=10,text="播放",font=('songti',12),command=lambda x=song:play_song(x))
btn.grid(row=4+i,column=3)
# 播放歌曲
def play_song(song):
url=song['url']
name=song['name']
id=song['id']
music_path=f'D:/56号妖精仓库/square/Python/实战项目/爬虫网易云播放器/{name}_{id}.mp3'
sound=requests.get(url).content
with open(music_path,'wb') as f:
f.write(sound)
ex = tk.Toplevel()
ex.geometry("240x30+660+260")
ex.title(name)
def delete_explain():
py.mixer.quit()
os.remove(music_path)
ex.destroy()
btn1=tk.Button(ex,width=10,text="继续",command=py.mixer.music.unpause)
btn1.grid(row=0,column=0)
btn2=tk.Button(ex,width=10,text="暂停",command=py.mixer.music.pause)
btn2.grid(row=0,column=1)
btn3=tk.Button(ex,width=10,text="结束",command=delete_explain)
btn3.grid(row=0,column=2)
ex.protocol('WM_DELETE_WINDOW',delete_explain)
py.mixer.init()
py.mixer.music.load(music_path)
py.mixer.music.play(-1, 0)
root=tk.Tk()
root.title("网易云音乐播放器")
root.iconphoto(True, tk.PhotoImage(file='Python/实战项目/爬虫网易云播放器/163.png'))
var=tk.StringVar()
var.set('')
lab=tk.Label(root,width=40,text=" 欢迎使用网易云播放器!请输入歌曲/歌手: ",font=('songti',12))
lab.grid(row=0,column=0,columnspan=2)
ent=tk.Entry(root,width=10,textvariable=var,font=('kaiti',14))
ent.grid(row=0,column=2)
btn=tk.Button(root,width=10,text="搜索音乐",font=('heiti',10),command=get_song_list)
btn.grid(row=0,column=3)
get_like_list()
l=tk.Label(root,text="***",font=('songti',10))
l.grid(row=1,column=0,columnspan=4)
root.mainloop()
js扣扣扣
window=this;
const CryptoJS = require('crypto-js');
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);
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
}
window.asrsea = d,
window.ecnonasr = e
pa_e='010001'
pa_f='00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
pa_g='0CoJUm6Qyw8W8jud'
pa_i='vIh9NqhrNQYqF3rD'
get_like_encText=function(){
pa_d='{"id":"7053185814","offset":"0","total":"true","limit":"1000","n":"1000","csrf_token":"880738687515b74fb700788c52270b8b"}'
h_encText=b(pa_d, pa_g)
like_encText = b(h_encText,pa_i);
return like_encText;
}
console.log(get_like_encText())
get_like_encSecKey=function(){
pd_d='{"moduleName":"preload","csrf_token":"880738687515b74fb700788c52270b8b"}'
like_encSecKey = c(pa_i,pa_e,pa_f);
return like_encSecKey;
}
console.log(get_like_encSecKey())
pa_i="etalO0jto4hGfdDj"
get_list_encText=function(s){
pa_d='{"hlpretag":"<span class=\\"s-fc7\\">","hlposttag":"</span>","id":"65766","s":"'+s+'","type":"1","offset":"0","total":"true","limit":"30","csrf_token":"c08dc13fbcff3a4a9285ed4250812a22"}'
h_encText=b(pa_d, pa_g)
list_encText = b(h_encText,pa_i);
return list_encText;
}
get_list_encSecKey=function(){
pd_d='{"logs":"[{\\"action\\":\\"mobile_monitor\\",\\"json\\":{\\"meta._ver\\":2,\\"meta._dataName\\":\\"pip_lyric_monitor\\",\\"action\\":\\"render\\",\\"userAgent\\":\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.52\\",\\"chromeVersion\\":106,\\"resourceId\\":5253801,\\"resourceType\\":\\"song\\"}}]","csrf_token":"c08dc13fbcff3a4a9285ed4250812a22"}'
list_encSecKey = c(pa_i,pa_e,pa_f);
return list_encSecKey;
}
get_encText=function(id){
pa_d='{"ids":"['+id+']","level":"standard","encodeType":"aac","csrf_token":"c08dc13fbcff3a4a9285ed4250812a22"}'
h_encText=b(pa_d, pa_g)
encText = b(h_encText,pa_i);
return encText;
}
get_encSecKey=function(){
pd_d='{"logs":"[{\\"action\\":\\"mobile_monitor\\",\\"json\\":{\\"meta._ver\\":2,\\"meta._dataName\\":\\"pip_lyric_monitor\\",\\"action\\":\\"render\\",\\"userAgent\\":\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.52\\",\\"chromeVersion\\":106,\\"resourceId\\":5253801,\\"resourceType\\":\\"song\\"}}]","csrf_token":"c08dc13fbcff3a4a9285ed4250812a22"}'
encSecKey = c(pa_i,pa_e,pa_f);
return encSecKey;
}
实现效果

利用爬虫js逆向破解网易云制作播放器的更多相关文章
- C#网易云音乐播放器
效果图: •实现教程: 打开VStudio 2015 #新建一个windows界面工程然后按我的界面来添加控件代码如下 namespace NeteaseMuisc { partial class M ...
- 爬虫综合大作业——网易云音乐爬虫 & 数据可视化分析
作业要求来自于https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3075 爬虫综合大作业 选择一个热点或者你感兴趣的主题. 选择爬取的对象 ...
- python3爬虫应用--爬取网易云音乐(两种办法)
一.需求 好久没有碰爬虫了,竟不知道从何入手.偶然看到一篇知乎的评论(https://www.zhihu.com/question/20799742/answer/99491808),一时兴起就也照葫 ...
- python学习之爬虫(一) ——————爬取网易云歌词
接触python也有一段时间了,一提到python,可能大部分pythoner都会想到爬虫,没错,今天我们的话题就是爬虫!作为一个小学生,关于爬虫其实本人也只是略懂,怀着"Done is b ...
- Python爬虫入门教程 21-100 网易云课堂课程数据抓取
写在前面 今天咱们抓取一下网易云课堂的课程数据,这个网站的数据量并不是很大,我们只需要使用requests就可以快速的抓取到这部分数据了. 你第一步要做的是打开全部课程的地址,找出爬虫规律, 地址如下 ...
- Python的几个爬虫代码整理(网易云、微信、淘宝、今日头条)
整理了一下网易云歌曲评论抓取.分析好友信息抓取.淘宝宝贝抓取.今日头条美图抓取的一些代码 抓取网易云评论 进入歌曲界面: http://music.163.com/#/song?id=45318582 ...
- 这个爬虫JS逆向加密任务,你还不来试试?逆向入门级,适合一定爬虫基础的人
友情提示:在博客园更新比较慢,有兴趣的关注知识图谱与大数据公众号吧.这次选择苏宁易购登录密码加密,如能调试出来代表你具备了一定的JS逆向能力,初学者建议跟着内容调试一波,尽量独自将JS代码抠出来,实在 ...
- 原生js制作播放器
以前 就想做一个播放器,一直没狠下心来,今天终于狠下心来,把这个做出来了(因为有点无聊) 做这个播放器 也百度了一下, 你叫我做,我肯定做不出来, 就算用jquery 我也做不出来. 以前也用过a ...
- 用H5和js写一个移动端自定义播放器
前言 由于html5自带的播放器样式不怎么好看,大多数人都是自己写一个来满足业务需求.这一次的需求如下: 1.不要上一曲下一曲 2.有进度条和播放暂停按钮 3.有时间显示 demo实现功能 1.进度条 ...
- JS写一个漂亮的音乐播放器
先放上效果图: 正如图中所展示的播放器那样,我们用HTML+CSS+JS将这个效果实现出来. HTML页面布局 <div class="music"> <div ...
随机推荐
- Vue相关笔记
Promise基本使用 Promise是异步编程的一种解决方案,用于一个异步操作的最终完成(或失败)及其结果值的表示,比传统的回调函数方案更加合理. var promise = new Promise ...
- 【记录】JS和C++的Base64编码解码(支持中文)
JS 解决方法来源于知乎新码笔记的文章 function b64Encode(str) { return btoa(unescape(encodeURIComponent(str))); } func ...
- 操作系统综合题之“短进程优先调度算法(Shortest-Process-First,SPF)和非抢占式优先权调度算法(Priority-Scheduling Lgorithm)的进程执行顺序并计算周转时间以及平均周转时间【分开计算题】”
一.问题: 1.当系统采用短进程优先调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周转时间 2.当系统采用优先权调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周 ...
- c++并发编程实战-第3章 在线程间共享数据
线程间共享数据的问题 多线程之间共享数据,最大的问题便是数据竞争导致的异常问题.多个线程操作同一块资源,如果不做任何限制,那么一定会发生错误.例如: 1 int g_nResource = 0; 2 ...
- 实际工作中 Git Commit 代码提交规范是什么样的?
前言 Git 是我们日常工作中使用最为广泛的分布式版本代码控制系统,因此在我们的实际工作中,git commit 代码提交规范能够让每一次代码提交都变得有据可循,方便后续的代码审查.问题追踪和版本管理 ...
- C# unsafe 快速复制数组
(1) /// <summary> /// 复制内存 /// </summary> /// <param name="dest">目标指针位置& ...
- netcore 使用mongodb
docker 安装mongodb:docker pull mongo 运行容器 docker run -d -p 27017:27017 --name mongo01 -v /docker/mongo ...
- Java 多个线程之间共享数据
线程执行的代码相同 如果每个线程执行的代码相同,可以使用同一个Runnable对象,在这个Runnable对象中定义共享数据即可,例如,卖票系统就可以这么做. public class Sell ...
- 【2020.12.02提高组模拟】球员(player) 题解
[2020.12.02提高组模拟]球员(player) 题解 题意描述 基本的递推. ①所有运动员姓氏的长度必须不同. ②每个运动员的姓氏必须是长度比其长的所有其他运动员姓氏的连续子串 潜在的球员分成 ...
- SRv6 验证实验
本文分享自天翼云开发者社区<SRv6 验证实验>,作者:f****n 引言 Segment Routing over IPv6 (SRv6) 是一种基于 IPv6 的新兴网络架构,其通过在 ...