ludoux / LrcHelper

从网易云音乐下载带翻译的歌词 Walkman 适配
MIT License
204 stars 13 forks source link

网易云对请求的限制 #18

Closed Initial-heart-1 closed 1 year ago

Initial-heart-1 commented 1 year ago
  1. 软件版本(右键-属性-详细信息-产品版本)是?:

2.3.2

  1. 外界环境是?(系统版本(包括位数)/联网状态是否正常):

Windows 10 专业版 x64 正常联网:中国电信

  1. 是在下载某个 ID 时必然发生的吗?如果是请附上 ID :

在所有 ID 均可复现问题

  1. 如果上者不是,可否描述一下问题发生前你所做的事?(如何复现?):

对于任意的歌单,仅能下载到不到 50 首歌曲的歌词。 网易云近期可能对请求进行了限制,故建议为请求间添加一个延迟。 经验证,使用技术手段限制了程序的下载速率后,因为间接控制了请求延迟,更多的歌词被成功下载。 如果猜想是正确的,直接按照文档使用本程序即可立即复现本问题。

Initial-heart-1 commented 1 year ago

原准备提交一个 PR 来解决本问题,但需要先探明请求限制以获得最高效率,然而我最近时间并不充裕,故交 issue。

Initial-heart-1 commented 1 year ago

@ludoux 你正在或正考虑修复这个问题吗?如果没有,请告知我,以便我开始准备尝试修复它。 如果其他人正准备这样做,得到了这个消息的话,请告知我,以避免重复的无效工作。

ludoux commented 1 year ago

抱歉,我暂时没有考虑修复这个问题。假如你方便的话,可以进行修复然后提一个 PR。多谢!


From: Initial-heart @.> Sent: Sunday, November 27, 2022 4:58:16 PM To: ludoux/LrcHelper @.> Cc: Lu Chang @.>; Mention @.> Subject: Re: [ludoux/LrcHelper] 网易云对请求的限制 (Issue #18)

@ludouxhttps://github.com/ludoux 你正在或正考虑修复这个问题吗?如果没有,请告知我,以便我开始准备尝试修复它。 如果其他人正准备这样做,得到了这个消息的话,请告知我,以避免重复的无效工作。

― Reply to this email directly, view it on GitHubhttps://github.com/ludoux/LrcHelper/issues/18#issuecomment-1328199777, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ADGWKTFKIWQML57B477M623WKMPCRANCNFSM6AAAAAARSGR35I. You are receiving this because you were mentioned.Message ID: @.***>

Initial-heart-1 commented 1 year ago

抱歉,我暂时没有考虑修复这个问题。假如你方便的话,可以进行修复然后提一个 PR。多谢! ____ From: Initial-heart @.> Sent: Sunday, November 27, 2022 4:58:16 PM To: ludoux/LrcHelper @.> Cc: Lu Chang @.>; Mention @.> Subject: Re: [ludoux/LrcHelper] 网易云对请求的限制 (Issue #18) @ludouxhttps://github.com/ludoux 你正在或正考虑修复这个问题吗?如果没有,请告知我,以便我开始准备尝试修复它。 如果其他人正准备这样做,得到了这个消息的话,请告知我,以避免重复的无效工作。 ― Reply to this email directly, view it on GitHub<#18 (comment)>, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ADGWKTFKIWQML57B477M623WKMPCRANCNFSM6AAAAAARSGR35I. You are receiving this because you were mentioned.Message ID: @.***>

好的,如果可能,我将尝试修复它。考虑为请求添加一个写死的延时,这可能导致效率降低。如果经过进一步测试验证这有效,将发起一个 PR 至本仓库。

Initial-heart-1 commented 1 year ago

@ludoux 我尝试为请求添加了一些很长的间隔,但似乎并没有起到什么作用。 我注意到 Log 回报了 <NO_LYRIC_LABEL>,查阅源码后发现这个错误似乎意味着返回不符合预期。你可以确认使用的 API 仍旧符合你编写该程序时的设计吗?

ludoux commented 1 year ago

我可能需要一段时间来确定。不过网易云API确实会改。有结果后我会回复


From: Initial-heart @.> Sent: Monday, November 28, 2022 1:34:01 PM To: ludoux/LrcHelper @.> Cc: Lu Chang @.>; Mention @.> Subject: Re: [ludoux/LrcHelper] 网易云对请求的限制 (Issue #18)

@ludouxhttps://github.com/ludoux 我尝试为请求添加了一些很长的间隔,但似乎并没有起到什么作用。 我注意到 Log 回报了 ,查阅源码后发现这个错误似乎意味着返回不符合预期。你可以确认使用的 API 仍旧符合你编写该程序时的设计吗?

― Reply to this email directly, view it on GitHubhttps://github.com/ludoux/LrcHelper/issues/18#issuecomment-1328566865, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ADGWKTDNHXZMAAL5YGOCDTDWKQ74TANCNFSM6AAAAAARSGR35I. You are receiving this because you were mentioned.Message ID: @.***>

Initial-heart-1 commented 1 year ago

我可能需要一段时间来确定。不过网易云API确实会改。有结果后我会回复 ____ From: Initial-heart @.> Sent: Monday, November 28, 2022 1:34:01 PM To: ludoux/LrcHelper @.> Cc: Lu Chang @.>; Mention @.> Subject: Re: [ludoux/LrcHelper] 网易云对请求的限制 (Issue #18) @ludouxhttps://github.com/ludoux 我尝试为请求添加了一些很长的间隔,但似乎并没有起到什么作用。 我注意到 Log 回报了 ,查阅源码后发现这个错误似乎意味着返回不符合预期。你可以确认使用的 API 仍旧符合你编写该程序时的设计吗? ― Reply to this email directly, view it on GitHub<#18 (comment)>, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ADGWKTDNHXZMAAL5YGOCDTDWKQ74TANCNFSM6AAAAAARSGR35I. You are receiving this because you were mentioned.Message ID: @.***>

经过调试,我捕获到这样的一条返回,证实了打开这个 issue 时的猜测:

"{\"msg\":\"操作频繁,请稍候再试\",\"code\":406,\"message\":\"操作频繁,请稍候再试\"}"

或许是我加的间隔不够长......总之,API 的返回证实了问题并明确了解决方案。

Initial-heart-1 commented 1 year ago

或许可以在得到这个返回时等待一会在继续请求以提高效率。

ludoux commented 1 year ago

方不方便给一个歌曲数目比较多的歌单的ID测试用,我这边用 7481237292 (https://music.163.com/#/playlist?id=7481237292) 歌单测试,70首歌曲还是可以下载的。可能网易云对一段时间内的总请求数有限制?

Initial-heart-1 commented 1 year ago

方不方便给一个歌曲数目比较多的歌单的ID测试用,我这边用 7481237292 (https://music.163.com/#/playlist?id=7481237292) 歌单测试,70首歌曲还是可以下载的。可能网易云对一段时间内的总请求数有限制?

我这里对我自己的收藏进行测试,300首左右的歌曲。你的猜测很可能是正确的,观察到进行大量请求后一段时间程序似乎一直得到这个返回以至于不断地重试,而一段时间后又正常工作。正在进行进一步测试以明确需要的间隔。

ludoux commented 1 year ago

这个感觉间隔比较难猜测出来🤣可能比较好的解决方案是检测到过于频繁的提示后,给用户提示以让用户过一段时间再试。 我后续有想法(但是没用动力)用WinUI3控件库以及重构一下代码,到时候可能会考虑分批下载同一个歌单内的不同部分的歌曲

Initial-heart-1 commented 1 year ago

进行了一次粗略的估计,在我触发这个返回后10s左右后再次请求不会再触发这个返回。 测试方法:下一个断点在判断收到此返回的语句后,触发时立刻打开秒表并过掉这个断点,10s后程序恢复了正常运行。

Initial-heart-1 commented 1 year ago

另外,限制的请求数量可能是50。基于本 issue 开启时的现象以及程序在 50 个歌词之后程序长时间的暂停,且之后以 50 为底数倍增,做出这样的猜测。

Initial-heart-1 commented 1 year ago

暂不确定单位时间,我也没有很好的确定办法......

ludoux commented 1 year ago

所以可能是每50个歌曲文件,停10秒是么

Initial-heart-1 commented 1 year ago

这个是猜测的数量和时间,故还是应该检测到返回时才做出动作以得到最高效率,而不是定量。想了一下,应该有两种方案,区别是延时: 1.下载效率更佳,性能消耗大 更短的延时,可能能够更快恢复下载。 2.能源效率更佳,耗时可能更长 更长的延时,可能提前恢复而存在空闲。

ludoux commented 1 year ago

好的。你方便直接做修改然后提一个PR么,可以在主界面加一个选项来切换。不方便的话我后面可能会尝试实践一下


From: Initial-heart @.> Sent: Monday, November 28, 2022 3:41:10 PM To: ludoux/LrcHelper @.> Cc: Lu Chang @.>; Mention @.> Subject: Re: [ludoux/LrcHelper] 网易云对请求的限制 (Issue #18)

这个是猜测的数量和时间,故还是应该检测到返回时才做出动作以得到最高效率,而不是定量。想了一下,应该有两种方案,区别是延时: 1.下载效率更佳,性能消耗大 更短的延时,可能能够更快恢复下载。 2.能源效率更佳,耗时可能更长 更长的延时,可能提前恢复而存在空闲。

― Reply to this email directly, view it on GitHubhttps://github.com/ludoux/LrcHelper/issues/18#issuecomment-1328663019, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ADGWKTFTFLVPRGDFYVA5OXTWKROZNANCNFSM6AAAAAARSGR35I. You are receiving this because you were mentioned.Message ID: @.***>

Initial-heart-1 commented 1 year ago

好的。你方便直接做修改然后提一个PR么,可以在主界面加一个选项来切换。不方便的话我后面可能会尝试实践一下 ____ From: Initial-heart @.> Sent: Monday, November 28, 2022 3:41:10 PM To: ludoux/LrcHelper @.> Cc: Lu Chang @.>; Mention @.> Subject: Re: [ludoux/LrcHelper] 网易云对请求的限制 (Issue #18) 这个是猜测的数量和时间,故还是应该检测到返回时才做出动作以得到最高效率,而不是定量。想了一下,应该有两种方案,区别是延时: 1.下载效率更佳,性能消耗大 更短的延时,可能能够更快恢复下载。 2.能源效率更佳,耗时可能更长 更长的延时,可能提前恢复而存在空闲。 ― Reply to this email directly, view it on GitHub<#18 (comment)>, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ADGWKTFTFLVPRGDFYVA5OXTWKROZNANCNFSM6AAAAAARSGR35I. You are receiving this because you were mentioned.Message ID: @.***>

好的,尝试一下

Initial-heart-1 commented 1 year ago

19

Initial-heart-1 commented 1 year ago

进一步调试检查发现,上述两种方案对于现代计算机来说性能消耗几乎没有区别。故可以考虑在新版本中使用更短的间隔以获得更高的效率。

Initial-heart-1 commented 1 year ago

但请注意:考虑到被网易云拉黑的风险,无论何时应当保留适当的延时。

ludoux commented 1 year ago

@Initial-heart-1 我做隔壁 cloudlrc 的时候,发现好像是 https://github.com/ludoux/LrcHelper/blob/223eaf8b3dc11f13ccc61371a8a222729f402aef/LrcHelper/NeteaseMusic.cs#L93 这个请求容易报错 "{\"msg\":\"操作频繁,请稍候再试\",\"code\":406,\"message\":\"操作频繁,请稍候再试\"}"

用这个 API 是为了 1) 明确歌曲的歌词状态。2) 获取原文歌词

但其实需求2可以用 https://github.com/ludoux/LrcHelper/blob/223eaf8b3dc11f13ccc61371a8a222729f402aef/LrcHelper/NeteaseMusic.cs#L127

这个API,但是参数补一个&lv=-1,即&lv=-1&tv=-1,来同时拿原文和翻译歌词。

还能再补一个 &kv=-1,但不知道这个有啥用,KTV版的?(http://music.163.com/api/song/lyric?os=pc&id=202367&lv=-1&tv=-1&kv=-1

假如你感兴趣可以试试把 第一个 API 给取消掉。现在主要是需求1怎么用第二个API来实现。我现在主要是只找到了纯音乐的一些例子,还没有找到应该有歌词,但没有人提交歌词的单曲ID。不知道后者这种ID在第二个API下是什么情况

~btw 最近我找到一个这个项目 https://github.com/jitwxs/163MusicLyrics ,假如你感觉我这个项目一直没维护可以去用他的😂~

ludoux commented 1 year ago

图片

他那个项目好像都统一用 weapi接口。我隔壁 cloudlrc 还是用老的 api 接口,只有登录用 weapi。后面看看这个 weapi 请求限制会不会低一点,假如会的话可能考虑cloudlrc切过去

Initial-heart-1 commented 1 year ago

最近没啥需求,之前是在家里有好设备嫌弃网易云的解码性能,所以准备用第三方播放器播。 但是最近我不在家,所以压根不急。 不用好像,就是那个请求报错,我直接循环请求直到返回符合预期解决。 关于有歌词但没提交的单曲,看看2039118943。 感觉请求限制应该差不多?相信网易不会留这么大一个洞。 当然,要是真不一样那当我没说。

ludoux commented 1 year ago

API2 返回的内容,有这三个很迷的键值对

图片 这三个均为false,基本都是完善好信息的了。包括1)外文歌,原文+翻译均有。2)中文歌,原文。3)纯音乐,比如536623433

图片 这种情况,有1)外文歌,只有原文没有中文翻译

图片 这种全true,有1)啥都没,比如你的提到的2039118943

目前还没有看到别的排列组合形式。感觉应该能代替前文提到的API1

Initial-heart-1 commented 1 year ago

那么,确定 API2 没有类似 API1 的请求限制吗?如果有,似乎没有什么必要。

ludoux commented 1 year ago

那么,确定 API2 没有类似 API1 的请求限制吗?如果有,似乎没有什么必要。

我 cloudlrc 把 API1 给弃用了,目前测试好像没有出那个频繁的报错