国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

python 根據(jù)列表批量下載網(wǎng)易云音樂的免費(fèi)音樂

瀏覽:15日期:2022-07-03 13:15:37

運(yùn)行效果

python 根據(jù)列表批量下載網(wǎng)易云音樂的免費(fèi)音樂

代碼

# -*- coding:utf-8 -*-import requests, hashlib, sys, click, re, base64, binascii, json, osfrom Crypto.Cipher import AESfrom http import cookiejar'''Website:http://cuijiahua.comAuthor:Jack CuiRefer:https://github.com/darknessomi/musicbox'''class Encrypyed():'''解密算法'''def __init__(self):self.modulus = ’00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7’self.nonce = ’0CoJUm6Qyw8W8jud’self.pub_key = ’010001’# 登錄加密算法, 基于https://github.com/stkevintan/nw_musicbox腳本實(shí)現(xiàn)def encrypted_request(self, text):text = json.dumps(text)sec_key = self.create_secret_key(16)enc_text = self.aes_encrypt(self.aes_encrypt(text, self.nonce), sec_key.decode(’utf-8’))enc_sec_key = self.rsa_encrpt(sec_key, self.pub_key, self.modulus)data = {’params’: enc_text, ’encSecKey’: enc_sec_key}return datadef aes_encrypt(self, text, secKey):pad = 16 - len(text) % 16text = text + chr(pad) * padencryptor = AES.new(secKey.encode(’utf-8’), AES.MODE_CBC, b’0102030405060708’)ciphertext = encryptor.encrypt(text.encode(’utf-8’))ciphertext = base64.b64encode(ciphertext).decode(’utf-8’)return ciphertextdef rsa_encrpt(self, text, pubKey, modulus):text = text[::-1]rs = pow(int(binascii.hexlify(text), 16), int(pubKey, 16), int(modulus, 16))return format(rs, ’x’).zfill(256)def create_secret_key(self, size):return binascii.hexlify(os.urandom(size))[:16]class Song():'''歌曲對(duì)象,用于存儲(chǔ)歌曲的信息'''def __init__(self, song_id, song_name, song_num, song_url=None):self.song_id = song_idself.song_name = song_nameself.song_num = song_numself.song_url = ’’ if song_url is None else song_urlclass Crawler():'''網(wǎng)易云爬取API'''def __init__(self, timeout=60, cookie_path=’.’):self.headers = {’Accept’: ’*/*’,’Accept-Encoding’: ’gzip,deflate,sdch’,’Accept-Language’: ’zh-CN,zh;q=0.8,gl;q=0.6,zh-TW;q=0.4’,’Connection’: ’keep-alive’,’Content-Type’: ’application/x-www-form-urlencoded’,’Host’: ’music.163.com’,’Referer’: ’http://music.163.com/search/’,’User-Agent’: ’Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36’}self.session = requests.Session()self.session.headers.update(self.headers)self.session.cookies = cookiejar.LWPCookieJar(cookie_path)self.download_session = requests.Session()self.timeout = timeoutself.ep = Encrypyed()def post_request(self, url, params):'''Post請(qǐng)求:return: 字典'''data = self.ep.encrypted_request(params)resp = self.session.post(url, data=data, timeout=self.timeout)result = resp.json()if result[’code’] != 200:click.echo(’post_request error’)else: return resultdef search(self, search_content, search_type, limit=9):'''搜索API:params search_content: 搜索內(nèi)容:params search_type: 搜索類型:params limit: 返回結(jié)果數(shù)量:return: 字典.'''url = ’http://music.163.com/weapi/cloudsearch/get/web?csrf_token=’params = {’s’: search_content, ’type’: search_type, ’offset’: 0, ’sub’: ’false’, ’limit’: limit}result = self.post_request(url, params)return resultdef search_song(self, song_name, song_num, quiet=True, limit=9):'''根據(jù)音樂名搜索:params song_name: 音樂名:params song_num: 下載的歌曲數(shù):params quiet: 自動(dòng)選擇匹配最優(yōu)結(jié)果:params limit: 返回結(jié)果數(shù)量:return: Song獨(dú)享'''result = self.search(song_name, search_type=1, limit=limit)if result[’result’][’songCount’] <= 0:click.echo(’Song {} not existed.’.format(song_name))else:songs = result[’result’][’songs’]if quiet:song_id, song_name = songs[0][’id’], songs[0][’name’]song = Song(song_id=song_id, song_name=song_name, song_num=song_num)return songdef get_song_url(self, song_id, bit_rate=320000):'''獲得歌曲的下載地址:params song_id: 音樂ID<int>.:params bit_rate: {’MD 128k’: 128000, ’HD 320k’: 320000}:return: 歌曲下載地址'''url = ’http://music.163.com/weapi/song/enhance/player/url?csrf_token=’csrf = ’’params = {’ids’: [song_id], ’br’: bit_rate, ’csrf_token’: csrf}result = self.post_request(url, params)# 歌曲下載地址song_url = result[’data’][0][’url’]# 歌曲不存在if song_url is None:click.echo(’Song {} is not available due to copyright issue.’.format(song_id))else:return song_urldef get_song_by_url(self, song_url, song_name, song_num, folder):'''下載歌曲到本地:params song_url: 歌曲下載地址:params song_name: 歌曲名字:params song_num: 下載的歌曲數(shù):params folder: 保存路徑'''if not os.path.exists(folder):os.makedirs(folder)fpath = os.path.join(folder, str(song_num) + ’_’ + song_name + ’.mp3’)if sys.platform == ’win32’ or sys.platform == ’cygwin’:valid_name = re.sub(r’[<>:'/|?*]’, ’’, song_name)if valid_name != song_name:click.echo(’{} will be saved as: {}.mp3’.format(song_name, valid_name))fpath = os.path.join(folder, str(song_num) + ’_’ + valid_name + ’.mp3’)if not os.path.exists(fpath):resp = self.download_session.get(song_url, timeout=self.timeout, stream=True)length = int(resp.headers.get(’content-length’))label = ’Downloading {} {}kb’.format(song_name, int(length/1024))with click.progressbar(length=length, label=label) as progressbar:with open(fpath, ’wb’) as song_file:for chunk in resp.iter_content(chunk_size=1024):if chunk:song_file.write(chunk)progressbar.update(1024)class Netease():'''網(wǎng)易云音樂下載'''def __init__(self, timeout, folder, quiet, cookie_path):self.crawler = Crawler(timeout, cookie_path)self.folder = ’.’ if folder is None else folderself.quiet = quietdef download_song_by_search(self, song_name, song_num):'''根據(jù)歌曲名進(jìn)行搜索:params song_name: 歌曲名字:params song_num: 下載的歌曲數(shù)'''try:song = self.crawler.search_song(song_name, song_num, self.quiet)except:click.echo(’download_song_by_serach error’)# 如果找到了音樂, 則下載if song != None:self.download_song_by_id(song.song_id, song.song_name, song.song_num, self.folder)def download_song_by_id(self, song_id, song_name, song_num, folder=’.’):'''通過歌曲的ID下載:params song_id: 歌曲ID:params song_name: 歌曲名:params song_num: 下載的歌曲數(shù):params folder: 保存地址'''try:url = self.crawler.get_song_url(song_id)# 去掉非法字符song_name = song_name.replace(’/’, ’’)song_name = song_name.replace(’.’, ’’)self.crawler.get_song_by_url(url, song_name, song_num, folder)except:click.echo(’download_song_by_id error’)if __name__ == ’__main__’:timeout = 60output = ’Musics’quiet = Truecookie_path = ’Cookie’netease = Netease(timeout, output, quiet, cookie_path)music_list_name = ’music_list.txt’# 如果music列表存在, 那么開始下載if os.path.exists(music_list_name):with open(music_list_name, ’r’) as f:music_list = list(map(lambda x: x.strip(), f.readlines()))for song_num, song_name in enumerate(music_list):netease.download_song_by_search(song_name,song_num + 1)else:click.echo(’music_list.txt not exist.’)

以上就是python 根據(jù)列表批量下載網(wǎng)易云音樂的免費(fèi)音樂的詳細(xì)內(nèi)容,更多關(guān)于python 網(wǎng)易云音樂下載的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: 網(wǎng)易云 Python
相關(guān)文章:
主站蜘蛛池模板: 精品国产97在线观看 | 亚洲欧美网 | 成年男人的天堂 | 国产欧美视频一区二区三区 | 亚洲欧洲日韩综合色天使不卡 | 5388国产亚洲欧美在线观看 | 成人午夜久久 | 窝窝午夜精品一区二区 | 台湾三级香港三级在线理论 | 亚洲欧美日韩精品久久亚洲区色播 | 国产精品第五页 | 中国美女黄色一级片 | 九九国产在线观看 | 91久久国产精品视频 | 欧美午夜不卡 | 国产看片一区二区三区 | 国产成人免费全部网站 | 在线观看国产精品入口 | 亚洲精品国产福利一区二区三区 | 免费黄色网址在线播放 | 黄视频免费在线 | 真实国产乱人伦在线视频播放 | 亚洲产国偷v产偷v自拍涩爱 | 国产成人一区二区三区免费观看 | 午夜亚洲| 美女131爽爽爽做爰中文视频 | 女女互操 | 澳门毛片在线播放 | 国产美女精品视频免费观看 | 一区二区三区在线 | 网站 | 国产在线不卡视频 | 一区二区三区高清视频在线观看 | 女人被男人躁得好爽免费视频免费 | 性感美女视频黄.免费网站 性高湖久久久久久久久 | 国产区一区 | 日韩亚洲欧美一区二区三区 | 最新版天堂资源中文官网 | 欧美三级黄色 | 亚洲在线观看网站 | 亚洲qingse中文久久网 | 国产欧美日韩成人 |