@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/index.js CHANGED
@@ -1,233 +1,233 @@
1
- const logger = require('./logger')
2
- const fs = require('fs')
3
- const path = require('path')
4
-
5
- // IP地址转换函数
6
- function ipToInt(ip) {
7
- const parts = ip.split('.').map(Number)
8
- const a = (parts[0] << 24) >>> 0
9
- const b = parts[1] << 16
10
- const c = parts[2] << 8
11
- const d = parts[3]
12
- return a + b + c + d
13
- }
14
-
15
- function intToIp(int) {
16
- return [
17
- (int >>> 24) & 0xff,
18
- (int >>> 16) & 0xff,
19
- (int >>> 8) & 0xff,
20
- int & 0xff,
21
- ].join('.')
22
- }
23
-
24
- // 解析CIDR格式的IP段
25
- function parseCIDR(cidr) {
26
- const [ipStr, prefixLengthStr] = cidr.split('/')
27
- const prefixLength = parseInt(prefixLengthStr, 10)
28
-
29
- const ipInt = ipToInt(ipStr)
30
- const mask = (0xffffffff << (32 - prefixLength)) >>> 0
31
- const start = (ipInt & mask) >>> 0
32
- const end = (start | (~mask >>> 0)) >>> 0
33
- const count = end - start + 1
34
-
35
- return { start, end, count, cidr }
36
- }
37
-
38
- // 从china_ip_ranges.txt加载中国IP段(CIDR格式)
39
- const chinaIPRanges = (function loadChinaIPRanges() {
40
- try {
41
- const filePath = path.join(__dirname, '../data/china_ip_ranges.txt')
42
- const content = fs.readFileSync(filePath, 'utf-8')
43
- const lines = content
44
- .split('\n')
45
- .filter((line) => line.trim() && !line.startsWith('#'))
46
-
47
- const arr = []
48
- let total = 0
49
-
50
- for (let i = 0; i < lines.length; i++) {
51
- const line = lines[i].trim()
52
- if (!line) continue
53
-
54
- const range = parseCIDR(line)
55
- arr.push(range)
56
- total += range.count
57
- }
58
-
59
- // 按IP段大小排序,提高随机选择效率
60
- arr.sort((a, b) => b.count - a.count)
61
-
62
- // attach total for convenience
63
- arr.totalCount = total
64
-
65
- logger.info(
66
- `Loaded ${arr.length} Chinese IP ranges from china_ip_ranges.txt, total ${total} IPs`,
67
- )
68
- return arr
69
- } catch (error) {
70
- logger.error('Failed to load china_ip_ranges.txt:', error.message)
71
- // 返回空数组,generateRandomChineseIP会使用兜底逻辑
72
- return { totalCount: 0 }
73
- }
74
- })()
75
- const floor = Math.floor
76
- const random = Math.random
77
- const keys = Object.keys
78
-
79
- // 预编译encodeURIComponent以减少查找开销
80
- const encode = encodeURIComponent
81
-
82
- module.exports = {
83
- toBoolean(val) {
84
- if (typeof val === 'boolean') return val
85
- if (val === '') return val
86
- return val === 'true' || val == '1'
87
- },
88
-
89
- cookieToJson(cookie) {
90
- if (!cookie) return {}
91
- let cookieArr = cookie.split(';')
92
- let obj = {}
93
-
94
- // 优化:使用for循环替代forEach,性能更好
95
- for (let i = 0, len = cookieArr.length; i < len; i++) {
96
- let item = cookieArr[i]
97
- let arr = item.split('=')
98
- // 优化:使用严格等于
99
- if (arr.length === 2) {
100
- obj[arr[0].trim()] = arr[1].trim()
101
- }
102
- }
103
- return obj
104
- },
105
-
106
- cookieObjToString(cookie) {
107
- // 优化:使用预绑定的keys函数和for循环
108
- const cookieKeys = keys(cookie)
109
- const result = []
110
-
111
- // 优化:使用for循环和预分配数组
112
- for (let i = 0, len = cookieKeys.length; i < len; i++) {
113
- const key = cookieKeys[i]
114
- result[i] = `${encode(key)}=${encode(cookie[key])}`
115
- }
116
-
117
- return result.join('; ')
118
- },
119
-
120
- getRandom(num) {
121
- // 优化:简化随机数生成逻辑
122
- // 原逻辑看起来有问题,这里保持原意但优化性能
123
- var randomValue = random()
124
- var floorValue = floor(randomValue * 9 + 1)
125
- var powValue = Math.pow(10, num - 1)
126
- var randomNum = floor((randomValue + floorValue) * powValue)
127
- return randomNum
128
- },
129
-
130
- generateRandomChineseIP() {
131
- // 从预定义的中国 IP 段中按权重随机选择一个段,然后在该段内生成随机 IP
132
- const total = chinaIPRanges.totalCount || 0
133
- if (!total) {
134
- // 兜底:回退到旧逻辑(随机 116.x 前缀)
135
- const fallback = `116.${getRandomInt(25, 94)}.${generateIPSegment()}.${generateIPSegment()}`
136
- logger.info('Generated Random Chinese IP (fallback):', fallback)
137
- return fallback
138
- }
139
-
140
- // 选择一个全局随机偏移([0, total))
141
- let offset = Math.floor(random() * total)
142
- let chosen = null
143
- for (let i = 0; i < chinaIPRanges.length; i++) {
144
- const seg = chinaIPRanges[i]
145
- if (offset < seg.count) {
146
- chosen = seg
147
- break
148
- }
149
- offset -= seg.count
150
- }
151
-
152
- // 如果没有选中(理论上不应该发生),回退到最后一个段
153
- if (!chosen) chosen = chinaIPRanges[chinaIPRanges.length - 1]
154
-
155
- // 在段内随机生成一个 IP(使用段真实的数值范围)
156
- const segSize = chosen.end - chosen.start + 1
157
- const ipInt = chosen.start + Math.floor(random() * segSize)
158
- const ip = intToIp(ipInt)
159
- logger.info('Generated Random Chinese IP:', ip, 'from CIDR:', chosen.cidr)
160
- return ip
161
- },
162
- // 生成chainId的函数
163
- generateChainId(cookie) {
164
- const version = 'v1'
165
- const randomNum = Math.floor(Math.random() * 1e6)
166
- const deviceId =
167
- getCookieValue(cookie, 'sDeviceId') || 'unknown-' + randomNum
168
- const platform = 'web'
169
- const action = 'login'
170
- const timestamp = Date.now()
171
-
172
- return `${version}_${deviceId}_${platform}_${action}_${timestamp}`
173
- },
174
-
175
- generateDeviceId() {
176
- const hexChars = '0123456789ABCDEF'
177
- const chars = []
178
- for (let i = 0; i < 52; i++) {
179
- const randomIndex = Math.floor(Math.random() * hexChars.length)
180
- chars.push(hexChars[randomIndex])
181
- }
182
- return chars.join('')
183
- },
184
- }
185
-
186
- // 优化:预先绑定函数
187
- function getRandomInt(min, max) {
188
- // 优化:简化计算
189
- return floor(random() * (max - min + 1)) + min
190
- }
191
-
192
- // 优化:预先绑定generateIPSegment函数引用
193
- function generateIPSegment() {
194
- // 优化:内联常量
195
- return getRandomInt(1, 255)
196
- }
197
-
198
- // 进一步优化版本(如果需要更高性能):
199
- /*
200
- const cookieToJsonOptimized = (function() {
201
- // 预编译trim函数
202
- const trim = String.prototype.trim
203
-
204
- return function(cookie) {
205
- if (!cookie) return {}
206
-
207
- const cookieArr = cookie.split(';')
208
- const obj = {}
209
-
210
- for (let i = 0, len = cookieArr.length; i < len; i++) {
211
- const item = cookieArr[i]
212
- const eqIndex = item.indexOf('=')
213
-
214
- if (eqIndex > 0 && eqIndex < item.length - 1) {
215
- const key = trim.call(item.substring(0, eqIndex))
216
- const value = trim.call(item.substring(eqIndex + 1))
217
- obj[key] = value
218
- }
219
- }
220
- return obj
221
- }
222
- })()
223
- */
224
-
225
- // 用于从cookie字符串中获取指定值的辅助函数
226
- function getCookieValue(cookieStr, name) {
227
- if (!cookieStr) return ''
228
-
229
- const cookies = '; ' + cookieStr
230
- const parts = cookies.split('; ' + name + '=')
231
- if (parts.length === 2) return parts.pop().split(';').shift()
232
- return ''
233
- }
1
+ const logger = require('./logger')
2
+ const fs = require('fs')
3
+ const path = require('path')
4
+
5
+ // IP地址转换函数
6
+ function ipToInt(ip) {
7
+ const parts = ip.split('.').map(Number)
8
+ const a = (parts[0] << 24) >>> 0
9
+ const b = parts[1] << 16
10
+ const c = parts[2] << 8
11
+ const d = parts[3]
12
+ return a + b + c + d
13
+ }
14
+
15
+ function intToIp(int) {
16
+ return [
17
+ (int >>> 24) & 0xff,
18
+ (int >>> 16) & 0xff,
19
+ (int >>> 8) & 0xff,
20
+ int & 0xff,
21
+ ].join('.')
22
+ }
23
+
24
+ // 解析CIDR格式的IP段
25
+ function parseCIDR(cidr) {
26
+ const [ipStr, prefixLengthStr] = cidr.split('/')
27
+ const prefixLength = parseInt(prefixLengthStr, 10)
28
+
29
+ const ipInt = ipToInt(ipStr)
30
+ const mask = (0xffffffff << (32 - prefixLength)) >>> 0
31
+ const start = (ipInt & mask) >>> 0
32
+ const end = (start | (~mask >>> 0)) >>> 0
33
+ const count = end - start + 1
34
+
35
+ return { start, end, count, cidr }
36
+ }
37
+
38
+ // 从china_ip_ranges.txt加载中国IP段(CIDR格式)
39
+ const chinaIPRanges = (function loadChinaIPRanges() {
40
+ try {
41
+ const filePath = path.join(__dirname, '../data/china_ip_ranges.txt')
42
+ const content = fs.readFileSync(filePath, 'utf-8')
43
+ const lines = content
44
+ .split('\n')
45
+ .filter((line) => line.trim() && !line.startsWith('#'))
46
+
47
+ const arr = []
48
+ let total = 0
49
+
50
+ for (let i = 0; i < lines.length; i++) {
51
+ const line = lines[i].trim()
52
+ if (!line) continue
53
+
54
+ const range = parseCIDR(line)
55
+ arr.push(range)
56
+ total += range.count
57
+ }
58
+
59
+ // 按IP段大小排序,提高随机选择效率
60
+ arr.sort((a, b) => b.count - a.count)
61
+
62
+ // attach total for convenience
63
+ arr.totalCount = total
64
+
65
+ logger.info(
66
+ `Loaded ${arr.length} Chinese IP ranges from china_ip_ranges.txt, total ${total} IPs`,
67
+ )
68
+ return arr
69
+ } catch (error) {
70
+ logger.error('Failed to load china_ip_ranges.txt:', error.message)
71
+ // 返回空数组,generateRandomChineseIP会使用兜底逻辑
72
+ return { totalCount: 0 }
73
+ }
74
+ })()
75
+ const floor = Math.floor
76
+ const random = Math.random
77
+ const keys = Object.keys
78
+
79
+ // 预编译encodeURIComponent以减少查找开销
80
+ const encode = encodeURIComponent
81
+
82
+ module.exports = {
83
+ toBoolean(val) {
84
+ if (typeof val === 'boolean') return val
85
+ if (val === '') return val
86
+ return val === 'true' || val == '1'
87
+ },
88
+
89
+ cookieToJson(cookie) {
90
+ if (!cookie) return {}
91
+ let cookieArr = cookie.split(';')
92
+ let obj = {}
93
+
94
+ // 优化:使用for循环替代forEach,性能更好
95
+ for (let i = 0, len = cookieArr.length; i < len; i++) {
96
+ let item = cookieArr[i]
97
+ let arr = item.split('=')
98
+ // 优化:使用严格等于
99
+ if (arr.length === 2) {
100
+ obj[arr[0].trim()] = arr[1].trim()
101
+ }
102
+ }
103
+ return obj
104
+ },
105
+
106
+ cookieObjToString(cookie) {
107
+ // 优化:使用预绑定的keys函数和for循环
108
+ const cookieKeys = keys(cookie)
109
+ const result = []
110
+
111
+ // 优化:使用for循环和预分配数组
112
+ for (let i = 0, len = cookieKeys.length; i < len; i++) {
113
+ const key = cookieKeys[i]
114
+ result[i] = `${encode(key)}=${encode(cookie[key])}`
115
+ }
116
+
117
+ return result.join('; ')
118
+ },
119
+
120
+ getRandom(num) {
121
+ // 优化:简化随机数生成逻辑
122
+ // 原逻辑看起来有问题,这里保持原意但优化性能
123
+ var randomValue = random()
124
+ var floorValue = floor(randomValue * 9 + 1)
125
+ var powValue = Math.pow(10, num - 1)
126
+ var randomNum = floor((randomValue + floorValue) * powValue)
127
+ return randomNum
128
+ },
129
+
130
+ generateRandomChineseIP() {
131
+ // 从预定义的中国 IP 段中按权重随机选择一个段,然后在该段内生成随机 IP
132
+ const total = chinaIPRanges.totalCount || 0
133
+ if (!total) {
134
+ // 兜底:回退到旧逻辑(随机 116.x 前缀)
135
+ const fallback = `116.${getRandomInt(25, 94)}.${generateIPSegment()}.${generateIPSegment()}`
136
+ logger.info('Generated Random Chinese IP (fallback):', fallback)
137
+ return fallback
138
+ }
139
+
140
+ // 选择一个全局随机偏移([0, total))
141
+ let offset = Math.floor(random() * total)
142
+ let chosen = null
143
+ for (let i = 0; i < chinaIPRanges.length; i++) {
144
+ const seg = chinaIPRanges[i]
145
+ if (offset < seg.count) {
146
+ chosen = seg
147
+ break
148
+ }
149
+ offset -= seg.count
150
+ }
151
+
152
+ // 如果没有选中(理论上不应该发生),回退到最后一个段
153
+ if (!chosen) chosen = chinaIPRanges[chinaIPRanges.length - 1]
154
+
155
+ // 在段内随机生成一个 IP(使用段真实的数值范围)
156
+ const segSize = chosen.end - chosen.start + 1
157
+ const ipInt = chosen.start + Math.floor(random() * segSize)
158
+ const ip = intToIp(ipInt)
159
+ logger.info('Generated Random Chinese IP:', ip, 'from CIDR:', chosen.cidr)
160
+ return ip
161
+ },
162
+ // 生成chainId的函数
163
+ generateChainId(cookie) {
164
+ const version = 'v1'
165
+ const randomNum = Math.floor(Math.random() * 1e6)
166
+ const deviceId =
167
+ getCookieValue(cookie, 'sDeviceId') || 'unknown-' + randomNum
168
+ const platform = 'web'
169
+ const action = 'login'
170
+ const timestamp = Date.now()
171
+
172
+ return `${version}_${deviceId}_${platform}_${action}_${timestamp}`
173
+ },
174
+
175
+ generateDeviceId() {
176
+ const hexChars = '0123456789ABCDEF'
177
+ const chars = []
178
+ for (let i = 0; i < 52; i++) {
179
+ const randomIndex = Math.floor(Math.random() * hexChars.length)
180
+ chars.push(hexChars[randomIndex])
181
+ }
182
+ return chars.join('')
183
+ },
184
+ }
185
+
186
+ // 优化:预先绑定函数
187
+ function getRandomInt(min, max) {
188
+ // 优化:简化计算
189
+ return floor(random() * (max - min + 1)) + min
190
+ }
191
+
192
+ // 优化:预先绑定generateIPSegment函数引用
193
+ function generateIPSegment() {
194
+ // 优化:内联常量
195
+ return getRandomInt(1, 255)
196
+ }
197
+
198
+ // 进一步优化版本(如果需要更高性能):
199
+ /*
200
+ const cookieToJsonOptimized = (function() {
201
+ // 预编译trim函数
202
+ const trim = String.prototype.trim
203
+
204
+ return function(cookie) {
205
+ if (!cookie) return {}
206
+
207
+ const cookieArr = cookie.split(';')
208
+ const obj = {}
209
+
210
+ for (let i = 0, len = cookieArr.length; i < len; i++) {
211
+ const item = cookieArr[i]
212
+ const eqIndex = item.indexOf('=')
213
+
214
+ if (eqIndex > 0 && eqIndex < item.length - 1) {
215
+ const key = trim.call(item.substring(0, eqIndex))
216
+ const value = trim.call(item.substring(eqIndex + 1))
217
+ obj[key] = value
218
+ }
219
+ }
220
+ return obj
221
+ }
222
+ })()
223
+ */
224
+
225
+ // 用于从cookie字符串中获取指定值的辅助函数
226
+ function getCookieValue(cookieStr, name) {
227
+ if (!cookieStr) return ''
228
+
229
+ const cookies = '; ' + cookieStr
230
+ const parts = cookies.split('; ' + name + '=')
231
+ if (parts.length === 2) return parts.pop().split(';').shift()
232
+ return ''
233
+ }
package/util/logger.js CHANGED
@@ -1,42 +1,42 @@
1
- // ANSI 颜色代码
2
- const colors = {
3
- reset: '\x1b[0m',
4
- bright: '\x1b[1m',
5
- dim: '\x1b[2m',
6
- black: '\x1b[30m',
7
- red: '\x1b[31m',
8
- green: '\x1b[32m',
9
- yellow: '\x1b[33m',
10
- blue: '\x1b[34m',
11
- magenta: '\x1b[35m',
12
- cyan: '\x1b[36m',
13
- white: '\x1b[37m',
14
- bgRed: '\x1b[41m',
15
- bgGreen: '\x1b[42m',
16
- bgYellow: '\x1b[43m',
17
- }
18
-
19
- const logger = {
20
- debug: (msg, ...args) =>
21
- console.info(`${colors.cyan}[DEBUG]${colors.reset}`, msg, ...args),
22
- info: (msg, ...args) =>
23
- console.info(`${colors.green}[INFO]${colors.reset}`, msg, ...args),
24
- warn: (msg, ...args) =>
25
- console.info(`${colors.yellow}[WARN]${colors.reset}`, msg, ...args),
26
- error: (msg, ...args) =>
27
- console.error(`${colors.red}[ERROR]${colors.reset}`, msg, ...args),
28
- success: (msg, ...args) =>
29
- console.log(
30
- `${colors.bright}${colors.green}[SUCCESS]${colors.reset}`,
31
- msg,
32
- ...args,
33
- ),
34
- critical: (msg, ...args) =>
35
- console.error(
36
- `${colors.bright}${colors.bgRed}[CRITICAL]${colors.reset}`,
37
- msg,
38
- ...args,
39
- ),
40
- }
41
-
42
- module.exports = logger
1
+ // ANSI 颜色代码
2
+ const colors = {
3
+ reset: '\x1b[0m',
4
+ bright: '\x1b[1m',
5
+ dim: '\x1b[2m',
6
+ black: '\x1b[30m',
7
+ red: '\x1b[31m',
8
+ green: '\x1b[32m',
9
+ yellow: '\x1b[33m',
10
+ blue: '\x1b[34m',
11
+ magenta: '\x1b[35m',
12
+ cyan: '\x1b[36m',
13
+ white: '\x1b[37m',
14
+ bgRed: '\x1b[41m',
15
+ bgGreen: '\x1b[42m',
16
+ bgYellow: '\x1b[43m',
17
+ }
18
+
19
+ const logger = {
20
+ debug: (msg, ...args) =>
21
+ console.info(`${colors.cyan}[DEBUG]${colors.reset}`, msg, ...args),
22
+ info: (msg, ...args) =>
23
+ console.info(`${colors.green}[INFO]${colors.reset}`, msg, ...args),
24
+ warn: (msg, ...args) =>
25
+ console.info(`${colors.yellow}[WARN]${colors.reset}`, msg, ...args),
26
+ error: (msg, ...args) =>
27
+ console.error(`${colors.red}[ERROR]${colors.reset}`, msg, ...args),
28
+ success: (msg, ...args) =>
29
+ console.log(
30
+ `${colors.bright}${colors.green}[SUCCESS]${colors.reset}`,
31
+ msg,
32
+ ...args,
33
+ ),
34
+ critical: (msg, ...args) =>
35
+ console.error(
36
+ `${colors.bright}${colors.bgRed}[CRITICAL]${colors.reset}`,
37
+ msg,
38
+ ...args,
39
+ ),
40
+ }
41
+
42
+ module.exports = logger