注意首先你得是会员
这里的难点就是怎么去把付费音频所有的参数构建出来, 需要用到js逆向找到生成参数的js代码,在就是接口参数在web页面找不到,需要切换成移动端才能找到所需的接口
import requests
import time
import hashlib
import random
import json
# 爬取喜马拉雅的音乐的类
class ximalaya(object):
def __init__(self):
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36"
}
def getServerTime(self):
"""
获取喜马拉雅服务器的时间戳
:return:
"""
# 这个地址就是返回服务器时间戳的接口
serverTimeUrl = "https://www.ximalaya.com/revision/time"
response = requests.get(serverTimeUrl,headers = self.headers)
return response.text
def getSign(self,serverTime):
"""
生成 xm-sign
规则是 md5(ximalaya-服务器时间戳)(100以内随机数)服务器时间戳(100以内随机数)现在时间戳
:param serverTime:
:return:
"""
nowTime = str(round(time.time()*1000))
sign = str(hashlib.md5("himalaya-{}".format(serverTime).encode()).hexdigest()) + "({})".format(str(round(random.random()*100))) + serverTime + "({})".format(str(round(random.random()*100))) + nowTime
# 将xm-sign添加到请求头中
self.headers["himalaya"] = sign
# return sign
def getInfos(self):
# 先调用该方法获取xm-sign
self.getSign(self.getServerTime())
# 将访问数据接口的参数写好
params = {
'id': '279999104',
'sort': '0',
'size': '30',
'ptype': '1',
}
# 喜马拉雅数据接口
url = "https://www.ximalaya.com/revision/play/v1/show"
response = requests.get(url,params=params,headers=self.headers)
infos = json.loads(response.text)
return infos
if __name__ == '__main__':
ximalaya = ximalaya()
print(ximalaya.getInfos())
function vt(t) {
this._randomSeed = t,
this.cg_hun()
}
vt.prototype = {
cg_hun: function() {
this._cgStr = "";
var t = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890"
, e = t.length
, n = 0;
for (n = 0; n < e; n++) {
var r = this.ran() * t.length
, o = parseInt(r);
this._cgStr += t.charAt(o),
t = t.split(t.charAt(o)).join("")
}
},
cg_fun: function(t) {
t = t.split("*");
var e = ""
, n = 0;
for (n = 0; n < t.length - 1; n++)
e += this._cgStr.charAt(t[n]);
return e
},
ran: function() {
this._randomSeed = (211 * this._randomSeed + 30031) % 65536;
return this._randomSeed / 65536
},
};
c = function(t, e) {
var n = new vt(t).cg_fun(e);
return "/" === n[0] ? n : "/".concat(n)
}
console.log(c(4609,"10*50*46*0*40*27*32*43*45*16*32*16*12*32*2*23*32*57*48*10*29*59*59*51*7*60*53*2*9*50*64*65*15*31*53*39*36*50*22*22*58*33*10*57*8*27*21*63*13*27*65*"))
Z = function() {
throw new TypeError("Invalid attempt to destructure non-iterable instance")
}
J = function(t, e) {
var n = []
, r = !0
, o = !1
, i = void 0;
try {
for (var a, u = t[Symbol.iterator](); !(r = (a = u.next()).done) && (n.push(a.value),
!e || n.length !== e); r = !0)
;
} catch (t) {
o = !0,
i = t
} finally {
try {
r || null == u.return || u.return()
} finally {
if (o)
throw i
}
}
return n
}
Q = function(t) {
if (Array.isArray(t))
return t
}
tt = function(t, e) {
return Q(t) || J(t, e) || Z()
}
function yt(t, e) {
for (var n, r = [], o = 0, i = "", a = 0; 256 > a; a++)
r[a] = a;
for (a = 0; 256 > a; a++)
o = (o + r[a] + t.charCodeAt(a % t.length)) % 256,
n = r[a],
r[a] = r[o],
r[o] = n;
for (var u = o = a = 0; u < e.length; u++)
o = (o + r[a = (a + 1) % 256]) % 256,
n = r[a],
r[a] = r[o],
r[o] = n,
i += String.fromCharCode(e.charCodeAt(u) ^ r[(r[a] + r[o]) % 256]);
return i
}
var mt = yt("xm", "Ä[üJ=†Û3áf÷N")
gt = [19, 1, 4, 7, 30, 14, 28, 8, 24, 17, 6, 35, 34, 16, 9, 10, 13, 22, 32, 29, 31, 21, 18, 3, 2, 23, 25, 27, 11, 20, 5, 15, 12, 0, 33, 26]
bt = function(t) {
var e1 = yt(
function(t, e) {
for (var n = [], r = 0; r < t.length; r++) {
for (var o = "a" <= t[r] && "z" >= t[r] ? t[r].charCodeAt() - 97 : t[r].charCodeAt() - "0".charCodeAt() + 26, i = 0; 36 > i; i++)
if (e[i] == o) {
o = i;
break
}
n[r] = 25 < o ? String.fromCharCode(o - 26 + "0".charCodeAt()) : String.fromCharCode(o + 97)
}
return n.join("")
}("d" + mt + "9",gt)
,
e2 = function(t) {
if (!t)
return "";
var e, n, r, o, i, a = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1];
for (o = (t = t.toString()).length,
r = 0,
i = ""; r < o; ) {
do {
e = a[255 & t.charCodeAt(r++)]
} while (r < o && -1 == e);if (-1 == e)
break;
do {
n = a[255 & t.charCodeAt(r++)]
} while (r < o && -1 == n);if (-1 == n)
break;
i += String.fromCharCode(e << 2 | (48 & n) >> 4);
do {
if (61 == (e = 255 & t.charCodeAt(r++)))
return i;
e = a[e]
} while (r < o && -1 == e);if (-1 == e)
break;
i += String.fromCharCode((15 & n) << 4 | (60 & e) >> 2);
do {
if (61 == (n = 255 & t.charCodeAt(r++)))
return i;
n = a[n]
} while (r < o && -1 == n);if (-1 == n)
break;
i += String.fromCharCode((3 & e) << 6 | n)
}
return i
}(t)
).split("-")
console.log(e1)
}
var c = bt("20NvOoh6T39X3qwKO4cY5g5bVhg+1nfPHIQafFTmCXihnrqF2PjczO8O0auK1KJhDrJ30XMYfKJo2uz+xgwd3rwRPi5f")