遇事不决,勾栏听曲
搜索,同样为get请求,但返回无意义
在网络中查找,发现搜索接口,查看数据发现无可用信息
进入具体音乐页面,发现请求接口,响应里有链接
查看音乐请求,对比发现不同处为encode_album_audio_id猜测为音乐标识id
GET /yy/index.php?r=play/getdata&callback=jQuery19105511680469461328_1675129023355&dfid=08xrxO05ksAE43juSd28o92H&appid=1014&mid=f952480a8705aa8efb36735fe792bece&platid=4&
"encode_album_audio_id=46r8v7e0"
&_=1675129023356 HTTP/2
Host: wwwapiretry.kugou.com
Cookie: kg_mid=f952480a8705aa8efb36735fe792bece; Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1675127580; Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1675129024; kg_dfid=08xrxO05ksAE43juSd28o92H; kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e; kg_mid_temp=f952480a8705aa8efb36735fe792bece
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: https://www.kugou.com/
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: same-site
Sec-Ch-Ua-Platform: "Windows"
Sec-Ch-Ua: "Google Chrome";v="108", "Chromium";v="108", "Not=A?Brand";v="24"
Sec-Ch-Ua-Mobile: ?0
Te: trailers
在音乐搜索响应中搜索该id值,发现确实为标识id
对比请求包,发现3处不同
GET /v2/search/song?
"callback=callback345"
&srcappid=2919&clientver=1000&
"clienttime=1675127601776"
&mid=f952480a8705aa8efb36735fe792bece&uuid=f952480a8705aa8efb36735fe792bece&dfid=08xrxO05ksAE43juSd28o92H&keyword=a&page=1&pagesize=30&bitrate=0&isfuzzy=0&inputtype=0&platform=We
bFilter&userid=0&iscorrection=1&privilege_filter=0&filter=10&token=&appid=1014&
"signature=7fce4fe8f8683dbc7046e8f427661ffd"
HTTP/2
Host: complexsearchretry.kugou.com
Cookie: kg_mid=f952480a8705aa8efb36735fe792bece; Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1675127580; Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1675127580; kg_dfid=08xrxO05ksAE43juSd28o92H; kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: https://www.kugou.com/
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: same-site
Sec-Ch-Ua-Platform: "Windows"
Sec-Ch-Ua: "Google Chrome";v="108", "Chromium";v="108", "Not=A?Brand";v="24"
Sec-Ch-Ua-Mobile: ?0
Te: trailers
搜索clienttime,发现为n
向上查找,n为自 1970/01/01 以来的毫秒数
搜索signature,打上断点
)
s值
打印l.signature,确实为signature值
查找后,发现为md5加密
"undefined" == typeof faultylabs && (faultylabs = {}),
faultylabs.MD5 = function(a) {
function b(a) {
var b = (a >>> 0).toString(16);
return "00000000".substr(0, 8 - b.length) + b
}
function c(a) {
for (var b = [], c = 0; c < a.length; c++)
b = b.concat(k(a[c]));
return b
}
function d(a) {
for (var b = [], c = 0; 8 > c; c++)
b.push(255 & a),
a >>>= 8;
return b
}
function e(a, b) {
return a << b & 4294967295 | a >>> 32 - b
}
function f(a, b, c) {
return a & b | ~a & c
}
function g(a, b, c) {
return c & a | ~c & b
}
function h(a, b, c) {
return a ^ b ^ c
}
function i(a, b, c) {
return b ^ (a | ~c)
}
function j(a, b) {
return a[b + 3] << 24 | a[b + 2] << 16 | a[b + 1] << 8 | a[b]
}
function k(a) {
for (var b = [], c = 0; c < a.length; c++)
if (a.charCodeAt(c) <= 127)
b.push(a.charCodeAt(c));
else
for (var d = encodeURIComponent(a.charAt(c)).substr(1).split("%"), e = 0; e < d.length; e++)
b.push(parseInt(d[e], 16));
return b
}
function l() {
for (var a = "", c = 0, d = 0, e = 3; e >= 0; e--)
d = arguments[e],
c = 255 & d,
d >>>= 8,
c <<= 8,
c |= 255 & d,
d >>>= 8,
c <<= 8,
c |= 255 & d,
d >>>= 8,
c <<= 8,
c |= d,
a += b(c);
return a
}
function m(a) {
for (var b = new Array(a.length), c = 0; c < a.length; c++)
b[c] = a[c];
return b
}
function n(a, b) {
return 4294967295 & a + b
}
function o() {
function a(a, b, c, d) {
var f = v;
v = u,
u = t,
t = n(t, e(n(s, n(a, n(b, c))), d)),
s = f
}
var b = p.length;
p.push(128);
var c = p.length % 64;
if (c > 56) {
for (var k = 0; 64 - c > k; k++)
p.push(0);
c = p.length % 64
}
for (k = 0; 56 - c > k; k++)
p.push(0);
p = p.concat(d(8 * b));
var m = 1732584193
, o = 4023233417
, q = 2562383102
, r = 271733878
, s = 0
, t = 0
, u = 0
, v = 0;
for (k = 0; k < p.length / 64; k++) {
s = m,
t = o,
u = q,
v = r;
var w = 64 * k;
a(f(t, u, v), 3614090360, j(p, w), 7),
a(f(t, u, v), 3905402710, j(p, w + 4), 12),
a(f(t, u, v), 606105819, j(p, w + 8), 17),
a(f(t, u, v), 3250441966, j(p, w + 12), 22),
a(f(t, u, v), 4118548399, j(p, w + 16), 7),
a(f(t, u, v), 1200080426, j(p, w + 20), 12),
a(f(t, u, v), 2821735955, j(p, w + 24), 17),
a(f(t, u, v), 4249261313, j(p, w + 28), 22),
a(f(t, u, v), 1770035416, j(p, w + 32), 7),
a(f(t, u, v), 2336552879, j(p, w + 36), 12),
a(f(t, u, v), 4294925233, j(p, w + 40), 17),
a(f(t, u, v), 2304563134, j(p, w + 44), 22),
a(f(t, u, v), 1804603682, j(p, w + 48), 7),
a(f(t, u, v), 4254626195, j(p, w + 52), 12),
a(f(t, u, v), 2792965006, j(p, w + 56), 17),
a(f(t, u, v), 1236535329, j(p, w + 60), 22),
a(g(t, u, v), 4129170786, j(p, w + 4), 5),
a(g(t, u, v), 3225465664, j(p, w + 24), 9),
a(g(t, u, v), 643717713, j(p, w + 44), 14),
a(g(t, u, v), 3921069994, j(p, w), 20),
a(g(t, u, v), 3593408605, j(p, w + 20), 5),
a(g(t, u, v), 38016083, j(p, w + 40), 9),
a(g(t, u, v), 3634488961, j(p, w + 60), 14),
a(g(t, u, v), 3889429448, j(p, w + 16), 20),
a(g(t, u, v), 568446438, j(p, w + 36), 5),
a(g(t, u, v), 3275163606, j(p, w + 56), 9),
a(g(t, u, v), 4107603335, j(p, w + 12), 14),
a(g(t, u, v), 1163531501, j(p, w + 32), 20),
a(g(t, u, v), 2850285829, j(p, w + 52), 5),
a(g(t, u, v), 4243563512, j(p, w + 8), 9),
a(g(t, u, v), 1735328473, j(p, w + 28), 14),
a(g(t, u, v), 2368359562, j(p, w + 48), 20),
a(h(t, u, v), 4294588738, j(p, w + 20), 4),
a(h(t, u, v), 2272392833, j(p, w + 32), 11),
a(h(t, u, v), 1839030562, j(p, w + 44), 16),
a(h(t, u, v), 4259657740, j(p, w + 56), 23),
a(h(t, u, v), 2763975236, j(p, w + 4), 4),
a(h(t, u, v), 1272893353, j(p, w + 16), 11),
a(h(t, u, v), 4139469664, j(p, w + 28), 16),
a(h(t, u, v), 3200236656, j(p, w + 40), 23),
a(h(t, u, v), 681279174, j(p, w + 52), 4),
a(h(t, u, v), 3936430074, j(p, w), 11),
a(h(t, u, v), 3572445317, j(p, w + 12), 16),
a(h(t, u, v), 76029189, j(p, w + 24), 23),
a(h(t, u, v), 3654602809, j(p, w + 36), 4),
a(h(t, u, v), 3873151461, j(p, w + 48), 11),
a(h(t, u, v), 530742520, j(p, w + 60), 16),
a(h(t, u, v), 3299628645, j(p, w + 8), 23),
a(i(t, u, v), 4096336452, j(p, w), 6),
a(i(t, u, v), 1126891415, j(p, w + 28), 10),
a(i(t, u, v), 2878612391, j(p, w + 56), 15),
a(i(t, u, v), 4237533241, j(p, w + 20), 21),
a(i(t, u, v), 1700485571, j(p, w + 48), 6),
a(i(t, u, v), 2399980690, j(p, w + 12), 10),
a(i(t, u, v), 4293915773, j(p, w + 40), 15),
a(i(t, u, v), 2240044497, j(p, w + 4), 21),
a(i(t, u, v), 1873313359, j(p, w + 32), 6),
a(i(t, u, v), 4264355552, j(p, w + 60), 10),
a(i(t, u, v), 2734768916, j(p, w + 24), 15),
a(i(t, u, v), 1309151649, j(p, w + 52), 21),
a(i(t, u, v), 4149444226, j(p, w + 16), 6),
a(i(t, u, v), 3174756917, j(p, w + 44), 10),
a(i(t, u, v), 718787259, j(p, w + 8), 15),
a(i(t, u, v), 3951481745, j(p, w + 36), 21),
m = n(m, s),
o = n(o, t),
q = n(q, u),
r = n(r, v)
}
return l(r, q, o, m).toUpperCase()
}
var p = null
, q = null;
return "string" == typeof a ? p = k(a) : a.constructor == Array ? 0 === a.length ? p = a : "string" == typeof a[0] ? p = c(a) : "number" == typeof a[0] ? p = a : q = typeof a[0] : "undefined" != typeof ArrayBuffer ? a instanceof ArrayBuffer ? p = m(new Uint8Array(a)) : a instanceof Uint8Array || a instanceof Int8Array ? p = m(a) : a instanceof Uint32Array || a instanceof Int32Array || a instanceof Uint16Array || a instanceof Int16Array || a instanceof Float32Array || a instanceof Float64Array ? p = m(new Uint8Array(a.buffer)) : q = typeof a : q = typeof a,
q && alert("MD5 type mismatch, cannot process " + q),
o()
}
拆分解决
需安装hashlib模块
模块作用:进行md5编码
pip install hashlib
python3 -m install hashlib
s值的数据
明显为列表
进行转化与MD5加密
构建请求数据
对id进行初步爬取
构建获取音乐请求数据
爬取音乐链接
初步代码,效果为获取搜索第一个数据的url
import requests
import hashlib
import time
import re
header = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
}
prox = {
"http":"61.216.156.222:60808"
}
n=input("请输入歌手和歌名")
s = [
"NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt",
"appid=1014",
"bitrate=0",
"callback=callback123",
"clienttime={}".format(int(time.time() * 1000)),
"clientver=1000",
"dfid=08xrxO05ksAE43juSd28o92H",
"filter=10",
"inputtype=0",
"iscorrection=1",
"isfuzzy=0",
"keyword={}".format(n),
"mid=f952480a8705aa8efb36735fe792bece",
"page=1",
"pagesize=30",
"platform=WebFilter",
"privilege_filter=0",
"srcappid=2919",
"token=",
"userid=0",
"uuid=f952480a8705aa8efb36735fe792bece",
"NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"
]
o="".join(s)
md5 = hashlib.md5(o.encode(encoding="utf-8")).hexdigest() #md5加密
param={
"callback":"callback123",
"srcappid":"2919",
"clientver":"1000",
"clienttime":int(time.time() * 1000),
"mid":"f952480a8705aa8efb36735fe792bece",
"uuid":"f952480a8705aa8efb36735fe792bece",
"dfid":"08xrxO05ksAE43juSd28o92H",
"keyword": f"{n}",
"page":"1",
"pagesize":"30",
"bitrate":"0",
"isfuzzy":"0",
"inputtype":"0",
"platform":"WebFilter",
"userid":"0",
"iscorrection":"1",
"privilege_filter":"0",
"filter":"10",
"token":"",
"appid":"1014",
"signature": md5
}
data=requests.get('https://complexsearch.kugou.com/v2/search/song',headers=header,proxies=prox,params=param)
kugous=re.compile('"EMixSongID":"(.+?)".',re.S)
kugouid=re.findall(kugous,data.text)
params={
'r':'play/getdata',
'callback':'jQuery19105511680469461328_1675129023355',
'dfid':'08xrxO05ksAE43juSd28o92H',
'appid':'1014',
'mid':'f952480a8705aa8efb36735fe792bece',
'platid':'4',
"encode_album_audio_id":kugouid[0],
'_':'1675129023356'
}
kugoudata=requests.get('https://wwwapiretry.kugou.com/yy/index.php?',headers=header,proxies=prox,params=params)
kugoud=re.compile('"play_url":"(.+?)"',re.S) #还有一个备份地址,正则为 "play_backup_url":"(.+?)"
kugoudm=re.findall(kugoud,kugoudata.text)
kugoum = eval(repr(str(kugoudm)).replace('\\', ''))
print(kugoum)