listen1 / listen1_chrome_extension

one for all free music in china (chrome extension, also works for firefox)
https://listen1.github.io/listen1
MIT License
11.47k stars 2.03k forks source link

bug: 酷我kuwo search api 失效 #1114

Open listen1 opened 1 year ago

listen1 commented 1 year ago

酷我最近更新了api的加密算法,之前的km_token直接作为csrf字段的方式已经失效,新的加密算法使用了Cookie中的Hm_token字段,并采用了一段转换代码将这个字段变成另一个字符串后,使用http header中的Cross字段发出。

计划尽快的修复该问题。

yhsj0919 commented 1 year ago

cookie 加了Hm_token属性,32位随机的,请求头加了Cross ,Hm_token的md5值

listen1 commented 1 year ago

cookie 加了Hm_token属性,32位随机的,请求头加了Cross ,Hm_token的md5值

非常感谢

yhsj0919 commented 1 year ago

又又又改了,先SHA1,再MD5

image image image

listen1 commented 1 year ago

谢谢,已经再次修复了该问题

wifi-left commented 1 year ago

https://github.com/QiuYaohong/kuwoMusicApi/issues/19 又改了,这次无法获取付费歌曲了

bbb1093811913 commented 1 year ago

好像又不行了

listen1 commented 1 year ago

https://github.com/listen1/listen1_chrome_extension/pull/1118

yhsj0919 commented 1 year ago

这接口一天改8遍,放个kotlin的实现

fun main() {
    //t是随机的32位字符串
    val t = "6Q5tPYAYEdQSz888887jh5FTKaMRXwdx"
    //e是固定的Cookie名称
    val e = "Hm_Iuvt_cdb524f42f0ce19b169b8072123a4727"
    //n是e的ASCII码拼接
    var n = e.toCharArray().joinToString("") { it.code.toString() }
    println(n)
    val r = floor(n.length / 5.0).toInt()
    println("r=$r")
    val o = (n[r].toString() + n[2 * r] + n[3 * r] + n[4 * r] + n[5 * r]).toInt()
    println("o=$o")
    val l = ceil(e.length / 2.0).toInt()
    println("l=$l")
    val c = (2.0.pow(31.0) - 1).toInt()
    println("c=$c")
    val d = (Math.round(1e9 * Math.random()) % 1e8).toInt()
    println("d=$d")
    n = "$n$d"
    //===========一个神奇的算法START,后期大概率会改===================================
    //这是上面计算的n值7210995731171181169599100985350521025250102489910149579849545798564855504950519752555055
    while (n.length > 10) {
        val a1 = n.substring(0, 10)
        val a2 = n.substring(10, n.length)
        //第一次循环7210995731  17118116959910098535052102525010248991014957984954579856485550495051975255505545084407
        //第二次循环1.71181169  59910098E85
        //这里竟然生成了科学计数
        //js中用了parseInt,但是在kotlin中‘59910098E85’带有字母会报错,这里用了parseDouble,替换了‘E’,实现了和js一样的效果
        //最后计算出来的值是59910099
        println("$a1  $a2")
        n = if (a2.contains("E")) {
            (parseDouble(a1).toInt() + parseDouble(a2.replace("E", ".")).toInt()).toString()
        } else {
            (parseDouble(a1) + parseDouble(a2)).toString()
        }
    }
    //===========一个神奇的算法END===================================
    println("n=$n")
    n = ((o * n.toDouble() + l) % c).toString()
    //由于上面算法科学计数剪切问题,随机数d被剪切丢失,这里n其实是一个固定值798334170
    //上面算法都是废话
    val f = t.toCharArray().joinToString("") {
        val h = it.code xor (floor(n.toDouble() / c * 255)).toInt()
        n = ((o * n.toDouble() + l) % c).toString()
        h.toString(16).padStart(2, '0')
    }
    println(f)
    val dd = d.toString(16).padStart(8, '0')
    //计算出来的Secret
    println(f + dd)
}
Mcdull0921 commented 1 year ago

获取列表的接口从网页抓一个secret保存下来就可以实现了。但获取播放路径的接口,如果是vip会直接返回"该歌曲为付费内容,请下载酷我音乐客户端后付费收听",所以目前只能播放非vip歌曲。 这是我的一个项目穷人音乐盒,可供参考,后续如果找到了新接口也会持续更新

wifi-left commented 1 year ago

接口是有的。在这个 https://github.com/QiuYaohong/kuwoMusicApi/issues/19 中我们介绍了用python与Java写的处理api的代码,但咱能力有限,如果能转换为js或者php就会好办很多。

yhsj0919 commented 1 year ago

请善用github,知道地址了比如"http://mobi.kuwo.cn/mobi.s",直接搜索这个地址,切到code,查看用这个地址的项目,或者下面选语言,要找的代码不就出来了

wifi-left commented 1 year ago

请善用github,知道地址了比如"[http://mobi.kuwo.cn/mobi.s",直接搜索这个地址,切到code,查看用这个地址的项目,或者下面选语言,要找的代码不就出来了]

Python 版本的代码就是这样搜出来的,但没找到JS、php可用的实例

Mcdull0921 commented 1 year ago

请善用github,知道地址了比如"[http://mobi.kuwo.cn/mobi.s",直接搜索这个地址,切到code,查看用这个地址的项目,或者下面选语言,要找的代码不就出来了]

Python 版本的代码就是这样搜出来的,但没找到JS、php可用的实例

我用你发的python脚本转成c#代码了,让chatgpt去翻译就好,目前我这个项目穷人音乐盒已经可以播放了,有需要的话你也可以拿这个代码https://github.com/Mcdull0921/PoorMusic/blob/main/MusicLibrary/KuwoDES.cs