前段时间帮朋友下歌放在车上听..结果好多都是ncm格式,伤心 ,搜索了下发现基本上这格式解密有好多昂,可惜UI我都不太想要..决定抄一下,自己做一个。 这里先记录下核心代码,回头补充个UI 做个小程序。

ncm是啥

ncm 是网易云音乐的音乐容器格式,并非是音乐格式,文件内带有meta cover audio 等信息,所以我们需要根据对应的加密算法,解密回来转成mp3 内容进行播放。

这个解密很多人都已经实现了,可惜要么是python 要么是c 要么是go ,有一个js实现的结果是浏览器的,当然浏览器跟nodejs 也没啥差别,不过写代码的意义就在于折腾嘛,准备做个nodejs版本的,顺便再加个electron的界面。

ncm 格式

借用下大神的图,现有的格式内容

ncm解密

由于所有的ncm的密钥都是相同的,所以这里就直接写死就可以了,如果不同..那就没办法了,可能更新了或有了其他的处理。出现的话就只能等待大神给密钥了。

直接上代码,注释都有记录的

const filePath = 'd:/nodejs/toy/网易云NCM2MP3/2.ncm';
const fs = require('fs');
const crypto = require('crypto');let content = fs.readFileSync(filePath);(async function () {let start = 0;let buff = Buffer.from(content);//1.读取8字节,获取 magic headerlet temp = buff.slice(start, start+8);start += 10;//空余 2 字节let header = Buffer.from([0x43, 0x54, 0x45, 0x4E, 0x46, 0x44, 0x41, 0x4D]);if (!header.equals(temp)) {throw new Error('文件头已损坏');}//读取 32 位 4字节的密钥长度let keyLength = buff.readUInt32LE(start);start += 4;//根据密钥长度读取密钥内容temp = buff.slice(start, start + keyLength);let cipherText = temp.map(t => {return t ^ 0x64;})start += keyLength;//解密的keylet key = Buffer.from('687a4852416d736f356b496e62617857', 'hex');//aes-128-ecb 解密let decipher = crypto.createDecipheriv('aes-128-ecb', key, '');let decodeText = decipher.update(cipherText);decodeText += decipher.final();//得到 keyDatalet keyData = decodeText.substr(17).trim();let key2Len = keyData.length;keyData = Buffer.from(keyData);//ttt//将keyData 做 RC4-KSA 算法解密 let keyBox = Buffer.alloc(256);for (let i = 0; i < keyBox.length; i++){keyBox[i] = i;}let j = 0;for (let i = 0; i < 256; i++) {j = (keyBox[i] + j + keyData[i % key2Len]) & 0xff;[keyBox[i], keyBox[j]] = [keyBox[j], keyBox[i]];}//读取4字节获取meta 长度let metaLen = buff.readUInt32LE(start);start += 4;//读取meta内容let metaContent = buff.slice(start, start + metaLen);metaContent = metaContent.map(t => t ^ 0x63)//去掉 22位 163 key(Don't modify):metaContent = metaContent.toString();metaContent = metaContent.substr(22);metaContent = Buffer.from(metaContent, 'base64');//解密meta 内容const metaKey = Buffer.from("2331346C6A6B5F215C5D2630553C2728",'hex');let decipher2 = crypto.createDecipheriv('aes-128-ecb', metaKey, '');let meta = decipher2.update(metaContent);meta += decipher2.final('utf8');meta = meta.substr(6);meta = JSON.parse(meta);start += metaLen;//5字节空白start += 5;//读取 4字节 crc32校验码let crc32 = buff.readUInt32LE(start);start += 4;//读取4字节图片大小let imgLen = buff.readUInt32LE(start);start += 4;//写入图片数据fs.writeFileSync('./1.jpg', buff.slice(start, start + imgLen))start += imgLen;let audioData = buff.slice(start);let m = 0;for (let i = 1; i < audioData.length + 1; i++){m = i & 0xff;audioData[i-1] ^= keyBox[(keyBox[m] + keyBox[(keyBox[m] + m) & 0xff]) & 0xff]}fs.writeFileSync('d:/nodejs/toy/网易云NCM2MP3/2.mp3', audioData);})();

示例图

其实也就是照着大神的代码抄一遍... 还是等我补UI吧,尽量做个好看易用的..

网易云音乐NCM格式转化为mp3相关推荐

  1. 来跟我学爬虫,爬取网易云音乐的邓紫棋歌单MP3,注意:VIP歌曲不可以爬取

    @Author:Runsen 我又回来了写几个爬虫案例了,这次是写一个简单的爬虫,我来教你如何爬取网易云音乐的歌单MP3,正所谓下载一个mp3很麻烦,你们的女朋友想听歌,秀即使帮她爬取所有MP3,从此 ...

  2. 从网易云音乐的缓存中获取mp3文件

    网易云音乐的缓存目录,音乐文件后缀名.uc: java代码: /* 从网易云的缓存中获取mp3 将.UC文件按二进制字节流输出,每个字节与0xa3做异或运算,再将运算结果以二进制字节流写入文件,保存后 ...

  3. 网易云音乐.uc格式的缓存文件转.mp3

    音乐的缓存文件与源文件大小相同,所以没有经过压缩,考虑异或运算,经试验发现每字节与 0xa3 异或即可 import java.io.*;public class Change {public sta ...

  4. 网易云音乐 歌词制作软件 BesLyric (最新版本下载)

    导读 BesLyric , 一款专门制作 网易云音乐 LRC 滚动歌词的软件! 搜索.下载.制作 歌词更方便! 哈哈,喜欢网易云音乐,又愁于制作歌词的童鞋有福啦!Beslyric 为你排忧解难! 本文 ...

  5. 歌单助手:一键导出网易云音乐歌单列表,推荐你喜爱的专辑

    苏生不惑第191 篇原创文章,将本公众号设为星标,第一时间看最新文章. 关于网易云音乐之前写过很多文章了,有兴趣可以点击阅读: 那些你可能不知道的网易云音乐奇技淫巧 不想下载那么多音乐软件?全网音乐在 ...

  6. 网易云音乐怎样下载mp3格式的音乐

    网易云音乐怎样下载mp3格式的音乐 选择下面这两种音质的音乐,最后音乐的格式都是mp3.

  7. unreal无损音乐百度云_将网易云音乐专用的无损音乐格式转换成全平台通用的无损格式...

    前几天发现网易云音乐的ncm格式很坑爹,由于网易云的部分音乐采取了这种流媒体平台模式,这种格式的歌曲下载到设备本地以后只有在网易云音乐的app上面才能播放,而且还要在会员生效期间才能播 今天网易云弄出 ...

  8. 网易云音乐怎么设置黑胶唱片_黑胶唱片是否是开放音乐格式?

    网易云音乐怎么设置黑胶唱片 这是我在Opensource.com上新专栏文章的第一篇,涉及开放音乐. 我不会做的一些事情:我不会只关注开放许可证下发行的音乐. 我不会写太多关于制作自己的音乐的事情. ...

  9. 网易云音乐mp3外链-真实地址下载方法

    此外链地址长期有效 1.打开网易云音乐,找到要下载的歌曲.点击播放.复制网址的ID. 平凡之路这首歌真实ID-------1916213996 2.新开一个页面输入网址 http://music.16 ...

  10. scrapy爬取网易云音乐的MP3链接

    最近遇到需要从网易云音乐爬取MP3的url的需求,看了很多github以及博客内容,都是直接拿着参数请求抓包得到的url,网上的一些api还能用,但是很多都已经不能用了,而且能用的那些也里面的MP3u ...

最新文章

  1. 继承jpanel不显示_房产继承全指南
  2. java的poi导出Excel文件
  3. 用matlab解一维单势垒波函数,一维多势垒结构准束缚态的MATLAB分析计算
  4. C语言 | 为什么写这三行代码
  5. 【渝粤教育】国家开放大学2018年秋季 0033-21T工程数学 参考试题
  6. windows搭建python开发环境方法_04 Windows下搭建 Python 开发环境 - Python 入门教程
  7. linux错误日志重定向,Linux shell 重定向标准错误输出
  8. 1.4Activity保存现场状态
  9. json字符串转成formdata_FormData 数据转化为 json 数据
  10. 《近匠》专访WRTnode创始人罗未——开源硬件如何拥抱物联网
  11. opencv旋转矩形定义以及求交叉面积
  12. linux终端安装搜狗输入法rpm,Linux下deb包安装工具(附带安装搜狗输入法)
  13. python虚拟变量回归_哑变量 虚拟变量 线性回归_spss 线性回归 哑变量
  14. 前端面试你需要知道的事情:简历
  15. 学习笔记(4):【数据分析实战训练营】 数据分析基础及方法论-row-column-len-lenb函数...
  16. 【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)
  17. 问题 B: 不同出栈情况(栈和队列)
  18. 1-fastfds 环境搭建
  19. 前端:margin、padding、float一篇文章彻底理解
  20. java mousemotionadapter_MouseMotionAdapter 类

热门文章

  1. 论文写作1:论第一篇SCI写作时的降重方法总结
  2. 2018美赛B题总结
  3. win10系统安装SQL Server2005中文版安装教程和下载地址(亲测成功)
  4. 优秀的孩子是这样培养的
  5. Android 音视频开发学习思路大纲
  6. 苹果手机各种型号图片_iphone全部机型图片
  7. 自然语言处理(NLP)语义分析:“词汇级”语义分析【词义消歧、词义表示和学习】、“句子级”语义分析【浅层语义分析(语义角色标注)、深层语义分析】
  8. 推荐一些高质量的自学网站
  9. clousx6机器人卡密_手机x6机器人词库编程-clousx6词库助手免费版v8.0 安卓最新版-2265安卓网...
  10. 系统集成项目管理工程师(软考中级)知识点总结【挣值分析】【关键路径】