python网易云_python 网易云音乐
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 网易云音乐相关推荐
- python爬虫爬取网易云音乐歌曲_Python网易云音乐爬虫进阶篇
image.png 年前写过一篇爬网易云音乐评论的文章,爬不了多久又回被封,所以爬下来那么点根本做不了什么分析,后面就再改了下,加入了多线程,一次性爬一个歌手最热门50首歌曲的评论,算是进阶版了- 思 ...
- python爬虫爬取网易云音乐下载_Python爬虫实践-网易云音乐!没有版权又如何!照样爬取!...
1.前言 最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊! 本文主要参考 python编写 ...
- python网易云_用python爬虫爬取网易云音乐
标签: 使用python爬虫爬取网易云音乐 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页版找一下你想要听的歌曲点击进去.按键盘F12打开网页调试工具,点击Ne ...
- python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名
目标网站: 首先获取第一页的数据,这里关键要切换到iframe里 打印一下 获取剩下的页数,这里在点击下一页之前需要设置一个延迟,不然会报错. 结果: 一共37页,爬取完毕后关闭浏览器 完整代码: u ...
- 用Python写了一个网易云音乐(附源码、视频教程)
今天给大家分享一个实战项目,用Python整个网易云出来,实现音乐自由!文末附本项目源码以及视频教程! 这一次,咱们来玩点花活,整个网易云出来,实现音乐自由! 环境 Python3.6.8 PyCha ...
- python爬虫----爬取网易云音乐
使用python爬虫爬取网易云音乐 目录 使用python爬虫爬取网易云音乐 需要使用的模块 开始工作 运行结果 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页 ...
- Python数据分析初探项目 基于Python数据可视化的网易云音乐歌单分析系统 大学编程作业(TUST 天津科技大学 2022年)
Python 数据分析初探项目 基于 Python 数据可视化的网易云音乐歌单分析系统 大学编程作业(TUST 天津科技大学 2022 年) Python 数据分析初探项目 基于 Python 数据可 ...
- python 批量爬取网易云音乐,java解密
每天一点点,记录学习 python 批量爬取网易云音乐 网易云音乐,排行榜,右键,显示网页源代码,并不能找到任何一首歌的id,是因为java加密了 随便找一首id为1374061038的歌,在网页源代 ...
- java怎么爬网易云_Python爬虫爬取网易云的音乐
Python爬虫爬取网易云的音乐(学习笔记) 在开始之前,做一点小小的说明哈: 我只是一个python爬虫爱好者,如果本文有侵权,请联系我删除! 本文需要有简单的python爬虫基础,主要用到两个爬虫 ...
- 计算机毕业设计Python+uniapp+安卓仿网易云音乐客户端APP(WEB+APP+LW)
计算机毕业设计Python+uniapp+安卓仿网易云音乐客户端APP(WEB+APP+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区 ...
最新文章
- MySQL之check、optimize和analyze
- python中继承是什么意思_如何理解Python中的继承?python入门
- Linux基础命令---lpr
- 闪灯什么意思_开车碰见别人闪灯知道是什么意思吗?看不懂不要说自己会开车哦...
- Vue2.0 UI框架Element运用之DateTimePicker(el-date-picker)初始值及时间格式转化等细节问题
- maven profile实现多环境构建 (单项目多套配置)
- HTML演练 0917 需求说明 我喜欢的影视剧
- 几个交换问题的咨询?
- php获取qq音乐的api类,QQ音乐api接口梳理
- ora01033是什么错误linux,ora-01033错误的解决办法
- ImageNet千分类标签翻译
- 【一起入门NLP】中科院自然语言处理第13课-NLP基础任务④:序列生成问题(Seq2Seq)
- jmeter-same user on each interation
- STM32用一个定时器封装多个定时函数调用
- 计算机xp怎么做备份,简单说说windowsXP中如何进行系统备份
- 苹果 iPhone4 ios7.0 无法下载应用程序 此时无法
- 关于升级win10 右键卡顿的解决方法
- MarkDown 图片和链接
- klayout 源码分析系列续 执行脚本
- velocity笔记(一)什么是velocity,我们什么时候会使用到这个,基本语法,利用模板生成实体类的各层代码
热门文章
- Java强制删除java程序占用的文件
- WEB端后台常用Axure元件库及框架模版
- 计算机组成原理英文词汇,“计算机组成原理”课专业词汇英汉对照.pdf
- egret农场游戏源码
- AMPL 简单运输模型
- wps linux 在线安装程序,WPS Office 2019 For Linux下载及安装教程
- 美团/饿了么外卖返利小程序+公众号PHP三级分销源码下载
- 欠拟合、过拟合、优化器
- java在线订单系统源码_春哥酒店在线预订微信小程序源码系统正式发布!
- python如何清屏_python如何清屏