@neteasecloudmusicapienhanced/api 4.32.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 -9
  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 -53
  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 -11
  241. package/module/sati_resource_list_more.js +13 -13
  242. package/module/sati_resource_sub.js +10 -10
  243. package/module/sati_resource_sub_list.js +7 -7
  244. package/module/sati_tag_list.js +7 -7
  245. package/module/sati_timescene_resources_get.js +13 -13
  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 -9
  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 -222
  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 -5325
  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 -264
  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 -454
  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 -153
  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 -367
  438. package/module/comment_add.js +0 -15
  439. package/module/comment_reply.js +0 -13
package/util/crypto.js CHANGED
@@ -1,153 +1,153 @@
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
- }
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
+ }
@@ -1,88 +1,88 @@
1
- const fs = require('fs')
2
- const crypto = require('crypto')
3
- const logger = require('./logger')
4
-
5
- function isTempFile(file) {
6
- return !!(file && file.tempFilePath)
7
- }
8
-
9
- async function getFileSize(file) {
10
- if (isTempFile(file)) {
11
- const stats = await fs.promises.stat(file.tempFilePath)
12
- return stats.size
13
- }
14
- return file.data ? file.data.byteLength : file.size || 0
15
- }
16
-
17
- async function getFileMd5(file) {
18
- if (file.md5) {
19
- return file.md5
20
- }
21
-
22
- if (isTempFile(file)) {
23
- return new Promise((resolve, reject) => {
24
- const hash = crypto.createHash('md5')
25
- const stream = fs.createReadStream(file.tempFilePath)
26
- stream.on('data', (chunk) => hash.update(chunk))
27
- stream.on('end', () => resolve(hash.digest('hex')))
28
- stream.on('error', reject)
29
- })
30
- }
31
-
32
- if (file.data) {
33
- return crypto.createHash('md5').update(file.data).digest('hex')
34
- }
35
-
36
- throw new Error('无法计算文件MD5: 缺少文件数据')
37
- }
38
-
39
- function getUploadData(file) {
40
- if (isTempFile(file)) {
41
- return fs.createReadStream(file.tempFilePath)
42
- }
43
- return file.data
44
- }
45
-
46
- async function cleanupTempFile(filePath) {
47
- if (!filePath) return
48
- try {
49
- await fs.promises.unlink(filePath)
50
- } catch (e) {
51
- logger.info('临时文件清理失败:', e.message)
52
- }
53
- }
54
-
55
- async function readFileChunk(filePath, offset, length) {
56
- const fd = await fs.promises.open(filePath, 'r')
57
- const buffer = Buffer.alloc(length)
58
- await fd.read(buffer, 0, length, offset)
59
- await fd.close()
60
- return buffer
61
- }
62
-
63
- function getFileExtension(filename) {
64
- if (!filename) return 'mp3'
65
- if (filename.includes('.')) {
66
- return filename.split('.').pop().toLowerCase()
67
- }
68
- return 'mp3'
69
- }
70
-
71
- function sanitizeFilename(filename) {
72
- if (!filename) return 'unknown'
73
- return filename
74
- .replace(/\.[^.]+$/, '')
75
- .replace(/\s/g, '')
76
- .replace(/\./g, '_')
77
- }
78
-
79
- module.exports = {
80
- isTempFile,
81
- getFileSize,
82
- getFileMd5,
83
- getUploadData,
84
- cleanupTempFile,
85
- readFileChunk,
86
- getFileExtension,
87
- sanitizeFilename,
88
- }
1
+ const fs = require('fs')
2
+ const crypto = require('crypto')
3
+ const logger = require('./logger')
4
+
5
+ function isTempFile(file) {
6
+ return !!(file && file.tempFilePath)
7
+ }
8
+
9
+ async function getFileSize(file) {
10
+ if (isTempFile(file)) {
11
+ const stats = await fs.promises.stat(file.tempFilePath)
12
+ return stats.size
13
+ }
14
+ return file.data ? file.data.byteLength : file.size || 0
15
+ }
16
+
17
+ async function getFileMd5(file) {
18
+ if (file.md5) {
19
+ return file.md5
20
+ }
21
+
22
+ if (isTempFile(file)) {
23
+ return new Promise((resolve, reject) => {
24
+ const hash = crypto.createHash('md5')
25
+ const stream = fs.createReadStream(file.tempFilePath)
26
+ stream.on('data', (chunk) => hash.update(chunk))
27
+ stream.on('end', () => resolve(hash.digest('hex')))
28
+ stream.on('error', reject)
29
+ })
30
+ }
31
+
32
+ if (file.data) {
33
+ return crypto.createHash('md5').update(file.data).digest('hex')
34
+ }
35
+
36
+ throw new Error('无法计算文件MD5: 缺少文件数据')
37
+ }
38
+
39
+ function getUploadData(file) {
40
+ if (isTempFile(file)) {
41
+ return fs.createReadStream(file.tempFilePath)
42
+ }
43
+ return file.data
44
+ }
45
+
46
+ async function cleanupTempFile(filePath) {
47
+ if (!filePath) return
48
+ try {
49
+ await fs.promises.unlink(filePath)
50
+ } catch (e) {
51
+ logger.info('临时文件清理失败:', e.message)
52
+ }
53
+ }
54
+
55
+ async function readFileChunk(filePath, offset, length) {
56
+ const fd = await fs.promises.open(filePath, 'r')
57
+ const buffer = Buffer.alloc(length)
58
+ await fd.read(buffer, 0, length, offset)
59
+ await fd.close()
60
+ return buffer
61
+ }
62
+
63
+ function getFileExtension(filename) {
64
+ if (!filename) return 'mp3'
65
+ if (filename.includes('.')) {
66
+ return filename.split('.').pop().toLowerCase()
67
+ }
68
+ return 'mp3'
69
+ }
70
+
71
+ function sanitizeFilename(filename) {
72
+ if (!filename) return 'unknown'
73
+ return filename
74
+ .replace(/\.[^.]+$/, '')
75
+ .replace(/\s/g, '')
76
+ .replace(/\./g, '_')
77
+ }
78
+
79
+ module.exports = {
80
+ isTempFile,
81
+ getFileSize,
82
+ getFileMd5,
83
+ getUploadData,
84
+ cleanupTempFile,
85
+ readFileChunk,
86
+ getFileExtension,
87
+ sanitizeFilename,
88
+ }