1. 网易云POST需要两个参数params,encSecKey

2. 在某一个js中可以找到这两个参数

3. bUS2x就是一个函数window.asrsea的返回值,window.asrsea = d,最终就是d函数,传入4个参数

4. 查看传入的是什么参数,把网页中的js保存在本地,找到window.asrsea,在其上面写下一下代码,目的是为了在网页的Console中看到传入的参数是什么

5. 替换网页中的js,在fiddler中找到包含着两个参数的js,并把它替换为你修改完成的js,然后再刷新的网易云页面,可以在Console看到如下

6. 只有第一个参数是不一样的,加密方式

# -*- coding:utf-8 -*-

import base64

import random

from binascii import hexlify

from Crypto.Cipher import AES

import json

import requests

class GetMusic:

def __init__(self):

self.key = GetParamsAndEncSecKey()

self.headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',

'Referer': 'http://music.163.com/'}

self.session = requests.Session()

self.session.headers = self.headers

self.conmment_url = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_{}?csrf_token=' # 评论

self.lyric_url = 'https://music.163.com/weapi/song/lyric?csrf_token=' # 歌词

self.music_url = 'https://music.163.com/weapi/song/enhance/player/url?csrf_token=' # 歌曲

self.url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token=' # 搜索歌曲列表,无歌曲链接

def get_params_and_encSecKey(self, song=None):

'''

获取什么就返回所需要两个参数

1. 歌曲

2. 歌词

3. 评论 默认

4. 搜索的歌曲列表

:param song:

:return:

'''

if isinstance(song, int):

data = {"ids": [song], "br": 128000, "csrf_token": ""}

elif isinstance(song, str) and song.isdigit():

data = {"id": song, "lv": -1, "tv": -1, "csrf_token": ""}

elif song == None:

data = {}

else:

data = {"hlpretag": "", "hlposttag": "", "s": song, "type": "1", "offset": "0",

"total": "true", "limit": "30", "csrf_token": ""}

song = json.dumps(data)

data = self.key.get(song)

return data

def get_music_list_info(self, name):

'''

获取歌曲详情:歌名+歌曲id+作者

:param name:

:return:

'''

data = self.get_params_and_encSecKey(name)

res = self.session.post(self.url, data=data) # 歌曲

song_info = res.json()['result']['songs']

for song in song_info:

song_name = song['name']

song_id = song['id']

songer = song['ar'][0]['name']

print(song_name, '\t', song_id, '\t', songer)

self.get_music_url(song_id)

self.get_music_lyric(song_id)

self.get_music_comment(song_id)

break

def get_music_url(self, id):

'''

获取歌曲URL链接

:param id:

:return:

'''

data = self.get_params_and_encSecKey(id)

res = self.session.post(self.music_url, data=data)

song_url = res.json()['data'][0]['url']

print(song_url)

def get_music_lyric(self, id_str):

'''

获取歌词

:param id_str:

:return:

'''

data = self.get_params_and_encSecKey(str(id_str))

res = self.session.post(self.lyric_url, data=data)

lyric = res.json()['lrc']['lyric']

print(lyric)

def get_music_comment(self, song_id):

'''

获取歌曲评论: 评论人+内容+头像

:param song_id:

:return:

'''

data = self.get_params_and_encSecKey()

comment = self.session.post(self.conmment_url.format(str(song_id)), data=data)

com_list = comment.json()['hotComments']

for com in com_list:

content = com['content']

nickname = com['user']['nickname']

user_img = com['user']['avatarUrl']

print(nickname, '!!!!' + content + '!!!!', user_img)

class GetParamsAndEncSecKey:

def __init__(self):

self.txt = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

self.i = ''.join(random.sample(self.txt, 16)) # 16为随机数

# self.i = hexlify(os.urandom(16))[:16].decode('utf -8') # 16为随机数bytes

self.first_key = '0CoJUm6Qyw8W8jud'

def get(self, song):

'''

获取加密的参数

params是两次加密的

:param song:

:return:

'''

res = self.get_params(song, self.first_key)

params = self.get_params(res, self.i)

encSecKey = self.get_encSecKey()

return {

'params': params,

'encSecKey': encSecKey

}

def get_params(self, data, key):

'''

获得params,加密字符长度要是16的倍数

:param data:

:param key:

:return:

'''

iv = '0102030405060708'

num = 16 - len(data) % 16

data = data + num * chr(num) # 补足

cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode())

result = cipher.encrypt(data.encode())

result_str = base64.b64encode(result).decode('utf-8')

return result_str

def get_encSecKey(self):

'''

获取encSecKey,256个字符串

hexlify--->转换为btyes类型

pow--->两个参数是幂,三个参数是先幂在取余

format(rs, 'x').zfill(256)-->256位的16进制

:return:

'''

enc_key = '010001'

modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'

rs = pow(int(hexlify(self.i[::-1].encode('utf-8')), 16), int(enc_key, 16), int(modulus, 16))

return format(rs, 'x').zfill(256)

if __name__ == '__main__':

Msuic = GetMusic()

Msuic.get_music_list_info('刘德华')

python网易云_python 网易云音乐相关推荐

  1. python爬虫爬取网易云音乐歌曲_Python网易云音乐爬虫进阶篇

    image.png 年前写过一篇爬网易云音乐评论的文章,爬不了多久又回被封,所以爬下来那么点根本做不了什么分析,后面就再改了下,加入了多线程,一次性爬一个歌手最热门50首歌曲的评论,算是进阶版了- 思 ...

  2. python爬虫爬取网易云音乐下载_Python爬虫实践-网易云音乐!没有版权又如何!照样爬取!...

    1.前言 最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊! 本文主要参考 python编写 ...

  3. python网易云_用python爬虫爬取网易云音乐

    标签: 使用python爬虫爬取网易云音乐 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页版找一下你想要听的歌曲点击进去.按键盘F12打开网页调试工具,点击Ne ...

  4. python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名

    目标网站: 首先获取第一页的数据,这里关键要切换到iframe里 打印一下 获取剩下的页数,这里在点击下一页之前需要设置一个延迟,不然会报错. 结果: 一共37页,爬取完毕后关闭浏览器 完整代码: u ...

  5. 用Python写了一个网易云音乐(附源码、视频教程)

    今天给大家分享一个实战项目,用Python整个网易云出来,实现音乐自由!文末附本项目源码以及视频教程! 这一次,咱们来玩点花活,整个网易云出来,实现音乐自由! 环境 Python3.6.8 PyCha ...

  6. python爬虫----爬取网易云音乐

    使用python爬虫爬取网易云音乐 目录 使用python爬虫爬取网易云音乐 需要使用的模块 开始工作 运行结果 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页 ...

  7. Python数据分析初探项目 基于Python数据可视化的网易云音乐歌单分析系统 大学编程作业(TUST 天津科技大学 2022年)

    Python 数据分析初探项目 基于 Python 数据可视化的网易云音乐歌单分析系统 大学编程作业(TUST 天津科技大学 2022 年) Python 数据分析初探项目 基于 Python 数据可 ...

  8. python 批量爬取网易云音乐,java解密

    每天一点点,记录学习 python 批量爬取网易云音乐 网易云音乐,排行榜,右键,显示网页源代码,并不能找到任何一首歌的id,是因为java加密了 随便找一首id为1374061038的歌,在网页源代 ...

  9. java怎么爬网易云_Python爬虫爬取网易云的音乐

    Python爬虫爬取网易云的音乐(学习笔记) 在开始之前,做一点小小的说明哈: 我只是一个python爬虫爱好者,如果本文有侵权,请联系我删除! 本文需要有简单的python爬虫基础,主要用到两个爬虫 ...

  10. 计算机毕业设计Python+uniapp+安卓仿网易云音乐客户端APP(WEB+APP+LW)

    计算机毕业设计Python+uniapp+安卓仿网易云音乐客户端APP(WEB+APP+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区 ...

最新文章

  1. MySQL之check、optimize和analyze
  2. python中继承是什么意思_如何理解Python中的继承?python入门
  3. Linux基础命令---lpr
  4. 闪灯什么意思_开车碰见别人闪灯知道是什么意思吗?看不懂不要说自己会开车哦...
  5. Vue2.0 UI框架Element运用之DateTimePicker(el-date-picker)初始值及时间格式转化等细节问题
  6. maven profile实现多环境构建 (单项目多套配置)
  7. HTML演练 0917 需求说明 我喜欢的影视剧
  8. 几个交换问题的咨询?
  9. php获取qq音乐的api类,QQ音乐api接口梳理
  10. ora01033是什么错误linux,ora-01033错误的解决办法
  11. ImageNet千分类标签翻译
  12. 【一起入门NLP】中科院自然语言处理第13课-NLP基础任务④:序列生成问题(Seq2Seq)
  13. jmeter-same user on each interation
  14. STM32用一个定时器封装多个定时函数调用
  15. 计算机xp怎么做备份,简单说说windowsXP中如何进行系统备份
  16. 苹果 iPhone4 ios7.0 无法下载应用程序 此时无法
  17. 关于升级win10 右键卡顿的解决方法
  18. MarkDown 图片和链接
  19. klayout 源码分析系列续 执行脚本
  20. velocity笔记(一)什么是velocity,我们什么时候会使用到这个,基本语法,利用模板生成实体类的各层代码

热门文章

  1. Java强制删除java程序占用的文件
  2. WEB端后台常用Axure元件库及框架模版
  3. 计算机组成原理英文词汇,“计算机组成原理”课专业词汇英汉对照.pdf
  4. egret农场游戏源码
  5. AMPL 简单运输模型
  6. wps linux 在线安装程序,WPS Office 2019 For Linux下载及安装教程
  7. 美团/饿了么外卖返利小程序+公众号PHP三级分销源码下载
  8. 欠拟合、过拟合、优化器
  9. java在线订单系统源码_春哥酒店在线预订微信小程序源码系统正式发布!
  10. python如何清屏_python如何清屏