From 9effec5e6f55732354de06f5517321c9ba19f38b Mon Sep 17 00:00:00 2001 From: Miyokiss Date: Fri, 6 Jun 2025 19:23:09 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix(cloud=5Fmusic.py):=20=E6=9B=B4=E6=8D=A2?= =?UTF-8?q?API=E4=BC=98=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clover_music/cloud_music/cloud_music.py | 77 +++++++++------------ 1 file changed, 33 insertions(+), 44 deletions(-) diff --git a/src/clover_music/cloud_music/cloud_music.py b/src/clover_music/cloud_music/cloud_music.py index 32f962d..d7eabe8 100644 --- a/src/clover_music/cloud_music/cloud_music.py +++ b/src/clover_music/cloud_music/cloud_music.py @@ -258,61 +258,50 @@ async def netease_music_download(song_id, song_name, singer, session): except requests.RequestException as e: return None - -async def music_search(keyword): - """ - 第三方歌曲搜索 - Args: - keyword: - Returns: - - """ - url = "https://api.kxzjoker.cn/api/163_search" - params = { - "name": keyword, - "limit": 10, - } - - response = await async_client.get(url,params=params) - result = response.json() - song_id = result["data"][0]["id"] - song_name = result["data"][0]["name"] - singer = result["data"][0]["artists"][0]["name"] - return song_id,song_name,singer - -async def music_download(song_id, song_name, singer): +async def music_download(song_id): if not os.path.exists(save_path): os.makedirs(save_path) try: headers = { - "Referer": "https://kxzjoker.cn/", + "Referer": "https://www.byfuns.top/api/1/", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", - "Origin": "https://kxzjoker.cn" + "Origin": "https://www.byfuns.top" } # 构造请求URL - url = f'https://api.kxzjoker.cn/api/163_music?ids={song_id}&level=lossless&type=down' + url = f'https://www.byfuns.top/api/1/?id={song_id}&level=lossless' - # 异步流式下载 - async with async_client.stream("GET",url,headers=headers,follow_redirects=True) as response: - response.raise_for_status() + # 获取Url内容 + song_url = requests.request("GET", url, headers=headers) + if song_url.status_code == 200: + # 异步流式下载 + async with async_client.stream("GET",song_url.text,headers=headers,follow_redirects=True) as response: + response.raise_for_status() + if response.status_code == 200: + logger.debug(f"下载歌曲中...") + file_path = os.path.join(save_path, f"{datetime.now().date()}-{uuid.uuid4().hex}-{song_id}.wav") + file_name = os.path.basename(f"{datetime.now().date()}-{uuid.uuid4().hex}-{song_id}.wav") - file_path = os.path.join(save_path, f"{song_name}-{singer}.wav") - file_name = os.path.basename(f"{song_name}-{singer}.wav") - - with open(file_path, "wb") as f: - async for chunk in response.aiter_bytes(chunk_size=8192): - f.write(chunk) - - output_silk_path = os.path.join(save_path, os.path.splitext(file_name)[0] + ".silk") - # 使用 graiax-silkcoder 进行转换 - silkcoder.encode(file_path, output_silk_path, rate=32000, tencent=True, ios_adaptive=True) - # 删除临时文件 - await delete_file(file_path) - return output_silk_path + with open(file_path, "wb") as f: + async for chunk in response.aiter_bytes(chunk_size=8192): + f.write(chunk) + output_silk_path = os.path.join(save_path, os.path.splitext(file_name)[0] + ".silk") + # 使用 graiax-silkcoder 进行转换 + silkcoder.encode(file_path, output_silk_path, rate=32000, tencent=True, ios_adaptive=True) + # 删除临时文件 + await delete_file(file_path) + return output_silk_path + else: + logger.error(f"获取歌曲链接失败,状态码:{song_url.status_code}") + return None + else: + logger.error(f"获取歌曲链接失败,状态码:{song_url.status_code}") + return None + except httpx.Timeout as e: + logger.error(f"TimeoutError: {e}") except httpx.HTTPStatusError as e: - print(f"❌ HTTP错误 {e.response.status_code}") + logger.error(f"HTTPStatusError: {e}") except Exception as e: - print(f"❌ 下载失败:{str(e)}") + logger.error(e) return None From 78237a30a668aa662b0efa81602a21cc61f1fbc7 Mon Sep 17 00:00:00 2001 From: Miyokiss Date: Sat, 7 Jun 2025 20:57:28 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat(cloud=5Fmusic.py):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0uuid=E5=92=8Cdatetime=E6=A8=A1=E5=9D=97=E4=BB=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=96=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clover_music/cloud_music/cloud_music.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/clover_music/cloud_music/cloud_music.py b/src/clover_music/cloud_music/cloud_music.py index d7eabe8..2ef2d0b 100644 --- a/src/clover_music/cloud_music/cloud_music.py +++ b/src/clover_music/cloud_music/cloud_music.py @@ -5,7 +5,10 @@ import qrcode import base64 import codecs import json +import uuid +import datetime import requests +from nonebot import logger from io import BytesIO from Crypto.Cipher import AES from graiax import silkcoder From a9e873d15a15519ccc28fba30c32914754353c4b Mon Sep 17 00:00:00 2001 From: Miyokiss Date: Sat, 7 Jun 2025 20:43:58 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix(music=5Fdownload):=20=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=97=A5=E5=BF=97=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=AD=8C=E6=9B=B2ID=E5=92=8CURL=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clover_music/cloud_music/cloud_music.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clover_music/cloud_music/cloud_music.py b/src/clover_music/cloud_music/cloud_music.py index 2ef2d0b..b3cabfd 100644 --- a/src/clover_music/cloud_music/cloud_music.py +++ b/src/clover_music/cloud_music/cloud_music.py @@ -281,7 +281,7 @@ async def music_download(song_id): async with async_client.stream("GET",song_url.text,headers=headers,follow_redirects=True) as response: response.raise_for_status() if response.status_code == 200: - logger.debug(f"下载歌曲中...") + logger.debug(f"下载歌曲ID:{song_id}\nURL:{song_url.text}\n开始下载中...") file_path = os.path.join(save_path, f"{datetime.now().date()}-{uuid.uuid4().hex}-{song_id}.wav") file_name = os.path.basename(f"{datetime.now().date()}-{uuid.uuid4().hex}-{song_id}.wav") From d481a6314e3c6966a478b93c3fd41103cc4d5859 Mon Sep 17 00:00:00 2001 From: Miyokiss Date: Sat, 7 Jun 2025 21:14:35 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix(cloud=5Fmusic):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=AD=8C=E6=9B=B2=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BC=9A=E8=AF=9D=E7=AE=A1=E7=90=86=E5=B9=B6?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=AD=8C=E6=9B=B2URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clover_music/cloud_music/cloud_music.py | 2 +- src/plugins/cloud_music.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/clover_music/cloud_music/cloud_music.py b/src/clover_music/cloud_music/cloud_music.py index b3cabfd..61adabf 100644 --- a/src/clover_music/cloud_music/cloud_music.py +++ b/src/clover_music/cloud_music/cloud_music.py @@ -6,7 +6,7 @@ import base64 import codecs import json import uuid -import datetime +from datetime import datetime import requests from nonebot import logger from io import BytesIO diff --git a/src/plugins/cloud_music.py b/src/plugins/cloud_music.py index 8523d38..b5a75cf 100644 --- a/src/plugins/cloud_music.py +++ b/src/plugins/cloud_music.py @@ -16,14 +16,15 @@ async def handle_function(msg: MessageEvent): if keyword == "": await music.finish("\n请输入“/点歌+歌曲名”喔🎶") #搜索歌曲 - song_id,song_name,singer = await music_search(keyword) + session = requests.session() + song_id,song_name,singer,song_url = await netease_music_search(keyword,session) song_name = str(song_name).replace(".", "·").replace("/", "、") if song_id is None: await music.finish("\n没有找到歌曲,或检索到的歌曲均为付费喔qwq\n这绝对不是我的错,绝对不是!") else: await music.send(MessageSegment.text(f" 来源:网易云音乐\n歌曲:{song_name} - {singer}\n请稍等喔🎵")) #返回转换后的歌曲路径 - output_silk_path = await music_download(song_id, song_name, singer) + output_silk_path = await music_download(song_id) if output_silk_path is None: await music.send("歌曲音频获取失败了Σヽ(゚Д ゚; )ノ,请重试。")