admin管理员组

文章数量:1583926

通过js解析酷我音乐的流地址

    • 缘由
    • 思路
    • java的js执行引擎

缘由

最近经常听到的一首歌曲,但是不知道是什么歌曲名,直到一个偶然的机会,我找到了这个音乐
清新的小女孩,习惯于其他音乐播放器的我,希望下载这首动听的歌曲,但是有意思的是歌曲的下载必须要下载客户端。由于某人比较懒,所以就开启了解析解析之路

1)http://m.kuwo.cn/newh5/singles/songinfoandlrc?musicId=72891154&reqId=5e80bd50-69f9-11ea-91f5-c5b065da4b63
(2)http://www.kuwo.cn/url?format=mp3&rid=73068685&response=url&type=convert_url3&br=128kmp3&from=web&t=1584632489746&reqId=17b249acXea5dX4164Xb6eeX8de501c2ed6a

思路

  • 先请求(1)链接,获取到 reqid ,36位字符串。拼接到(2),就可以获取到这首歌mp3的下载地址
  • 所以目标变成了,如何获取到(1)中的 ·reqId,类似于(5e80bd50-69f9-11ea-91f5-c5b065da4b63)这一字符串的形式,这个是通过 js获取到的

这边整理了一个js文件,通过js引擎获取到参数
kuwomusic.js

l = function(t){
   var n, o, h = 0, d = 0 ,e;
	var f = [157, 158, 13, 133, 205, 78];
	var i = e && r || 0
	  , b = e || new Uint8Array(16)
	  , v =  o;
	var y = (new Date).getTime()
	  , w =  d + 1
	  , dt = y - h + (w - d) / 1e4;
	if (dt < 0 && void 0 === t.clockseq && (v = v + 1 & 16383),
	(dt < 0 || y > h) && void 0 === t.nsecs && (w = 0),
	w >= 1e4)
		throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
	h = y,
	d = w,
	o = v;
	var A = (1e4 * (268435455 & (y += 122192928e5)) + w) % 4294967296;
	b[i++] = A >>> 24 & 255,
	b[i++] = A >>> 16 & 255,
	b[i++] = A >>> 8 & 255,
	b[i++] = 255 & A;
	var T = y / 4294967296 * 1e4 & 268435455;
	b[i++] = T >>> 8 & 255,
	b[i++] = 255 & T,
	b[i++] = T >>> 24 & 15 | 16,
	b[i++] = T >>> 16 & 255,
	b[i++] = v >>> 8 | 128,
	b[i++] = 255 & v;
	for (var x = 0; x < 6; ++x)
		b[i + x] = f[x];
		return b;
};
		
c = function(t, e) {
	for (var r = [], i = 0; i < 256; ++i)
		r[i] = (i + 256).toString(16).substr(1);
		var i = e || 0
		  , n = r;
		return [n[t[i++]], n[t[i++]], n[t[i++]], n[t[i++]], "-", n[t[i++]], n[t[i++]], "-", n[t[i++]], n[t[i++]], "-", n[t[i++]], n[t[i++]], "-", n[t[i++]], n[t[i++]], n[t[i++]], n[t[i++]], n[t[i++]], n[t[i++]]].join("")
	};
		

java的js执行引擎

/**
 * 酷我音乐
 */
public class KuwoMusic {
    public static void main(String[] args) {
        String fileName = "e:/video/kuwomusic.js"; // 调用以上的js文件脚本
        Object l = parseJs("l", 4, fileName);
        Object reqId = parseJs("c", l, fileName);
        System.out.println(reqId);

        /**
         * 然后执行
         * http://m.kuwo/newh5/singles/songinfoandlrc?musicId=72891154&reqId=5e80bd50-69f9-11ea-91f5-c5b065da4b63
         *
         * 获取到 reqid
         * 再请求 http://www.kuwo/url?format=mp3&rid=73068685&response=url&type=convert_url3&br=128kmp3&from=web&t=1584632489746&reqId=17b249acXea5dX4164Xb6eeX8de501c2ed6a
         */
    }

    /**
     * 通过js解析 获取 reqId 的值
     *
     * @param method
     * @param param
     * @param fileName
     * @return
     */
    private static Object parseJs(String method, Object param, String fileName) {
        ScriptEngineManager engineManager = new ScriptEngineManager();
        ScriptEngine javascript = engineManager.getEngineByName("javascript");
        FileReader reader = null;
        try {
            reader = new FileReader(fileName);
            javascript.eval(reader);
            if (javascript instanceof Invocable) {
                Invocable invocation = (Invocable) javascript;
                return invocation.invokeFunction(method, param);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (Exception e) {
                }
            }
        }
        return null;
    }
}

至此,也就可以获取到 reqId的值,然后根据以下的连接,也就可以获取到这首心仪的歌曲的下载地址

1)http://m.kuwo.cn/newh5/singles/songinfoandlrc?musicId=72891154&reqId=5e80bd50-69f9-11ea-91f5-c5b065da4b63
(2)http://www.kuwo.cn/url?format=mp3&rid=73068685&response=url&type=convert_url3&br=128kmp3&from=web&t=1584632489746&reqId=17b249acXea5dX4164Xb6eeX8de501c2ed6a

本文标签: 音乐