现象
ApiClient::playlist_tracks(/api/playlist/manipulate/tracks)使用 CryptoType::default()(即 Eapi),
实际调用时请求在发送层即失败:
HTTP request failed: error sending request for url (https://interface.music.163.com/eapi/playlist/manipulate/tracks)
同环境下其他 eapi 端点(song_url_v1 / cloudsearch / likelist)均正常,失败特定于该端点;
目标域名用 curl 可达(HTTP 200),排除网络问题。
对照
Node 参考实现(NeteaseCloudMusicApi module/playlist_tracks.js)该端点走 weapi
(music.163.com/weapi/playlist/manipulate/tracks)。
另:playlist_track_add(/api/playlist/track/add,weapi)对用户自建歌单返回
code=401 无权限操作歌单,似乎并不适用于常规「收藏歌曲到歌单」场景。
绕行验证(可用)
用公开的底层 request() 手动以 weapi 调同一端点,真实登录态下成功(添加/重复添加均正常,
502 已存在被 SPECIAL_STATUS_CODES 特判为成功):
let data = json!({
"op": "add",
"pid": playlist_id,
"trackIds": json!([song_id]).to_string(),
"imme": "true",
});
let opt = RequestOption {
crypto: CryptoType::Weapi,
cookie: Some(cookie),
..Default::default()
};
client.request("/api/playlist/manipulate/tracks", data, opt).await
建议
playlist_tracks 的 crypto 由 CryptoType::default() 改为 CryptoType::Weapi,与 Node 实现对齐。
现象
ApiClient::playlist_tracks(/api/playlist/manipulate/tracks)使用CryptoType::default()(即 Eapi),实际调用时请求在发送层即失败:
同环境下其他 eapi 端点(
song_url_v1/cloudsearch/likelist)均正常,失败特定于该端点;目标域名用 curl 可达(HTTP 200),排除网络问题。
对照
Node 参考实现(NeteaseCloudMusicApi
module/playlist_tracks.js)该端点走 weapi(
music.163.com/weapi/playlist/manipulate/tracks)。另:
playlist_track_add(/api/playlist/track/add,weapi)对用户自建歌单返回code=401 无权限操作歌单,似乎并不适用于常规「收藏歌曲到歌单」场景。绕行验证(可用)
用公开的底层
request()手动以 weapi 调同一端点,真实登录态下成功(添加/重复添加均正常,502 已存在被 SPECIAL_STATUS_CODES 特判为成功):
建议
playlist_tracks的 crypto 由CryptoType::default()改为CryptoType::Weapi,与 Node 实现对齐。