首页 > 编程知识 正文

网易云音乐api官方文档,网易音乐ncm文件转mp3

时间:2023-05-06 08:53:37 阅读:106957 作者:2198

3358 www.Sina.com/http://www.Sina.com /第一加密:加密的实际上是要传送的明文数据,数据的具体形式将在后面描述。 密钥固定为http://www.Sina.com/,iv固定为3358www .

第二加密:将初始加密结果转换为base64格式,然后进行加密。 密钥在前端随机生成,长度为16字节,iv为1.首先来个整体的解析

params:经过两次AES加密后的数据(128位,CBC,pkcs5padding)上述第二次AES加密的密钥是在前端随机生成的。 服务器要解密数据就需要知道这个密钥,但是服务器是怎么知道这个随机密钥的呢?

这个时候encSecKey有用了。 用RSA加密AES密钥,然后发送到服务器。 是的,encSecKey是RSA加密的AES密钥

请注意,在加密之前,需要对明文进行反转处理。 例如,如果加密的明文为0CoJUm6Qyw8W8jud,则必须将其转换为3358www.Sina.com/然后进行RSA加密

RSA加密后,这个RSA的公钥是多少? 好在这个公钥是固定的。 modulus和publicExponent如下(均为十进制) :

modulus=157794750267131502212476817800348178003481780034240115310253627536262539137018062906290762907180718907181818 4888854888888858888858888 08607243280642783685472618792592200592200592200594687295130177058053492590167490167490536138082468068063806385144414414414416 29292583402530167494905361363846808080846868680680680

2 .为了简化爬虫,如上所述,params的第二次AES加密的密钥在前端随机生成,如果每次都介入使得生成的密钥相同,则encSecKey每次也相同。

为了方便爬行动物,为了每次都固定encSecKey,我每次都用0102030405060708

接着,按照上述规则进行RSA加密,如下生成encSecKey码

import javax.crypto.Cipher; import java.math.BigInteger; import Java.nio.charset.standard charsets; import java.security.KeyFactory; import Java.security.interfaces.RSA public key; import Java.security.spec.RSA public key spec; 公共类测试{公共staticvoidmain (string [ ] args ) throws exception { string modulus=' 157794750267131502212478003454981218733834742401531025310253526253913801801806060606033333333 53913918018060606060606 8606803194253978603299419807860786072432807243280683683685472618792592200594346872951301770580765133513353492534925349253253480 5341353533534353533348053686806806806063063017 string public exponent=' 65537 '; rsapublickeyspecpublicspec=newrsapublickeyspec (newbiginteger (modulus ),newbiginteger ) publicexponent ); RSApublickeykey=(RSApublickey ) keyfactory.getinstance(RSA ).generatepublic ) publicspec; cipher cipher=cipher.getinstance (RSA/ECB/no padding ); cipher.init (cipher.encrypt _ mode,key; //注意,我这里已经写字了

符串反转 byte[] res = cipher.doFinal("ddddccccbbbbaaaa".getBytes(StandardCharsets.UTF_8)); //把密文转成16进制字符串后输出 System.out.print(longToHexString(res)); } //这个函数是用来将二进制数据转成16进制字符串的 static private String longToHexString(byte[] num) { StringBuffer hexString = new StringBuffer(); for (int i=0;i<num.length;i++){ if((num[i]&0xf0)==0){ hexString.append("0"+Integer.toHexString(num[i]&0xff)); } else{ hexString.append(Integer.toHexString(num[i]&0xff)); } } return hexString.toString(); }}

输出encSecKey为:

814e4abf9c1c6a2af74a7ecca8843f3052626c5c054584352e3fd38a519bd659e687cf1c079e1aac5dd9d491af6b8abf92109862ada93dc7b0ef94a8ee79d557ff2a20512b87ce507e357861366b8542139c67896748852d4086104a8dfc99a2e2e0640b46a4357407b72407b2849b323425c6ed45a0222e69d551a2e59e15b7

到这里,已经简化了爬虫,即以后每次请求,encSecKey的值都是固定的,都是上面这个字符串。
params用到的加密密钥也固定了,
第一次是0CoJUm6Qyw8W8jud
第二次是aaaabbbbccccdddd
iv都是0102030405060708





3.网易云主要接口

既然我们知道了param和encSecKey的生成原理,下面我们就介绍一下基本接口:音乐搜索接口获取音乐文件接口

音乐搜索
接口:https://music.163.com/weapi/cloudsearch/get/web
请求方式:post
求情数据: 参数值备注params数据{"ids" :"[193824]","br":128000,"csrf_token":""} 经过两次AES加密的密文,密钥第一次是0CoJUm6Qyw8W8jud 第二次是ddddccccbbbbaaaa iv都是0102030405060708世界第一等是要搜索的歌名,30是返回的结果数量encSecKey固定为814e4abf9c1c6a2af74a7ecca8843f3052626c5c054584352e3fd38a519bd659e687cf1c079e1aac5dd9d491af6b8abf92109862ada93dc7b0ef94a8ee79d557ff2a20512b87ce507e357861366b8542139c67896748852d4086104a8dfc99a2e2e0640b46a4357407b72407b2849b323425c6ed45a0222e69d551a2e59e15b7此时的第二次AES加密密钥为固定为aaaabbbbccccdddd
返回格式:json格式,里面包含有歌曲的id数据,id用于获取歌曲文件链接


2.获取音乐文件链接

接口:https://music.163.com/weapi/song/enhance/player/url

请求方式:post

请求数据:

参数值备注paramsjson数据{"hlpretag":"","hlposttag":"","s":"世界第一等","type":"1","offset":"0","total":"true","limit":"30","csrf_token":""} 经过两次AES加密的密文,密钥第一次是0CoJUm6Qyw8W8jud 第二次是ddddccccbbbbaaaa iv都是0102030405060708193824是要歌曲idencSecKey固定为814e4abf9c1c6a2af74a7ecca8843f3052626c5c054584352e3fd38a519bd659e687cf1c079e1aac5dd9d491af6b8abf92109862ada93dc7b0ef94a8ee79d557ff2a20512b87ce507e357861366b8542139c67896748852d4086104a8dfc99a2e2e0640b46a4357407b72407b2849b323425c6ed45a0222e69d551a2e59e15b7此时的第二次AES加密密钥为固定为aaaabbbbccccdddd
返回数据示例:

{“data”:[{“id”:193824,“url”:“http://m10.music.126.net/20210826233706/5e405016288a201701153be3bc74b384/ymusic/369d/350a/1ee0/465d7f1ada6b28c4d8c83dcc37858e84.mp3”,“br”:128000,“size”:4091445,“md5”:“465d7f1ada6b28c4d8c83dcc37858e84”,“code”:200,“expi”:1200,“type”:“mp3”,“gain”:0.0,“fee”:0,“uf”:null,“payed”:0,“flag”:0,“canExtend”:false,“freeTrialInfo”:null,“level”:“standard”,“encodeType”:“mp3”,“freeTrialPrivilege”:{“resConsumable”:false,“userConsumable”:false},“freeTimeTrialPrivilege”:{“resConsumable”:false,“userConsumable”:false,“type”:0,“remainTime”:0},“urlSource”:0}],“code”:200}


黑体那个就是纯音乐文件,打开可以直接下载或者播放

4.代码示例

如果你看不懂上面的讲解也无大碍,看懂下面的代码就可以了
生成param的java代码:

try { //明文数据,两次AES加密后再发送,请根据需求进行修改;172447为歌曲id String data ="{"ids":"[570839692]","br":128000,"csrf_token":""}"; Cipher cipher = Cipher.getInstance("AES/CBC/pkcs5padding"); IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes(StandardCharsets.UTF_8)); //第一次加密 SecretKeySpec key1 = new SecretKeySpec("0CoJUm6Qyw8W8jud".getBytes(StandardCharsets.UTF_8),"AES"); cipher.init(Cipher.ENCRYPT_MODE,key1,iv); byte[] res = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); //第二次加密(注意:要先把第一次加密结果转成base64后再进行第一次加密) SecretKeySpec key2 = new SecretKeySpec("aaaabbbbccccdddd".getBytes(StandardCharsets.UTF_8),"AES"); cipher.init(Cipher.ENCRYPT_MODE,key2,iv); byte[] base64 =Base64.getEncoder().encode(res);//转base64 res=cipher.doFinal(base64); String params= URLEncoder.encode(Base64.getEncoder().encodeToString(res),StandardCharsets.UTF_8); System.out.println(params); } catch (Exception e){ e.printStackTrace(); }

输出params为:

v1UdMgiG2PgS146seSwrcuicidNtpVNCL9ogx4K1r4Bdjp3GboV9tyIKh8PmfUduQFNgqj%2BZfcvI5vHQDEbEA1tqM56zy5yiGFcisEnuWqoqm4UI00XeDExtyra3RFHc


生成encSecKey:
已经让它固定了,不需要每次再生成了,固定为下面

814e4abf9c1c6a2af74a7ecca8843f3052626c5c054584352e3fd38a519bd659e687cf1c079e1aac5dd9d491af6b8abf92109862ada93dc7b0ef94a8ee79d557ff2a20512b87ce507e357861366b8542139c67896748852d4086104a8dfc99a2e2e0640b46a4357407b72407b2849b323425c6ed45a0222e69d551a2e59e15b7

再次强调,encSecKey固定是因为我们让第二次AES加密的密钥固定了,也就是说现在这个固定的encSecKey是AES密钥aaaabbbbccccdddd的密文

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。