@sansenjian/qq-music-api 2.2.1 → 2.2.7

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 (344) hide show
  1. package/CHANGELOG.md +120 -42
  2. package/dist/app.js +58 -0
  3. package/dist/config/user-info.js +59 -0
  4. package/dist/index.js +3 -0
  5. package/dist/jest.config.js +40 -0
  6. package/dist/middlewares/koa-cors.js +63 -0
  7. package/dist/module/apis/UCommon/UCommon.js +10 -0
  8. package/dist/module/apis/album/getAlbumInfo.js +23 -0
  9. package/dist/module/apis/comments/getComments.js +24 -0
  10. package/dist/module/apis/digitalAlbum/getDigitalAlbumLists.js +22 -0
  11. package/dist/module/apis/downloadQQMusic.js +48 -0
  12. package/dist/module/apis/extend/getPlaylistTags.js +158 -0
  13. package/dist/module/apis/music/getLyric.js +32 -0
  14. package/dist/module/apis/mv/getMvByTag.js +23 -0
  15. package/dist/module/apis/radio/getRadioLists.js +26 -0
  16. package/dist/module/apis/rank/getTopLists.js +35 -0
  17. package/dist/module/apis/recommend/getDailyRecommend.js +124 -0
  18. package/dist/module/apis/recommend/getPersonalRecommend.js +114 -0
  19. package/dist/module/apis/search/getHotKey.js +25 -0
  20. package/dist/module/apis/search/getSearchByKey.js +32 -0
  21. package/dist/module/apis/search/getSmartbox.js +40 -0
  22. package/dist/module/apis/singers/getSimilarSinger.js +24 -0
  23. package/dist/module/apis/singers/getSingerDesc.js +24 -0
  24. package/dist/module/apis/singers/getSingerMv.js +23 -0
  25. package/dist/module/apis/singers/getSingerStarNum.js +23 -0
  26. package/dist/module/apis/songLists/songListCategories.js +23 -0
  27. package/dist/module/apis/songLists/songListDetail.js +28 -0
  28. package/dist/module/apis/songLists/songLists.js +35 -0
  29. package/dist/module/apis/u_common.js +56 -0
  30. package/dist/module/apis/user/checkQQLoginQr.js +189 -0
  31. package/dist/module/apis/user/getQQLoginQr.js +23 -0
  32. package/dist/module/apis/user/getUserAvatar.js +25 -0
  33. package/dist/module/apis/user/getUserLikedSongs.js +129 -0
  34. package/dist/module/apis/user/getUserPlaylists.js +138 -0
  35. package/dist/module/apis/y_common.js +69 -0
  36. package/dist/module/config.js +24 -0
  37. package/dist/module/index.js +70 -0
  38. package/dist/package.json +117 -0
  39. package/dist/routers/context/batchGetSongInfo.js +53 -0
  40. package/dist/routers/context/batchGetSongLists.js +37 -0
  41. package/dist/routers/context/checkQQLoginQr.js +16 -0
  42. package/dist/routers/context/cookies.js +36 -0
  43. package/dist/routers/context/getAlbumInfo.js +29 -0
  44. package/dist/routers/context/getComments.js +38 -0
  45. package/dist/routers/context/getDailyRecommend.js +45 -0
  46. package/dist/routers/context/getDigitalAlbumLists.js +16 -0
  47. package/dist/routers/context/getDownloadQQMusic.js +16 -0
  48. package/dist/routers/context/getHotkey.js +21 -0
  49. package/dist/routers/context/getImageUrl.js +25 -0
  50. package/dist/routers/context/getLyric.js +29 -0
  51. package/dist/routers/context/getMusicPlay.js +91 -0
  52. package/dist/routers/context/getMv.js +57 -0
  53. package/dist/routers/context/getMvByTag.js +16 -0
  54. package/dist/routers/context/getMvPlay.js +105 -0
  55. package/dist/routers/context/getNewDisks.js +52 -0
  56. package/dist/routers/context/getPersonalRecommend.js +54 -0
  57. package/dist/routers/context/getPlaylistTags.js +60 -0
  58. package/dist/routers/context/getQQLoginQr.js +14 -0
  59. package/dist/routers/context/getRadioLists.js +16 -0
  60. package/dist/routers/context/getRanks.js +60 -0
  61. package/dist/routers/context/getRecommend.js +88 -0
  62. package/dist/routers/context/getSearchByKey.js +32 -0
  63. package/dist/routers/context/getSimilarSinger.js +27 -0
  64. package/dist/routers/context/getSingerAlbum.js +54 -0
  65. package/dist/routers/context/getSingerDesc.js +28 -0
  66. package/dist/routers/context/getSingerHotsong.js +54 -0
  67. package/dist/routers/context/getSingerList.js +51 -0
  68. package/dist/routers/context/getSingerMv.js +36 -0
  69. package/dist/routers/context/getSingerStarNum.js +27 -0
  70. package/dist/routers/context/getSmartbox.js +27 -0
  71. package/dist/routers/context/getSongInfo.js +47 -0
  72. package/dist/routers/context/getSongListCategories.js +23 -0
  73. package/dist/routers/context/getSongListDetail.js +19 -0
  74. package/dist/routers/context/getSongLists.js +25 -0
  75. package/dist/routers/context/getTicketInfo.js +47 -0
  76. package/dist/routers/context/getTopLists.js +16 -0
  77. package/dist/routers/context/getUserAvatar.js +48 -0
  78. package/dist/routers/context/getUserLikedSongs.js +24 -0
  79. package/dist/routers/context/getUserPlaylists.js +24 -0
  80. package/dist/routers/context/index.js +107 -0
  81. package/dist/routers/router.js +69 -0
  82. package/dist/routers/types.js +2 -0
  83. package/dist/routers/util.js +188 -0
  84. package/dist/types/api.js +55 -0
  85. package/dist/util/apiResponse.js +88 -0
  86. package/dist/util/colors.js +19 -0
  87. package/dist/util/cookie.js +26 -0
  88. package/dist/util/loginUtils.js +30 -0
  89. package/dist/util/lyricParse.js +72 -0
  90. package/dist/util/request.js +109 -0
  91. package/docs-dist/404.html +24 -0
  92. package/docs-dist/CHANGELOG-ARCHITECTURE.html +131 -0
  93. package/docs-dist/COOKIE_CONFIG_GUIDE.html +39 -0
  94. package/docs-dist/README.html +447 -0
  95. package/docs-dist/TEST_USER_PLAYLISTS.html +42 -0
  96. package/docs-dist/USER_AVATAR_GUIDE.html +100 -0
  97. package/docs-dist/api/comments.html +48 -0
  98. package/docs-dist/api/index.html +27 -0
  99. package/docs-dist/api/music.html +51 -0
  100. package/docs-dist/api/other.html +33 -0
  101. package/docs-dist/api/playlist.html +77 -0
  102. package/docs-dist/api/rank.html +48 -0
  103. package/docs-dist/api/search.html +62 -0
  104. package/docs-dist/api/singer.html +47 -0
  105. package/docs-dist/api/user.html +64 -0
  106. package/docs-dist/assets/CHANGELOG-ARCHITECTURE.md.BOe0ZtyR.js +105 -0
  107. package/docs-dist/assets/CHANGELOG-ARCHITECTURE.md.BOe0ZtyR.lean.js +1 -0
  108. package/docs-dist/assets/COOKIE_CONFIG_GUIDE.md.D68AwXR2.js +13 -0
  109. package/docs-dist/assets/COOKIE_CONFIG_GUIDE.md.D68AwXR2.lean.js +1 -0
  110. package/docs-dist/assets/README.md.ZJQGJ1Gb.js +421 -0
  111. package/docs-dist/assets/README.md.ZJQGJ1Gb.lean.js +1 -0
  112. package/docs-dist/assets/TEST_USER_PLAYLISTS.md.C02575X2.js +16 -0
  113. package/docs-dist/assets/TEST_USER_PLAYLISTS.md.C02575X2.lean.js +1 -0
  114. package/docs-dist/assets/USER_AVATAR_GUIDE.md.BOqjn5Cm.js +74 -0
  115. package/docs-dist/assets/USER_AVATAR_GUIDE.md.BOqjn5Cm.lean.js +1 -0
  116. package/docs-dist/assets/api_comments.md.DADvndEA.js +22 -0
  117. package/docs-dist/assets/api_comments.md.DADvndEA.lean.js +1 -0
  118. package/docs-dist/assets/api_index.md.D5IASxxG.js +1 -0
  119. package/docs-dist/assets/api_index.md.D5IASxxG.lean.js +1 -0
  120. package/docs-dist/assets/api_music.md.BgB8NmZq.js +25 -0
  121. package/docs-dist/assets/api_music.md.BgB8NmZq.lean.js +1 -0
  122. package/docs-dist/assets/api_other.md.BkRWXX2z.js +7 -0
  123. package/docs-dist/assets/api_other.md.BkRWXX2z.lean.js +1 -0
  124. package/docs-dist/assets/api_playlist.md.Dc0hTrZ4.js +51 -0
  125. package/docs-dist/assets/api_playlist.md.Dc0hTrZ4.lean.js +1 -0
  126. package/docs-dist/assets/api_rank.md.DRisCFyT.js +22 -0
  127. package/docs-dist/assets/api_rank.md.DRisCFyT.lean.js +1 -0
  128. package/docs-dist/assets/api_search.md.DNnMUZK0.js +36 -0
  129. package/docs-dist/assets/api_search.md.DNnMUZK0.lean.js +1 -0
  130. package/docs-dist/assets/api_singer.md.DCmuxQkk.js +21 -0
  131. package/docs-dist/assets/api_singer.md.DCmuxQkk.lean.js +1 -0
  132. package/docs-dist/assets/api_user.md.Cjm9GG3z.js +38 -0
  133. package/docs-dist/assets/api_user.md.Cjm9GG3z.lean.js +1 -0
  134. package/docs-dist/assets/app.Dx_1wB58.js +1 -0
  135. package/docs-dist/assets/chunks/@localSearchIndexroot.CMY5EIwU.js +1 -0
  136. package/docs-dist/assets/chunks/VPLocalSearchBox.DwKWtsdX.js +9 -0
  137. package/docs-dist/assets/chunks/framework.o40iizuP.js +19 -0
  138. package/docs-dist/assets/chunks/theme.pGVgJ9Cx.js +2 -0
  139. package/docs-dist/assets/guide_architecture.md.DGtNyuMH.js +258 -0
  140. package/docs-dist/assets/guide_architecture.md.DGtNyuMH.lean.js +1 -0
  141. package/docs-dist/assets/guide_authentication.md.mtI5LfCw.js +4 -0
  142. package/docs-dist/assets/guide_authentication.md.mtI5LfCw.lean.js +1 -0
  143. package/docs-dist/assets/guide_index.md.B-0SG46T.js +1 -0
  144. package/docs-dist/assets/guide_index.md.B-0SG46T.lean.js +1 -0
  145. package/docs-dist/assets/guide_installation.md.k-KpAfxv.js +7 -0
  146. package/docs-dist/assets/guide_installation.md.k-KpAfxv.lean.js +1 -0
  147. package/docs-dist/assets/guide_quickstart.md.Bff_KFOD.js +13 -0
  148. package/docs-dist/assets/guide_quickstart.md.Bff_KFOD.lean.js +1 -0
  149. package/docs-dist/assets/index.md.xrs-uIyo.js +1 -0
  150. package/docs-dist/assets/index.md.xrs-uIyo.lean.js +1 -0
  151. package/docs-dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  152. package/docs-dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  153. package/docs-dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  154. package/docs-dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  155. package/docs-dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  156. package/docs-dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  157. package/docs-dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  158. package/docs-dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  159. package/docs-dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  160. package/docs-dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  161. package/docs-dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  162. package/docs-dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  163. package/docs-dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  164. package/docs-dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  165. package/docs-dist/assets/reference_response-format.md.DKYTK6uJ.js +12 -0
  166. package/docs-dist/assets/reference_response-format.md.DKYTK6uJ.lean.js +1 -0
  167. package/docs-dist/assets/style.DM4qKDd4.css +1 -0
  168. package/docs-dist/guide/architecture.html +284 -0
  169. package/docs-dist/guide/authentication.html +30 -0
  170. package/docs-dist/guide/index.html +27 -0
  171. package/docs-dist/guide/installation.html +33 -0
  172. package/docs-dist/guide/quickstart.html +39 -0
  173. package/docs-dist/hashmap.json +1 -0
  174. package/docs-dist/index.html +27 -0
  175. package/docs-dist/logo.svg +4 -0
  176. package/docs-dist/reference/response-format.html +38 -0
  177. package/docs-dist/version.json +7 -0
  178. package/docs-dist/vp-icons.css +1 -0
  179. package/package.json +28 -17
  180. package/.babelrc +0 -7
  181. package/.dockerignore +0 -5
  182. package/.editorconfig +0 -31
  183. package/.eslintrc.json +0 -22
  184. package/.github/workflows/deploy-docs.yml +0 -54
  185. package/.github/workflows/release.yml +0 -37
  186. package/.github/workflows/test.yml +0 -70
  187. package/.husky/commit-msg +0 -1
  188. package/.husky/pre-commit +0 -1
  189. package/.prettierignore +0 -1
  190. package/.prettierrc +0 -9
  191. package/AGENTS.md +0 -153
  192. package/Dockerfile +0 -18
  193. package/QQ/351/237/263/344/271/220-v0.xmind +0 -0
  194. package/QQ/351/237/263/344/271/220-v1.xmind +0 -0
  195. package/app.ts +0 -68
  196. package/commitlint.config.js +0 -20
  197. package/config/user-info.ts +0 -71
  198. package/index.ts +0 -1
  199. package/jest.config.ts +0 -41
  200. package/middlewares/koa-cors.ts +0 -81
  201. package/module/apis/UCommon/UCommon.ts +0 -13
  202. package/module/apis/album/getAlbumInfo.ts +0 -22
  203. package/module/apis/comments/getComments.ts +0 -23
  204. package/module/apis/digitalAlbum/getDigitalAlbumLists.ts +0 -23
  205. package/module/apis/downloadQQMusic.ts +0 -51
  206. package/module/apis/music/getLyric.ts +0 -34
  207. package/module/apis/mv/getMvByTag.ts +0 -24
  208. package/module/apis/radio/getRadioLists.ts +0 -27
  209. package/module/apis/rank/getTopLists.ts +0 -37
  210. package/module/apis/search/getHotKey.ts +0 -24
  211. package/module/apis/search/getSearchByKey.ts +0 -31
  212. package/module/apis/search/getSmartbox.ts +0 -43
  213. package/module/apis/singers/getSimilarSinger.ts +0 -25
  214. package/module/apis/singers/getSingerDesc.ts +0 -25
  215. package/module/apis/singers/getSingerMv.ts +0 -24
  216. package/module/apis/singers/getSingerStarNum.ts +0 -24
  217. package/module/apis/songLists/songListCategories.ts +0 -22
  218. package/module/apis/songLists/songListDetail.ts +0 -27
  219. package/module/apis/songLists/songLists.ts +0 -35
  220. package/module/apis/u_common.ts +0 -29
  221. package/module/apis/user/checkQQLoginQr.ts +0 -230
  222. package/module/apis/user/getQQLoginQr.ts +0 -28
  223. package/module/apis/user/getUserAvatar.ts +0 -32
  224. package/module/apis/user/getUserLikedSongs.ts +0 -145
  225. package/module/apis/user/getUserPlaylists.ts +0 -163
  226. package/module/apis/y_common.ts +0 -44
  227. package/module/config.ts +0 -24
  228. package/module/index.ts +0 -95
  229. package/music.png +0 -0
  230. package/pnpm-workspace.yaml +0 -2
  231. package/public/index.html +0 -430
  232. package/routers/context/batchGetSongInfo.ts +0 -60
  233. package/routers/context/batchGetSongLists.ts +0 -46
  234. package/routers/context/checkQQLoginQr.ts +0 -19
  235. package/routers/context/cookies.ts +0 -38
  236. package/routers/context/getAlbumInfo.ts +0 -31
  237. package/routers/context/getComments.ts +0 -51
  238. package/routers/context/getDigitalAlbumLists.ts +0 -18
  239. package/routers/context/getDownloadQQMusic.ts +0 -17
  240. package/routers/context/getHotkey.ts +0 -25
  241. package/routers/context/getImageUrl.ts +0 -29
  242. package/routers/context/getLyric.ts +0 -32
  243. package/routers/context/getMusicPlay.ts +0 -102
  244. package/routers/context/getMv.ts +0 -61
  245. package/routers/context/getMvByTag.ts +0 -18
  246. package/routers/context/getMvPlay.ts +0 -114
  247. package/routers/context/getNewDisks.ts +0 -58
  248. package/routers/context/getQQLoginQr.ts +0 -16
  249. package/routers/context/getRadioLists.ts +0 -18
  250. package/routers/context/getRanks.ts +0 -67
  251. package/routers/context/getRecommend.ts +0 -92
  252. package/routers/context/getSearchByKey.ts +0 -34
  253. package/routers/context/getSimilarSinger.ts +0 -29
  254. package/routers/context/getSingerAlbum.ts +0 -58
  255. package/routers/context/getSingerDesc.ts +0 -30
  256. package/routers/context/getSingerHotsong.ts +0 -58
  257. package/routers/context/getSingerList.ts +0 -56
  258. package/routers/context/getSingerMv.ts +0 -41
  259. package/routers/context/getSingerStarNum.ts +0 -29
  260. package/routers/context/getSmartbox.ts +0 -27
  261. package/routers/context/getSongInfo.ts +0 -51
  262. package/routers/context/getSongListCategories.ts +0 -23
  263. package/routers/context/getSongListDetail.ts +0 -22
  264. package/routers/context/getSongLists.ts +0 -30
  265. package/routers/context/getTicketInfo.ts +0 -51
  266. package/routers/context/getTopLists.ts +0 -18
  267. package/routers/context/getUserAvatar.ts +0 -53
  268. package/routers/context/getUserLikedSongs.ts +0 -28
  269. package/routers/context/getUserPlaylists.ts +0 -29
  270. package/routers/context/index.ts +0 -87
  271. package/routers/router.ts +0 -88
  272. package/routers/types.ts +0 -18
  273. package/routers/util.ts +0 -231
  274. package/screenshot/album-image.png +0 -0
  275. package/screenshot/batchGetSongInfo.png +0 -0
  276. package/screenshot/batchGetSongLists.png +0 -0
  277. package/screenshot/downloadQQMusic.png +0 -0
  278. package/screenshot/get-album-image.png +0 -0
  279. package/screenshot/get-play-all-data.png +0 -0
  280. package/screenshot/get-song-album-id.png +0 -0
  281. package/screenshot/get-song-id.png +0 -0
  282. package/screenshot/get-song-image.png +0 -0
  283. package/screenshot/getAlbumInfo.png +0 -0
  284. package/screenshot/getComments-id.png +0 -0
  285. package/screenshot/getComments-param.png +0 -0
  286. package/screenshot/getComments.png +0 -0
  287. package/screenshot/getDigitalAlbumLists.png +0 -0
  288. package/screenshot/getLyric-parse.png +0 -0
  289. package/screenshot/getLyric.png +0 -0
  290. package/screenshot/getMusicPlay.png +0 -0
  291. package/screenshot/getMv.png +0 -0
  292. package/screenshot/getMvByTag.png +0 -0
  293. package/screenshot/getMvPlay.png +0 -0
  294. package/screenshot/getNewDisks.png +0 -0
  295. package/screenshot/getRadioLists.png +0 -0
  296. package/screenshot/getRanks.png +0 -0
  297. package/screenshot/getRecommend.png +0 -0
  298. package/screenshot/getSearchByKey.png +0 -0
  299. package/screenshot/getSimilarSinger.png +0 -0
  300. package/screenshot/getSingerAlbum.png +0 -0
  301. package/screenshot/getSingerDesc.png +0 -0
  302. package/screenshot/getSingerHotsong.png +0 -0
  303. package/screenshot/getSingerList.png +0 -0
  304. package/screenshot/getSingerMv-default.png +0 -0
  305. package/screenshot/getSingerMv-listen.png +0 -0
  306. package/screenshot/getSingerMv-time.png +0 -0
  307. package/screenshot/getSingerStarNum.png +0 -0
  308. package/screenshot/getSmartbox.png +0 -0
  309. package/screenshot/getSongInfo.png +0 -0
  310. package/screenshot/getSongListCategories.png +0 -0
  311. package/screenshot/getSongListDetail.png +0 -0
  312. package/screenshot/getSongLists-params.png +0 -0
  313. package/screenshot/getSongLists.png +0 -0
  314. package/screenshot/getTicketInfo.png +0 -0
  315. package/screenshot/getTopLists.png +0 -0
  316. package/screenshot/gethotkey.png +0 -0
  317. package/screenshot/just-get-play-url.png +0 -0
  318. package/screenshot/musicPlay.png +0 -0
  319. package/screenshot/new-feature-error-tips.png +0 -0
  320. package/screenshot/normalize-cookie.png +0 -0
  321. package/screenshot/qq-music-v0.png +0 -0
  322. package/screenshot/qq-music.png +0 -0
  323. package/screenshot/song-image.png +0 -0
  324. package/screenshot/song-quality-128.png +0 -0
  325. package/screenshot/song-quality-m4a.png +0 -0
  326. package/scripts/build-images.js +0 -36
  327. package/scripts/commit-push.sh +0 -103
  328. package/tests/integration/api/api.test.ts +0 -852
  329. package/tests/integration/middleware/cors.test.ts +0 -41
  330. package/tests/setup/jest.setup.ts +0 -15
  331. package/tests/setup/testUtils.ts +0 -35
  332. package/tests/unit/util/request.test.ts +0 -177
  333. package/tsconfig.json +0 -20
  334. package/tsconfig.test.json +0 -8
  335. package/types/api.ts +0 -105
  336. package/types/global.d.ts +0 -26
  337. package/types/index.d.ts +0 -97
  338. package/util/apiResponse.ts +0 -97
  339. package/util/colors.ts +0 -31
  340. package/util/cookie.ts +0 -40
  341. package/util/loginUtils.ts +0 -26
  342. package/util/lyricParse.ts +0 -86
  343. package/util/request.ts +0 -141
  344. package/vercel.json +0 -15
@@ -1,145 +0,0 @@
1
- import request from '../../../util/request';
2
- import { customResponse, errorResponse } from '../../../util/apiResponse';
3
- import type { ApiResponse } from '../../../types/api';
4
-
5
- interface LikedSong {
6
- [key: string]: unknown;
7
- }
8
-
9
- const DEBUG_ENABLED = process.env.DEBUG === 'true';
10
-
11
- const debugLog = (message: string, payload?: unknown) => {
12
- if (DEBUG_ENABLED) {
13
- console.log(`[getUserLikedSongs] ${message}`, payload ?? '');
14
- }
15
- };
16
-
17
- // 获取用户喜欢的歌曲列表
18
- // 注意:此接口需要有效的 QQ 音乐 Cookie 才能正常工作
19
- export const getUserLikedSongs = async (params: {
20
- uin: string;
21
- offset?: number;
22
- limit?: number;
23
- }): Promise<ApiResponse> => {
24
- const { uin, offset = 0, limit = 30 } = params;
25
- const page = Math.floor(offset / limit) + 1;
26
-
27
- // 使用 c6.y.qq.com/rsc/fcgi-bin/fcg_get_profile_homepage.fcg 接口
28
- // 通过 mymusic 字段获取用户喜欢的歌曲信息
29
- const url = 'https://c6.y.qq.com/rsc/fcgi-bin/fcg_get_profile_homepage.fcg';
30
-
31
- try {
32
- debugLog('request meta', {
33
- url,
34
- uin,
35
- offset,
36
- limit,
37
- page,
38
- hasGlobalCookie: Boolean(global.userInfo?.cookie),
39
- cookieLength: global.userInfo?.cookie?.length || 0
40
- });
41
-
42
- const response = await request<Record<string, any>>({
43
- url,
44
- method: 'GET',
45
- isUUrl: 'u',
46
- options: {
47
- params: {
48
- _: Date.now(),
49
- cv: 4747474,
50
- ct: 24,
51
- format: 'json',
52
- inCharset: 'utf-8',
53
- outCharset: 'utf-8',
54
- notice: 0,
55
- platform: 'yqq.json',
56
- needNewCode: 0,
57
- uin: Number.parseInt(uin, 10),
58
- g_tk_new_20200303: 0,
59
- g_tk: 0,
60
- cid: 205360838,
61
- userid: Number.parseInt(uin, 10),
62
- reqfrom: 1,
63
- reqtype: 0,
64
- hostUin: 0,
65
- loginUin: Number.parseInt(uin, 10)
66
- },
67
- headers: {
68
- Referer: `https://y.qq.com/portal/profile.html?uin=${uin}`,
69
- Cookie: global.userInfo?.cookie || ''
70
- }
71
- }
72
- });
73
-
74
- const payload = response.data;
75
-
76
- debugLog('upstream payload summary', {
77
- topLevelKeys: payload && typeof payload === 'object' ? Object.keys(payload) : null,
78
- code: payload?.code,
79
- hasData: Boolean(payload?.data),
80
- dataKeys: payload?.data && typeof payload.data === 'object' ? Object.keys(payload.data) : []
81
- });
82
-
83
- if (!payload || typeof payload !== 'object') {
84
- debugLog('invalid payload received', payload);
85
- return errorResponse('用户喜欢的歌曲响应格式无效', 502);
86
- }
87
-
88
- if (typeof payload.code === 'number' && payload.code !== 0) {
89
- debugLog('upstream business error payload', payload);
90
- return errorResponse(payload.msg || payload.message || '获取用户喜欢的歌曲失败', 502);
91
- }
92
-
93
- // 从 mymusic 字段中提取喜欢的歌曲信息
94
- // mymusic 数组中的第一个元素通常包含"我喜欢"歌单的信息
95
- const mymusic = payload?.data?.mymusic;
96
- let likedSongsInfo = null;
97
-
98
- if (Array.isArray(mymusic)) {
99
- // 查找"我喜欢"歌单(通常 title 包含"喜欢"或 type 为 1)
100
- likedSongsInfo = mymusic.find((item: any) => {
101
- return item?.title && (item.title.includes('喜欢') || item.type === 1);
102
- });
103
- }
104
-
105
- debugLog('liked songs info', likedSongsInfo);
106
-
107
- if (!likedSongsInfo) {
108
- debugLog('no liked songs info found in mymusic');
109
- return customResponse({
110
- response: {
111
- code: 0,
112
- data: {
113
- songs: [],
114
- total: 0,
115
- hasMore: false
116
- }
117
- }
118
- }, 200);
119
- }
120
-
121
- // 返回喜欢的歌曲信息(包含歌单 ID 和统计信息)
122
- // 注意:完整的歌曲列表需要通过 musics.fcg 接口获取(需要二进制加密)
123
- // 这里先返回歌单基本信息
124
- return customResponse({
125
- response: {
126
- code: 0,
127
- data: {
128
- songs: [likedSongsInfo],
129
- total: likedSongsInfo.num0 || 0,
130
- hasMore: false,
131
- info: {
132
- title: likedSongsInfo.title,
133
- songCount: likedSongsInfo.num0,
134
- albumCount: likedSongsInfo.num1,
135
- playlistCount: likedSongsInfo.num2,
136
- id: likedSongsInfo.id
137
- }
138
- }
139
- }
140
- }, 200);
141
- } catch (error) {
142
- console.error('获取用户喜欢的歌曲失败:', error);
143
- return errorResponse((error as Error).message || '获取用户喜欢的歌曲失败', 502);
144
- }
145
- };
@@ -1,163 +0,0 @@
1
- import request from '../../../util/request';
2
- import { customResponse, errorResponse } from '../../../util/apiResponse';
3
- import type { ApiResponse } from '../../../types/api';
4
-
5
- interface UserPlaylistItem {
6
- [key: string]: unknown;
7
- }
8
-
9
- const DEBUG_ENABLED = process.env.DEBUG === 'true';
10
-
11
- const debugLog = (message: string, payload?: unknown) => {
12
- if (DEBUG_ENABLED) {
13
- console.log(`[getUserPlaylists] ${message}`, payload ?? '');
14
- }
15
- };
16
-
17
- const getNamedCandidateEntries = (payload: Record<string, any>) => [
18
- ['data.mydiss.list', payload?.data?.mydiss?.list],
19
- ['data.mymusic', payload?.data?.mymusic],
20
- ['data.createdDissList', payload?.data?.createdDissList],
21
- ['data.createdList', payload?.data?.createdList],
22
- ['data.creator', payload?.data?.creator],
23
- ['data.creator.playlist', payload?.data?.creator?.playlist],
24
- ['data.creator.playlists', payload?.data?.creator?.playlists],
25
- ['data.playlist', payload?.data?.playlist],
26
- ['data.playlists', payload?.data?.playlists],
27
- ['mydiss.list', payload?.mydiss?.list],
28
- ['mymusic', payload?.mymusic],
29
- ['createdDissList', payload?.createdDissList],
30
- ['createdList', payload?.createdList],
31
- ['creator', payload?.creator],
32
- ['creator.playlist', payload?.creator?.playlist],
33
- ['creator.playlists', payload?.creator?.playlists],
34
- ['playlist', payload?.playlist],
35
- ['playlists', payload?.playlists]
36
- ] as const;
37
-
38
- const extractPlaylists = (payload: Record<string, any>): UserPlaylistItem[] => {
39
- debugLog('payload top-level keys', Object.keys(payload || {}));
40
- debugLog('payload.data keys', payload?.data && typeof payload.data === 'object' ? Object.keys(payload.data) : []);
41
-
42
- const matchedEntry = getNamedCandidateEntries(payload).find(([, candidate]) => Array.isArray(candidate));
43
-
44
- if (matchedEntry) {
45
- const [candidatePath, playlists] = matchedEntry;
46
- debugLog('matched playlist candidate', {
47
- candidatePath,
48
- length: (playlists as unknown[]).length
49
- });
50
- return playlists as UserPlaylistItem[];
51
- }
52
-
53
- debugLog(
54
- 'playlist candidates summary',
55
- getNamedCandidateEntries(payload).map(([candidatePath, candidate]) => ({
56
- candidatePath,
57
- type: Array.isArray(candidate) ? 'array' : typeof candidate,
58
- keys: candidate && typeof candidate === 'object' && !Array.isArray(candidate) ? Object.keys(candidate) : undefined
59
- }))
60
- );
61
-
62
- throw new Error('用户歌单响应中未找到歌单列表字段');
63
- };
64
-
65
- const getErrorMessage = (payload: Record<string, any>): string => {
66
- const candidates = [payload.message, payload.msg, payload.errmsg, payload.error];
67
- const matched = candidates.find(candidate => typeof candidate === 'string' && candidate.trim() !== '');
68
- return (matched as string | undefined) || '获取用户歌单失败';
69
- };
70
-
71
- // 获取用户创建的歌单
72
- // 注意:此接口需要有效的 QQ 音乐 Cookie 才能正常工作
73
- export const getUserPlaylists = async (params: {
74
- uin: string;
75
- offset?: number;
76
- limit?: number;
77
- }): Promise<ApiResponse> => {
78
- const { uin, offset = 0, limit = 30 } = params;
79
-
80
- // 使用 c6.y.qq.com/rsc/fcgi-bin/fcg_get_profile_homepage.fcg 接口
81
- // 这是通过 Chrome DevTools 抓包发现的实际使用的接口
82
- const url = 'https://c6.y.qq.com/rsc/fcgi-bin/fcg_get_profile_homepage.fcg';
83
- const pageOffset = offset % limit;
84
-
85
- try {
86
- debugLog('request meta', {
87
- url,
88
- uin,
89
- offset,
90
- limit,
91
- pageOffset,
92
- hasGlobalCookie: Boolean(global.userInfo?.cookie),
93
- cookieLength: global.userInfo?.cookie?.length || 0
94
- });
95
-
96
- const response = await request<Record<string, any>>({
97
- url,
98
- method: 'GET',
99
- isUUrl: 'u',
100
- options: {
101
- params: {
102
- _: Date.now(),
103
- cv: 4747474,
104
- ct: 24,
105
- format: 'json',
106
- inCharset: 'utf-8',
107
- outCharset: 'utf-8',
108
- notice: 0,
109
- platform: 'yqq.json',
110
- needNewCode: 0,
111
- uin: Number.parseInt(uin, 10),
112
- g_tk_new_20200303: 0,
113
- g_tk: 0,
114
- cid: 205360838,
115
- userid: Number.parseInt(uin, 10),
116
- reqfrom: 1,
117
- reqtype: 0,
118
- hostUin: 0,
119
- loginUin: Number.parseInt(uin, 10)
120
- },
121
- headers: {
122
- Referer: `https://y.qq.com/portal/profile.html?uin=${uin}`,
123
- Cookie: global.userInfo?.cookie || ''
124
- }
125
- }
126
- });
127
-
128
- const payload = response.data;
129
-
130
- debugLog('upstream payload summary', {
131
- topLevelKeys: payload && typeof payload === 'object' ? Object.keys(payload) : null,
132
- code: payload?.code,
133
- hasData: Boolean(payload?.data),
134
- dataKeys: payload?.data && typeof payload.data === 'object' ? Object.keys(payload.data) : []
135
- });
136
-
137
- if (!payload || typeof payload !== 'object') {
138
- debugLog('invalid payload received', payload);
139
- return errorResponse('用户歌单响应格式无效', 502);
140
- }
141
-
142
- if (typeof payload.code === 'number' && payload.code !== 0) {
143
- debugLog('upstream business error payload', payload);
144
- return errorResponse(getErrorMessage(payload), 502);
145
- }
146
-
147
- const upstreamPlaylists = extractPlaylists(payload);
148
- const playlists = pageOffset > 0 ? upstreamPlaylists.slice(pageOffset, pageOffset + limit) : upstreamPlaylists;
149
-
150
- debugLog('final response contract', {
151
- wrapper: 'customResponse',
152
- expectedBodyShape: { response: { code: 0, data: { playlists: '...' } } },
153
- upstreamLength: upstreamPlaylists.length,
154
- normalizedLength: playlists.length
155
- });
156
-
157
- return customResponse({ response: { code: 0, data: { playlists } } }, 200);
158
- } catch (error) {
159
- console.error('获取用户歌单失败:', error);
160
- return errorResponse((error as Error).message || '获取用户歌单失败', 502);
161
- }
162
- };
163
-
@@ -1,44 +0,0 @@
1
- import { AxiosRequestConfig, Method } from 'axios';
2
- import request from '../../util/request';
3
- import * as config from '../config';
4
-
5
- interface YCommonOptions {
6
- url: string;
7
- method?: Method | string;
8
- options?: AxiosRequestConfig;
9
- hasCommonParams?: boolean;
10
- }
11
-
12
- export default ({ url, method = 'get', options = {}, hasCommonParams = true }: YCommonOptions) => {
13
- const opts: AxiosRequestConfig = { ...options };
14
-
15
- // Merge commonParams into params
16
- // commonParams acts as defaults, specific params override them
17
- if (hasCommonParams) {
18
- opts.params = { ...config.commonParams, ...(opts.params || {}) };
19
- } else {
20
- opts.params = { ...(opts.params || {}) };
21
- }
22
-
23
- opts.headers = {
24
- referer: 'https://c.y.qq.com/',
25
- host: 'c.y.qq.com',
26
- ...(opts.headers || {})
27
- };
28
-
29
- if (process.env.DEBUG === 'true') {
30
- const logOpts = { ...opts, headers: { ...opts.headers } };
31
- const SENSITIVE_HEADER_KEYS = ['cookie', 'authorization', 'proxy-authorization'];
32
-
33
- if (logOpts.headers) {
34
- Object.keys(logOpts.headers).forEach(key => {
35
- if (SENSITIVE_HEADER_KEYS.includes(key.toLowerCase())) {
36
- (logOpts.headers as any)[key] = '[masked]';
37
- }
38
- });
39
- }
40
-
41
- console.log(url, { opts: logOpts });
42
- }
43
- return request(url, method as Method, opts);
44
- };
package/module/config.ts DELETED
@@ -1,24 +0,0 @@
1
- export const commonParams = {
2
- g_tk: 1124214810,
3
- loginUin: (global.userInfo as any)?.uin || '0',
4
- hostUin: 0,
5
- inCharset: 'utf8',
6
- outCharset: 'utf-8',
7
- // format: 'json',
8
- notice: 0,
9
- platform: 'yqq.json',
10
- needNewCode: 0
11
- };
12
-
13
- export const _guid = (Math.round(2147483647 * Math.random()) * new Date().getUTCMilliseconds()) % 1e10;
14
-
15
- export const options = {
16
- param: 'jsonpCallback',
17
- prefix: 'tan'
18
- // prefix: 'jp',
19
- };
20
-
21
- export const optionsPrefix = {
22
- param: 'jsonpCallback',
23
- prefix: 'playlistinfoCallback'
24
- };
package/module/index.ts DELETED
@@ -1,95 +0,0 @@
1
- import downloadQQMusic from './apis/downloadQQMusic';
2
- // search
3
- import getHotKey from './apis/search/getHotKey';
4
- import getSearchByKey from './apis/search/getSearchByKey';
5
- import getSmartbox from './apis/search/getSmartbox';
6
-
7
- // song list
8
- import songLists from './apis/songLists/songLists';
9
- import songListCategories from './apis/songLists/songListCategories';
10
- import songListDetail from './apis/songLists/songListDetail';
11
-
12
- // MV
13
- import getMvByTag from './apis/mv/getMvByTag';
14
-
15
- // singer
16
- import getSimilarSinger from './apis/singers/getSimilarSinger';
17
- import getSingerMv from './apis/singers/getSingerMv';
18
- import getSingerDesc from './apis/singers/getSingerDesc';
19
- import getSingerStarNum from './apis/singers/getSingerStarNum';
20
-
21
- // radio
22
- import getRadioLists from './apis/radio/getRadioLists';
23
-
24
- // DigitalAlbum
25
- import getDigitalAlbumLists from './apis/digitalAlbum/getDigitalAlbumLists';
26
-
27
- // music
28
- import getLyric from './apis/music/getLyric';
29
-
30
- // album
31
- import getAlbumInfo from './apis/album/getAlbumInfo';
32
-
33
- // comments
34
- import getComments from './apis/comments/getComments';
35
-
36
- // UCommon
37
- import UCommon from './apis/UCommon/UCommon';
38
-
39
- // getTopLists
40
- import getTopLists from './apis/rank/getTopLists';
41
-
42
- // getQQLoginQr
43
- import getQQLoginQr from './apis/user/getQQLoginQr';
44
-
45
- // checkQQLoginQr
46
- import checkQQLoginQr from './apis/user/checkQQLoginQr';
47
-
48
- // getUserPlaylists
49
- import { getUserPlaylists } from './apis/user/getUserPlaylists';
50
-
51
- // getUserAvatar
52
- import { getUserAvatar } from './apis/user/getUserAvatar';
53
-
54
- // getUserLikedSongs
55
- import { getUserLikedSongs } from './apis/user/getUserLikedSongs';
56
-
57
- export {
58
- downloadQQMusic,
59
- // search
60
- getHotKey,
61
- getSearchByKey,
62
- getSmartbox,
63
- // song lists
64
- songLists,
65
- songListCategories,
66
- songListDetail,
67
- // MV
68
- getMvByTag,
69
- // singer
70
- getSimilarSinger,
71
- getSingerMv,
72
- getSingerDesc,
73
- getSingerStarNum,
74
- // radio
75
- getRadioLists,
76
- // DigitalAlbum
77
- getDigitalAlbumLists,
78
- // music
79
- getLyric,
80
- // album
81
- getAlbumInfo,
82
- // comments
83
- getComments,
84
- // UCommon
85
- UCommon,
86
- // getTopLists
87
- getTopLists,
88
- // login
89
- getQQLoginQr,
90
- checkQQLoginQr,
91
- // user
92
- getUserPlaylists,
93
- getUserAvatar,
94
- getUserLikedSongs
95
- };
package/music.png DELETED
Binary file
@@ -1,2 +0,0 @@
1
- onlyBuiltDependencies:
2
- - esbuild