最近有点闲,听歌的时候遇见好听的想下载却遇到尴尬的事,版权!唉,知道我干什么了吧

网易云音乐

  获取排行榜中的歌曲列表

    https://music.163.com/discover/toplist?id=

    参数id:左侧分类的id,比如云音乐热歌榜:3778678

  获取具体歌曲链接

    http://music.163.com/weapi/song/enhance/player/url?csrf_token=&ids=xxx&br=999000

    参数:ids:歌曲id集合,br歌曲码率

  获取歌词:

    http://music.163.com/weapi/song/lyric?csrf_token=&id=xxx&os=pc&lv-1&kv=-1&tv=-1

    参数:id:歌曲id  

网易云的参数先经过JSON序列化然后进行加密,所有加密代码:

需要用到的一些Head及参数:

#region 属性
private string _MODULUS = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7";
private string _NONCE = "0CoJUm6Qyw8W8jud";
private string _PUBKEY = "";
private string _VI = "";
private string _USERAGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36";
private string _COOKIE = "os=pc;osver=Microsoft-Windows-10-Professional-build-16299.125-64bit;appver=2.0.3.131777;channel=netease;__remember_me=true";
private string _REFERER = "http://music.163.com/";
// use keygen in c#
private string _secretKey;
private string _encSecKey;
#endregion

加密方法:

private string CreateSecretKey(int length)
{
var str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var r = "";
var rnd = new Random();
for (int i = ; i < length; i++)
{
r += str[rnd.Next(, str.Length)];
}
return r;
}
private Dictionary<string, string> Prepare(string raw)
{
Dictionary<string, string> data = new Dictionary<string, string>();
data["params"] = AESEncode(raw, _NONCE);
data["params"] = AESEncode(data["params"], _secretKey);
data["encSecKey"] = _encSecKey; return data;
}
private string RSAEncode(string text)
{
string srtext = new string(text.Reverse().ToArray()); ;
var a = BCHexDec(BitConverter.ToString(Encoding.Default.GetBytes(srtext)).Replace("-", ""));
var b = BCHexDec(_PUBKEY);
var c = BCHexDec(_MODULUS);
var key = BigInteger.ModPow(a, b, c).ToString("x");
key = key.PadLeft(, '');
if (key.Length > )
return key.Substring(key.Length - , );
else
return key;
} private BigInteger BCHexDec(string hex)
{
BigInteger dec = new BigInteger();
int len = hex.Length;
for (int i = ; i < len; i++)
{
dec += BigInteger.Multiply(new BigInteger(Convert.ToInt32(hex[i].ToString(), )), BigInteger.Pow(new BigInteger(), len - i - ));
}
return dec;
} private string AESEncode(string secretData, string secret = "TA3YiYCfY2dDJQgg")
{
byte[] encrypted;
byte[] IV = Encoding.UTF8.GetBytes(_VI); using (var aes = Aes.Create())
{
aes.Key = Encoding.UTF8.GetBytes(secret);
aes.IV = IV;
aes.Mode = CipherMode.CBC;
using (var encryptor = aes.CreateEncryptor())
{
using (var stream = new MemoryStream())
{
using (var cstream = new CryptoStream(stream, encryptor, CryptoStreamMode.Write))
{
using (var sw = new StreamWriter(cstream))
{
sw.Write(secretData);
}
encrypted = stream.ToArray();
}
}
}
}
return Convert.ToBase64String(encrypted);
}
private string CURL(string url, Dictionary<string, string> parms, string method = "POST")
{
string result;
using (var wc = new WebClient())
{
wc.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");
wc.Headers.Add(HttpRequestHeader.Referer, _REFERER);
wc.Headers.Add(HttpRequestHeader.UserAgent, _USERAGENT);
wc.Headers.Add(HttpRequestHeader.Cookie, _COOKIE);
var reqparm = new System.Collections.Specialized.NameValueCollection();
foreach (var keyPair in parms)
{
reqparm.Add(keyPair.Key, keyPair.Value);
} byte[] responsebytes = wc.UploadValues(url, method, reqparm);
result = Encoding.UTF8.GetString(responsebytes);
}
return result;
}

获取歌曲详情调用方法:

public DetailResult Detail(long song_id)
{
string url = "http://music.163.com/weapi/v3/song/detail?csrf_token=";
var data = new Dictionary<string, string> {
{ "c",
"[" + JsonConvert.SerializeObject(new Dictionary<string, string> { //神tm 加密的json里套json mdzz (说不定一次可以查多首歌?)
{ "id", song_id.ToString() }
}) + "]"
},
{"csrf_token",""},
};
string raw = CURL(url, Prepare(JsonConvert.SerializeObject(data))); var deserialedObj = JsonConvert.DeserializeObject<DetailResult>(raw);
return deserialedObj;
}

QQ音乐

  获取排行榜类别

    https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_opt.fcg?page=index&format=html&tpl=macv4&v8debug=1

  获取排行榜中的歌曲

    https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg?tpl=3&page=detail&date={update_key}&topid={Id}&type=top&song_begin=0&song_num=30}&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0

  参数:id:排行榜的类别id,song_num 每页显示的条数

  获取歌曲链接

    https://u.y.qq.com/cgi-bin/musicu.fcg?-=getplaysongvkey7202785251801513&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&data=%7B%22req%22%3A%7B%22module%22%3A%22CDN.SrfCdnDispatchServer%22%2C%22method%22%3A%22GetCdnDispatch%22%2C%22param%22%3A%7B%22guid%22%3A%229756534816%22%2C%22calltype%22%3A0%2C%22userip%22%3A%22%22%7D%7D%2C%22req_0%22%3A%7B%22module%22%3A%22vkey.GetVkeyServer%22%2C%22method%22%3A%22CgiGetVkey%22%2C%22param%22%3A%7B%22guid%22%3A%226541487400%22%2C%22songmid%22%3A%5B%22{mid}%22%5D%2C%22songtype%22%3A%5B0%5D%2C%22uin%22%3A%220%22%2C%22loginflag%22%3A1%2C%22platform%22%3A%2220%22%7D%7D%2C%22comm%22%3A%7B%22uin%22%3A0%2C%22format%22%3A%22json%22%2C%22ct%22%3A20%2C%22cv%22%3A0%7D%7D

    参数:mid:歌曲的mid  

 private string GetSongUrl(string mid)
{
var url = $"https://u.y.qq.com/cgi-bin/musicu.fcg?-=getplaysongvkey7202785251801513&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&data=%7B%22req%22%3A%7B%22module%22%3A%22CDN.SrfCdnDispatchServer%22%2C%22method%22%3A%22GetCdnDispatch%22%2C%22param%22%3A%7B%22guid%22%3A%229756534816%22%2C%22calltype%22%3A0%2C%22userip%22%3A%22%22%7D%7D%2C%22req_0%22%3A%7B%22module%22%3A%22vkey.GetVkeyServer%22%2C%22method%22%3A%22CgiGetVkey%22%2C%22param%22%3A%7B%22guid%22%3A%226541487400%22%2C%22songmid%22%3A%5B%22{mid}%22%5D%2C%22songtype%22%3A%5B0%5D%2C%22uin%22%3A%220%22%2C%22loginflag%22%3A1%2C%22platform%22%3A%2220%22%7D%7D%2C%22comm%22%3A%7B%22uin%22%3A0%2C%22format%22%3A%22json%22%2C%22ct%22%3A20%2C%22cv%22%3A0%7D%7D";
WebClient client = new WebClient();
client.Encoding = Encoding.UTF8;
var result = client.DownloadString(url);
}

  获取歌词:

    https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg?songmid={songmid}&g_tk=5381

    参数:songmid:歌曲id    

var url = $"https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg?songmid={songmid}&g_tk=5381";
WebClient client = new WebClient(); client.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36");
client.Headers.Add("Accept", "*/*");
client.Headers.Add("Referer", "https://y.qq.com/portal/player.html");
client.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8");
client.Headers.Add("Cookie", "tvfe_boss_uuid=c3db0dcc4d677c60; pac_uid=1_2728578956; qq_slist_autoplay=on; ts_refer=ADTAGh5_playsong; RK=pKOOKi2f1O; pgv_pvi=8927113216; o_cookie=2728578956; pgv_pvid=5107924810; ptui_loginuin=2728578956; ptcz=897c17d7e17ae9009e018ebf3f818355147a3a26c6c67a63ae949e24758baa2d; pt2gguin=o2728578956; pgv_si=s5715204096; qqmusic_fromtag=66; yplayer_open=1; ts_last=y.qq.com/portal/player.html; ts_uid=996779984; yq_index=0"); client.Headers.Add("Host", "c.y.qq.com");
var result = client.DownloadString(url);
result = result.Substring(result.IndexOf('(') + );
result = result.Substring(, result.LastIndexOf(')'));
var data = JsonConvert.DeserializeObject<dynamic>(result);

歌词是经过base64进行加密的,所以获取后需要进行base64解密

/// <summary>
/// Base64解码
/// </summary>
/// <param name="Message"></param>
/// <returns></returns>
public static string Base64Decode(string Message)
{
if ((Message.Length % ) != )
{
throw new ArgumentException("不是正确的BASE64编码,请检查。", "Message");
}
if (!System.Text.RegularExpressions.Regex.IsMatch(Message, "^[A-Z0-9/+=]*$", System.Text.RegularExpressions.RegexOptions.IgnoreCase))
{
throw new ArgumentException("包含不正确的BASE64编码,请检查。", "Message");
}
string Base64Code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
int page = Message.Length / ;
System.Collections.ArrayList outMessage = new System.Collections.ArrayList(page * );
char[] message = Message.ToCharArray();
for (int i = ; i < page; i++)
{
byte[] instr = new byte[];
instr[] = (byte)Base64Code.IndexOf(message[i * ]);
instr[] = (byte)Base64Code.IndexOf(message[i * + ]);
instr[] = (byte)Base64Code.IndexOf(message[i * + ]);
instr[] = (byte)Base64Code.IndexOf(message[i * + ]);
byte[] outstr = new byte[];
outstr[] = (byte)((instr[] << ) ^ ((instr[] & 0x30) >> ));
if (instr[] != )
{
outstr[] = (byte)((instr[] << ) ^ ((instr[] & 0x3c) >> ));
}
else
{
outstr[] = ;
}
if (instr[] != )
{
outstr[] = (byte)((instr[] << ) ^ instr[]);
}
else
{
outstr[] = ;
}
outMessage.Add(outstr[]);
if (outstr[] != )
outMessage.Add(outstr[]);
if (outstr[] != )
outMessage.Add(outstr[]);
}
byte[] outbyte = (byte[])outMessage.ToArray(Type.GetType("System.Byte"));
return Encoding.UTF8.GetString(outbyte);
}

完整项目地址:Demo

网易云和QQ音乐api的更多相关文章

  1. 【QQ音乐Api】移花接木 打造自己的音乐电台

    最近突发奇想想做个在线音乐小网页.需求很简单,如下 搜索歌曲 或 歌手 在线播放音乐 借用qq 或者 百度的 音乐接口 需求明确那就直接动手了 我首先尝试的百度音乐,但是不能在线播放(提示forbid ...

  2. QQ音乐API

    今天分享的是QQ音乐API 搜索歌曲API:http://s.music.qq.com/fcgi-bin/music_search_new_platform?t=0& amp;n={2}&am ...

  3. QQ音乐API分析记录

    我一直是QQ音乐的用户,最近想做一个应用,想用QQ音乐的API,搜索了很久无果,于是就自己分析QQ音乐的API. 前不久发现QQ音乐出了网页版的,是Flash的,但是,我用iPhone打开这个链接的时 ...

  4. 调皮的QQ音乐API:修复无法获取歌单

    上一篇完整版:http://www.cnblogs.com/TwilightLemon/p/7076938.html QQ音乐的API真是太调皮了,获取歌单的API又更换了好多次,喵喵喵 旧版API( ...

  5. 使用浏览器抓取QQ音乐接口(歌曲篇)

    前言 前面我们获取了歌曲的排行榜的数据,我们现在需要实现歌曲播放 前面我们写了一段函数来得到了回调的数据,现在我们需要使用这一段数据,来实现播放歌曲 完整代码 <!DOCTYPE html> ...

  6. QQ音乐的各种相关API

    QQ音乐的各种相关API 分类: oc2014-01-29 15:34 2676人阅读 评论(2) 收藏 举报 基本上论坛里做在线音乐的都在用百度的API,进来发现百度的API不仅歌曲的质量不可以保证 ...

  7. 网易音乐API

    本次分析的是网易音乐API 歌曲搜索API:http://music.163.com/api/search/get/web?csrf_token= 需要用POST来获取 参数: Referer=htt ...

  8. 音乐API之QQ音乐

    欢迎大家来到我的博客,这是我在博客园写的第一篇文章,但不会是最后一篇,希望大家多多关注我,支持我哦!正文开始,今天我们要讲的是QQ音乐的API,都是来源于官方的地址,以前我也想写一个,但百度谷歌之后都 ...

  9. QQ音乐无损歌曲接口api

    1.打开QQ音乐官网 y.qq.com 2.选择你要的歌曲,进入后查看网址,以虎口脱险这个歌曲为例:http://y.qq.com/#type=song&mid=000Ib8E71sUNi7 ...

随机推荐

  1. 部署springboot工程到linux上及遇到的坑

    一.步骤 1.将工程打成jar包 IDEA中点击file-project structure,如下图: 选择Artifacts-JAR-From modules,选择入口类Main Class,如下图 ...

  2. js···元素的属性

    Div.attributes 是所有标签属性构成的数据集合 Div.classList 是所有class名构成的数组集合 在classList的原型链上看以看到add()和remove(). clie ...

  3. 2018-2019-2 20165313 《网络对抗技术》 Exp5:MSF基础应用

    实践使用漏洞和辅助模块 任务一:MS17-010安全漏洞 任务二:(1)MS11-050(失败)(2)MS14-064(唯一) 任务三:abode_flash_avm2 辅助模块:(1)ARP扫描模块 ...

  4. robotframework之上传功能

    上传功能,分为上传图片以及上传文件 1.上传文件 A)上传文件的html标签为input类型,可以直接输入文本中input文件路径,可以省略点击[上传文件]这一步骤 B)直接输入使用的关键词为:cho ...

  5. 简单尝试利用维控LeviStudioU的一栈缓冲区溢出漏洞

    这是别人给我发的,让我分析一下,看能否写出exp.只怪自己水平不够,最后没能写出exp,以下为自己的分析思路 环境为win10 pro x64 英文版(10.0.16299) 默认安全配置 一.漏洞分 ...

  6. JavaException的使用

    (第一个文件 MyException.java) package exception;import java.io.*; //先创建自己的异常类继承与Exception的类 public class ...

  7. vue 项目 使用sass,node-sass 安装方法及cnpm下如何安装node sass

    内容为转载,方便用时查阅,原文地址: https://www.cnblogs.com/crazycode2/p/6535105.html 1,使用save会在package.json中自动添加. 1 ...

  8. 嵌入式C语言常见的错误

    预处理的错误: #include “stdio.h”   //引用符号错误 #inlcude <name>  //自定义文件用 "  " not find gcc -I ...

  9. markdown特殊符号语法

    符号 说明           对应编码 &    AND符号        & < 小于           < > 大于           > _    ...

  10. .NET微信开发Charles突破微信授权,获取任意微信网页源代码(含Https)

    简介 Charles其实是一款代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的.该软件是用Java写的,能够在Windows,Mac,Linux上使用.开发iOS都在 ...