Android网易歌词json接口,网易云音乐api分析
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
网易云音乐weapi
最近想写个爬虫来爬取网易云每首歌的评论,以前写的时候使用的是网易云手机端的api,全部都是明文参数,直接提交就能得到结果,但是那套api网易已经废弃了。现在客户端使用的为新的api,这个api如下:请求头片段:
POST /eapi/song/lyric HTTP/1.1
Referer: http://music.163.com/
Accept-Encoding: gzip, deflate
deviceId=5385a39d1484dcdde85c81812c2b3feb
Content-Length: 903
Content-Type: application/x-www-form-urlencoded
Host: music.163.com
Connection: Keep-Alive
params=8E4B12D503AA553F82561F2…(这个参数非常长,这里为了篇幅,省略了一部分)
这是获得一首歌的歌词的api,post参数就一个params,显然过加密,然而要搞到这个加密方法需要去把app反编译了才行,萌新瑟瑟发抖。所以不用考虑了。所以就用web的api好了。知乎大神把加密方法什么的全都分析出来了,这是极好的。
web端api
然我们来看看web端的api把1
2
3//这个json实际上才是提交的参数,只不过需要加密以后
//要得到这个原始json需要js中下断点
{"s":"周杰伦","limit":"8","csrf_token":""}1
2params=QWkgp21wyrRbtMQe5oNvWDfPukYPbbwopSZGBKFEwXBSkNGWHb9JuJCuwwSSpKoR7HGR0UQjolBKW0RSMkgmqF/Q8MkZBR4zAsOph50GwCI=
encSecKey=d8ec44254cda7821468298094a3b659adff2aca1ce5acfc20ff832802a3f28ba7d47b69770a834e1c6c89ce7b02d33420ee00f71ce110feedeb65db850ae5ca7068fbaf91511b6e9e06ce985060ec38d05888076ce31b71883c4933bafcd4336f144b89e515f2494ddd5b68d5f9ae8c3202105dd5650d47b2195aca454c6c43f
提交的参数一共有两个params,encSecKey。其中params是经过两次aes加密过的json数据,encSecKey则为加密params的密钥进行rsa加密后得到的结果。emmmm…mmp完全绕进去了,我这里说的不是很清楚,直接看后面的代码就懂了。
加密
web端的加密方法全部写到了一个叫core.js的文件中:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42!function(){
function (a){
var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
for (d = 0; a > d; d += 1)
e = Math.random() * b.length,
e = Math.floor(e),
c += b.charAt(e);
return c
}
function b(a, b){
var c = CryptoJS.enc.Utf8.parse(b)
, d = CryptoJS.enc.Utf8.parse("0102030405060708")
, e = CryptoJS.enc.Utf8.parse(a)
, f = CryptoJS.AES.encrypt(e, c, {
iv: d,
mode: CryptoJS.mode.CBC
});
return f.toString()
}
function c(a, b, c){
var d, e;
return setMaxDigits(131),
d = new RSAKeyPair(b,"",c),
e = encryptedString(d, a)
}
function d(d, e, f, g){
var h = {}
, i = a(16);
return h.encText = b(d, g),
h.encText = b(h.encText, i),
h.encSecKey = c(i, e, f),
h
}
function e(a, b, d, e){
var f = {};
return f.encText = c(a + e, b, d),
f
}
window.asrsea = d,
window.ecnonasr = e
}();
js代码表示完全看不懂,但是通过各种大佬分析,其中a函数是返回一个随机的16位字符串,既然是随机的,那么我们为了避免麻烦,后面改写成Python代码的时候直接返回16个F就好了。b函数就是把一个字符串进行aes加密,c函数是进行rsa加密,d函数就是进行post参数的加密,看不懂不要紧,反正我们不研究js。
将上面的改写为python代码(使用python3.6):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47import requests
import json
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import binascii
def aesEncrypt(text, secKey):
"""
aes加密
:param text: 要加密的文本
:param pubKey:密钥
:return:返回加密过后的文本(aes加密完后在进行一遍base64)
"""
blockSize = 16
encryptor = AES.new(secKey.encode(), AES.MODE_CBC, b'0102030405060708')
text = pad(text.encode(),blockSize) #将texe的长度填充到16的倍数,不然后面的加密回报错
ciphertext = encryptor.encrypt(text) # 进行AES加密
ciphertext = base64.b64encode(ciphertext) #把加密后的结果再进行一遍base64
return str(ciphertext,encoding='utf-8') # 由于上面得到的是一个bytes 所以将它转换为字符串
def rsaEncrypt(text, pubKey, modulus):
"""
将密钥进行rsa加密
:param text: 16位随机字符
:param pubKey:公钥
:param modulus:modulus
:return:
"""
text = text[::-1]
rs = int(binascii.b2a_hex(text.encode()), base=16) ** int(pubKey, base=16) % int(modulus, base=16)
return format(rs, 'x').zfill(256)
def createSecretKey(size):
"""
返回一个长度为size的随机字符串 这里直接返回n个F了
:param size: 生成字符串的长度
:return:返回一个长度为size的随机字符串
"""
return 'F' * size
上面的就是加密的核心代码,大部分都是抄的知乎大佬的。只是他那个是python2的代码,在python3上面直接跑不起来。所以进行了各种更改,这里使用的AES加密库为pycryptodome,crypto只有python2,pycrpto好像是不维护了还是什么的,反正在我的python3.6上装不上,只能使用pycryptodome。rsaEncrypt方法运行速度很慢,不知道为什么,难道是我电脑太辣鸡 。嘛,反正这函数我们只用一次,生成完encSecKey的值以后直接把值写死下次就不用在调这个函数了。
使用方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41#post请求地址 这里为得到一首歌曲的url地址的api 其他api看后面
url = 'http://music.163.com/weapi/song/enhance/player/url?csrf_token='
headers = {
'Referer': 'http://music.163.com/'
}
#这个不知道是什么东西 跟着抄过来
modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
#将json进行第一次aes加密的时候用这个作为密钥
nonce = '0CoJUm6Qyw8W8jud'
# rsa加密的公钥
pubKey = '010001'
#构建json 这是获得一首歌曲的url的api 其他的api看后面
text = {
'ids': [186016, ],
'br': 128000,
'csrf_token': ''
}
# 将字典dump成一个json字符串
text = json.dumps(text)
#获得一个16位的随机字符串,我们这里图省事给的是16个F
secKey = createSecretKey(16)
encText = aesEncrypt(text,nonce) #把上面构建的json数据使用nonce进行第一次aes加密
encText = aesEncrypt(encText,secKey)#使用随机的十六位字符串作为密钥把上面的到的结果进行第二次加密
encSecKey = rsaEncrypt(secKey, pubKey, modulus) #把我们用作ARS加密的密钥进行ras加密
#由于我们这里使用的一直是使用十六个F作为密钥所以这个对于我们来说是不变的,所以只要加密一遍以后直接复制出来搞成一个常量就行,每次提交给服务器都一样
data = {
'params': str(encText),
'encSecKey': encSecKey
}
req = requests.post(url, headers=headers, data=data) #发送post请求
print(req.text)
部分api
这里提供了部分api。
==注意:标注为get方式直接提交就行,post需要使用上面的加密方法将json文本进行加密以后在post==
获得指定歌手的所有专辑1
2
3
4参数就三个:
id:歌手的id 这个直接歌手页面爬一下就能得到
limit:获取数量 比如一个歌手有100个专辑 你写12 就给你返回12个专辑
offset:偏移量,分页用的 不知道就写0
使用python的requests库发送请求的时候必须在请求头里面指定User-Agent 否者获取不到,值为空就行,但是必须要存在这个键。
返回的是一个html,结果都在里面,需要通过正则什么的提取。
获得一个专辑的歌曲1id:专辑id
返回一个html 需要通过正则等手段提取
获得一个专辑的评论1
2
3
4
5
6
7
8//json
{
"rid":"R_AL_3_34720827", //34720827为专辑的id
"offset":"0", //偏移量 分页用
"total":"true", //这个不确定是什么意思 全部获取?
"limit":"20", //获得评论数量
"csrf_token":"" //不知道是什么 可以提交空也可以不提交
}
返回一个json,其中包括这张专辑的15条热门评论和普通评论
获得一首歌曲的地址1
2
3
4
5
6//json
{
"ids":"[186016]", //歌曲id 这个参数的值是一个列表 意味着你可以同时获得多首歌曲的地址
"br":"128000", //这个大概是比特率吧 试过192000和224000结果返回的都是128000 是需要会员还是api限制
"csrf_token":"" //不知道是什么 可以提交空也可以不提交
}
返回一个json,其中包括歌曲的id,歌曲的url地址,歌曲的比特率,歌曲的文件大小,歌曲的md5,格式等。
获得一首歌曲的评论1
2
3
4
5
6
7{
"rid":"R_SO_4_186016", //186016为歌曲的id
"offset":"0",//偏移量 分页用
"total":"true",
"limit":"20", //获得评论数量
"csrf_token":""//不知道是什么 可以提交空也可以不提交
}
返回一个json,其中包括这首歌曲的15条热门评论和普通评论
获得一首歌曲的歌词1
2
3
4
5
6{
"id":"186016", //歌曲的id
"lv":-1,//值为-1,判断是否搜索lyric格式,这个值的含义是参考http://moonlib.com/606.html这里的
"tv":-1,//值为-1,判断是否搜索tlyric格式,同上
"csrf_token":""//不知道是什么 可以提交空也可以不提交
}
返回一个json,其中包括这首歌曲的歌词
手机号登陆1
2
3
4
5
6{
"phone":"13888888888", //手机号
"password":"25f9e794323b453885f5181f1b624d0b", //密码 这里的密码需要原始密码进行md5
"rememberLogin":"true", //这个就不用我解释了吧
"csrf_token":""//不知道是什么 可以提交空也可以不提交
}
如果登陆失败,返回一个json,里面包含了为什么失败的原因。如果登陆成功,返回一个json,里面包括用户id,头像,反正就是用户的信息。这个请求会设置cookie,以后的请求只要带有这个cookie那么就是在登陆状态下操作,当然你也可你用requests的session自动帮你处理。
获取用户动态1
2
3
4
5
6
7
8{
"userId":"100000000", //用户id
"total":"true", //不知道
"limit":"20", //获取数量
"time":"-1", //这个时间不确定是不是可以根据时间筛选动态
"getcounts":"true", //这个不确定 是不是获得总动态数的
"csrf_token":"" //这个同上面其他api的 后面我就不写了
}
返回一个json,其中包括用户发表的动态
获取用户的关注1
2
3
4
5
6
7{
"uid":"100000000",//用户id
"offset":"0", //偏移量 分页用
"total":"true",
"limit":"20", //同上面的api 后面的我就不写了
"csrf_token":""
}
返回一个json,其中包括改用户关注的用户信息
获取用户的粉丝1
2
3
4
5
6
7{
"uid":"100000000",//用户id
"offset":"0", //偏移量 分页用
"total":"true",
"limit":"20",
"csrf_token":""
}
返回一个json,其中包括关注改用户的用户信息
获取一个用户所创建的歌单1
2
3
4
5
6
7
8{
"uid":"100000000",//用户id
"type":"-1",
"limit":"1000",
"offset":"0",
"total":"true",
"csrf_token":""
}
返回一个json,其中包括用户所创建的歌单信息
获取一个歌单的评论1
2
3
4
5
6
7{
"rid":"A_PL_0_2013433866", //其中2013433866为歌单的id
"offset":"0",
"total":"true",
"limit":"20",
"csrf_token":""
}
返回一个json,其中包括这张歌单的15条热门评论和普通评论
获取用户听歌排行1
2
3
4
5
6
7
8{
"uid":"100000000",//用户id
"type":"1", //为1时获得该用户一个星期听歌排行,为0时获得所有时间听歌排行
"limit":"1000",
"offset":"0",
"total":"true",
"csrf_token":""
}
Android网易歌词json接口,网易云音乐api分析相关推荐
- [转]网易云音乐API分析
源地址: https://github.com/yanunon/NeteaseCloudMusic/wiki/%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90 ...
- 网易云音乐API分析
环境:Win10 工具:Fiddler 4,Chrome浏览器 想做一个网易云音乐的下载地址解析,于是有了这篇文章,记录下过程. 开Fiddler截包 抓取到如下的包 POST http://musi ...
- 小谈网易云音乐----API
网易云音乐API分析1. 总览本文档是通过对网易云音乐Android客户端(1.5.2)的部分功能进行分析得出的在所有的交互中,均需要在cookie中添加这对键值appver=1.5.2;(Updat ...
- python爬虫api接口,网易云音乐python爬虫api接口
抓包能力有限,分析了一下网易云音乐的一些api接口,但是关于它很多post请求都是加了密,没有弄太明白.之前在知乎看到过一个豆瓣工程师写的教程,但是被投诉删掉了,请问有网友fork了的吗?因为我觉得他 ...
- 开源的网易云音乐API项目都是怎么实现的?
上一篇文章这个高颜值的开源第三方网易云音乐播放器你值得拥有介绍了一个开源的第三方网易云音乐播放器,这篇文章我们来详细了解一下其中使用到的网易云音乐api项目NeteaseCloudMusicApi的实 ...
- Github每日Rank推荐:网易云音乐API
今天要推荐的github开源项目是NeteaseCloudMusicApi,即网易云音乐API,安装所需环境即可实现真实调用网易云音乐 API,包括注册.登录.搜索歌单歌词.歌曲点评等功能,请看客老爷 ...
- 网易云音乐api歌单数据获取
网易云音乐api歌单数据获取 网易作为IT大厂,数据可以说 藏的很严实,普通按个f12以为能搞到点东西,结果,看不到要的歌单信息,这可是愁死我了啊. 后来看了看知乎,一帮怪才集中的地方果然迸发了思维的 ...
- 网易云音乐API,的调用方法 ,vue项目中(在本地使用)
1. 在cmd 命令行下:安装并启动: git clone https://github.com/Binaryify/NeteaseCloudMusicApi.git /* 下载 */cd Netea ...
- Docker 使用网易云音乐 API
背景 最近想写一个一小程序,需要搜索音乐歌曲相关信息.找到了一个叫 NeteaseCloudMusicApi 网易云音乐 API 的GitHub 开源项目. 它的 GitHub 地址: Binaryi ...
- 网易云音乐API使用
网易云音乐API使用 网易云音乐API 1.安装 $ git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git 或者 https://gi ...
最新文章
- java的jbutton啥意思,Jbutton和Jpanel和JFrame之间的区别?
- 实现用户注册功能---文件保存信息,如果用户名存在就死循环继续
- 查看AIX系统cpu、内存、网卡、硬盘、HBA卡信息命令
- web视频播放插件:Video For Everybody
- Web - JSON基础讲解
- 微信小程序开发-新闻简讯demo
- 【Git可视化工具】Sourcetree的初始化与使用
- SQLyog安装教程
- 计算机信息检索工作的原理,2021年湖北自考计算机信息检索课程考试大纲
- ixp协议服务器,ipx协议中的“内部网络号”是什么意思?
- android手机usb设置在哪里,手机usb调试在哪,教您安卓手机怎么打开USB调试
- html---表单实例代码
- 软考高级 真题 2016年上半年 信息系统项目管理师 案例分析
- cocoscreator热更新
- moviepy音视频开发:使用credits1给视频加片头片尾字幕
- 解决Google浏览器打开页面速度太慢问题
- 二维数组的初始化(二维数组的赋值)
- 微信小程序内部那些事
- Java-Eclipse折叠代码插件 code folding 使用方法
- 显示函数取字符数组的用法
热门文章
- 微信机器人框架【Python】
- GIWAXS数据处理流程详细
- python爬虫100例教程 python爬虫实例100例子
- stm32 上电初始化串口输出一个字节FF问题
- python写作_开源一个Python文档写作应用:MrDoc
- Delphi7学习第一天
- Borland Delphi7 企业版注册方法
- 毕业论文计算机设计,计算机设计毕业论文
- 电子设计大赛可以用linux开发板嘛,【一转再转】电子设计大赛应该怎么准备?...
- vc2010c语言,VC2010下载_VisualC++2010官方下载「vc2010」-太平洋下载中心