@neteasecloudmusicapienhanced/api 4.31.0 → 4.32.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/LICENSE +21 -21
  2. package/README.MD +248 -251
  3. package/app.js +18 -18
  4. package/data/china_ip_ranges.txt +4147 -4147
  5. package/data/deviceid.txt +24641 -24641
  6. package/generateConfig.js +24 -24
  7. package/interface.d.ts +1843 -1836
  8. package/main.js +63 -63
  9. package/module/activate_init_profile.js +9 -9
  10. package/module/aidj_content_rcmd.js +28 -28
  11. package/module/album.js +6 -6
  12. package/module/album_detail.js +12 -12
  13. package/module/album_detail_dynamic.js +12 -12
  14. package/module/album_list.js +16 -16
  15. package/module/album_list_style.js +15 -15
  16. package/module/album_new.js +11 -11
  17. package/module/album_newest.js +6 -6
  18. package/module/album_privilege.js +9 -9
  19. package/module/album_songsaleboard.js +19 -19
  20. package/module/album_sub.js +10 -10
  21. package/module/album_sublist.js +11 -11
  22. package/module/api.js +21 -21
  23. package/module/artist_album.js +15 -15
  24. package/module/artist_desc.js +9 -9
  25. package/module/artist_detail.js +10 -10
  26. package/module/artist_detail_dynamic.js +9 -9
  27. package/module/artist_fans.js +11 -11
  28. package/module/artist_follow_count.js +13 -13
  29. package/module/artist_list.js +33 -33
  30. package/module/artist_mv.js +12 -12
  31. package/module/artist_new_mv.js +12 -12
  32. package/module/artist_new_song.js +12 -12
  33. package/module/artist_songs.js +12 -12
  34. package/module/artist_sub.js +11 -11
  35. package/module/artist_sublist.js +11 -11
  36. package/module/artist_top_song.js +8 -8
  37. package/module/artist_video.js +15 -15
  38. package/module/artists.js +6 -6
  39. package/module/audio_match.js +19 -19
  40. package/module/avatar_upload.js +22 -22
  41. package/module/banner.js +16 -16
  42. package/module/batch.js +12 -12
  43. package/module/broadcast_category_region_get.js +11 -11
  44. package/module/broadcast_channel_collect_list.js +12 -12
  45. package/module/broadcast_channel_currentinfo.js +13 -13
  46. package/module/broadcast_channel_list.js +13 -13
  47. package/module/broadcast_sub.js +12 -12
  48. package/module/calendar.js +8 -8
  49. package/module/captcha_sent.js +11 -11
  50. package/module/captcha_verify.js +11 -11
  51. package/module/cellphone_existence_check.js +10 -10
  52. package/module/check_music.js +30 -30
  53. package/module/cloud.js +164 -164
  54. package/module/cloud_import.js +39 -39
  55. package/module/cloud_lyric_get.js +11 -11
  56. package/module/cloud_match.js +13 -13
  57. package/module/cloud_upload_complete.js +72 -72
  58. package/module/cloud_upload_token.js +111 -111
  59. package/module/cloudsearch.js +13 -13
  60. package/module/comment.js +30 -30
  61. package/module/comment_album.js +16 -16
  62. package/module/comment_dj.js +16 -16
  63. package/module/comment_event.js +15 -15
  64. package/module/comment_floor.js +16 -16
  65. package/module/comment_hot.js +18 -18
  66. package/module/comment_hug_list.js +20 -20
  67. package/module/comment_info_list.js +30 -30
  68. package/module/comment_like.js +20 -20
  69. package/module/comment_music.js +16 -16
  70. package/module/comment_mv.js +16 -16
  71. package/module/comment_new.js +37 -37
  72. package/module/comment_playlist.js +16 -16
  73. package/module/{comment_delete.js → comment_report.js} +11 -10
  74. package/module/comment_video.js +16 -16
  75. package/module/countries_code_list.js +6 -6
  76. package/module/creator_authinfo_get.js +6 -6
  77. package/module/daily_signin.js +16 -16
  78. package/module/digitalAlbum_detail.js +13 -13
  79. package/module/digitalAlbum_ordering.js +22 -22
  80. package/module/digitalAlbum_purchased.js +15 -15
  81. package/module/digitalAlbum_sales.js +13 -13
  82. package/module/djRadio_top.js +15 -15
  83. package/module/dj_banner.js +6 -6
  84. package/module/dj_category_excludehot.js +10 -10
  85. package/module/dj_category_recommend.js +10 -10
  86. package/module/dj_catelist.js +6 -6
  87. package/module/dj_detail.js +9 -9
  88. package/module/dj_difm_all_style_channel.js +9 -9
  89. package/module/dj_difm_channel_subscribe.js +9 -9
  90. package/module/dj_difm_channel_unsubscribe.js +9 -9
  91. package/module/dj_difm_playing_tracks_list.js +11 -11
  92. package/module/dj_difm_subscribe_channels_get.js +13 -13
  93. package/module/dj_hot.js +10 -10
  94. package/module/dj_paygift.js +15 -15
  95. package/module/dj_personalize_recommend.js +12 -12
  96. package/module/dj_program.js +12 -12
  97. package/module/dj_program_detail.js +9 -9
  98. package/module/dj_program_toplist.js +10 -10
  99. package/module/dj_program_toplist_hours.js +13 -13
  100. package/module/dj_radio_hot.js +11 -11
  101. package/module/dj_recommend.js +6 -6
  102. package/module/dj_recommend_type.js +32 -32
  103. package/module/dj_sub.js +10 -10
  104. package/module/dj_sublist.js +11 -11
  105. package/module/dj_subscriber.js +12 -12
  106. package/module/dj_today_perfered.js +13 -13
  107. package/module/dj_toplist.js +14 -14
  108. package/module/dj_toplist_hours.js +10 -10
  109. package/module/dj_toplist_newcomer.js +9 -9
  110. package/module/dj_toplist_pay.js +9 -9
  111. package/module/dj_toplist_popular.js +10 -10
  112. package/module/eapi_decrypt.js +27 -27
  113. package/module/event.js +10 -10
  114. package/module/event_del.js +9 -9
  115. package/module/event_forward.js +11 -11
  116. package/module/fanscenter_basicinfo_age_get.js +6 -6
  117. package/module/fanscenter_basicinfo_gender_get.js +10 -10
  118. package/module/fanscenter_basicinfo_province_get.js +10 -10
  119. package/module/fanscenter_overview_get.js +6 -6
  120. package/module/fanscenter_trend_list.js +10 -10
  121. package/module/fm_trash.js +11 -11
  122. package/module/follow.js +11 -11
  123. package/module/get_userids.js +7 -7
  124. package/module/history_recommend_songs.js +11 -11
  125. package/module/history_recommend_songs_detail.js +13 -13
  126. package/module/homepage_block_page.js +8 -8
  127. package/module/homepage_dragon_ball.js +10 -10
  128. package/module/hot_topic.js +10 -10
  129. package/module/hug_comment.js +16 -16
  130. package/module/inner_version.js +16 -16
  131. package/module/like.js +13 -13
  132. package/module/likelist.js +9 -9
  133. package/module/listen_data_realtime_report.js +11 -11
  134. package/module/listen_data_report.js +12 -12
  135. package/module/listen_data_today_song.js +9 -9
  136. package/module/listen_data_total.js +9 -9
  137. package/module/listen_data_year_report.js +9 -9
  138. package/module/listentogether_accept.js +13 -13
  139. package/module/listentogether_end.js +9 -9
  140. package/module/listentogether_heatbeat.js +12 -12
  141. package/module/listentogether_play_command.js +21 -21
  142. package/module/listentogether_room_check.js +9 -9
  143. package/module/listentogether_room_create.js +9 -9
  144. package/module/listentogether_status.js +10 -10
  145. package/module/listentogether_sync_list_command.js +26 -26
  146. package/module/listentogether_sync_playlist_get.js +13 -13
  147. package/module/login.js +41 -41
  148. package/module/login_cellphone.js +40 -40
  149. package/module/login_qr_check.js +29 -29
  150. package/module/login_qr_create.js +30 -30
  151. package/module/login_qr_key.js +19 -19
  152. package/module/login_refresh.js +21 -21
  153. package/module/login_status.js +21 -21
  154. package/module/logout.js +6 -6
  155. package/module/lyric.js +14 -14
  156. package/module/lyric_new.js +17 -17
  157. package/module/mlog_music_rcmd.js +13 -13
  158. package/module/mlog_to_video.js +13 -13
  159. package/module/mlog_url.js +11 -11
  160. package/module/msg_comments.js +17 -17
  161. package/module/msg_forwards.js +11 -11
  162. package/module/msg_notices.js +10 -10
  163. package/module/msg_private.js +11 -11
  164. package/module/msg_private_history.js +12 -12
  165. package/module/msg_recentcontact.js +11 -11
  166. package/module/music_first_listen_info.js +13 -13
  167. package/module/musician_cloudbean.js +7 -7
  168. package/module/musician_cloudbean_obtain.js +14 -14
  169. package/module/musician_data_overview.js +11 -11
  170. package/module/musician_play_trend.js +14 -14
  171. package/module/musician_sign.js +7 -7
  172. package/module/musician_tasks.js +11 -11
  173. package/module/musician_tasks_new.js +11 -11
  174. package/module/musician_vip_tasks.js +11 -11
  175. package/module/mv_all.js +16 -16
  176. package/module/mv_detail.js +9 -9
  177. package/module/mv_detail_info.js +14 -14
  178. package/module/mv_exclusive_rcmd.js +10 -10
  179. package/module/mv_first.js +12 -12
  180. package/module/mv_sub.js +11 -11
  181. package/module/mv_sublist.js +15 -15
  182. package/module/mv_url.js +14 -14
  183. package/module/nickname_check.js +7 -7
  184. package/module/personal_fm.js +6 -6
  185. package/module/personal_fm_mode.js +14 -14
  186. package/module/personalized.js +16 -16
  187. package/module/personalized_djprogram.js +10 -10
  188. package/module/personalized_mv.js +6 -6
  189. package/module/personalized_newsong.js +15 -15
  190. package/module/personalized_privatecontent.js +10 -10
  191. package/module/personalized_privatecontent_list.js +15 -15
  192. package/module/pl_count.js +6 -6
  193. package/module/playlist_category_list.js +11 -11
  194. package/module/playlist_catlist.js +6 -6
  195. package/module/playlist_cover_update.js +32 -32
  196. package/module/playlist_create.js +11 -11
  197. package/module/playlist_delete.js +9 -9
  198. package/module/playlist_desc_update.js +10 -10
  199. package/module/playlist_detail.js +11 -11
  200. package/module/playlist_detail_dynamic.js +11 -11
  201. package/module/playlist_detail_rcmd_get.js +11 -11
  202. package/module/playlist_highquality_tags.js +10 -10
  203. package/module/playlist_hot.js +6 -6
  204. package/module/playlist_import_name_task_create.js +62 -62
  205. package/module/playlist_import_task_status.js +11 -11
  206. package/module/playlist_mylike.js +12 -12
  207. package/module/playlist_name_update.js +10 -10
  208. package/module/playlist_order_update.js +13 -13
  209. package/module/playlist_privacy.js +10 -10
  210. package/module/playlist_subscribe.js +14 -14
  211. package/module/playlist_subscribers.js +11 -11
  212. package/module/playlist_tags_update.js +10 -10
  213. package/module/playlist_track_add.js +16 -16
  214. package/module/playlist_track_all.js +31 -31
  215. package/module/playlist_track_delete.js +20 -20
  216. package/module/playlist_tracks.js +45 -45
  217. package/module/playlist_update.js +13 -13
  218. package/module/playlist_update_playcount.js +9 -9
  219. package/module/playlist_video_recent.js +9 -9
  220. package/module/playmode_intelligence_list.js +13 -13
  221. package/module/playmode_song_vector.js +8 -8
  222. package/module/program_recommend.js +15 -15
  223. package/module/radio_sport_get.js +9 -0
  224. package/module/rebind.js +16 -16
  225. package/module/recent_listen_list.js +7 -7
  226. package/module/recommend_resource.js +10 -10
  227. package/module/recommend_songs.js +13 -11
  228. package/module/recommend_songs_dislike.js +14 -14
  229. package/module/record_recent_album.js +11 -11
  230. package/module/record_recent_dj.js +11 -11
  231. package/module/record_recent_playlist.js +11 -11
  232. package/module/record_recent_song.js +11 -11
  233. package/module/record_recent_video.js +11 -11
  234. package/module/record_recent_voice.js +11 -11
  235. package/module/register_anonimous.js +53 -52
  236. package/module/register_cellphone.js +15 -15
  237. package/module/related_allvideo.js +14 -14
  238. package/module/related_playlist.js +32 -32
  239. package/module/resource_like.js +14 -14
  240. package/module/sati_resource_list.js +11 -0
  241. package/module/sati_resource_list_more.js +13 -0
  242. package/module/sati_resource_sub.js +10 -0
  243. package/module/sati_resource_sub_list.js +7 -0
  244. package/module/sati_tag_list.js +7 -0
  245. package/module/sati_timescene_resources_get.js +13 -0
  246. package/module/scrobble.js +26 -26
  247. package/module/search.js +21 -21
  248. package/module/search_default.js +6 -6
  249. package/module/search_hot.js +9 -9
  250. package/module/search_hot_detail.js +6 -6
  251. package/module/search_match.js +18 -18
  252. package/module/search_multimatch.js +14 -14
  253. package/module/search_suggest.js +14 -14
  254. package/module/search_suggest_pc.js +13 -13
  255. package/module/send_album.js +12 -12
  256. package/module/send_playlist.js +12 -12
  257. package/module/send_song.js +12 -12
  258. package/module/send_text.js +11 -11
  259. package/module/setting.js +7 -7
  260. package/module/share_resource.js +11 -11
  261. package/module/sheet_list.js +9 -9
  262. package/module/sheet_preview.js +8 -8
  263. package/module/sign_happy_info.js +5 -5
  264. package/module/signin_progress.js +13 -13
  265. package/module/simi_artist.js +12 -12
  266. package/module/simi_mv.js +9 -9
  267. package/module/simi_playlist.js +15 -15
  268. package/module/simi_song.js +15 -15
  269. package/module/simi_user.js +11 -11
  270. package/module/song_chorus.js +11 -11
  271. package/module/song_copyright_rcmd.js +9 -0
  272. package/module/song_creators.js +9 -0
  273. package/module/song_detail.js +11 -11
  274. package/module/song_downlist.js +11 -11
  275. package/module/song_download_url.js +10 -10
  276. package/module/song_download_url_v1.js +13 -13
  277. package/module/song_dynamic_cover.js +9 -9
  278. package/module/song_like.js +12 -12
  279. package/module/song_like_check.js +9 -9
  280. package/module/song_lyrics_mark.js +9 -9
  281. package/module/song_lyrics_mark_add.js +12 -12
  282. package/module/song_lyrics_mark_del.js +9 -9
  283. package/module/song_lyrics_mark_user_page.js +14 -14
  284. package/module/song_monthdownlist.js +11 -11
  285. package/module/song_music_detail.js +9 -9
  286. package/module/song_order_update.js +12 -12
  287. package/module/song_purchased.js +14 -14
  288. package/module/song_red_count.js +9 -9
  289. package/module/song_singledownlist.js +11 -11
  290. package/module/song_url.js +26 -26
  291. package/module/song_url_match.js +38 -38
  292. package/module/song_url_ncmget.js +5 -5
  293. package/module/song_url_v1.js +57 -57
  294. package/module/song_url_v1_302.js +53 -53
  295. package/module/song_wiki_summary.js +8 -8
  296. package/module/starpick_comments_summary.js +12 -12
  297. package/module/style_album.js +16 -16
  298. package/module/style_artist.js +16 -16
  299. package/module/style_detail.js +9 -9
  300. package/module/style_list.js +7 -7
  301. package/module/style_playlist.js +16 -16
  302. package/module/style_preference.js +11 -11
  303. package/module/style_song.js +12 -12
  304. package/module/summary_annual.js +12 -12
  305. package/module/threshold_detail_get.js +10 -10
  306. package/module/top_album.js +22 -22
  307. package/module/top_artists.js +11 -11
  308. package/module/top_list.js +20 -20
  309. package/module/top_mv.js +12 -12
  310. package/module/top_playlist.js +22 -22
  311. package/module/top_playlist_highquality.js +16 -16
  312. package/module/top_song.js +16 -16
  313. package/module/topic_detail.js +7 -7
  314. package/module/topic_detail_event_hot.js +7 -7
  315. package/module/topic_sublist.js +11 -11
  316. package/module/toplist.js +6 -6
  317. package/module/toplist_artist.js +12 -12
  318. package/module/toplist_detail.js +6 -6
  319. package/module/toplist_detail_v2.js +6 -6
  320. package/module/ugc_album_get.js +8 -8
  321. package/module/ugc_artist_get.js +8 -8
  322. package/module/ugc_artist_search.js +10 -10
  323. package/module/ugc_detail.js +17 -17
  324. package/module/ugc_mv_get.js +8 -8
  325. package/module/ugc_song_get.js +8 -8
  326. package/module/ugc_user_devote.js +6 -6
  327. package/module/user_account.js +5 -5
  328. package/module/user_audio.js +9 -9
  329. package/module/user_binding.js +9 -9
  330. package/module/user_bindingcellphone.js +15 -15
  331. package/module/user_cloud.js +10 -10
  332. package/module/user_cloud_del.js +9 -9
  333. package/module/user_cloud_detail.js +10 -10
  334. package/module/user_comment_history.js +15 -15
  335. package/module/user_detail.js +15 -15
  336. package/module/user_detail_new.js +20 -20
  337. package/module/user_dj.js +14 -14
  338. package/module/user_event.js +12 -12
  339. package/module/user_follow_mixed.js +23 -23
  340. package/module/user_followeds.js +17 -17
  341. package/module/user_follows.js +15 -15
  342. package/module/user_level.js +7 -7
  343. package/module/user_medal.js +11 -11
  344. package/module/user_mutualfollow_get.js +9 -9
  345. package/module/user_playlist.js +12 -12
  346. package/module/user_playlist_collect.js +14 -14
  347. package/module/user_playlist_create.js +14 -14
  348. package/module/user_record.js +10 -10
  349. package/module/user_replacephone.js +14 -14
  350. package/module/user_social_status.js +11 -11
  351. package/module/user_social_status_edit.js +16 -16
  352. package/module/user_social_status_rcmd.js +5 -5
  353. package/module/user_social_status_support.js +5 -5
  354. package/module/user_subcount.js +6 -6
  355. package/module/user_update.js +15 -15
  356. package/module/verify_getQr.js +39 -39
  357. package/module/verify_qrcodestatus.js +12 -12
  358. package/module/video_category_list.js +15 -15
  359. package/module/video_detail.js +13 -13
  360. package/module/video_detail_info.js +14 -14
  361. package/module/video_group.js +16 -16
  362. package/module/video_group_list.js +11 -11
  363. package/module/video_sub.js +14 -14
  364. package/module/video_timeline_all.js +17 -17
  365. package/module/video_timeline_recommend.js +13 -13
  366. package/module/video_url.js +10 -10
  367. package/module/vip_growthpoint.js +11 -11
  368. package/module/vip_growthpoint_details.js +14 -14
  369. package/module/vip_growthpoint_get.js +13 -13
  370. package/module/vip_info.js +12 -12
  371. package/module/vip_info_v2.js +12 -12
  372. package/module/vip_sign.js +7 -11
  373. package/module/vip_sign_info.js +11 -11
  374. package/module/vip_tasks.js +11 -11
  375. package/module/vip_timemachine.js +17 -17
  376. package/module/voice_delete.js +7 -7
  377. package/module/voice_detail.js +7 -7
  378. package/module/voice_lyric.js +7 -7
  379. package/module/voice_upload.js +200 -200
  380. package/module/voicelist_detail.js +11 -11
  381. package/module/voicelist_list.js +13 -13
  382. package/module/voicelist_list_search.js +14 -14
  383. package/module/voicelist_my_created.js +13 -13
  384. package/module/voicelist_search.js +11 -11
  385. package/module/voicelist_trans.js +15 -15
  386. package/module/weblog.js +10 -10
  387. package/module/yunbei.js +6 -6
  388. package/module/yunbei_expense.js +8 -8
  389. package/module/yunbei_info.js +5 -5
  390. package/module/yunbei_rcmd_song.js +17 -17
  391. package/module/yunbei_rcmd_song_history.js +16 -16
  392. package/module/yunbei_receipt.js +8 -8
  393. package/module/yunbei_sign.js +5 -5
  394. package/module/yunbei_task_finish.js +12 -12
  395. package/module/yunbei_tasks.js +9 -9
  396. package/module/yunbei_tasks_todo.js +9 -9
  397. package/module/yunbei_today.js +5 -5
  398. package/package.json +8 -8
  399. package/plugins/songUpload.js +109 -109
  400. package/plugins/upload.js +35 -35
  401. package/public/api.html +222 -193
  402. package/public/audio_match_demo/afp.js +1626 -1626
  403. package/public/audio_match_demo/afp.wasm.js +5 -5
  404. package/public/audio_match_demo/index.html +367 -367
  405. package/public/audio_match_demo/rec.js +49 -49
  406. package/public/avatar_update.html +326 -326
  407. package/public/cloud.html +578 -578
  408. package/public/docs/_coverpage.md +13 -13
  409. package/public/docs/home.md +5318 -5218
  410. package/public/docs/index.html +129 -47
  411. package/public/docs/logo.svg +6 -6
  412. package/public/docs/netease.png +0 -0
  413. package/public/docs/sw.js +90 -90
  414. package/public/eapi_decrypt.html +264 -226
  415. package/public/home.html +40 -40
  416. package/public/index.html +124 -124
  417. package/public/listen_together_host.html +552 -552
  418. package/public/login.html +219 -219
  419. package/public/playlist_cover_update.html +323 -323
  420. package/public/playlist_import.html +416 -416
  421. package/public/qrlogin-nocookie.html +199 -199
  422. package/public/qrlogin.html +199 -199
  423. package/public/static/2169.png +0 -0
  424. package/public/static/neteaselogo.png +0 -0
  425. package/public/unblock_test.html +153 -153
  426. package/public/voice_upload.html +326 -326
  427. package/server.js +454 -435
  428. package/util/apicache.js +836 -836
  429. package/util/client-sign.js +169 -169
  430. package/util/config.json +20 -20
  431. package/util/crypto.js +153 -135
  432. package/util/fileHelper.js +88 -88
  433. package/util/index.js +233 -233
  434. package/util/logger.js +42 -42
  435. package/util/memory-cache.js +71 -71
  436. package/util/option.js +14 -14
  437. package/util/request.js +367 -368
  438. package/module/comment_add.js +0 -15
  439. package/module/comment_reply.js +0 -13
@@ -1,169 +1,169 @@
1
- const crypto = require('crypto')
2
- const os = require('os')
3
-
4
- class AdvancedClientSignGenerator {
5
- /**
6
- * 获取本机MAC地址
7
- */
8
- static getRealMacAddress() {
9
- try {
10
- const interfaces = os.networkInterfaces()
11
- for (let interfaceName in interfaces) {
12
- const interfaceItem = interfaces[interfaceName]
13
- for (let i = 0; i < interfaceItem.length; i++) {
14
- const alias = interfaceItem[i]
15
- // 排除内部地址和无效地址
16
- if (
17
- alias.mac &&
18
- alias.mac !== '00:00:00:00:00:00' &&
19
- !alias.internal
20
- ) {
21
- return alias.mac.toUpperCase()
22
- }
23
- }
24
- }
25
- return null
26
- } catch (error) {
27
- console.warn('获取MAC地址失败:', error.message)
28
- return null
29
- }
30
- }
31
-
32
- /**
33
- * 生成随机MAC地址
34
- */
35
- static generateRandomMac() {
36
- const chars = '0123456789ABCDEF'
37
- let mac = ''
38
- for (let i = 0; i < 6; i++) {
39
- if (i > 0) mac += ':'
40
- mac +=
41
- chars[Math.floor(Math.random() * 16)] +
42
- chars[Math.floor(Math.random() * 16)]
43
- }
44
- // 确保第一个字节是单播地址(最低位为0)
45
- const firstByte = parseInt(mac.substring(0, 2), 16)
46
- const unicastFirstByte = (firstByte & 0xfe)
47
- .toString(16)
48
- .padStart(2, '0')
49
- .toUpperCase()
50
- return unicastFirstByte + mac.substring(2)
51
- }
52
-
53
- /**
54
- * 获取MAC地址(优先真实,否则随机)
55
- */
56
- static getMacAddress() {
57
- const realMac = this.getRealMacAddress()
58
- if (realMac) {
59
- return realMac
60
- }
61
- console.warn('无法获取真实MAC地址,使用随机生成')
62
- return this.generateRandomMac()
63
- }
64
-
65
- /**
66
- * 字符串转HEX编码
67
- */
68
- static stringToHex(str) {
69
- return Buffer.from(str, 'utf8').toString('hex').toUpperCase()
70
- }
71
-
72
- /**
73
- * SHA-256哈希
74
- */
75
- static sha256(data) {
76
- return crypto.createHash('sha256').update(data, 'utf8').digest('hex')
77
- }
78
-
79
- /**
80
- * 生成随机设备ID
81
- */
82
- static generateRandomDeviceId() {
83
- const partLengths = [4, 4, 4, 4, 4, 4, 4, 5] // 各部分长度
84
- const chars = '0123456789ABCDEF'
85
-
86
- const parts = partLengths.map((length) => {
87
- let part = ''
88
- for (let i = 0; i < length; i++) {
89
- part += chars[Math.floor(Math.random() * 16)]
90
- }
91
- return part
92
- })
93
-
94
- return parts.join('_')
95
- }
96
-
97
- /**
98
- * 生成随机clientSign(优先使用真实MAC,否则随机)
99
- */
100
- static generateRandomClientSign(secretKey = '') {
101
- // 获取MAC地址(优先真实,否则随机)
102
- const macAddress = this.getMacAddress()
103
-
104
- // 生成随机设备ID
105
- const deviceId = this.generateRandomDeviceId()
106
-
107
- // 转换设备ID为HEX
108
- const hexDeviceId = this.stringToHex(deviceId)
109
-
110
- // 构造签名字符串
111
- const signString = `${macAddress}@@@${hexDeviceId}`
112
-
113
- // 生成哈希
114
- const hash = this.sha256(signString + secretKey)
115
-
116
- return `${signString}@@@@@@${hash}`
117
- }
118
-
119
- /**
120
- * 批量生成多个随机签名
121
- */
122
- static generateMultipleRandomSigns(count, secretKey = '') {
123
- const signs = []
124
- for (let i = 0; i < count; i++) {
125
- signs.push(this.generateRandomClientSign(secretKey))
126
- }
127
- return signs
128
- }
129
-
130
- /**
131
- * 使用指定参数生成签名
132
- */
133
- static generateWithCustomDeviceId(macAddress, deviceId, secretKey = '') {
134
- const hexDeviceId = this.stringToHex(deviceId)
135
- const signString = `${macAddress}@@@${hexDeviceId}`
136
- const hash = this.sha256(signString + secretKey)
137
- return `${signString}@@@@@@${hash}`
138
- }
139
-
140
- /**
141
- * 验证签名格式是否正确
142
- */
143
- static validateClientSign(clientSign) {
144
- try {
145
- const parts = clientSign.split('@@@@@@')
146
- if (parts.length !== 2) return false
147
-
148
- const [infoPart, hash] = parts
149
- const infoParts = infoPart.split('@@@')
150
- if (infoParts.length !== 2) return false
151
-
152
- const [mac, hexDeviceId] = infoParts
153
-
154
- // 验证MAC地址格式
155
- const macRegex = /^([0-9A-F]{2}:){5}[0-9A-F]{2}$/
156
- if (!macRegex.test(mac)) return false
157
-
158
- // 验证哈希格式
159
- const hashRegex = /^[0-9a-f]{64}$/
160
- if (!hashRegex.test(hash)) return false
161
-
162
- return true
163
- } catch (error) {
164
- return false
165
- }
166
- }
167
- }
168
-
169
- module.exports = AdvancedClientSignGenerator
1
+ const crypto = require('crypto')
2
+ const os = require('os')
3
+
4
+ class AdvancedClientSignGenerator {
5
+ /**
6
+ * 获取本机MAC地址
7
+ */
8
+ static getRealMacAddress() {
9
+ try {
10
+ const interfaces = os.networkInterfaces()
11
+ for (let interfaceName in interfaces) {
12
+ const interfaceItem = interfaces[interfaceName]
13
+ for (let i = 0; i < interfaceItem.length; i++) {
14
+ const alias = interfaceItem[i]
15
+ // 排除内部地址和无效地址
16
+ if (
17
+ alias.mac &&
18
+ alias.mac !== '00:00:00:00:00:00' &&
19
+ !alias.internal
20
+ ) {
21
+ return alias.mac.toUpperCase()
22
+ }
23
+ }
24
+ }
25
+ return null
26
+ } catch (error) {
27
+ console.warn('获取MAC地址失败:', error.message)
28
+ return null
29
+ }
30
+ }
31
+
32
+ /**
33
+ * 生成随机MAC地址
34
+ */
35
+ static generateRandomMac() {
36
+ const chars = '0123456789ABCDEF'
37
+ let mac = ''
38
+ for (let i = 0; i < 6; i++) {
39
+ if (i > 0) mac += ':'
40
+ mac +=
41
+ chars[Math.floor(Math.random() * 16)] +
42
+ chars[Math.floor(Math.random() * 16)]
43
+ }
44
+ // 确保第一个字节是单播地址(最低位为0)
45
+ const firstByte = parseInt(mac.substring(0, 2), 16)
46
+ const unicastFirstByte = (firstByte & 0xfe)
47
+ .toString(16)
48
+ .padStart(2, '0')
49
+ .toUpperCase()
50
+ return unicastFirstByte + mac.substring(2)
51
+ }
52
+
53
+ /**
54
+ * 获取MAC地址(优先真实,否则随机)
55
+ */
56
+ static getMacAddress() {
57
+ const realMac = this.getRealMacAddress()
58
+ if (realMac) {
59
+ return realMac
60
+ }
61
+ console.warn('无法获取真实MAC地址,使用随机生成')
62
+ return this.generateRandomMac()
63
+ }
64
+
65
+ /**
66
+ * 字符串转HEX编码
67
+ */
68
+ static stringToHex(str) {
69
+ return Buffer.from(str, 'utf8').toString('hex').toUpperCase()
70
+ }
71
+
72
+ /**
73
+ * SHA-256哈希
74
+ */
75
+ static sha256(data) {
76
+ return crypto.createHash('sha256').update(data, 'utf8').digest('hex')
77
+ }
78
+
79
+ /**
80
+ * 生成随机设备ID
81
+ */
82
+ static generateRandomDeviceId() {
83
+ const partLengths = [4, 4, 4, 4, 4, 4, 4, 5] // 各部分长度
84
+ const chars = '0123456789ABCDEF'
85
+
86
+ const parts = partLengths.map((length) => {
87
+ let part = ''
88
+ for (let i = 0; i < length; i++) {
89
+ part += chars[Math.floor(Math.random() * 16)]
90
+ }
91
+ return part
92
+ })
93
+
94
+ return parts.join('_')
95
+ }
96
+
97
+ /**
98
+ * 生成随机clientSign(优先使用真实MAC,否则随机)
99
+ */
100
+ static generateRandomClientSign(secretKey = '') {
101
+ // 获取MAC地址(优先真实,否则随机)
102
+ const macAddress = this.getMacAddress()
103
+
104
+ // 生成随机设备ID
105
+ const deviceId = this.generateRandomDeviceId()
106
+
107
+ // 转换设备ID为HEX
108
+ const hexDeviceId = this.stringToHex(deviceId)
109
+
110
+ // 构造签名字符串
111
+ const signString = `${macAddress}@@@${hexDeviceId}`
112
+
113
+ // 生成哈希
114
+ const hash = this.sha256(signString + secretKey)
115
+
116
+ return `${signString}@@@@@@${hash}`
117
+ }
118
+
119
+ /**
120
+ * 批量生成多个随机签名
121
+ */
122
+ static generateMultipleRandomSigns(count, secretKey = '') {
123
+ const signs = []
124
+ for (let i = 0; i < count; i++) {
125
+ signs.push(this.generateRandomClientSign(secretKey))
126
+ }
127
+ return signs
128
+ }
129
+
130
+ /**
131
+ * 使用指定参数生成签名
132
+ */
133
+ static generateWithCustomDeviceId(macAddress, deviceId, secretKey = '') {
134
+ const hexDeviceId = this.stringToHex(deviceId)
135
+ const signString = `${macAddress}@@@${hexDeviceId}`
136
+ const hash = this.sha256(signString + secretKey)
137
+ return `${signString}@@@@@@${hash}`
138
+ }
139
+
140
+ /**
141
+ * 验证签名格式是否正确
142
+ */
143
+ static validateClientSign(clientSign) {
144
+ try {
145
+ const parts = clientSign.split('@@@@@@')
146
+ if (parts.length !== 2) return false
147
+
148
+ const [infoPart, hash] = parts
149
+ const infoParts = infoPart.split('@@@')
150
+ if (infoParts.length !== 2) return false
151
+
152
+ const [mac, hexDeviceId] = infoParts
153
+
154
+ // 验证MAC地址格式
155
+ const macRegex = /^([0-9A-F]{2}:){5}[0-9A-F]{2}$/
156
+ if (!macRegex.test(mac)) return false
157
+
158
+ // 验证哈希格式
159
+ const hashRegex = /^[0-9a-f]{64}$/
160
+ if (!hashRegex.test(hash)) return false
161
+
162
+ return true
163
+ } catch (error) {
164
+ return false
165
+ }
166
+ }
167
+ }
168
+
169
+ module.exports = AdvancedClientSignGenerator
package/util/config.json CHANGED
@@ -1,20 +1,20 @@
1
- {
2
- "resourceTypeMap": {
3
- "0": "R_SO_4_",
4
- "1": "R_MV_5_",
5
- "2": "A_PL_0_",
6
- "3": "R_AL_3_",
7
- "4": "A_DJ_1_",
8
- "5": "R_VI_62_",
9
- "6": "A_EV_2_",
10
- "7": "A_DR_14_"
11
- },
12
- "APP_CONF": {
13
- "apiDomain": "https://interface.music.163.com",
14
- "domain": "https://music.163.com",
15
- "encrypt": true,
16
- "encryptResponse": false,
17
- "clientSign": "18:C0:4D:B9:8F:FE@@@453832335F384641365F424635335F303030315F303031425F343434415F343643365F333638332@@@@@@6ff673ef74955b38bce2fa8562d95c976ed4758b1227c4e9ee345987cee17bc9",
18
- "checkToken": "9ca17ae2e6ffcda170e2e6ee8af14fbabdb988f225b3868eb2c15a879b9a83d274a790ac8ff54a97b889d5d42af0feaec3b92af58cff99c470a7eafd88f75e839a9ea7c14e909da883e83fb692a3abdb6b92adee9e"
19
- }
20
- }
1
+ {
2
+ "resourceTypeMap": {
3
+ "0": "R_SO_4_",
4
+ "1": "R_MV_5_",
5
+ "2": "A_PL_0_",
6
+ "3": "R_AL_3_",
7
+ "4": "A_DJ_1_",
8
+ "5": "R_VI_62_",
9
+ "6": "A_EV_2_",
10
+ "7": "A_DR_14_"
11
+ },
12
+ "APP_CONF": {
13
+ "apiDomain": "https://interface.music.163.com",
14
+ "domain": "https://music.163.com",
15
+ "encrypt": true,
16
+ "encryptResponse": false,
17
+ "clientSign": "18:C0:4D:B9:8F:FE@@@453832335F384641365F424635335F303030315F303031425F343434415F343643365F333638332@@@@@@6ff673ef74955b38bce2fa8562d95c976ed4758b1227c4e9ee345987cee17bc9",
18
+ "checkToken": "9ca17ae2e6ffcda170e2e6ee8af14fbabdb988f225b3868eb2c15a879b9a83d274a790ac8ff54a97b889d5d42af0feaec3b92af58cff99c470a7eafd88f75e839a9ea7c14e909da883e83fb692a3abdb6b92adee9e"
19
+ }
20
+ }
package/util/crypto.js CHANGED
@@ -1,135 +1,153 @@
1
- const CryptoJS = require('crypto-js')
2
- const forge = require('node-forge')
3
- const iv = '0102030405060708'
4
- const presetKey = '0CoJUm6Qyw8W8jud'
5
- const linuxapiKey = 'rFgB&h#%2?^eDg:Q'
6
- const base62 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
7
- const publicKey = `-----BEGIN PUBLIC KEY-----
8
- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgtQn2JZ34ZC28NWYpAUd98iZ37BUrX/aKzmFbt7clFSs6sXqHauqKWqdtLkF2KexO40H1YTX8z2lSgBBOAxLsvaklV8k4cBFK9snQXE9/DDaFt6Rr7iVZMldczhC0JNgTz+SHXT6CBHuX3e9SdB1Ua44oncaTWz7OBGLbCiK45wIDAQAB
9
- -----END PUBLIC KEY-----`
10
- const eapiKey = 'e82ckenh8dichen8'
11
-
12
- const aesEncrypt = (text, mode, key, iv, format = 'base64') => {
13
- let encrypted = CryptoJS.AES.encrypt(
14
- CryptoJS.enc.Utf8.parse(text),
15
- CryptoJS.enc.Utf8.parse(key),
16
- {
17
- iv: CryptoJS.enc.Utf8.parse(iv),
18
- mode: CryptoJS.mode[mode.toUpperCase()],
19
- padding: CryptoJS.pad.Pkcs7,
20
- },
21
- )
22
- if (format === 'base64') {
23
- return encrypted.toString()
24
- }
25
-
26
- return encrypted.ciphertext.toString().toUpperCase()
27
- }
28
- const aesDecrypt = (ciphertext, key, iv, format = 'base64') => {
29
- let bytes
30
- if (format === 'base64') {
31
- bytes = CryptoJS.AES.decrypt(ciphertext, CryptoJS.enc.Utf8.parse(key), {
32
- iv: CryptoJS.enc.Utf8.parse(iv),
33
- mode: CryptoJS.mode.ECB,
34
- padding: CryptoJS.pad.Pkcs7,
35
- })
36
- } else {
37
- bytes = CryptoJS.AES.decrypt(
38
- { ciphertext: CryptoJS.enc.Hex.parse(ciphertext) },
39
- CryptoJS.enc.Utf8.parse(key),
40
- {
41
- iv: CryptoJS.enc.Utf8.parse(iv),
42
- mode: CryptoJS.mode.ECB,
43
- padding: CryptoJS.pad.Pkcs7,
44
- },
45
- )
46
- }
47
- return bytes.toString(CryptoJS.enc.Utf8)
48
- }
49
- const rsaEncrypt = (str, key) => {
50
- const forgePublicKey = forge.pki.publicKeyFromPem(key)
51
- const encrypted = forgePublicKey.encrypt(str, 'NONE')
52
- return forge.util.bytesToHex(encrypted)
53
- }
54
-
55
- const weapi = (object) => {
56
- const text = JSON.stringify(object)
57
- let secretKey = ''
58
- for (let i = 0; i < 16; i++) {
59
- secretKey += base62.charAt(Math.round(Math.random() * 61))
60
- }
61
- return {
62
- params: aesEncrypt(
63
- aesEncrypt(text, 'cbc', presetKey, iv),
64
- 'cbc',
65
- secretKey,
66
- iv,
67
- ),
68
- encSecKey: rsaEncrypt(secretKey.split('').reverse().join(''), publicKey),
69
- }
70
- }
71
-
72
- const linuxapi = (object) => {
73
- const text = JSON.stringify(object)
74
- return {
75
- eparams: aesEncrypt(text, 'ecb', linuxapiKey, '', 'hex'),
76
- }
77
- }
78
-
79
- const eapi = (url, object) => {
80
- const text = typeof object === 'object' ? JSON.stringify(object) : object
81
- const message = `nobody${url}use${text}md5forencrypt`
82
- const digest = CryptoJS.MD5(message).toString()
83
- const data = `${url}-36cd479b6b5-${text}-36cd479b6b5-${digest}`
84
- return {
85
- params: aesEncrypt(data, 'ecb', eapiKey, '', 'hex'),
86
- }
87
- }
88
- const eapiResDecrypt = (encryptedParams) => {
89
- // 使用aesDecrypt解密参数
90
- try {
91
- const decryptedData = aesDecrypt(encryptedParams, eapiKey, '', 'hex')
92
- return JSON.parse(decryptedData)
93
- } catch (error) {
94
- console.log('eapiResDecrypt error:', error)
95
- return null
96
- }
97
- }
98
- const eapiReqDecrypt = (encryptedParams) => {
99
- // 使用aesDecrypt解密参数
100
- const decryptedData = aesDecrypt(encryptedParams, eapiKey, '', 'hex')
101
- // 使用正则表达式解析出URL和数据
102
- const match = decryptedData.match(/(.*?)-36cd479b6b5-(.*?)-36cd479b6b5-(.*)/)
103
- if (match) {
104
- const url = match[1]
105
- const data = JSON.parse(match[2])
106
- return { url, data }
107
- }
108
-
109
- // 如果没有匹配到,返回null
110
- return null
111
- }
112
- const decrypt = (cipher) => {
113
- const decipher = CryptoJS.AES.decrypt(
114
- {
115
- ciphertext: CryptoJS.enc.Hex.parse(cipher),
116
- },
117
- eapiKey,
118
- {
119
- mode: CryptoJS.mode.ECB,
120
- },
121
- )
122
- const decryptedBytes = CryptoJS.enc.Utf8.stringify(decipher)
123
- return decryptedBytes
124
- }
125
-
126
- module.exports = {
127
- weapi,
128
- linuxapi,
129
- eapi,
130
- decrypt,
131
- aesEncrypt,
132
- aesDecrypt,
133
- eapiReqDecrypt,
134
- eapiResDecrypt,
135
- }
1
+ const CryptoJS = require('crypto-js')
2
+ const forge = require('node-forge')
3
+ const zlib = require('zlib')
4
+ const iv = '0102030405060708'
5
+ const presetKey = '0CoJUm6Qyw8W8jud'
6
+ const linuxapiKey = 'rFgB&h#%2?^eDg:Q'
7
+ const base62 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
8
+ const publicKey = `-----BEGIN PUBLIC KEY-----
9
+ MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgtQn2JZ34ZC28NWYpAUd98iZ37BUrX/aKzmFbt7clFSs6sXqHauqKWqdtLkF2KexO40H1YTX8z2lSgBBOAxLsvaklV8k4cBFK9snQXE9/DDaFt6Rr7iVZMldczhC0JNgTz+SHXT6CBHuX3e9SdB1Ua44oncaTWz7OBGLbCiK45wIDAQAB
10
+ -----END PUBLIC KEY-----`
11
+ const eapiKey = 'e82ckenh8dichen8'
12
+
13
+ const aesEncrypt = (text, mode, key, iv, format = 'base64') => {
14
+ let encrypted = CryptoJS.AES.encrypt(
15
+ CryptoJS.enc.Utf8.parse(text),
16
+ CryptoJS.enc.Utf8.parse(key),
17
+ {
18
+ iv: CryptoJS.enc.Utf8.parse(iv),
19
+ mode: CryptoJS.mode[mode.toUpperCase()],
20
+ padding: CryptoJS.pad.Pkcs7,
21
+ },
22
+ )
23
+ if (format === 'base64') {
24
+ return encrypted.toString()
25
+ }
26
+
27
+ return encrypted.ciphertext.toString().toUpperCase()
28
+ }
29
+ const aesDecrypt = (ciphertext, key, iv, format = 'base64') => {
30
+ let bytes
31
+ if (format === 'base64') {
32
+ bytes = CryptoJS.AES.decrypt(ciphertext, CryptoJS.enc.Utf8.parse(key), {
33
+ iv: CryptoJS.enc.Utf8.parse(iv),
34
+ mode: CryptoJS.mode.ECB,
35
+ padding: CryptoJS.pad.Pkcs7,
36
+ })
37
+ } else {
38
+ bytes = CryptoJS.AES.decrypt(
39
+ { ciphertext: CryptoJS.enc.Hex.parse(ciphertext) },
40
+ CryptoJS.enc.Utf8.parse(key),
41
+ {
42
+ iv: CryptoJS.enc.Utf8.parse(iv),
43
+ mode: CryptoJS.mode.ECB,
44
+ padding: CryptoJS.pad.Pkcs7,
45
+ },
46
+ )
47
+ }
48
+ return bytes
49
+ }
50
+ const rsaEncrypt = (str, key) => {
51
+ const forgePublicKey = forge.pki.publicKeyFromPem(key)
52
+ const encrypted = forgePublicKey.encrypt(str, 'NONE')
53
+ return forge.util.bytesToHex(encrypted)
54
+ }
55
+
56
+ const weapi = (object) => {
57
+ const text = JSON.stringify(object)
58
+ let secretKey = ''
59
+ for (let i = 0; i < 16; i++) {
60
+ secretKey += base62.charAt(Math.round(Math.random() * 61))
61
+ }
62
+ return {
63
+ params: aesEncrypt(
64
+ aesEncrypt(text, 'cbc', presetKey, iv),
65
+ 'cbc',
66
+ secretKey,
67
+ iv,
68
+ ),
69
+ encSecKey: rsaEncrypt(secretKey.split('').reverse().join(''), publicKey),
70
+ }
71
+ }
72
+
73
+ const linuxapi = (object) => {
74
+ const text = JSON.stringify(object)
75
+ return {
76
+ eparams: aesEncrypt(text, 'ecb', linuxapiKey, '', 'hex'),
77
+ }
78
+ }
79
+
80
+ const eapi = (url, object) => {
81
+ const text = typeof object === 'object' ? JSON.stringify(object) : object
82
+ const message = `nobody${url}use${text}md5forencrypt`
83
+ const digest = CryptoJS.MD5(message).toString()
84
+ const data = `${url}-36cd479b6b5-${text}-36cd479b6b5-${digest}`
85
+ return {
86
+ params: aesEncrypt(data, 'ecb', eapiKey, '', 'hex'),
87
+ }
88
+ }
89
+ const eapiResDecrypt = (encryptedParams, aeapi = false) => {
90
+ // 使用aesDecrypt解密参数
91
+ try {
92
+ const decrypted = aesDecrypt(encryptedParams, eapiKey, '', 'hex') // WordArray
93
+
94
+ if (aeapi) {
95
+ // 带压缩的解密:先转 Base64 再解压
96
+ const decryptedBuffer = Buffer.from(
97
+ decrypted.toString(CryptoJS.enc.Base64),
98
+ 'base64',
99
+ )
100
+ const decompressed = zlib.gunzipSync(decryptedBuffer)
101
+ return JSON.parse(decompressed.toString())
102
+ } else {
103
+ // 普通解密:直接转 UTF-8 字符串
104
+ return JSON.parse(decrypted.toString(CryptoJS.enc.Utf8))
105
+ }
106
+ } catch (error) {
107
+ console.log(`eapiResDecrypt error:`, error)
108
+ return null
109
+ }
110
+ }
111
+ const eapiReqDecrypt = (encryptedParams) => {
112
+ // 使用 aesDecrypt 解密参数
113
+ const decryptedData = aesDecrypt(
114
+ encryptedParams,
115
+ eapiKey,
116
+ '',
117
+ 'hex',
118
+ ).toString(CryptoJS.enc.Utf8)
119
+ // 使用正则表达式解析出 URL 和数据
120
+ const match = decryptedData.match(/(.*?)-36cd479b6b5-(.*?)-36cd479b6b5-(.*)/)
121
+ if (match) {
122
+ const url = match[1]
123
+ const data = JSON.parse(match[2])
124
+ return { url, data }
125
+ }
126
+
127
+ // 如果没有匹配到,返回 null
128
+ return null
129
+ }
130
+ const decrypt = (cipher) => {
131
+ const decipher = CryptoJS.AES.decrypt(
132
+ {
133
+ ciphertext: CryptoJS.enc.Hex.parse(cipher),
134
+ },
135
+ eapiKey,
136
+ {
137
+ mode: CryptoJS.mode.ECB,
138
+ },
139
+ )
140
+ const decryptedBytes = CryptoJS.enc.Utf8.stringify(decipher)
141
+ return decryptedBytes
142
+ }
143
+
144
+ module.exports = {
145
+ weapi,
146
+ linuxapi,
147
+ eapi,
148
+ decrypt,
149
+ aesEncrypt,
150
+ aesDecrypt,
151
+ eapiReqDecrypt,
152
+ eapiResDecrypt,
153
+ }