网易云音乐API获取分析

喜欢的朋友star 一下
终于对网易云音乐下手了!
一、网易云音乐歌曲评论数据获取分析

本来是想着用jsoup 来爬取网易的评论,结果一分析发现获取的网页中找不到评论数据。研究了半天,无果。于是百度看看。
果然是大厂,在安全方面肯定做的比较多,原因是在传递参数的时候对参数进行加密,所以在我们直接访问网址的时候,如果传递的参数没有经过加密,前端页面就获取不到数据。看看知乎的大神们的解法: https://www.zhihu.com/question/36081767
下面是我的分析:
 
我们先对页面分析:
1、 首先通过URL得知歌曲的固定id
2、这是我们需要查看的歌曲
3、通过开发者工具可以找到评论的API接口
4、我们可以看到response给我们的是json数据,我们所需要的评论数据就是包含在json数据中。
 
 
现在问题来了,API 接口知道了,直接访问行不行呢?答案是,肯定不行啊!最起码我们要把歌曲的id 传过去,才可以找到指定的评论啊。
通过分析可以知道,参数没有放在URL 中,所以参数肯定是post 过去的。要不怎么说是大厂呢,就算是你把参数放在请求头也是不行的!如果我是产品经理肯定要程序员去加密传输数据,我大厂的数据岂是你能随便获取的!
继续分析:

通过在header 中我们可以发现完整的请求地址,以及包头的一些参数配置。

重点来了:

data 中我们发现了两个参数,对,就是加密之后的参数,肯定看不懂啦。这都是加密之后的密文。这里肯定是我们要传递的参数,包括歌曲的id 什么的,但是加密算法我们怎么能知道呢?
走到这一步我们似乎前一脚已经踏进去了,还没有落地,发现脚下埋着地雷!
不急不急,再神秘的算法也是人写的嘛!总会有破解的方法。
 
 
二、post数据加密破解
为了安全问题,一般程序员或多或少会对数据进行加密。一般加解密的程序只有开发者自己清楚。
总是有那么些大牛平时没事干就喜欢琢磨这些事情,通过破解这些程序来证明自己。还有的是为了喜欢的女孩,比如下面这位:(这是一个悲伤的故事!)

这位同学的代码分析能力很强,他提供的方法属于另辟蹊径。其他的大牛都是通过分析js 加密算法,然后自己写出来,实现对传输参数的加密,大部分都是使用Python ,这位作者使用的是纯Java 写的加密程序。通过java 内置的ScriptEngine 调用js 引擎,实现对js 中的方法调用,这个我也是第一次听说,在JavaSE6 中提供的功能。什么是ScriptEngine, 请看博客: https://www.cnblogs.com/zouhao/p/3644788.html 或者
作者通过对core.js 的核心文件分析,将两万行的代码删减成一千多行,不得不说作者很有耐心啊!最后就简单了,直接在java 代码中调用js 的方法就可以对参数进行加密了。
 
现在对代码进行分析:

1、首先分析JSSecret.java

一开始是static 中实现起始加载的功能
1)首先使用Java的NIO实现对文件的读取,Path和Files,对于以往的各种IO流大家是不是写吐了
2)第二步使用ScriptEngineManager,详情看下面的官方API,使用getEngineByName()方法指定参数,可以获取指定脚本的ScriptEngine的对象。


3)第三步创建ScriptEngine对象

ScriptEngine 是一个基础接口,它的eval 方法如下:

也就是说当我们将js 代码放入到eval 中当做参数就可以执行相应的js 代码。
  1. Invocable
这一步我们就要调用js 中的方法,上一步我们获取到了js 的对象,我们来看看什么是Invocable

它是干什么的呢?它就是用来调用js 中指定的方法的


2、js 中实现参数加密:

Core.js中部分代码:

让我们来看看网易的js 代码


这些都是什么鬼,你没看错,找不到变量名称吧,一般写程序都是按照功能给变量起特定的名字,但是网易的全是abcdefg 什么的,这里应该是使用了代码混淆!
1)第一步可以看到。此处执行了core.js中myFunc()方法,将传入的参数paras进行加密。那么paras参数是什么呢?通过程序运行可以看出paras参数是一个json数据集,包含了四个参数,实际测试随着接口的不同参数是可以改变的,csrf_token亲测给不给数据没关系的。主要是offset和limit,懂数据库的同学应该懂得,起始位置和返回数据的数目。Uid可以根据具体的需求来改,参数名称可以从URL中获取到。
 
大家再看看ScriptObjectMirror 这个东西,这又是什么鬼?在java6 API 找了一圈,结果没找到,java7 才支持的,可见作者的见识很广。但是奇怪的是从1.7 找到1.8 也找不到这个东西!
 
没办去去Oracle 的官网去看API 了,是不是这玩意太偏了,一般用不到。链接如下:
你没看错,这是JDK9 ,也就是Java9 API ,我能怎么办,我也很无奈啊!先看官方解释:

大家看一看,这不就是和Map 非常相似嘛,get( 参数) 方法中的参数就是key ,返回值就是value ,下面我们来验证一下:这应该是set 集合,以Map.Entry<String,Object> 为泛型类型,通过foreach 我们就可以获取so 存储的全部的值。它的两个key 分别是encText encSeckey ,它们的值就是js 加密过后的值。
 
 
 
下面是它的源码:
public Object get( final Object key) {
    checkKey(key) ;
    return this .inGlobal( new Callable() {
        public Object call() {
            return ScriptObjectMirror.translateUndefined(ScriptObjectMirror. this .wrapLikeMe(ScriptObjectMirror. this .sobj.get(key))) ;
        }
    }) ;
}
 
2)第二步就是在Map中设置这两个值,最后整个方法返回一个map对象。
 
三、数据请求测试
分析测试类:
 
1)将请求参数封装到json中。

2)封装请求头。
3)请求头中主要修改的是url和data的参数,也就是请求地址和携带的参数。
4)最后通过API接口返回完整的json数据

 
 

四、爆出其它的API接口:

通过分析各种页面,发现参数加密方式都是一致的,所以这就很简单了,其它的接口也都出来了。下面做个总结:
1 、搜索API
 
原来的网页地址:
http://music.163.com/#/search/m/?id=28193075&s=%E5%9C%A8%E4%BA%BA%E9%97%B4&type=1
 
(%E5%9C%A8%E4%BA%BA%E9%97%B4) 这个就是我们在搜索框中输入内容
 
搜索建议:
http://music.163.com/weapi/search/suggest/web?csrf_token=
 
按类型搜索:
http://music.163.com/weapi/cloudsearch/get/web?csrf_token=
 
 
在原地址上面传递的参数可以分析:
type 类型的不同,搜索的类型不同
type=1              单曲

type=10            专辑

type=100          歌手

type=1000       歌单

type=1002       用户

type=1004       MV

type=1006       歌词

type=1009       主播电台
 
 
 
2 、查看粉丝
请求头:
Referer:http://music.163.com/user/fans?id=97526496
 
获取指定用户的粉丝:
http://music.163.com/weapi/user/getfolloweds?csrf_token=
 
 
3 、动态:
http://music.163.com/user/event?id=97526496
http://music.163.com/weapi/event/get/97526496?csrf_token=
 
 
4 、播放
http://music.163.com/weapi/song/enhance/player/url
直接播放地址:id 可以改为任何存在的歌曲的ID
 
5 、评论(热门评论和全部评论)
516392300 这就是歌曲的id
http://music.163.com/weapi/v1/resource/comments/R_SO_4_516392300?csrf_token=1ac15bcb947b3900d9e8e6039d121a81




基于Spark进行网易云音乐数据分析的步骤如下: 1. 数据获取:从网易云音乐API获取数据,或者从公开数据集中获取数据。 2. 数据清洗:对数据进行清洗,包括去重、缺失值处理、异常值处理等。 3. 数据预处理:对数据进行预处理,包括特征提取、特征选择、数据转换等。 4. 数据分析:使用Spark的分布式计算能力进行数据分析,包括统计分析、机器学习等。 5. 结果可视化:将分析结果进行可视化展示,包括图表、报表等。 以下是一个基于Spark进行网易云音乐数据分析的例子: ```scala // 导入Spark SQL和Spark MLlib库 import org.apache.spark.sql.SparkSession import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer} import org.apache.spark.ml.clustering.KMeans // 创建SparkSession val spark = SparkSession.builder.appName("NetEaseMusicAnalysis").getOrCreate() // 读取数据 val data = spark.read.format("csv").option("header", "true").load("netease_music_data.csv") // 数据清洗 val cleanedData = data.dropDuplicates().na.drop() // 数据预处理 val tokenizer = new Tokenizer().setInputCol("song_name").setOutputCol("words") val wordsData = tokenizer.transform(cleanedData) val hashingTF = new HashingTF().setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(10000) val featurizedData = hashingTF.transform(wordsData) val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features") val idfModel = idf.fit(featurizedData) val rescaledData = idfModel.transform(featurizedData) // 数据分析 val kmeans = new KMeans().setK(10).setSeed(1L) val model = kmeans.fit(rescaledData.select("features")) val predictions = model.transform(rescaledData) // 结果可视化 predictions.groupBy("prediction").count().show() ``` 该例子使用Spark对网易云音乐歌曲名称进行聚类分析分析结果展示了每个聚类中歌曲数量的统计信息。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值