From 40d96dcbe854cf223a1f0eeb94116d8bfd5f741a Mon Sep 17 00:00:00 2001 From: 2061360308 <2061360308@qq.com> Date: Fri, 15 Dec 2023 15:55:04 +0800 Subject: [PATCH] fix:fix errors encountered during initial startup without cookies --- README.md | 4 +- config.json | 10 + example.py | 110 +++ package/NeteaseCloudMusic.egg-info/PKG-INFO | 94 ++- .../NeteaseCloudMusic/NeteaseCloudMusicApi.js | 774 ++++++++++-------- package/NeteaseCloudMusic/config.json | 11 +- package/NeteaseCloudMusic/main.py | 78 +- package/README.md | 90 ++ package/dist/NeteaseCloudMusic-0.1.3.tar.gz | Bin 18411 -> 0 bytes ...easeCloudMusic-0.1.4-py2.py3-none-any.whl} | Bin 290129 -> 291449 bytes package/dist/NeteaseCloudMusic-0.1.4.tar.gz | Bin 0 -> 18437 bytes test.py | 16 +- 临时文件.py | 12 - 13 files changed, 789 insertions(+), 410 deletions(-) create mode 100644 example.py create mode 100644 package/README.md delete mode 100644 package/dist/NeteaseCloudMusic-0.1.3.tar.gz rename package/dist/{NeteaseCloudMusic-0.1.3-py2.py3-none-any.whl => NeteaseCloudMusic-0.1.4-py2.py3-none-any.whl} (98%) create mode 100644 package/dist/NeteaseCloudMusic-0.1.4.tar.gz delete mode 100644 临时文件.py diff --git a/README.md b/README.md index ba1a8a1..361e073 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,13 @@ ### 使用 - 安装 `pip install NeteaseCloudMusic` -- 导入API进行使用(具体查看`test.py`中的示例) +- 导入API进行使用(具体查看`example.py`中的示例) ```python from NeteaseCloudMusic import NeteaseCloudMusicApi, api_help, api_list import os netease_cloud_music_api = NeteaseCloudMusicApi() # 初始化API -netease_cloud_music_api.cookie = os.getenv("COOKIE") # 设置cookie +netease_cloud_music_api.cookie = "你的cookie" # 设置cookie, 如果没有cookie需要先登录 具体见example.py response = netease_cloud_music_api.request("song_url_v1", {"id": 33894312, "level": "exhigh"}) # 调用API # 获取帮助 diff --git a/config.json b/config.json index 80cdb2e..851b7be 100644 --- a/config.json +++ b/config.json @@ -307763,5 +307763,15 @@ "result": {} } ] + }, + "/login/status": { + "name": "登录状态", + "explain": "说明 : 调用此接口,可获取登录状态", + "example": [ + { + "query":{}, + "result": {} + } + ] } } \ No newline at end of file diff --git a/example.py b/example.py new file mode 100644 index 0000000..ed04a6f --- /dev/null +++ b/example.py @@ -0,0 +1,110 @@ +""" +description: 网易云音乐API使用示例,这个示例引导你进行登录操作,然后下载一首歌曲 +author: LuTong +date: 2020-10-07 10:00 +""" +from pprint import pprint + +import requests + +from package.NeteaseCloudMusic import NeteaseCloudMusicApi, api_help, api_list + +netease_cloud_music_api = NeteaseCloudMusicApi() # 初始化API + + +def captcha_sent(_phone): + response = netease_cloud_music_api.request("/captcha/sent", {"phone": f"{_phone}"}) + return response + + +def login_cellphone(_phone, _captcha): + response = netease_cloud_music_api.request("/login/cellphone", {"phone": f"{_phone}", "captcha": f"{_captcha}"}) + return response + + +def song_url_v1(song_id): + # 获取歌曲mp3地址 + response = netease_cloud_music_api.request("song_url_v1", {"id": song_id, "level": "exhigh"}) + return response + + +def song_detail(song_id): + # 获取歌曲详情 + response = netease_cloud_music_api.request("song_detail", {"ids": str(song_id)}) + # 这里记得传一个字符串,其实所有参数都传字符串就行,需要数字的话内部会自己转换的,但是它默认你传入的时候是字符串,所以你传数字他不会自动转字符串, + # 这时如果遇到操作字符串的方法就会报错,所以最好都传字符串,避免出现意外 + return response + + +def login_status(): + response = netease_cloud_music_api.request("/login/status") + return response + + +# 登录 +if not netease_cloud_music_api.cookie: + print("请设置cookie") + phone = input("请输入手机号:") + result = captcha_sent(phone) + print(result) + if result.get("code") == 200: + print("验证码已发送,请查收") + captcha = input("请输入验证码:") + result = login_cellphone(phone, captcha) + if result.get("code") == 200: + print("登录成功") + if netease_cloud_music_api.cookie: + print("cookie已自动设置") + else: + print("登录失败") +""" +调用登录接口后,会自动设置cookie,如果cookie失效,需要重新登录,登录过后api会在你的当前工作目录下创建cookie_storage文件保存你的cookie +在下次调用运行程序时,他会判断cookie是否过期,没有过期就自动读取cookie_storage文件中的cookie。 + +总的来说你不需要手动管理cookie,只需要调用登录接口,然后调用其他接口即可,cookie会自动设置,如果cookie过期,再次调用登录接口就好。 +更好的办法是,在cookie还没有失效之前使用refresh_login接口刷新cookie,这样就不需要重新登录了(建议在你每次启动软件时都刷新,当然频繁重启调试的时候另算) + +如果你想判断当前是否已经登录,if not netease_cloud_music_api.cookie 就可以了,或者调用/login/status接口 +""" + +# 获取登录状态 +login_status_result = login_status() +# pprint(login_status_result) +if login_status_result['data']['data']["code"] == 200: + print(f'当前登录账号:{login_status_result["data"]["data"]["profile"]["nickname"]}') + +version_result = netease_cloud_music_api.request("inner_version") +print( + f'当前使用NeteaseCloudMusicApi版本号:{version_result["NeteaseCloudMusicApi"]}\n当前使用NeteaseCloudMusicApi_V8版本号:{version_result["NeteaseCloudMusicApi_V8"]}') # 退出登录 + +# 获取歌曲mp3地址 +song_url_result = song_url_v1(33894312) +if song_url_result.get("code") == 200: + song_url = song_url_result['data']["data"][0]['url'] +else: + print("获取歌曲mp3地址失败") + exit(1) +# 获取歌曲详情 +song_detail_result = song_detail(33894312) +if song_detail_result.get("code") == 200: + song_name = song_detail_result['data']['songs'][0]['name'] + song_artist = song_detail_result['data']['songs'][0]['ar'][0]['name'] +else: + print("获取歌曲详情失败") + exit(1) +# 下载歌曲mp3 +print(f"正在下载歌曲:{song_name} - {song_artist}") +result = requests.get(song_url) +with open(f"{song_name} - {song_artist}.mp3", "wb") as f: + f.write(result.content) +print("下载完成") + +""" +示例程序结束,如果你运行成功了,那么你的执行目录下应该有一个cookie_storage文件,里面保存了你的cookie,还有一个mp3文件,就是你下载的歌曲 +有关其他API的使用方法请参考:https://docs.neteasecloudmusicapi.binaryify.com/ + +再次注明一下,我之前也想过要不要将登录状态管理和cookie刷新等等封装到NeteaseCloudMusicApi类中, +但最后我想的是,这毕竟这是一个api接口类,就让他保持最原始简洁的状态就好,其他的留给大家去自由发挥吧! + +友情提示:单个账户每天发送验证码的次数有限制,千万别一直调试登录接口。 +""" diff --git a/package/NeteaseCloudMusic.egg-info/PKG-INFO b/package/NeteaseCloudMusic.egg-info/PKG-INFO index e9b280b..09f7be5 100644 --- a/package/NeteaseCloudMusic.egg-info/PKG-INFO +++ b/package/NeteaseCloudMusic.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: NeteaseCloudMusic -Version: 0.1.3 +Version: 0.1.4 Summary: 网易云音乐API NeteaseCloudMusicApi项目的 Python SDK Home-page: https://github.com/2061360308/NeteaseCloudMusic_PythonSDK Author: 盧瞳 @@ -16,4 +16,94 @@ Requires-Python: >=3.6.0 Description-Content-Type: text/markdown License-File: LICENSE -网易云音乐API NeteaseCloudMusicApi项目的 Python SDK + +# NeteaseCloudMusic_PythonSDK +> 基于 [ NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) 封装的 Python SDK。 +> 网易云API Python版本。 +> 现已同步原项目接口且测试通过的有200多个 +> 已发布到PyPi,可直接使用pip安装 +> 项目地址:[GitHub](https://github.com/2061360308/NeteaseCloudMusic_PythonSDK) + +![](https://img.shields.io/badge/py_mini_racer-@0.6.0-red.svg) +![License](https://img.shields.io/badge/license-MIT-yellow) + +### 依赖于 +- [ NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) +- [ NeteaseCloudMusicApi_V8 ](https://github.com/2061360308/NeteaseCloudMusicApi_V8) + +### 原理 +- 通过 `py_mini_racer` 调用 `NeteaseCloudMusicApi_V8` 的 `js` 方法。进一步进行了简单封装。 + +### 使用 +- 安装 `pip install NeteaseCloudMusic` +- 导入API进行使用(具体查看`test.py`中的示例) +```python +from NeteaseCloudMusic import NeteaseCloudMusicApi, api_help, api_list +import os + +netease_cloud_music_api = NeteaseCloudMusicApi() # 初始化API +netease_cloud_music_api.cookie = os.getenv("COOKIE") # 设置cookie +response = netease_cloud_music_api.request("song_url_v1", {"id": 33894312, "level": "exhigh"}) # 调用API + +# 获取帮助 +print(api_help()) +print(api_help('song_url_v1')) +# 获取API列表 +print(api_list()) +``` + +> 注意: request(self, name, query=None) 的第一个参数为API名称,第二个参数为API参数,具体API名称和参数请参考 [NeteaseCloudMusicApi文档](https://docs.neteasecloudmusicapi.binaryify.com),name支持`/song/url/v1`和`song_url_v1`两种写法。 + + +### 开发 +- 克隆项目 `git clone git@github.com:2061360308/NeteaseCloudMusic_PythonSDK.git` +- 安装依赖 `pip install -r requirements.txt` +- 目录/文件说明 +├── package 项目包根目录 +├── test_gender 生成测试代码的脚本 +├── test.py 手动测试/ 使用示例 + + +### 改进 +> 下列API未支持 +> +- apicache.js +- memory-cache.js +- request_reference.js +- avatar_upload.js +- cloud.js +- playlist_cover_update.js +- voice_upload.js +- register_anonimous.js +- verify_getQr.js + +> 以下api未测试(这些接口测试起来比较繁琐) +> +- /user/replacephone +- /audio/match +- /rebind +- /nickname/check +- /activate/init/profile +- /cellphone/existence/check +- /register/cellphone +- /captcha/verify +- /captcha/sent +- /login/refresh +- /logout +- /user/update +- /pl/count +- /playlist/update +- /playlist/desc/update +- /playlist/name/update +- /playlist/tags/update +- /event/forward +- /event/del +- /share/resource +- /send/text +- /send/playlist +- /playlist/create +- /playlist/tracks +- /daily_signin +- /fm_trash + +### 欢迎提交PR diff --git a/package/NeteaseCloudMusic/NeteaseCloudMusicApi.js b/package/NeteaseCloudMusic/NeteaseCloudMusicApi.js index 9d431b7..d849989 100644 --- a/package/NeteaseCloudMusic/NeteaseCloudMusicApi.js +++ b/package/NeteaseCloudMusic/NeteaseCloudMusicApi.js @@ -77,13 +77,13 @@ if (typeof window === "undefined") { return /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ -/***/ 452: +/***/ 6244: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(8269), __webpack_require__(8214), __webpack_require__(888), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(4227), __webpack_require__(2857), __webpack_require__(842), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -310,13 +310,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 7407: +/***/ 2717: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(8269), __webpack_require__(8214), __webpack_require__(888), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(4227), __webpack_require__(2857), __webpack_require__(842), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -780,13 +780,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 5109: +/***/ 3667: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(888)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(842)); } else {} }(this, function (CryptoJS) { @@ -1674,7 +1674,7 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 8249: +/***/ 2034: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory) { @@ -1722,7 +1722,7 @@ return /******/ (() => { // webpackBootstrap // Native crypto import via require (NodeJS) if (!crypto && "function" === 'function') { try { - crypto = __webpack_require__(2480); + crypto = __webpack_require__(2297); } catch (err) {} } @@ -2480,13 +2480,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 8269: +/***/ 4227: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249)); + module.exports = exports = factory(__webpack_require__(2034)); } else {} }(this, function (CryptoJS) { @@ -2615,13 +2615,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 3786: +/***/ 1182: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249)); + module.exports = exports = factory(__webpack_require__(2034)); } else {} }(this, function (CryptoJS) { @@ -2762,13 +2762,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 298: +/***/ 3018: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249)); + module.exports = exports = factory(__webpack_require__(2034)); } else {} }(this, function (CryptoJS) { @@ -2910,13 +2910,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 888: +/***/ 842: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(2783), __webpack_require__(9824)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(6635), __webpack_require__(5574)); } else {} }(this, function (CryptoJS) { @@ -3043,13 +3043,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 2209: +/***/ 7908: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -3108,13 +3108,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 9824: +/***/ 5574: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249)); + module.exports = exports = factory(__webpack_require__(2034)); } else {} }(this, function (CryptoJS) { @@ -3250,13 +3250,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 1354: +/***/ 1292: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(4938), __webpack_require__(4433), __webpack_require__(298), __webpack_require__(8269), __webpack_require__(3786), __webpack_require__(8214), __webpack_require__(2783), __webpack_require__(2153), __webpack_require__(7792), __webpack_require__(34), __webpack_require__(7460), __webpack_require__(3327), __webpack_require__(706), __webpack_require__(9824), __webpack_require__(2112), __webpack_require__(888), __webpack_require__(5109), __webpack_require__(8568), __webpack_require__(4242), __webpack_require__(9968), __webpack_require__(7660), __webpack_require__(1148), __webpack_require__(3615), __webpack_require__(2807), __webpack_require__(1077), __webpack_require__(6475), __webpack_require__(6991), __webpack_require__(2209), __webpack_require__(452), __webpack_require__(4253), __webpack_require__(1857), __webpack_require__(4454), __webpack_require__(3974), __webpack_require__(7407)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(6925), __webpack_require__(8055), __webpack_require__(3018), __webpack_require__(4227), __webpack_require__(1182), __webpack_require__(2857), __webpack_require__(6635), __webpack_require__(5386), __webpack_require__(3834), __webpack_require__(1113), __webpack_require__(5501), __webpack_require__(5618), __webpack_require__(1342), __webpack_require__(5574), __webpack_require__(631), __webpack_require__(842), __webpack_require__(3667), __webpack_require__(1767), __webpack_require__(5508), __webpack_require__(7198), __webpack_require__(452), __webpack_require__(6172), __webpack_require__(6930), __webpack_require__(7533), __webpack_require__(1322), __webpack_require__(4455), __webpack_require__(9167), __webpack_require__(7908), __webpack_require__(6244), __webpack_require__(199), __webpack_require__(92), __webpack_require__(4598), __webpack_require__(6173), __webpack_require__(2717)); } else {} }(this, function (CryptoJS) { @@ -3267,13 +3267,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 4433: +/***/ 8055: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249)); + module.exports = exports = factory(__webpack_require__(2034)); } else {} }(this, function (CryptoJS) { @@ -3342,13 +3342,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 8214: +/***/ 2857: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249)); + module.exports = exports = factory(__webpack_require__(2034)); } else {} }(this, function (CryptoJS) { @@ -3609,13 +3609,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 8568: +/***/ 1767: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -3688,13 +3688,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 9968: +/***/ 7198: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -3803,13 +3803,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 4242: +/***/ 5508: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -3860,13 +3860,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 1148: +/***/ 6172: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -3899,13 +3899,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 7660: +/***/ 452: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -3952,13 +3952,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 3615: +/***/ 6930: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -4000,13 +4000,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 2807: +/***/ 7533: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -4043,13 +4043,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 1077: +/***/ 1322: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -4082,13 +4082,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 6991: +/***/ 9167: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -4111,13 +4111,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 6475: +/***/ 4455: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -4157,13 +4157,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 2112: +/***/ 631: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(2153), __webpack_require__(9824)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(5386), __webpack_require__(5574)); } else {} }(this, function (CryptoJS) { @@ -4301,13 +4301,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 3974: +/***/ 6173: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(8269), __webpack_require__(8214), __webpack_require__(888), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(4227), __webpack_require__(2857), __webpack_require__(842), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -4490,13 +4490,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 4454: +/***/ 4598: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(8269), __webpack_require__(8214), __webpack_require__(888), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(4227), __webpack_require__(2857), __webpack_require__(842), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -4681,13 +4681,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 1857: +/***/ 92: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(8269), __webpack_require__(8214), __webpack_require__(888), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(4227), __webpack_require__(2857), __webpack_require__(842), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -4819,13 +4819,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 706: +/***/ 1342: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249)); + module.exports = exports = factory(__webpack_require__(2034)); } else {} }(this, function (CryptoJS) { @@ -5085,13 +5085,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 2783: +/***/ 6635: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249)); + module.exports = exports = factory(__webpack_require__(2034)); } else {} }(this, function (CryptoJS) { @@ -5234,13 +5234,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 7792: +/***/ 3834: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(2153)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(5386)); } else {} }(this, function (CryptoJS) { @@ -5313,13 +5313,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 2153: +/***/ 5386: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249)); + module.exports = exports = factory(__webpack_require__(2034)); } else {} }(this, function (CryptoJS) { @@ -5511,13 +5511,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 3327: +/***/ 5618: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(4938)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(6925)); } else {} }(this, function (CryptoJS) { @@ -5836,13 +5836,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 7460: +/***/ 5501: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(4938), __webpack_require__(34)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(6925), __webpack_require__(1113)); } else {} }(this, function (CryptoJS) { @@ -5918,13 +5918,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 34: +/***/ 1113: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(4938)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(6925)); } else {} }(this, function (CryptoJS) { @@ -6243,13 +6243,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 4253: +/***/ 199: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory, undef) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249), __webpack_require__(8269), __webpack_require__(8214), __webpack_require__(888), __webpack_require__(5109)); + module.exports = exports = factory(__webpack_require__(2034), __webpack_require__(4227), __webpack_require__(2857), __webpack_require__(842), __webpack_require__(3667)); } else {} }(this, function (CryptoJS) { @@ -7021,13 +7021,13 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 4938: +/***/ 6925: /***/ (function(module, exports, __webpack_require__) { ;(function (root, factory) { if (true) { // CommonJS - module.exports = exports = factory(__webpack_require__(8249)); + module.exports = exports = factory(__webpack_require__(2034)); } else {} }(this, function (CryptoJS) { @@ -7324,7 +7324,7 @@ return /******/ (() => { // webpackBootstrap /***/ }), -/***/ 8925: +/***/ 8663: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -7344,10 +7344,10 @@ return /******/ (() => { // webpackBootstrap * * Copyright (c) 2010-2014 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(5649); -__webpack_require__(1967); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(4125); +__webpack_require__(5142); +__webpack_require__(9993); /* AES API */ module.exports = forge.aes = forge.aes || {}; @@ -8422,7 +8422,7 @@ function _createCipher(options) { /***/ }), -/***/ 6164: +/***/ 6608: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -8433,9 +8433,9 @@ function _createCipher(options) { * Copyright (c) 2009-2015 Digital Bazaar, Inc. * */ -var forge = __webpack_require__(3832); -__webpack_require__(8925); -__webpack_require__(4311); +var forge = __webpack_require__(4117); +__webpack_require__(8663); +__webpack_require__(3020); var tls = module.exports = forge.tls; @@ -8711,15 +8711,15 @@ function compareMacs(key, mac1, mac2) { /***/ }), -/***/ 9205: +/***/ 9425: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { /** * Copyright (c) 2019 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(3068); +var forge = __webpack_require__(4117); +__webpack_require__(9319); var asn1 = forge.asn1; exports.privateKeyValidator = { @@ -8809,7 +8809,7 @@ exports.publicKeyValidator = { /***/ }), -/***/ 3068: +/***/ 9319: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -8947,9 +8947,9 @@ exports.publicKeyValidator = { * The full OID (including ASN.1 tag and length of 6 bytes) is: * 0x06062A864886F70D */ -var forge = __webpack_require__(3832); -__webpack_require__(7116); -__webpack_require__(6270); +var forge = __webpack_require__(4117); +__webpack_require__(9993); +__webpack_require__(1384); /* ASN.1 API */ var asn1 = module.exports = forge.asn1 = forge.asn1 || {}; @@ -10250,7 +10250,7 @@ asn1.prettyPrint = function(obj, level, indentation) { /***/ }), -/***/ 8807: +/***/ 1727: /***/ ((module) => { /** @@ -10443,7 +10443,7 @@ function _encodeWithByteBuffer(input, alphabet) { /***/ }), -/***/ 5649: +/***/ 4125: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -10453,8 +10453,8 @@ function _encodeWithByteBuffer(input, alphabet) { * * Copyright (c) 2010-2014 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(9993); module.exports = forge.cipher = forge.cipher || {}; @@ -10680,7 +10680,7 @@ BlockCipher.prototype.finish = function(pad) { /***/ }), -/***/ 1967: +/***/ 5142: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -10690,8 +10690,8 @@ BlockCipher.prototype.finish = function(pad) { * * Copyright (c) 2010-2014 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(9993); forge.cipher = forge.cipher || {}; @@ -11686,7 +11686,7 @@ function from64To32(num) { /***/ }), -/***/ 3480: +/***/ 2188: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -11720,10 +11720,10 @@ function from64To32(num) { * Copyright (c) 2012 Stefan Siegl * Copyright (c) 2012-2014 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(5649); -__webpack_require__(1967); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(4125); +__webpack_require__(5142); +__webpack_require__(9993); /* DES API */ module.exports = forge.des = forge.des || {}; @@ -12189,7 +12189,7 @@ function _createCipher(options) { /***/ }), -/***/ 69: +/***/ 3956: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -12202,12 +12202,12 @@ function _createCipher(options) { * * https://github.com/dchest/tweetnacl-js */ -var forge = __webpack_require__(3832); -__webpack_require__(5764); -__webpack_require__(9563); -__webpack_require__(3219); -__webpack_require__(7116); -var asn1Validator = __webpack_require__(9205); +var forge = __webpack_require__(4117); +__webpack_require__(1838); +__webpack_require__(7646); +__webpack_require__(501); +__webpack_require__(9993); +var asn1Validator = __webpack_require__(9425); var publicKeyValidator = asn1Validator.publicKeyValidator; var privateKeyValidator = asn1Validator.privateKeyValidator; @@ -13268,7 +13268,7 @@ function M(o, a, b) { /***/ }), -/***/ 3832: +/***/ 4117: /***/ ((module) => { /** @@ -13288,7 +13288,7 @@ module.exports = { /***/ }), -/***/ 6607: +/***/ 7637: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -13300,9 +13300,9 @@ module.exports = { * * Copyright (c) 2010-2012 Digital Bazaar, Inc. All rights reserved. */ -var forge = __webpack_require__(3832); -__webpack_require__(8991); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(7279); +__webpack_require__(9993); /* HMAC API */ var hmac = module.exports = forge.hmac = forge.hmac || {}; @@ -13441,7 +13441,7 @@ hmac.create = function() { /***/ }), -/***/ 2079: +/***/ 2795: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -13451,37 +13451,37 @@ hmac.create = function() { * * Copyright 2011-2016 Digital Bazaar, Inc. */ -module.exports = __webpack_require__(3832); -__webpack_require__(8925); -__webpack_require__(6164); -__webpack_require__(3068); -__webpack_require__(5649); -__webpack_require__(3480); -__webpack_require__(69); -__webpack_require__(6607); -__webpack_require__(6366); -__webpack_require__(4145); -__webpack_require__(3389); -__webpack_require__(3453); -__webpack_require__(8960); -__webpack_require__(6953); -__webpack_require__(8936); -__webpack_require__(5147); -__webpack_require__(9437); -__webpack_require__(4742); -__webpack_require__(9654); -__webpack_require__(4933); -__webpack_require__(6007); -__webpack_require__(9563); -__webpack_require__(9372); -__webpack_require__(7173); -__webpack_require__(4311); -__webpack_require__(7116); +module.exports = __webpack_require__(4117); +__webpack_require__(8663); +__webpack_require__(6608); +__webpack_require__(9319); +__webpack_require__(4125); +__webpack_require__(2188); +__webpack_require__(3956); +__webpack_require__(7637); +__webpack_require__(5427); +__webpack_require__(8512); +__webpack_require__(5835); +__webpack_require__(898); +__webpack_require__(3498); +__webpack_require__(624); +__webpack_require__(1504); +__webpack_require__(6433); +__webpack_require__(2292); +__webpack_require__(2696); +__webpack_require__(9293); +__webpack_require__(833); +__webpack_require__(3678); +__webpack_require__(7646); +__webpack_require__(6232); +__webpack_require__(6786); +__webpack_require__(3020); +__webpack_require__(9993); /***/ }), -/***/ 5764: +/***/ 1838: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // Copyright (c) 2005 Tom Wu @@ -13532,7 +13532,7 @@ Address all questions regarding this license to: Tom Wu tjw@cs.Stanford.EDU */ -var forge = __webpack_require__(3832); +var forge = __webpack_require__(4117); module.exports = forge.jsbn = forge.jsbn || {}; @@ -14752,7 +14752,7 @@ BigInteger.prototype.isProbablePrime = bnIsProbablePrime; /***/ }), -/***/ 6366: +/***/ 5427: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -14764,10 +14764,10 @@ BigInteger.prototype.isProbablePrime = bnIsProbablePrime; * Copyright (c) 2014 Lautaro Cozzani * Copyright (c) 2014 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(7116); -__webpack_require__(9563); -__webpack_require__(5764); +var forge = __webpack_require__(4117); +__webpack_require__(9993); +__webpack_require__(7646); +__webpack_require__(1838); module.exports = forge.kem = forge.kem || {}; @@ -14927,7 +14927,7 @@ function _createKDF(kdf, md, counterStart, digestLength) { /***/ }), -/***/ 4145: +/***/ 8512: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -14937,8 +14937,8 @@ function _createKDF(kdf, md, counterStart, digestLength) { * * Copyright (c) 2008-2013 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(9993); /* LOG API */ module.exports = forge.log = forge.log || {}; @@ -15253,7 +15253,7 @@ forge.log.consoleLogger = sConsoleLogger; /***/ }), -/***/ 3389: +/***/ 5835: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -15263,17 +15263,17 @@ forge.log.consoleLogger = sConsoleLogger; * * Copyright 2011-2017 Digital Bazaar, Inc. */ -module.exports = __webpack_require__(8991); +module.exports = __webpack_require__(7279); -__webpack_require__(5063); -__webpack_require__(137); -__webpack_require__(1668); -__webpack_require__(3219); +__webpack_require__(6383); +__webpack_require__(76); +__webpack_require__(4824); +__webpack_require__(501); /***/ }), -/***/ 8991: +/***/ 7279: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -15283,7 +15283,7 @@ __webpack_require__(3219); * * Copyright 2011-2017 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); +var forge = __webpack_require__(4117); module.exports = forge.md = forge.md || {}; forge.md.algorithms = forge.md.algorithms || {}; @@ -15291,7 +15291,7 @@ forge.md.algorithms = forge.md.algorithms || {}; /***/ }), -/***/ 5063: +/***/ 6383: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -15301,9 +15301,9 @@ forge.md.algorithms = forge.md.algorithms || {}; * * Copyright (c) 2010-2014 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(8991); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(7279); +__webpack_require__(9993); var md5 = module.exports = forge.md5 = forge.md5 || {}; forge.md.md5 = forge.md.algorithms.md5 = md5; @@ -15587,7 +15587,7 @@ function _update(s, w, bytes) { /***/ }), -/***/ 6971: +/***/ 3049: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -15597,8 +15597,8 @@ function _update(s, w, bytes) { * * Copyright 2012 Stefan Siegl */ -var forge = __webpack_require__(3832); -__webpack_require__(3453); +var forge = __webpack_require__(4117); +__webpack_require__(898); module.exports = forge.mgf = forge.mgf || {}; forge.mgf.mgf1 = forge.mgf1; @@ -15606,7 +15606,7 @@ forge.mgf.mgf1 = forge.mgf1; /***/ }), -/***/ 3453: +/***/ 898: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -15618,8 +15618,8 @@ forge.mgf.mgf1 = forge.mgf1; * Copyright (c) 2012 Stefan Siegl * Copyright (c) 2014 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(9993); forge.mgf = forge.mgf || {}; var mgf1 = module.exports = forge.mgf.mgf1 = forge.mgf1 = forge.mgf1 || {}; @@ -15670,7 +15670,7 @@ mgf1.create = function(md) { /***/ }), -/***/ 6270: +/***/ 1384: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -15680,7 +15680,7 @@ mgf1.create = function(md) { * * Copyright (c) 2010-2013 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); +var forge = __webpack_require__(4117); forge.pki = forge.pki || {}; var oids = module.exports = forge.pki.oids = forge.oids = forge.oids || {}; @@ -15856,7 +15856,7 @@ _IN('1.3.6.1.5.5.7.3.8', 'timeStamping'); /***/ }), -/***/ 7450: +/***/ 8788: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -15878,18 +15878,18 @@ _IN('1.3.6.1.5.5.7.3.8', 'timeStamping'); * * EncryptedData ::= OCTET STRING */ -var forge = __webpack_require__(3832); -__webpack_require__(8925); -__webpack_require__(3068); -__webpack_require__(3480); -__webpack_require__(8991); -__webpack_require__(6270); -__webpack_require__(8960); -__webpack_require__(6953); -__webpack_require__(9563); -__webpack_require__(9372); -__webpack_require__(8095); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(8663); +__webpack_require__(9319); +__webpack_require__(2188); +__webpack_require__(7279); +__webpack_require__(1384); +__webpack_require__(3498); +__webpack_require__(624); +__webpack_require__(7646); +__webpack_require__(6232); +__webpack_require__(8855); +__webpack_require__(9993); if(typeof BigInteger === 'undefined') { var BigInteger = forge.jsbn.BigInteger; @@ -16886,7 +16886,7 @@ function createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm) { /***/ }), -/***/ 8960: +/***/ 3498: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -16898,16 +16898,16 @@ function createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm) { * * Copyright (c) 2010-2013 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(6607); -__webpack_require__(8991); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(7637); +__webpack_require__(7279); +__webpack_require__(9993); var pkcs5 = forge.pkcs5 = forge.pkcs5 || {}; var crypto; if(forge.util.isNodejs && !forge.options.usePureJavaScript) { - crypto = __webpack_require__(5819); + crypto = __webpack_require__(289); } /** @@ -17104,7 +17104,7 @@ module.exports = forge.pbkdf2 = pkcs5.pbkdf2 = function( /***/ }), -/***/ 6953: +/***/ 624: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -17135,8 +17135,8 @@ module.exports = forge.pbkdf2 = pkcs5.pbkdf2 = function( * * body: the binary-encoded body. */ -var forge = __webpack_require__(3832); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(9993); // shortcut for pem API var pem = module.exports = forge.pem = forge.pem || {}; @@ -17348,7 +17348,7 @@ function ltrim(str) { /***/ }), -/***/ 8936: +/***/ 1504: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -17396,10 +17396,10 @@ function ltrim(str) { * * Copyright (c) 2013-2014 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(7116); -__webpack_require__(9563); -__webpack_require__(137); +var forge = __webpack_require__(4117); +__webpack_require__(9993); +__webpack_require__(7646); +__webpack_require__(76); // shortcut for PKCS#1 API var pkcs1 = module.exports = forge.pkcs1 = forge.pkcs1 || {}; @@ -17631,7 +17631,7 @@ function rsa_mgf1(seed, maskLength, hash) { /***/ }), -/***/ 5147: +/***/ 6433: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -17729,17 +17729,17 @@ function rsa_mgf1(seed, maskLength, hash) { * ... -- For future extensions * } */ -var forge = __webpack_require__(3832); -__webpack_require__(3068); -__webpack_require__(6607); -__webpack_require__(6270); -__webpack_require__(5496); -__webpack_require__(7450); -__webpack_require__(9563); -__webpack_require__(8095); -__webpack_require__(137); -__webpack_require__(7116); -__webpack_require__(5414); +var forge = __webpack_require__(4117); +__webpack_require__(9319); +__webpack_require__(7637); +__webpack_require__(1384); +__webpack_require__(8840); +__webpack_require__(8788); +__webpack_require__(7646); +__webpack_require__(8855); +__webpack_require__(76); +__webpack_require__(9993); +__webpack_require__(5200); // shortcut for asn.1 & PKI API var asn1 = forge.asn1; @@ -18712,7 +18712,7 @@ p12.generateKey = forge.pbe.generatePkcs12Key; /***/ }), -/***/ 9437: +/***/ 2292: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -18733,16 +18733,16 @@ p12.generateKey = forge.pbe.generatePkcs12Key; * a separate file pkcs7asn1.js, since those are referenced from other * PKCS standards like PKCS #12. */ -var forge = __webpack_require__(3832); -__webpack_require__(8925); -__webpack_require__(3068); -__webpack_require__(3480); -__webpack_require__(6270); -__webpack_require__(6953); -__webpack_require__(5496); -__webpack_require__(9563); -__webpack_require__(7116); -__webpack_require__(5414); +var forge = __webpack_require__(4117); +__webpack_require__(8663); +__webpack_require__(9319); +__webpack_require__(2188); +__webpack_require__(1384); +__webpack_require__(624); +__webpack_require__(8840); +__webpack_require__(7646); +__webpack_require__(9993); +__webpack_require__(5200); // shortcut for ASN.1 API var asn1 = forge.asn1; @@ -19979,7 +19979,7 @@ function _decryptContent(msg) { /***/ }), -/***/ 5496: +/***/ 8840: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -20091,9 +20091,9 @@ function _decryptContent(msg) { * * EncryptedKey ::= OCTET STRING */ -var forge = __webpack_require__(3832); -__webpack_require__(3068); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(9319); +__webpack_require__(9993); // shortcut for ASN.1 API var asn1 = forge.asn1; @@ -20396,7 +20396,7 @@ p7v.recipientInfoValidator = { /***/ }), -/***/ 4742: +/***/ 2696: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -20407,17 +20407,17 @@ p7v.recipientInfoValidator = { * * Copyright (c) 2010-2013 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(3068); -__webpack_require__(6270); -__webpack_require__(7450); -__webpack_require__(6953); -__webpack_require__(8960); -__webpack_require__(5147); -__webpack_require__(6007); -__webpack_require__(8095); -__webpack_require__(7116); -__webpack_require__(5414); +var forge = __webpack_require__(4117); +__webpack_require__(9319); +__webpack_require__(1384); +__webpack_require__(8788); +__webpack_require__(624); +__webpack_require__(3498); +__webpack_require__(6433); +__webpack_require__(3678); +__webpack_require__(8855); +__webpack_require__(9993); +__webpack_require__(5200); // shortcut for asn.1 API var asn1 = forge.asn1; @@ -20505,7 +20505,7 @@ pki.privateKeyInfoToPem = function(pki, maxline) { /***/ }), -/***/ 9654: +/***/ 9293: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -20515,10 +20515,10 @@ pki.privateKeyInfoToPem = function(pki, maxline) { * * Copyright (c) 2014 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(7116); -__webpack_require__(5764); -__webpack_require__(9563); +var forge = __webpack_require__(4117); +__webpack_require__(9993); +__webpack_require__(1838); +__webpack_require__(7646); (function() { @@ -20809,7 +20809,7 @@ function getMillerRabinTests(bits) { /***/ }), -/***/ 4933: +/***/ 833: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -20823,13 +20823,13 @@ function getMillerRabinTests(bits) { * * Copyright (c) 2010-2014 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(9993); var _crypto = null; if(forge.util.isNodejs && !forge.options.usePureJavaScript && !process.versions['node-webkit']) { - _crypto = __webpack_require__(5819); + _crypto = __webpack_require__(289); } /* PRNG API */ @@ -21235,7 +21235,7 @@ prng.create = function(plugin) { /***/ }), -/***/ 6007: +/***/ 3678: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -21245,9 +21245,9 @@ prng.create = function(plugin) { * * Copyright (c) 2012 Stefan Siegl */ -var forge = __webpack_require__(3832); -__webpack_require__(9563); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(7646); +__webpack_require__(9993); // shortcut for PSS API var pss = module.exports = forge.pss = forge.pss || {}; @@ -21483,7 +21483,7 @@ pss.create = function(options) { /***/ }), -/***/ 9563: +/***/ 7646: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -21501,11 +21501,11 @@ pss.create = function(options) { * * Copyright (c) 2009-2014 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(8925); -__webpack_require__(1668); -__webpack_require__(4933); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(8663); +__webpack_require__(4824); +__webpack_require__(833); +__webpack_require__(9993); (function() { @@ -21681,7 +21681,7 @@ module.exports = forge.random; /***/ }), -/***/ 9372: +/***/ 6232: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -21694,8 +21694,8 @@ module.exports = forge.random; * Information on the RC2 cipher is available from RFC #2268, * http://www.ietf.org/rfc/rfc2268.txt */ -var forge = __webpack_require__(3832); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(9993); var piTable = [ 0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d, @@ -22098,7 +22098,7 @@ forge.rc2.createDecryptionCipher = function(key, bits) { /***/ }), -/***/ 8095: +/***/ 8855: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -22164,20 +22164,20 @@ forge.rc2.createDecryptionCipher = function(key, bits) { * * The OID for the RSA key algorithm is: 1.2.840.113549.1.1.1 */ -var forge = __webpack_require__(3832); -__webpack_require__(3068); -__webpack_require__(5764); -__webpack_require__(6270); -__webpack_require__(8936); -__webpack_require__(9654); -__webpack_require__(9563); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(9319); +__webpack_require__(1838); +__webpack_require__(1384); +__webpack_require__(1504); +__webpack_require__(9293); +__webpack_require__(7646); +__webpack_require__(9993); if(typeof BigInteger === 'undefined') { var BigInteger = forge.jsbn.BigInteger; } -var _crypto = forge.util.isNodejs ? __webpack_require__(5819) : null; +var _crypto = forge.util.isNodejs ? __webpack_require__(289) : null; // shortcut for asn.1 API var asn1 = forge.asn1; @@ -24054,7 +24054,7 @@ function _base64ToBigInt(b64) { /***/ }), -/***/ 137: +/***/ 76: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -24064,9 +24064,9 @@ function _base64ToBigInt(b64) { * * Copyright (c) 2010-2015 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(8991); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(7279); +__webpack_require__(9993); var sha1 = module.exports = forge.sha1 = forge.sha1 || {}; forge.md.sha1 = forge.md.algorithms.sha1 = sha1; @@ -24380,7 +24380,7 @@ function _update(s, w, bytes) { /***/ }), -/***/ 1668: +/***/ 4824: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -24392,9 +24392,9 @@ function _update(s, w, bytes) { * * Copyright (c) 2010-2015 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(8991); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(7279); +__webpack_require__(9993); var sha256 = module.exports = forge.sha256 = forge.sha256 || {}; forge.md.sha256 = forge.md.algorithms.sha256 = sha256; @@ -24714,7 +24714,7 @@ function _update(s, w, bytes) { /***/ }), -/***/ 3219: +/***/ 501: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -24729,9 +24729,9 @@ function _update(s, w, bytes) { * * Copyright (c) 2014-2015 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -__webpack_require__(8991); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(7279); +__webpack_require__(9993); var sha512 = module.exports = forge.sha512 = forge.sha512 || {}; @@ -25282,7 +25282,7 @@ function _update(s, w, bytes) { /***/ }), -/***/ 7173: +/***/ 6786: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -25295,12 +25295,12 @@ function _update(s, w, bytes) { * * @author https://github.com/shellac */ -var forge = __webpack_require__(3832); -__webpack_require__(8925); -__webpack_require__(6607); -__webpack_require__(5063); -__webpack_require__(137); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(8663); +__webpack_require__(7637); +__webpack_require__(6383); +__webpack_require__(76); +__webpack_require__(9993); var ssh = module.exports = forge.ssh = forge.ssh || {}; @@ -25525,7 +25525,7 @@ function _sha1() { /***/ }), -/***/ 4311: +/***/ 3020: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -25760,15 +25760,15 @@ function _sha1() { * due to the large block size of existing MACs and the small size of the * timing signal. */ -var forge = __webpack_require__(3832); -__webpack_require__(3068); -__webpack_require__(6607); -__webpack_require__(5063); -__webpack_require__(6953); -__webpack_require__(4742); -__webpack_require__(9563); -__webpack_require__(137); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(9319); +__webpack_require__(7637); +__webpack_require__(6383); +__webpack_require__(624); +__webpack_require__(2696); +__webpack_require__(7646); +__webpack_require__(76); +__webpack_require__(9993); /** * Generates pseudo random bytes by mixing the result of two hash functions, @@ -29814,7 +29814,7 @@ forge.tls.createConnection = tls.createConnection; /***/ }), -/***/ 7116: +/***/ 9993: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -29824,8 +29824,8 @@ forge.tls.createConnection = tls.createConnection; * * Copyright (c) 2010-2018 Digital Bazaar, Inc. */ -var forge = __webpack_require__(3832); -var baseN = __webpack_require__(8807); +var forge = __webpack_require__(4117); +var baseN = __webpack_require__(1727); /* Utilities API */ var util = module.exports = forge.util = forge.util || {}; @@ -32473,7 +32473,7 @@ util.estimateCores = function(options, callback) { /***/ }), -/***/ 5414: +/***/ 5200: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** @@ -32585,17 +32585,17 @@ util.estimateCores = function(options, callback) { * signature BIT STRING * } */ -var forge = __webpack_require__(3832); -__webpack_require__(8925); -__webpack_require__(3068); -__webpack_require__(3480); -__webpack_require__(8991); -__webpack_require__(6971); -__webpack_require__(6270); -__webpack_require__(6953); -__webpack_require__(6007); -__webpack_require__(8095); -__webpack_require__(7116); +var forge = __webpack_require__(4117); +__webpack_require__(8663); +__webpack_require__(9319); +__webpack_require__(2188); +__webpack_require__(7279); +__webpack_require__(3049); +__webpack_require__(1384); +__webpack_require__(624); +__webpack_require__(3678); +__webpack_require__(8855); +__webpack_require__(9993); // shortcut for asn.1 API var asn1 = forge.asn1; @@ -35722,14 +35722,14 @@ pki.verifyCertificateChain = function(caStore, chain, options) { /***/ }), -/***/ 2480: +/***/ 2297: /***/ (() => { /* (ignored) */ /***/ }), -/***/ 5819: +/***/ 289: /***/ (() => { /* (ignored) */ @@ -37234,12 +37234,36 @@ function toBoolean (val) { } function cookieToJson(cookie) { + // python的requests模块返回的多个cookie会用','分隔但是set-cookie的值里面也有',' + // 先用';'分隔开,再用','分隔开 + // 如果分割结果里面有'=',那么就是一个完整的cookie。如果不包含等号 + // 那么这个部分应该与前一个部分合并,因为它是前一个cookie的一部分。 if (!cookie) return {} - let cookieArr = cookie.split(';') + + let cookies = []; + cookies = cookie.split(';') + + let cookieArr = [] + cookies.forEach((i) => { + let parts = i.split(',') + + parts.forEach((part, i) => { + if (part.includes('=')) { + cookieArr.push(part) + } else { + cookieArr[cookieArr.length - 1] += ',' + part + } + }) + }) + let obj = {} cookieArr.forEach((i) => { let arr = i.split('=') - obj[arr[0]] = arr[1] + if (arr.length === 2) { + obj[arr[0].trim()] = arr[1] + } else { + obj[arr[0].trim()] = "" + } }) return obj } @@ -37904,7 +37928,7 @@ const hug_comment_resourceTypeMap = config_namespaceObject.A; }); ;// CONCATENATED MODULE: ./package.json -const package_namespaceObject = {"i8":"0.1.0"}; +const package_namespaceObject = {"i8":"0.1.1"}; ;// CONCATENATED MODULE: ./module/inner_version.js /* harmony default export */ const inner_version = ((query, request) => { @@ -38196,8 +38220,8 @@ const package_namespaceObject = {"i8":"0.1.0"}; return result }); -// EXTERNAL MODULE: ./node_modules/crypto-js/index.js -var crypto_js = __webpack_require__(1354); +// EXTERNAL MODULE: ./node_modules/.store/crypto-js@4.2.0/node_modules/crypto-js/index.js +var crypto_js = __webpack_require__(1292); ;// CONCATENATED MODULE: ./module/login_cellphone.js // 手机登录 @@ -38341,33 +38365,21 @@ var crypto_js = __webpack_require__(1354); }); ;// CONCATENATED MODULE: ./module/login_status.js -/* harmony default export */ const login_status = (async (query, request) => { - const data = {} - let result = await request( - 'POST', - `https://music.163.com/weapi/w/nuser/account/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) - if (result.body.code === 200) { - result = { - status: 200, - body: { - data: { - ...result.body, - }, +/* harmony default export */ const login_status = ((query, request) => { + const data = {} + return request( + 'POST', + `https://music.163.com/weapi/w/nuser/account/get`, + data, + { + crypto: 'weapi', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, }, - cookie: result.cookie, - } - } - return result -}); - + ) + }); + ;// CONCATENATED MODULE: ./module/logout.js // 退出登录 @@ -38743,7 +38755,8 @@ var crypto_js = __webpack_require__(1354); realIP: query.realIP, }, ) -}); +}); + ;// CONCATENATED MODULE: ./module/music_first_listen_info.js // 回忆坐标 @@ -42795,8 +42808,8 @@ const resource_like_resourceTypeMap = config_namespaceObject.A; 'yunbei_task_finish':yunbei_task_finish, 'yunbei_today':yunbei_today, }); -// EXTERNAL MODULE: ./node_modules/node-forge/lib/index.js -var lib = __webpack_require__(2079); +// EXTERNAL MODULE: ./node_modules/.store/node-forge@1.3.1/node_modules/node-forge/lib/index.js +var lib = __webpack_require__(2795); ;// CONCATENATED MODULE: ./util/crypto.js @@ -42958,7 +42971,7 @@ const createRequestParam = (method, url, data = {}, options) => { if (!options.cookie.MUSIC_U) { // 游客 if (!options.cookie.MUSIC_A) { - options.cookie.MUSIC_A = anonymous_token; + options.cookie.MUSIC_A = ""; options.cookie.os = options.cookie.os || "ios"; options.cookie.appver = options.cookie.appver || "8.10.90"; } @@ -43146,6 +43159,11 @@ function beforeRequest(name, query) { /* harmony default export */ const afterRequest_login_cellphone = ((response) => { response = JSON.parse(response); if (response.body.code === 200) { + let cookie = response.cookie; + if (Array.isArray(cookie)) { + cookie = cookie.join(';'); + } + response = { status: 200, body: { @@ -43155,9 +43173,26 @@ function beforeRequest(name, query) { "avatarImgIdStr" ) ), - cookie: response.cookie.join(";"), + cookie: cookie, }, - cookie: response.cookie, + cookie: cookie, + }; + } + return response; +}); + +;// CONCATENATED MODULE: ./afterRequest/login_status.js +/* harmony default export */ const afterRequest_login_status = ((response) => { + response = JSON.parse(response); + if (response.body.code === 200) { + response = { + status: 200, + body: { + data: { + ...response.body, + cookie: response.cookie, + }, + } }; } return response; @@ -43219,9 +43254,11 @@ function beforeRequest(name, query) { + /* harmony default export */ const afterRequestApi = ({ 'check_music':afterRequest_check_music, 'login_cellphone':afterRequest_login_cellphone, + 'login_status':afterRequest_login_status, 'related_playlist':afterRequest_related_playlist, 'top_playlist':afterRequest_top_playlist, 'user_detail':afterRequest_user_detail, @@ -43257,21 +43294,40 @@ const afterRequest = (result, crypto, apiName) => { const body = result.data; - let cookie = result.headers["set-cookie"]; + // let cookie = result.headers["Set-Cookie"]; + let cookie; + + for (let key in result.headers) { + if (key.toLowerCase() === 'set-cookie') { + cookie = result.headers[key]; + break; + } + } + // console.log("得到了set-cookie 的值:", cookie); // 处理字符串格式的 cookie 到一个对象 - if (typeof cookie === "string") { - cookie = cookieToJson(cookie); + // if (typeof cookie === "string") { + // console.log("cookie 是 string", cookie); + // cookie = cookieToJson(cookie); + // } + + // 处理数组格式的 cookie + if (Array.isArray(cookie)) { + cookie = cookie.join(';'); } // 对象转换为数组 - if(typeof cookie === 'object' && cookie !== null){ - cookie = Object.entries(cookie).map(([key, value]) => `${key}=${value}`); - } + // if(typeof cookie === 'object' && cookie !== null){ + // console.log("cookie 是 object", cookie); + // cookie = Object.entries(cookie).map(([key, value]) => `${key}=${value}`); + // } + + answer.cookie = cookie || ""; - answer.cookie = (cookie || []).map((x) => - x.replace(/\s*Domain=[^(;|$)]+;*/, "") - ); + // 不是浏览器Domain属性不重要 + // answer.cookie = (cookie || []).map((x) => + // x.replace(/\s*Domain=[^(;|$)]+;*/, "") + // ); try { if (crypto === "eapi") { diff --git a/package/NeteaseCloudMusic/config.json b/package/NeteaseCloudMusic/config.json index da3a66a..44674f3 100644 --- a/package/NeteaseCloudMusic/config.json +++ b/package/NeteaseCloudMusic/config.json @@ -3057,5 +3057,14 @@ } } ] - } + }, + "/login/status": { + "name": "登录状态", + "explain": "说明 : 调用此接口,可获取登录状态", + "example": [ + { + "query":{} + } + ] + } } \ No newline at end of file diff --git a/package/NeteaseCloudMusic/main.py b/package/NeteaseCloudMusic/main.py index 3f29b77..7f973ef 100644 --- a/package/NeteaseCloudMusic/main.py +++ b/package/NeteaseCloudMusic/main.py @@ -2,6 +2,8 @@ import json import os.path import socket from pprint import pprint +import http.cookies +import datetime import pkg_resources import requests @@ -17,6 +19,7 @@ class NeteaseCloudMusicApi: self.DEBUG = debug # 是否开启调试模式 self.special_api = {"/playlist/track/all": self.playlist_track_all, + "/login/cellphone": self.login_cellphone, "/inner/version": self.inner_version} # 载入js代码 @@ -57,7 +60,7 @@ class NeteaseCloudMusicApi: # 处理俩个云贝接口名称转换问题 if name in yubei_special.keys(): name = yubei_special[name] - print("转换了个麻烦的路由", name) + # print("转换了个麻烦的路由", name) if name not in api_list(): if name not in yubei_special.values(): @@ -79,6 +82,8 @@ class NeteaseCloudMusicApi: else: result = self.call_api(name, query) + # + return result @staticmethod @@ -100,7 +105,7 @@ class NeteaseCloudMusicApi: if self.__cookie is None: if os.path.isfile("cookie_storage"): with open("cookie_storage", "r", encoding='utf-8') as f: - self.__cookie = f.read() + self.cookie = f.read() else: self.__cookie = "" # 如果没有cookie文件,就设置为空 @@ -110,9 +115,36 @@ class NeteaseCloudMusicApi: def cookie(self, cookie): if cookie is None: cookie = "" - self.__cookie = cookie + + _cookie = cookie + + '''判断cookie是否过期''' + + # 创建一个Morsel对象,它可以解析cookie字符串 + morsel = http.cookies.SimpleCookie(cookie) + # 获取当前时间 + now = datetime.datetime.now() + + # 只判断 __csrf 是否过期 + if not morsel.get('__csrf'): + # __csrf 不存在,不是有效cookie + _cookie = "" + else: + # 将过期时间字符串转换为datetime对象 + expires = morsel.get('__csrf')['expires'] + expires_datetime = datetime.datetime.strptime(expires, "%a, %d %b %Y %H:%M:%S GMT") + + # 判断cookie是否过期 + if now > expires_datetime: + # 过期了 + _cookie = "" + else: + # 未过期 + pass + + self.__cookie = _cookie with open("cookie_storage", "w+", encoding='utf-8') as f: - f.write(cookie) + f.write(_cookie) @property def ip(self): @@ -147,6 +179,12 @@ class NeteaseCloudMusicApi: "status": response.status_code, } + # print("headers", response.headers) + # print("headers_dict", dict(response.headers)) + + # with open("response_result.json", "w+", encoding='utf-8') as f: + # f.write(json.dumps(response_result, indent=2, ensure_ascii=False)) + result = self.ctx.call('NeteaseCloudMusicApi.afterRequest', json.dumps(response_result), request_param.get('crypto', None), @@ -184,24 +222,16 @@ class NeteaseCloudMusicApi: result = self.ctx.call('NeteaseCloudMusicApi.inner_version') return result + def login_cellphone(self, query): + """ + 手机号登录 + :param query: + :return: + """ + result = self.call_api("/login/cellphone", query) -if __name__ == '__main__': - import json - import os - from pprint import pprint - import dotenv - - dotenv.load_dotenv("../../.env") # 从.env文件中加载环境变量 - - netease_cloud_music_api = NeteaseCloudMusicApi() # 初始化API - netease_cloud_music_api.cookie = os.getenv("COOKIE") # 设置cookie - netease_cloud_music_api.DEBUG = True # 开启调试模式 - - - def songv1_test(): - # 获取歌曲详情 - response = netease_cloud_music_api.request("song_url_v1", {"id": 33894312, "level": "exhigh"}) - pprint(response) - - - songv1_test() + # 自动 填充cookie + if result["code"] == 200: + if result.get("data").get("cookie"): + self.cookie = result.get("data").get("cookie") + return result diff --git a/package/README.md b/package/README.md new file mode 100644 index 0000000..ba1a8a1 --- /dev/null +++ b/package/README.md @@ -0,0 +1,90 @@ +# NeteaseCloudMusic_PythonSDK +> 基于 [ NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) 封装的 Python SDK。 +> 网易云API Python版本。 +> 现已同步原项目接口且测试通过的有200多个 +> 已发布到PyPi,可直接使用pip安装 +> 项目地址:[GitHub](https://github.com/2061360308/NeteaseCloudMusic_PythonSDK) + +![](https://img.shields.io/badge/py_mini_racer-@0.6.0-red.svg) +![License](https://img.shields.io/badge/license-MIT-yellow) + +### 依赖于 +- [ NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) +- [ NeteaseCloudMusicApi_V8 ](https://github.com/2061360308/NeteaseCloudMusicApi_V8) + +### 原理 +- 通过 `py_mini_racer` 调用 `NeteaseCloudMusicApi_V8` 的 `js` 方法。进一步进行了简单封装。 + +### 使用 +- 安装 `pip install NeteaseCloudMusic` +- 导入API进行使用(具体查看`test.py`中的示例) +```python +from NeteaseCloudMusic import NeteaseCloudMusicApi, api_help, api_list +import os + +netease_cloud_music_api = NeteaseCloudMusicApi() # 初始化API +netease_cloud_music_api.cookie = os.getenv("COOKIE") # 设置cookie +response = netease_cloud_music_api.request("song_url_v1", {"id": 33894312, "level": "exhigh"}) # 调用API + +# 获取帮助 +print(api_help()) +print(api_help('song_url_v1')) +# 获取API列表 +print(api_list()) +``` + +> 注意: request(self, name, query=None) 的第一个参数为API名称,第二个参数为API参数,具体API名称和参数请参考 [NeteaseCloudMusicApi文档](https://docs.neteasecloudmusicapi.binaryify.com),name支持`/song/url/v1`和`song_url_v1`两种写法。 + + +### 开发 +- 克隆项目 `git clone git@github.com:2061360308/NeteaseCloudMusic_PythonSDK.git` +- 安装依赖 `pip install -r requirements.txt` +- 目录/文件说明 +├── package 项目包根目录 +├── test_gender 生成测试代码的脚本 +├── test.py 手动测试/ 使用示例 + + +### 改进 +> 下列API未支持 +> +- apicache.js +- memory-cache.js +- request_reference.js +- avatar_upload.js +- cloud.js +- playlist_cover_update.js +- voice_upload.js +- register_anonimous.js +- verify_getQr.js + +> 以下api未测试(这些接口测试起来比较繁琐) +> +- /user/replacephone +- /audio/match +- /rebind +- /nickname/check +- /activate/init/profile +- /cellphone/existence/check +- /register/cellphone +- /captcha/verify +- /captcha/sent +- /login/refresh +- /logout +- /user/update +- /pl/count +- /playlist/update +- /playlist/desc/update +- /playlist/name/update +- /playlist/tags/update +- /event/forward +- /event/del +- /share/resource +- /send/text +- /send/playlist +- /playlist/create +- /playlist/tracks +- /daily_signin +- /fm_trash + +### 欢迎提交PR diff --git a/package/dist/NeteaseCloudMusic-0.1.3.tar.gz b/package/dist/NeteaseCloudMusic-0.1.3.tar.gz deleted file mode 100644 index 9860568bd4bd377250f61cee49840ed73cccff56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18411 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 S)xLf?*Z&87T!>=;2m%15>n%M1 diff --git a/package/dist/NeteaseCloudMusic-0.1.3-py2.py3-none-any.whl b/package/dist/NeteaseCloudMusic-0.1.4-py2.py3-none-any.whl similarity index 98% rename from package/dist/NeteaseCloudMusic-0.1.3-py2.py3-none-any.whl rename to package/dist/NeteaseCloudMusic-0.1.4-py2.py3-none-any.whl index 4a5f76d53775b359bb66ece3802fb7687347c514..d20ad74c5ecea2be8acead045d1ae8c0e95d3549 100644 GIT binary patch delta 2584 zcmZ9OcQhM%AI1|2YDBFP%0)x1s4ZHfrAED>_NK_>B>n8E$T0}g-LgA+Hs}9zk}rZYs%iIw>VXsv*kt zg(0R~h&S}fx#=&IJ?MMH zMSI4ICsyuCU?a0&3Lj3^opY!OeJFFtNT3+DVh z6mpgD$7VA$t{zj1P2nK|4CmC=r>Lx*S-9B<^1Y z;1G?Wy8$s4q(xpu9%D{2X`uF~`Dp3q*z$IiSGm8_@blZRh1uZqcD5un{>Q3LoR=m{ zlr(kMqAONv9;V@CEBv`0v{PzOy@`T7=)N1vYy+KrA^4Dya@`Obz4V%rtjU%W5G@nG z-=4=0U)E^uIKlJxty>A{E#AKX8FykL#i|~?8&VSGk5Bk4pIl5ngRZP3%XZPDbq{sGVVTHgK;KF zzEYY3pR}<$qFD)kZ;E4LIifL}jiWu=u#u8Y^~r}Ao84Tm>J06s9v0tPVFnWh)!iI- zD5YhHMOdNrb)UllAGTxx64eBJw^(gh8)gbhL39WV$k5mIuM%G5N5^l_LG}5;YkW^O zI-uVp@WKN5Pg(LyPzWO6;g>SyRcNt)#p!IzD6jDEJVG|Jj0zm#W^z=pk22F8p5RSd zi(J#)Of2`YZW21n2w6dQ$__&_Mm(8Wc*NA$P_Iys8G*C_88RNR-|J*PvHY<_AZw#i zZtz&{Y6*9YYi@7xjXc+kT6l+2Ypyfz41Aq*uVq8!_NffKu}esCGp@Rc&zAJ6{)~b>U#rUM)v3enzzAp`XN@wP(bo%;%h-+;{o2jEP_*C_L zW+K1nR@u%r1E%cqgPZ>ySia_%Y zXy3nUpmYXuD6fU7M$tmpb-b1iEdIF)qUHBX`}b8I{hCX8>S_2MSEpB-YxsM%-SC0TH@kbQh_&fBG8RL zLZ5OTyPVo@d}l z=iMEiciolR?oL)VJL>G6w!3`8$H=7x6ux?bGd4~rQv#G0tx&?+gS$s<{g!s1*wZlF z+AxE+`0XS+D97~7mAN=a+7cf+ATpJlg-mL-nMBdR3|XV$?7u#J`nG~#{^L$(@{E+ZY#xC48u_B@b*g9Y^?)#_P2#9*_2747Y*_ewcO?tnd!SNz`xal^e?bOF5SSeR z09*oG5N{0ii+CBQC~&|p0Qx)sxfVEs75?NO`O|07BOn0a3IYH`{^B2A?#4q`FK-D~ zchnKaPvP3GXoUKJL#BD=nKBs!g7P^vH^OIsYh?JD-aW-lceydZ3NtH23ZVy}v;uT7bM znl3QP>A`bT^>22Ci`k;t;&MDL_a$1GkUe<$fEYLL;Z*+8e5+0=#_GSFY(B%!WU~K#nG#7A>N$_M3`+TjI;0 zLxZa>N>oM*8a(+cLdh7g!bPG!V!*#K{kuYC9ALm=f3+tj10;}&9q>;M)!e{5RNI&g z7AzQgA@RRh`G2{YAq19RBG!wMyqLdVV@QhI-{On3LgD}ZFW&tBlKZz0P#?1Yk5LQ@ M7NC)S1im=_4}IFXYybcN delta 1247 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