rsshub 1.0.0-master.ff487f3 → 1.0.0-master.ff76aa7

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.

Potentially problematic release.


This version of rsshub might be problematic. Click here for more details.

Files changed (532) hide show
  1. package/README.md +13 -48
  2. package/lib/api/radar/rules/all.ts +3 -6
  3. package/lib/api/radar/rules/one.ts +3 -6
  4. package/lib/config.ts +50 -2
  5. package/lib/errors/index.test.ts +1 -1
  6. package/lib/errors/index.tsx +1 -1
  7. package/lib/index.ts +1 -1
  8. package/lib/middleware/anti-hotlink.test.ts +191 -6
  9. package/lib/middleware/anti-hotlink.ts +29 -1
  10. package/lib/middleware/logger.ts +2 -2
  11. package/lib/middleware/parameter.test.ts +22 -5
  12. package/lib/middleware/parameter.ts +47 -17
  13. package/lib/middleware/template.tsx +10 -2
  14. package/lib/registry.test.ts +8 -0
  15. package/lib/registry.ts +2 -0
  16. package/lib/router.js +1 -9
  17. package/lib/routes/4ksj/forum.ts +54 -20
  18. package/lib/routes/500px/tribe-set.ts +3 -2
  19. package/lib/routes/51cto/recommend.ts +45 -7
  20. package/lib/routes/5eplay/index.ts +1 -51
  21. package/lib/routes/5eplay/utils.ts +5 -3
  22. package/lib/routes/a9vg/index.ts +214 -0
  23. package/lib/routes/a9vg/namespace.ts +1 -0
  24. package/lib/routes/a9vg/templates/description.art +17 -0
  25. package/lib/routes/abc/index.ts +2 -2
  26. package/lib/routes/academia/namespace.ts +1 -1
  27. package/lib/routes/agri/index.ts +307 -0
  28. package/lib/routes/agri/namespace.ts +8 -0
  29. package/lib/routes/agri/templates/description.art +21 -0
  30. package/lib/routes/aibase/discover.ts +388 -0
  31. package/lib/routes/aibase/namespace.ts +8 -0
  32. package/lib/routes/aibase/news.ts +118 -0
  33. package/lib/routes/aibase/templates/description.art +100 -0
  34. package/lib/routes/aibase/topic.ts +614 -0
  35. package/lib/routes/aibase/util.ts +114 -0
  36. package/lib/routes/anime1/anime.ts +63 -0
  37. package/lib/routes/anime1/namespace.ts +6 -0
  38. package/lib/routes/anime1/search.ts +57 -0
  39. package/lib/routes/apnews/api.ts +77 -0
  40. package/lib/routes/apnews/rss.ts +2 -2
  41. package/lib/routes/apnews/sitemap.ts +99 -0
  42. package/lib/routes/apnews/topics.ts +2 -2
  43. package/lib/routes/apnews/utils.ts +2 -1
  44. package/lib/routes/apple/podcast.ts +20 -16
  45. package/lib/routes/asus/bios.ts +88 -21
  46. package/lib/routes/asus/templates/bios.art +13 -6
  47. package/lib/routes/bangumi/templates/tv/subject.art +6 -0
  48. package/lib/routes/bangumi/tv/other/followrank.ts +19 -22
  49. package/lib/routes/bangumi/tv/user/collections.ts +172 -0
  50. package/lib/routes/behance/user.ts +14 -3
  51. package/lib/routes/beijingprice/index.ts +12 -12
  52. package/lib/routes/bestblogs/feeds.ts +107 -0
  53. package/lib/routes/bestblogs/namespace.ts +6 -0
  54. package/lib/routes/bilibili/api-interface.d.ts +1 -0
  55. package/lib/routes/bilibili/bangumi.ts +3 -2
  56. package/lib/routes/bilibili/bilibili-recommend.ts +42 -0
  57. package/lib/routes/bilibili/cache.ts +41 -9
  58. package/lib/routes/bilibili/dynamic.ts +103 -105
  59. package/lib/routes/bilibili/followings-dynamic.ts +3 -1
  60. package/lib/routes/bilibili/followings-video.ts +9 -3
  61. package/lib/routes/bilibili/readlist.ts +3 -2
  62. package/lib/routes/bilibili/utils.ts +90 -3
  63. package/lib/routes/bilibili/video.ts +8 -9
  64. package/lib/routes/bilibili/vsearch.ts +1 -1
  65. package/lib/routes/binance/announcement.ts +168 -0
  66. package/lib/routes/binance/types.ts +26 -0
  67. package/lib/routes/bitget/announcement.ts +200 -0
  68. package/lib/routes/bitget/namespace.ts +6 -0
  69. package/lib/routes/bitget/type.ts +26 -0
  70. package/lib/routes/bjnews/cat.ts +9 -1
  71. package/lib/routes/bjp/apod.ts +4 -2
  72. package/lib/routes/buaa/jiaowu.ts +1 -1
  73. package/lib/routes/buaa/lib/space/newbook.ts +171 -0
  74. package/lib/routes/buaa/lib/space/templates/newbook.art +44 -0
  75. package/lib/routes/bupt/jwc.ts +130 -0
  76. package/lib/routes/caixin/latest.ts +3 -2
  77. package/lib/routes/cbpanet/index.ts +380 -0
  78. package/lib/routes/cbpanet/namespace.ts +8 -0
  79. package/lib/routes/ccfa/index.ts +216 -0
  80. package/lib/routes/ccfa/namespace.ts +8 -0
  81. package/lib/routes/ccfa/templates/description.art +7 -0
  82. package/lib/routes/cctv/category.ts +16 -12
  83. package/lib/routes/cctv/xwlb.ts +32 -10
  84. package/lib/routes/cdu/jwgg.ts +79 -0
  85. package/lib/routes/cdu/namespace.ts +6 -0
  86. package/lib/routes/ceph/blog.ts +72 -0
  87. package/lib/routes/ceph/namespace.ts +7 -0
  88. package/lib/routes/changba/user.ts +6 -5
  89. package/lib/routes/chikubi/category.ts +41 -0
  90. package/lib/routes/chikubi/index.ts +66 -0
  91. package/lib/routes/chikubi/namespace.ts +15 -0
  92. package/lib/routes/chikubi/navigation.ts +66 -0
  93. package/lib/routes/chikubi/nipple-video-category.ts +49 -0
  94. package/lib/routes/chikubi/nipple-video-maker.ts +49 -0
  95. package/lib/routes/chikubi/search.ts +39 -0
  96. package/lib/routes/chikubi/tag.ts +41 -0
  97. package/lib/routes/chikubi/utils.ts +135 -0
  98. package/lib/routes/chinanews/index.ts +1 -1
  99. package/lib/routes/chinaventure/index.ts +1 -1
  100. package/lib/routes/chlinlearn/daily-blog.ts +7 -0
  101. package/lib/routes/cisia/index.ts +264 -0
  102. package/lib/routes/cisia/namespace.ts +8 -0
  103. package/lib/routes/cjlu/namespace.ts +10 -0
  104. package/lib/routes/cjlu/yjsy/index.ts +107 -0
  105. package/lib/routes/cls/subject.ts +153 -0
  106. package/lib/routes/cls/templates/description.art +21 -0
  107. package/lib/routes/cohere/index.ts +54 -0
  108. package/lib/routes/cohere/namespace.ts +6 -0
  109. package/lib/routes/damai/activity.ts +3 -2
  110. package/lib/routes/dcfever/trading.ts +3 -5
  111. package/lib/routes/dcfever/utils.ts +13 -4
  112. package/lib/routes/dealstreetasia/home.ts +72 -0
  113. package/lib/routes/dealstreetasia/namespace.ts +6 -0
  114. package/lib/routes/dealstreetasia/section.ts +57 -0
  115. package/lib/routes/deepin/thread.ts +102 -0
  116. package/lib/routes/deeplearning/thebatch.ts +30 -18
  117. package/lib/routes/devolverdigital/blog.ts +59 -42
  118. package/lib/routes/devtrium/namespace.ts +6 -0
  119. package/lib/routes/devtrium/posts.ts +55 -0
  120. package/lib/routes/discourse/official.ts +55 -0
  121. package/lib/routes/dlsite/campaign.ts +1 -2
  122. package/lib/routes/dlsite/new.ts +1 -2
  123. package/lib/routes/dlsite/{index.ts → z-index/index.ts} +1 -1
  124. package/lib/routes/dockerhub/build.ts +1 -1
  125. package/lib/routes/dockerhub/utils.ts +4 -3
  126. package/lib/routes/douban/movie/coming.ts +68 -0
  127. package/lib/routes/douban/templates/movie_coming.art +27 -0
  128. package/lib/routes/douyin/types.ts +795 -0
  129. package/lib/routes/douyin/user.ts +51 -23
  130. package/lib/routes/douyin/utils.ts +1 -87
  131. package/lib/routes/dykszx/namespace.ts +8 -0
  132. package/lib/routes/dykszx/news.ts +88 -0
  133. package/lib/routes/eagle/blog.ts +13 -2
  134. package/lib/routes/eastmoney/report/index.ts +63 -15
  135. package/lib/routes/eastmoney/templates/stock_description.art +36 -0
  136. package/lib/routes/eastmoney/utils.ts +35 -0
  137. package/lib/routes/easynomad/joblist.ts +56 -0
  138. package/lib/routes/easynomad/namespace.ts +6 -0
  139. package/lib/routes/economist/espresso.ts +3 -2
  140. package/lib/routes/economist/full.ts +3 -2
  141. package/lib/routes/epicgames/index.ts +1 -1
  142. package/lib/routes/espn/namespace.ts +6 -0
  143. package/lib/routes/espn/news.ts +120 -0
  144. package/lib/routes/espn/templates/media.art +19 -0
  145. package/lib/routes/famitsu/category.ts +1 -1
  146. package/lib/routes/fanbox/index.ts +1 -1
  147. package/lib/routes/fanbox/types.ts +1 -5
  148. package/lib/routes/fediverse/timeline.ts +2 -2
  149. package/lib/routes/flashcat/blog.ts +61 -0
  150. package/lib/routes/flashcat/namespace.ts +6 -0
  151. package/lib/routes/follow/namespace.ts +6 -0
  152. package/lib/routes/follow/profile.ts +83 -0
  153. package/lib/routes/follow/types.ts +78 -0
  154. package/lib/routes/ftm/index.ts +60 -0
  155. package/lib/routes/ftm/namespace.ts +6 -0
  156. package/lib/routes/galxe/index.ts +94 -0
  157. package/lib/routes/galxe/namespace.ts +9 -0
  158. package/lib/routes/gamer/ani/anime.ts +10 -3
  159. package/lib/routes/gamer/ani/new-anime.ts +4 -3
  160. package/lib/routes/gamer/gnn-index.ts +31 -11
  161. package/lib/routes/gamer/hot.ts +4 -3
  162. package/lib/routes/gamersky/ent.ts +57 -0
  163. package/lib/routes/gamersky/namespace.ts +10 -0
  164. package/lib/routes/gamersky/news.ts +91 -0
  165. package/lib/routes/gamersky/review.ts +80 -0
  166. package/lib/routes/gamersky/utils.ts +94 -0
  167. package/lib/routes/gdut/oa-news.ts +12 -17
  168. package/lib/routes/geekpark/index.ts +219 -0
  169. package/lib/routes/geekpark/namespace.ts +8 -0
  170. package/lib/routes/geekpark/templates/description.art +21 -0
  171. package/lib/routes/gisreportsonline/index.ts +60 -0
  172. package/lib/routes/gisreportsonline/namespace.ts +6 -0
  173. package/lib/routes/github/activity.ts +2 -1
  174. package/lib/routes/github/advisor.ts +97 -0
  175. package/lib/routes/github/comments.ts +32 -30
  176. package/lib/routes/github/discussions.ts +194 -0
  177. package/lib/routes/github/issue.ts +1 -1
  178. package/lib/routes/github/pulls.ts +1 -1
  179. package/lib/routes/gmcmonline/chinacustoms.ts +130 -0
  180. package/lib/routes/gmcmonline/namespace.ts +8 -0
  181. package/lib/routes/go/mhlw/pdf.ts +87 -0
  182. package/lib/routes/go/namespace.ts +8 -0
  183. package/lib/routes/go/niid/idwr-dl.ts +104 -0
  184. package/lib/routes/gov/cbirc/index.ts +371 -0
  185. package/lib/routes/gov/chongqing/sydwgkzp.ts +4 -4
  186. package/lib/routes/gov/cn/namespace.ts +8 -0
  187. package/lib/routes/gov/{news → cn/news}/index.ts +11 -7
  188. package/lib/routes/gov/csrc/csrc.ts +541 -0
  189. package/lib/routes/gov/lswz/index.ts +289 -0
  190. package/lib/routes/gov/moa/moa.ts +3 -3
  191. package/lib/routes/gov/moa/szcpxx.ts +115 -0
  192. package/lib/routes/gov/moa/zdscxx.ts +71 -21
  193. package/lib/routes/gov/ndrc/fggz.ts +637 -2
  194. package/lib/routes/gov/ndrc/namespace.ts +8 -0
  195. package/lib/routes/gov/ndrc/xwdt.ts +28 -8
  196. package/lib/routes/gov/ndrc/zfxxgk.ts +106 -0
  197. package/lib/routes/gov/zj/search.ts +17 -12
  198. package/lib/routes/gq/news.ts +3 -2
  199. package/lib/routes/gs/developer/blog.ts +58 -0
  200. package/lib/routes/gs/namespace.ts +9 -0
  201. package/lib/routes/guancha/member.ts +1 -1
  202. package/lib/routes/hackernews/index.ts +16 -5
  203. package/lib/routes/healthz.ts +8 -0
  204. package/lib/routes/hellogithub/index.ts +17 -67
  205. package/lib/routes/hellogithub/report.ts +1 -1
  206. package/lib/routes/hex-rays/index.ts +23 -29
  207. package/lib/routes/hfut/hf/notice.ts +43 -0
  208. package/lib/routes/hfut/hf/utils.ts +80 -0
  209. package/lib/routes/hfut/namespace.ts +6 -0
  210. package/lib/routes/hfut/xc/notice.ts +43 -0
  211. package/lib/routes/hfut/xc/utils.ts +73 -0
  212. package/lib/routes/hket/index.ts +80 -76
  213. package/lib/routes/hko/earthquake.ts +56 -0
  214. package/lib/routes/hko/namespace.ts +8 -0
  215. package/lib/routes/hko/weather.ts +56 -0
  216. package/lib/routes/hottoys/index.ts +63 -0
  217. package/lib/routes/hottoys/namespace.ts +6 -0
  218. package/lib/routes/hpoi/all.ts +17 -6
  219. package/lib/routes/hpoi/character.ts +18 -6
  220. package/lib/routes/hpoi/info.ts +11 -6
  221. package/lib/routes/hpoi/user.ts +16 -4
  222. package/lib/routes/hpoi/utils.ts +36 -3
  223. package/lib/routes/hpoi/work.ts +18 -6
  224. package/lib/routes/huggingface/blog-zh.ts +1 -1
  225. package/lib/routes/hust/gs.ts +281 -0
  226. package/lib/routes/hust/mse.ts +575 -0
  227. package/lib/routes/hust/namespace.ts +1 -1
  228. package/lib/routes/i-cable/namespace.ts +6 -0
  229. package/lib/routes/i-cable/news.ts +77 -0
  230. package/lib/routes/i-cable/templates/description.art +8 -0
  231. package/lib/routes/imhcg/blog.ts +47 -0
  232. package/lib/routes/imhcg/namespace.ts +7 -0
  233. package/lib/routes/imop/namespace.ts +10 -0
  234. package/lib/routes/imop/tianshu.ts +53 -0
  235. package/lib/routes/infzm/hot.ts +39 -0
  236. package/lib/routes/infzm/index.ts +3 -30
  237. package/lib/routes/infzm/utils.ts +34 -0
  238. package/lib/routes/ipsw.dev/index.ts +64 -0
  239. package/lib/routes/ipsw.dev/namespace.ts +7 -0
  240. package/lib/routes/ipsw.dev/templates/description.art +20 -0
  241. package/lib/routes/iwara/subscriptions.ts +1 -1
  242. package/lib/routes/javtiful/actress.ts +37 -0
  243. package/lib/routes/javtiful/channel.ts +37 -0
  244. package/lib/routes/javtiful/namespace.ts +6 -0
  245. package/lib/routes/javtiful/templates/description.art +7 -0
  246. package/lib/routes/javtiful/utils.ts +18 -0
  247. package/lib/routes/jianshu/collection.ts +3 -2
  248. package/lib/routes/jianshu/home.ts +3 -2
  249. package/lib/routes/jianshu/user.ts +3 -2
  250. package/lib/routes/jike/topic.ts +10 -3
  251. package/lib/routes/jike/user.ts +3 -2
  252. package/lib/routes/jjwxc/book.ts +18 -14
  253. package/lib/routes/joins/chinese.ts +218 -0
  254. package/lib/routes/joins/namespace.ts +8 -0
  255. package/lib/routes/joins/templates/description.art +17 -0
  256. package/lib/routes/kakuyomu/namespace.ts +6 -0
  257. package/lib/routes/kakuyomu/types.ts +6 -0
  258. package/lib/routes/kakuyomu/works.ts +73 -0
  259. package/lib/routes/kaopu/news.ts +3 -3
  260. package/lib/routes/kisskiss/blog.ts +74 -0
  261. package/lib/routes/kisskiss/namespace.ts +6 -0
  262. package/lib/routes/konachan/namespace.ts +7 -0
  263. package/lib/routes/konachan/post.ts +84 -0
  264. package/lib/routes/lemmy/index.ts +30 -3
  265. package/lib/routes/lemmy/namespace.ts +1 -0
  266. package/lib/routes/link3/events.ts +86 -0
  267. package/lib/routes/link3/namespace.ts +6 -0
  268. package/lib/routes/link3/profile.ts +143 -0
  269. package/lib/routes/lmu/jobs.ts +96 -0
  270. package/lib/routes/lmu/namespace.ts +17 -0
  271. package/lib/routes/lmu/templates/jobPosting.art +11 -0
  272. package/lib/routes/lofter/collection.ts +87 -0
  273. package/lib/routes/lofter/user.ts +1 -1
  274. package/lib/routes/lorientlejour/index.ts +186 -0
  275. package/lib/routes/lorientlejour/namespace.ts +7 -0
  276. package/lib/routes/lorientlejour/templates/description.art +18 -0
  277. package/lib/routes/lovelive-anime/namespace.ts +1 -1
  278. package/lib/routes/lovelive-anime/news.ts +56 -26
  279. package/lib/routes/lovelive-anime/schedules.ts +18 -6
  280. package/lib/routes/lovelive-anime/templates/description.art +1 -1
  281. package/lib/routes/lovelive-anime/templates/scheduleDesc.art +0 -1
  282. package/lib/routes/lovelive-anime/topics.ts +1 -1
  283. package/lib/routes/luma/index.ts +92 -0
  284. package/lib/routes/luma/namespace.ts +6 -0
  285. package/lib/routes/malaysiakini/index.ts +179 -0
  286. package/lib/routes/malaysiakini/namespace.ts +11 -0
  287. package/lib/routes/manhuagui/comic.ts +1 -1
  288. package/lib/routes/mastodon/account-id.ts +26 -3
  289. package/lib/routes/mastodon/acct.ts +15 -4
  290. package/lib/routes/mastodon/timeline-local.ts +14 -3
  291. package/lib/routes/mastodon/timeline-remote.ts +14 -3
  292. package/lib/routes/meishichina/index.ts +1997 -0
  293. package/lib/routes/meishichina/namespace.ts +8 -0
  294. package/lib/routes/mi/crowdfunding.ts +43 -22
  295. package/lib/routes/mi/templates/crowdfunding.art +28 -0
  296. package/lib/routes/mi/types.ts +40 -0
  297. package/lib/routes/mi/utils.ts +80 -0
  298. package/lib/routes/misskey/featured-notes.ts +3 -2
  299. package/lib/routes/misskey/user-timeline.ts +3 -2
  300. package/lib/routes/misskey/utils.ts +1 -0
  301. package/lib/routes/natgeo/dailyphoto.ts +4 -3
  302. package/lib/routes/natgeo/dailyselection.ts +17 -2
  303. package/lib/routes/ncku/csie.ts +83 -0
  304. package/lib/routes/ncku/namespace.ts +6 -0
  305. package/lib/routes/ncku/phys.ts +95 -0
  306. package/lib/routes/news/namespace.ts +1 -1
  307. package/lib/routes/newyorker/news.ts +29 -21
  308. package/lib/routes/nhk/news.ts +32 -15
  309. package/lib/routes/nicovideo/namespace.ts +7 -0
  310. package/lib/routes/nicovideo/templates/video.art +7 -0
  311. package/lib/routes/nicovideo/types.ts +54 -0
  312. package/lib/routes/nicovideo/utils.ts +37 -0
  313. package/lib/routes/nicovideo/video.ts +47 -0
  314. package/lib/routes/nikkei/cn/index.ts +12 -1
  315. package/lib/routes/nytimes/book.ts +25 -28
  316. package/lib/routes/nytimes/daily-briefing-chinese.ts +4 -4
  317. package/lib/routes/nytimes/index.ts +16 -9
  318. package/lib/routes/nytimes/namespace.ts +1 -1
  319. package/lib/routes/obsidian/namespace.ts +6 -0
  320. package/lib/routes/obsidian/publish.ts +83 -0
  321. package/lib/routes/obsidian/utils.ts +8 -0
  322. package/lib/routes/oct0pu5/namespace.ts +10 -0
  323. package/lib/routes/oct0pu5/rss.ts +48 -0
  324. package/lib/routes/oncc/templates/article.art +1 -1
  325. package/lib/routes/papers/index.ts +7 -1
  326. package/lib/routes/parliament.uk/commonslibrary.ts +55 -0
  327. package/lib/routes/parliament.uk/lordslibrary.ts +55 -0
  328. package/lib/routes/parliament.uk/namespace.ts +6 -0
  329. package/lib/routes/pconline/focus.ts +143 -0
  330. package/lib/routes/pconline/namespace.ts +10 -0
  331. package/lib/routes/people/index.ts +6 -2
  332. package/lib/routes/picnob/user.ts +11 -3
  333. package/lib/routes/picuki/profile.ts +50 -39
  334. package/lib/routes/pixiv/ranking.ts +1 -0
  335. package/lib/routes/pixivision/index.ts +84 -0
  336. package/lib/routes/pixivision/namespace.ts +6 -0
  337. package/lib/routes/pixivision/utils.ts +86 -0
  338. package/lib/routes/pku/bbs/hot.ts +1 -1
  339. package/lib/routes/pornhub/category.ts +3 -2
  340. package/lib/routes/pornhub/model.ts +6 -7
  341. package/lib/routes/pornhub/pornstar.ts +67 -19
  342. package/lib/routes/pornhub/search.ts +3 -2
  343. package/lib/routes/pornhub/users.ts +3 -5
  344. package/lib/routes/qiche365/namespace.ts +5 -0
  345. package/lib/routes/qiche365/recall.ts +53 -0
  346. package/lib/routes/qidian/namespace.ts +1 -1
  347. package/lib/routes/questn/community.ts +76 -0
  348. package/lib/routes/questn/events.ts +101 -0
  349. package/lib/routes/questn/namespace.ts +6 -0
  350. package/lib/routes/questn/util.ts +16 -0
  351. package/lib/routes/rebase/geekdaily.ts +35 -0
  352. package/lib/routes/rebase/namespace.ts +6 -0
  353. package/lib/routes/resonac/namespace.ts +6 -0
  354. package/lib/routes/resonac/products.ts +85 -0
  355. package/lib/routes/reuters/common.ts +54 -1
  356. package/lib/routes/rss3/index.ts +22 -13
  357. package/lib/routes/rss3/interfaces/metadata.ts +67 -0
  358. package/lib/routes/rsshub/transform/html.ts +114 -75
  359. package/lib/routes/samd/news.ts +1 -1
  360. package/lib/routes/sciencenet/user.ts +3 -1
  361. package/lib/routes/scmp/utils.ts +2 -2
  362. package/lib/routes/scut/gzic/media.ts +71 -0
  363. package/lib/routes/scut/gzic/news.ts +65 -0
  364. package/lib/routes/scut/gzic/notice.ts +88 -0
  365. package/lib/routes/sdu/{cs.ts → cs/index.ts} +46 -12
  366. package/lib/routes/sdu/cs/yjsgz.ts +85 -0
  367. package/lib/routes/sdu/gjsw.ts +80 -0
  368. package/lib/routes/sdu/namespace.ts +2 -2
  369. package/lib/routes/sdu/qd/xszxqd.ts +98 -0
  370. package/lib/routes/sdu/qd/xyb.ts +82 -0
  371. package/lib/routes/sdu/ygb.ts +90 -0
  372. package/lib/routes/showstart/search.ts +33 -1
  373. package/lib/routes/sis001/author.ts +52 -0
  374. package/lib/routes/sis001/common.ts +38 -0
  375. package/lib/routes/sis001/forum.ts +2 -29
  376. package/lib/routes/sjtu/jwc.ts +4 -1
  377. package/lib/routes/sjtu/namespace.ts +1 -1
  378. package/lib/routes/sjtu/seiee/index.ts +97 -0
  379. package/lib/routes/skeb/following-creators.ts +52 -0
  380. package/lib/routes/skeb/following-works.ts +52 -0
  381. package/lib/routes/skeb/friend-works.ts +52 -0
  382. package/lib/routes/skeb/index.ts +131 -0
  383. package/lib/routes/skeb/namespace.ts +6 -0
  384. package/lib/routes/skeb/search.ts +77 -0
  385. package/lib/routes/skeb/templates/creator.art +8 -0
  386. package/lib/routes/skeb/templates/work.art +10 -0
  387. package/lib/routes/skeb/utils.ts +155 -0
  388. package/lib/routes/skeb/works.ts +88 -0
  389. package/lib/routes/skebetter/illust.ts +83 -0
  390. package/lib/routes/skebetter/index.ts +83 -0
  391. package/lib/routes/skebetter/manga.ts +65 -0
  392. package/lib/routes/skebetter/namespace.ts +6 -0
  393. package/lib/routes/skebetter/utils.ts +72 -0
  394. package/lib/routes/smzdm/product.ts +85 -0
  395. package/lib/routes/solidot/main.ts +28 -12
  396. package/lib/routes/soundon/namespace.ts +6 -0
  397. package/lib/routes/soundon/podcast.ts +80 -0
  398. package/lib/routes/soundon/types.ts +67 -0
  399. package/lib/routes/spankbang/namespace.ts +6 -0
  400. package/lib/routes/spankbang/new-videos.ts +90 -0
  401. package/lib/routes/spankbang/templates/video.art +7 -0
  402. package/lib/routes/sse/sselawsrules.ts +370 -0
  403. package/lib/routes/sspai/index.ts +2 -2
  404. package/lib/routes/straitstimes/index.ts +135 -0
  405. package/lib/routes/straitstimes/namespace.ts +7 -0
  406. package/lib/routes/straitstimes/templates/description.art +27 -0
  407. package/lib/routes/sustainabilitymag/articles.ts +2 -0
  408. package/lib/routes/sustainabilitymag/namespace.ts +1 -1
  409. package/lib/routes/swjtu/scai/bks.ts +76 -0
  410. package/lib/routes/szftedu/dongtai.ts +62 -0
  411. package/lib/routes/szftedu/gonggao.ts +62 -0
  412. package/lib/routes/szftedu/namespace.ts +6 -0
  413. package/lib/routes/szse/rule.ts +315 -42
  414. package/lib/routes/taoguba/blog.ts +1 -1
  415. package/lib/routes/taoguba/index.ts +1 -1
  416. package/lib/routes/telegram/blog.ts +3 -2
  417. package/lib/routes/telegram/channel.ts +34 -3
  418. package/lib/routes/telegram/stickerpack.ts +3 -2
  419. package/lib/routes/tencent/news/author.ts +2 -1
  420. package/lib/routes/test/index.ts +50 -43
  421. package/lib/routes/the/index.ts +8 -4
  422. package/lib/routes/theblockbeats/index.ts +10 -5
  423. package/lib/routes/theinitium/app.ts +137 -0
  424. package/lib/routes/theinitium/templates/description.art +17 -0
  425. package/lib/routes/threads/index.ts +26 -20
  426. package/lib/routes/tju/cic/index.ts +2 -2
  427. package/lib/routes/tju/news/index.ts +2 -2
  428. package/lib/routes/tju/oaa/index.ts +2 -2
  429. package/lib/routes/towardsdatascience/latest.ts +67 -0
  430. package/lib/routes/towardsdatascience/namespace.ts +6 -0
  431. package/lib/routes/ttv/index.ts +1 -1
  432. package/lib/routes/tvb/news.ts +2 -1
  433. package/lib/routes/twitch/live.ts +3 -2
  434. package/lib/routes/twitch/video.ts +15 -6
  435. package/lib/routes/twitter/api/index.ts +2 -0
  436. package/lib/routes/twitter/api/mobile-api/login.ts +6 -1
  437. package/lib/routes/twitter/api/web-api/api.ts +34 -10
  438. package/lib/routes/twitter/api/web-api/constants.ts +18 -15
  439. package/lib/routes/twitter/api/web-api/login.ts +75 -0
  440. package/lib/routes/twitter/api/web-api/utils.ts +147 -52
  441. package/lib/routes/twitter/home-latest.ts +60 -0
  442. package/lib/routes/twitter/list.ts +5 -2
  443. package/lib/routes/twitter/media.ts +13 -4
  444. package/lib/routes/twitter/tweet.ts +1 -0
  445. package/lib/routes/twitter/user.ts +15 -6
  446. package/lib/routes/uber/blog.ts +1 -1
  447. package/lib/routes/udn/breaking-news.ts +2 -2
  448. package/lib/routes/uestc/bbs.ts +97 -0
  449. package/lib/routes/uestc/gr.ts +65 -37
  450. package/lib/routes/uestc/jwc.ts +49 -28
  451. package/lib/routes/uestc/namespace.ts +1 -1
  452. package/lib/routes/ustc/scms.ts +97 -0
  453. package/lib/routes/v2ex/topics.ts +1 -0
  454. package/lib/routes/vimeo/category.ts +4 -3
  455. package/lib/routes/vimeo/usr-videos.ts +3 -2
  456. package/lib/routes/voronoiapp/author.ts +41 -0
  457. package/lib/routes/voronoiapp/common.ts +247 -0
  458. package/lib/routes/voronoiapp/editors-pick.ts +28 -0
  459. package/lib/routes/voronoiapp/home.ts +29 -0
  460. package/lib/routes/voronoiapp/latest.ts +28 -0
  461. package/lib/routes/voronoiapp/namespace.ts +6 -0
  462. package/lib/routes/voronoiapp/popular.ts +49 -0
  463. package/lib/routes/voronoiapp/search.ts +33 -0
  464. package/lib/routes/voronoiapp/types.d.ts +78 -0
  465. package/lib/routes/wchscu/namespace.ts +6 -0
  466. package/lib/routes/wchscu/recruit.ts +73 -0
  467. package/lib/routes/wechat/ershcimi.ts +4 -2
  468. package/lib/routes/weibo/namespace.ts +1 -0
  469. package/lib/routes/weibo/oasis/user.ts +1 -1
  470. package/lib/routes/weibo/super-index.ts +23 -11
  471. package/lib/routes/weibo/user.ts +22 -3
  472. package/lib/routes/weibo/utils.ts +0 -4
  473. package/lib/routes/whu/cs.ts +11 -3
  474. package/lib/routes/whu/gs/index.ts +2 -1
  475. package/lib/routes/whu/news.ts +27 -2
  476. package/lib/routes/withgoogle/explorables.ts +54 -0
  477. package/lib/routes/withgoogle/namespace.ts +6 -0
  478. package/lib/routes/xbookcn/blog.ts +66 -0
  479. package/lib/routes/xbookcn/namespace.ts +6 -0
  480. package/lib/routes/xiaohongshu/notes.ts +10 -2
  481. package/lib/routes/xiaohongshu/user.ts +30 -6
  482. package/lib/routes/xiaohongshu/util.ts +3 -1
  483. package/lib/routes/xiaoyuzhou/podcast.ts +35 -7
  484. package/lib/routes/xidian/cs.ts +143 -0
  485. package/lib/routes/xidian/gr.ts +289 -0
  486. package/lib/routes/xidian/jwc.ts +1 -0
  487. package/lib/routes/xidian/namespace.ts +1 -1
  488. package/lib/routes/xueqiu/cookies.ts +17 -2
  489. package/lib/routes/xueqiu/favorite.ts +16 -2
  490. package/lib/routes/xueqiu/stock-info.ts +6 -12
  491. package/lib/routes/yamap/articles.ts +62 -0
  492. package/lib/routes/yamap/namespace.ts +6 -0
  493. package/lib/routes/yande/namespace.ts +1 -1
  494. package/lib/routes/yande/post.ts +7 -7
  495. package/lib/routes/yicai/carousel.ts +48 -0
  496. package/lib/routes/yicai/utils.ts +23 -17
  497. package/lib/routes/yilinzazhi/index.ts +58 -0
  498. package/lib/routes/yilinzazhi/latest.ts +103 -0
  499. package/lib/routes/yilinzazhi/namespace.ts +8 -0
  500. package/lib/routes/youtube/playlist.ts +3 -2
  501. package/lib/routes/yystv/docs.ts +28 -19
  502. package/lib/routes/zaobao/util.ts +41 -43
  503. package/lib/routes/zhihu/activities.ts +2 -1
  504. package/lib/routes/zhihu/answers.ts +5 -1
  505. package/lib/routes/zhihu/execlib/x-zse-96-v3.ts +2 -0
  506. package/lib/routes/zhihu/timeline.ts +6 -1
  507. package/lib/routes/zhihu/utils.ts +15 -7
  508. package/lib/routes/zhihu/zhuanlan.ts +8 -7
  509. package/lib/routes/zsxq/types.ts +9 -0
  510. package/lib/routes/zsxq/utils.ts +4 -3
  511. package/lib/setup.test.ts +1 -1
  512. package/lib/types.ts +6 -0
  513. package/lib/utils/cache/redis.ts +1 -1
  514. package/lib/utils/camelcase-keys.spec.ts +127 -0
  515. package/lib/utils/camelcase-keys.ts +27 -0
  516. package/lib/utils/common-utils.ts +1 -0
  517. package/lib/utils/otel/metric.ts +3 -2
  518. package/lib/utils/request-rewriter/fetch.ts +1 -1
  519. package/lib/views/index.tsx +3 -6
  520. package/lib/views/json.ts +1 -1
  521. package/lib/views/rss.tsx +7 -0
  522. package/package.json +55 -55
  523. package/lib/routes/a9vg/a9vg.ts +0 -45
  524. package/lib/routes/sse/lawandrules.ts +0 -68
  525. package/lib/routes-deprecated/anime1/anime.js +0 -25
  526. package/lib/routes-deprecated/anime1/search.js +0 -25
  527. package/lib/routes-deprecated/dykszx/news.js +0 -60
  528. package/lib/routes-deprecated/gamersky/ent.js +0 -89
  529. package/lib/routes-deprecated/gamersky/news.js +0 -34
  530. package/lib/routes-deprecated/geekpark/breakingnews.js +0 -25
  531. package/lib/routes-deprecated/hko/weather.js +0 -44
  532. package/lib/routes-deprecated/konachan/post-popular-recent.js +0 -67
@@ -0,0 +1,42 @@
1
+ import { Route } from '@/types';
2
+ import got from '@/utils/got';
3
+ import utils from './utils';
4
+
5
+ export const route: Route = {
6
+ path: '/precious/:disableEmbed?',
7
+ categories: ['social-media'],
8
+ example: '/bilibili/precious',
9
+ parameters: { disableEmbed: '默认为开启内嵌视频, 任意值为关闭' },
10
+ features: {
11
+ requireConfig: false,
12
+ requirePuppeteer: false,
13
+ antiCrawler: false,
14
+ supportBT: false,
15
+ supportPodcast: false,
16
+ supportScihub: false,
17
+ },
18
+ name: '入站必刷',
19
+ maintainers: ['liuyuhe666'],
20
+ handler,
21
+ };
22
+
23
+ async function handler(ctx) {
24
+ const disableEmbed = ctx.req.param('disableEmbed');
25
+ const response = await got({
26
+ method: 'get',
27
+ url: 'https://api.bilibili.com/x/web-interface/popular/precious',
28
+ headers: {
29
+ Referer: 'https://www.bilibili.com/v/popular/history',
30
+ },
31
+ });
32
+ const data = response.data.data.list;
33
+ return {
34
+ title: '哔哩哔哩入站必刷',
35
+ link: 'https://www.bilibili.com/v/popular/history',
36
+ item: data.map((item) => ({
37
+ title: item.title,
38
+ description: `${item.desc || item.title}${disableEmbed ? '' : `<br><br>${utils.iframe(item.aid, null, item.bvid)}`}<br><img src="${item.pic}">`,
39
+ link: item.bvid ? `https://www.bilibili.com/video/${item.bvid}` : `https://www.bilibili.com/video/av${item.aid}`,
40
+ })),
41
+ };
42
+ }
@@ -5,21 +5,36 @@ import { load } from 'cheerio';
5
5
  import { config } from '@/config';
6
6
  import logger from '@/utils/logger';
7
7
  import puppeteer from '@/utils/puppeteer';
8
+ import { JSDOM } from 'jsdom';
8
9
 
9
10
  let disableConfigCookie = false;
11
+
10
12
  const getCookie = () => {
11
13
  if (!disableConfigCookie && Object.keys(config.bilibili.cookies).length > 0) {
14
+ // Update b_lsid in cookies
15
+ for (const key of Object.keys(config.bilibili.cookies)) {
16
+ const cookie = config.bilibili.cookies[key];
17
+ if (cookie) {
18
+ const updatedCookie = cookie.replace(/b_lsid=[0-9A-F]+_[0-9A-F]+/, `b_lsid=${utils.lsid()}`);
19
+ config.bilibili.cookies[key] = updatedCookie;
20
+ }
21
+ }
22
+
12
23
  return config.bilibili.cookies[Object.keys(config.bilibili.cookies)[Math.floor(Math.random() * Object.keys(config.bilibili.cookies).length)]];
13
24
  }
14
25
  const key = 'bili-cookie';
15
26
  return cache.tryGet(key, async () => {
16
- const browser = await puppeteer();
27
+ const browser = await puppeteer({
28
+ stealth: true,
29
+ });
17
30
  const page = await browser.newPage();
18
31
  const waitForRequest = new Promise<string>((resolve) => {
19
32
  page.on('requestfinished', async (request) => {
20
33
  if (request.url() === 'https://api.bilibili.com/x/internal/gaia-gateway/ExClimbWuzhi') {
21
34
  const cookies = await page.cookies();
22
- const cookieString = cookies.map((cookie) => `${cookie.name}=${cookie.value}`).join('; ');
35
+ let cookieString = cookies.map((cookie) => `${cookie.name}=${cookie.value}`).join('; ');
36
+
37
+ cookieString = cookieString.replace(/b_lsid=[0-9A-F]+_[0-9A-F]+/, `b_lsid=${utils.lsid()}`);
23
38
  resolve(cookieString);
24
39
  }
25
40
  });
@@ -37,6 +52,26 @@ const clearCookie = () => {
37
52
  disableConfigCookie = true;
38
53
  };
39
54
 
55
+ const getRenderData = (uid) => {
56
+ const key = 'bili-web-render-data';
57
+ return cache.tryGet(key, async () => {
58
+ const cookie = await getCookie();
59
+ const { data: response } = await got(`https://space.bilibili.com/${uid}`, {
60
+ headers: {
61
+ Referer: 'https://www.bilibili.com/',
62
+ Cookie: cookie,
63
+ },
64
+ });
65
+ const dom = new JSDOM(response);
66
+ const document = dom.window.document;
67
+ const scriptElement = document.querySelector('#__RENDER_DATA__');
68
+ const innerText = scriptElement ? scriptElement.textContent || '{}' : '{}';
69
+ const renderData = JSON.parse(decodeURIComponent(innerText));
70
+ const accessId = renderData.access_id;
71
+ return accessId;
72
+ });
73
+ };
74
+
40
75
  const getWbiVerifyString = () => {
41
76
  const key = 'bili-wbi-verify-string';
42
77
  return cache.tryGet(key, async () => {
@@ -106,13 +141,9 @@ const getUsernameAndFaceFromUID = async (uid) => {
106
141
  if (!name || !face) {
107
142
  const cookie = await getCookie();
108
143
  const wbiVerifyString = await getWbiVerifyString();
109
- // await got(`https://space.bilibili.com/${uid}/`, {
110
- // headers: {
111
- // Referer: `https://www.bilibili.com/`,
112
- // Cookie: cookie,
113
- // },
114
- // });
115
- const params = utils.addWbiVerifyInfo(`mid=${uid}&token=&platform=web&web_location=1550101`, wbiVerifyString);
144
+ const dmImgList = utils.getDmImgList();
145
+ const renderData = await getRenderData(uid);
146
+ const params = utils.addWbiVerifyInfo(utils.addRenderData(utils.addDmVerifyInfo(`mid=${uid}&token=&platform=web&web_location=1550101`, dmImgList), renderData), wbiVerifyString);
116
147
  const { data: nameResponse } = await got(`https://api.bilibili.com/x/space/wbi/acc/info?${params}`, {
117
148
  headers: {
118
149
  Referer: `https://space.bilibili.com/${uid}/`,
@@ -260,4 +291,5 @@ export default {
260
291
  getCidFromId,
261
292
  getAidFromBvid,
262
293
  getArticleDataFromCvid,
294
+ getRenderData,
263
295
  };
@@ -22,6 +22,7 @@ export const route: Route = {
22
22
  | disableEmbed | 关闭内嵌视频 | 0/1/true/false | false |
23
23
  | useAvid | 视频链接使用 AV 号 (默认为 BV 号) | 0/1/true/false | false |
24
24
  | directLink | 使用内容直链 | 0/1/true/false | false |
25
+ | hideGoods | 隐藏带货动态 | 0/1/true/false | false |
25
26
 
26
27
  用例:\`/bilibili/user/dynamic/2267573/showEmoji=1&disableEmbed=1&useAvid=1\``,
27
28
  },
@@ -229,17 +230,12 @@ async function handler(ctx) {
229
230
  const displayArticle = ctx.req.query('mode') === 'fulltext';
230
231
  const useAvid = fallback(undefined, queryToBoolean(routeParams.useAvid), false);
231
232
  const directLink = fallback(undefined, queryToBoolean(routeParams.directLink), false);
233
+ const hideGoods = fallback(undefined, queryToBoolean(routeParams.hideGoods), false);
232
234
 
233
235
  const cookie = await cacheIn.getCookie();
234
236
 
235
- const response = await got({
236
- method: 'get',
237
- url: `https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space`,
238
- searchParams: {
239
- host_mid: uid,
240
- platform: 'web',
241
- features: 'itemOpusStyle,listOnlyfans,opusBigCover,onlyfansVote',
242
- },
237
+ const params = utils.addDmVerifyInfo(`host_mid=${uid}&platform=web&features=itemOpusStyle,listOnlyfans,opusBigCover,onlyfansVote`, utils.getDmImgList());
238
+ const response = await got(`https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?${params}`, {
243
239
  headers: {
244
240
  Referer: `https://space.bilibili.com/${uid}/`,
245
241
  Cookie: cookie,
@@ -259,119 +255,121 @@ async function handler(ctx) {
259
255
  cache.set(`bili-userface-from-uid-${uid}`, face);
260
256
 
261
257
  const rssItems = await Promise.all(
262
- items.map(async (item) => {
263
- // const parsed = JSONbig.parse(item.card);
258
+ items
259
+ .filter((item) => !hideGoods || item.modules.module_dynamic?.additional?.type !== 'ADDITIONAL_TYPE_GOODS')
260
+ .map(async (item) => {
261
+ // const parsed = JSONbig.parse(item.card);
264
262
 
265
- const data = item.modules;
266
- const origin = item?.orig?.modules;
263
+ const data = item.modules;
264
+ const origin = item?.orig?.modules;
267
265
 
268
- // link
269
- let link = '';
270
- if (item.id_str) {
271
- link = `https://t.bilibili.com/${item.id_str}`;
272
- }
266
+ // link
267
+ let link = '';
268
+ if (item.id_str) {
269
+ link = `https://t.bilibili.com/${item.id_str}`;
270
+ }
273
271
 
274
- let description = getDes(data) || '';
275
- const title = getTitle(data) || description; // 没有 title 的时候使用 desc 填充
276
- const category: string[] = [];
277
- // emoji
278
- if (data.module_dynamic?.desc?.rich_text_nodes?.length) {
279
- const nodes = data.module_dynamic.desc.rich_text_nodes;
280
- for (const node of nodes) {
281
- // 处理 emoji 的情况
282
- if (showEmoji && node?.emoji) {
283
- const emoji = node.emoji;
284
- description = description.replaceAll(
285
- emoji.text,
286
- `<img alt="${emoji.text}" src="${emoji.icon_url}" style="margin: -1px 1px 0px; display: inline-block; width: 20px; height: 20px; vertical-align: text-bottom;" title="" referrerpolicy="no-referrer">`
287
- );
288
- }
289
- // 处理转发带图评论的情况
290
- if (node?.pics?.length) {
291
- const { pics, text } = node;
292
- description = description.replaceAll(
293
- text,
294
- pics
295
- .map(
296
- (pic) =>
297
- `<img alt="${text}" src="${pic.src}" style="margin: 0px 0px 0px; display: inline-block; width: ${pic.width}px; height: ${pic.height}px; vertical-align: text-bottom;" title="" referrerpolicy="no-referrer">`
298
- )
299
- .join('<br>')
300
- );
301
- }
302
- if (node?.type === 'RICH_TEXT_NODE_TYPE_TOPIC') {
303
- // 将话题作为 category
304
- category.push(node.text.match(/#(\S+)#/)?.[1] || '');
272
+ let description = getDes(data) || '';
273
+ const title = getTitle(data) || description; // 没有 title 的时候使用 desc 填充
274
+ const category: string[] = [];
275
+ // emoji
276
+ if (data.module_dynamic?.desc?.rich_text_nodes?.length) {
277
+ const nodes = data.module_dynamic.desc.rich_text_nodes;
278
+ for (const node of nodes) {
279
+ // 处理 emoji 的情况
280
+ if (showEmoji && node?.emoji) {
281
+ const emoji = node.emoji;
282
+ description = description.replaceAll(
283
+ emoji.text,
284
+ `<img alt="${emoji.text}" src="${emoji.icon_url}" style="margin: -1px 1px 0px; display: inline-block; width: 20px; height: 20px; vertical-align: text-bottom;" title="" referrerpolicy="no-referrer">`
285
+ );
286
+ }
287
+ // 处理转发带图评论的情况
288
+ if (node?.pics?.length) {
289
+ const { pics, text } = node;
290
+ description = description.replaceAll(
291
+ text,
292
+ pics
293
+ .map(
294
+ (pic) =>
295
+ `<img alt="${text}" src="${pic.src}" style="margin: 0px 0px 0px; display: inline-block; width: ${pic.width}px; height: ${pic.height}px; vertical-align: text-bottom;" title="" referrerpolicy="no-referrer">`
296
+ )
297
+ .join('<br>')
298
+ );
299
+ }
300
+ if (node?.type === 'RICH_TEXT_NODE_TYPE_TOPIC') {
301
+ // 将话题作为 category
302
+ category.push(node.text.match(/#(\S+)#/)?.[1] || '');
303
+ }
305
304
  }
306
305
  }
307
- }
308
306
 
309
- if (data.module_dynamic?.major?.opus?.summary?.rich_text_nodes?.length) {
310
- const nodes = data.module_dynamic.major.opus.summary.rich_text_nodes;
311
- for (const node of nodes) {
312
- if (node?.type === 'RICH_TEXT_NODE_TYPE_TOPIC') {
313
- // 将话题作为 category
314
- category.push(node.text.match(/#(\S+)#/)?.[1] || '');
307
+ if (data.module_dynamic?.major?.opus?.summary?.rich_text_nodes?.length) {
308
+ const nodes = data.module_dynamic.major.opus.summary.rich_text_nodes;
309
+ for (const node of nodes) {
310
+ if (node?.type === 'RICH_TEXT_NODE_TYPE_TOPIC') {
311
+ // 将话题作为 category
312
+ category.push(node.text.match(/#(\S+)#/)?.[1] || '');
313
+ }
315
314
  }
316
315
  }
317
- }
318
- if (data.module_dynamic?.topic?.name) {
319
- // 将话题作为 category
320
- category.push(data.module_dynamic.topic.name);
321
- }
316
+ if (data.module_dynamic?.topic?.name) {
317
+ // 将话题作为 category
318
+ category.push(data.module_dynamic.topic.name);
319
+ }
322
320
 
323
- if (item.type === 'DYNAMIC_TYPE_ARTICLE' && displayArticle) {
324
- // 抓取专栏全文
325
- const cvid = data.module_dynamic?.major?.opus?.jump_url?.match?.(/cv(\d+)/)?.[0];
326
- if (cvid) {
327
- description = (await cacheIn.getArticleDataFromCvid(cvid, uid)).description || '';
321
+ if (item.type === 'DYNAMIC_TYPE_ARTICLE' && displayArticle) {
322
+ // 抓取专栏全文
323
+ const cvid = data.module_dynamic?.major?.opus?.jump_url?.match?.(/cv(\d+)/)?.[0];
324
+ if (cvid) {
325
+ description = (await cacheIn.getArticleDataFromCvid(cvid, uid)).description || '';
326
+ }
328
327
  }
329
- }
330
328
 
331
- const urlResult = getUrl(item, useAvid);
332
- const urlText = urlResult?.text;
333
- if (urlResult && directLink) {
334
- link = urlResult.url;
335
- }
329
+ const urlResult = getUrl(item, useAvid);
330
+ const urlText = urlResult?.text;
331
+ if (urlResult && directLink) {
332
+ link = urlResult.url;
333
+ }
336
334
 
337
- const originUrlResult = getUrl(item?.orig, useAvid);
338
- const originUrlText = originUrlResult?.text;
339
- if (originUrlResult && directLink) {
340
- link = originUrlResult.url;
341
- }
335
+ const originUrlResult = getUrl(item?.orig, useAvid);
336
+ const originUrlText = originUrlResult?.text;
337
+ if (originUrlResult && directLink) {
338
+ link = originUrlResult.url;
339
+ }
342
340
 
343
- let originDescription = '';
344
- const originName = getOriginName(origin);
345
- const originTitle = getOriginTitle(origin);
346
- const originDes = getOriginDes(origin);
347
- if (originName) {
348
- originDescription += `//转发自: @${getOriginName(origin)}: `;
349
- }
350
- if (originTitle) {
351
- originDescription += originTitle;
352
- }
353
- if (originDes) {
354
- originDescription += `<br>${originDes}`;
355
- }
341
+ let originDescription = '';
342
+ const originName = getOriginName(origin);
343
+ const originTitle = getOriginTitle(origin);
344
+ const originDes = getOriginDes(origin);
345
+ if (originName) {
346
+ originDescription += `//转发自: @${getOriginName(origin)}: `;
347
+ }
348
+ if (originTitle) {
349
+ originDescription += originTitle;
350
+ }
351
+ if (originDes) {
352
+ originDescription += `<br>${originDes}`;
353
+ }
356
354
 
357
- // 换行处理
358
- description = description.replaceAll('\r\n', '<br>').replaceAll('\n', '<br>');
359
- originDescription = originDescription.replaceAll('\r\n', '<br>').replaceAll('\n', '<br>');
355
+ // 换行处理
356
+ description = description.replaceAll('\r\n', '<br>').replaceAll('\n', '<br>');
357
+ originDescription = originDescription.replaceAll('\r\n', '<br>').replaceAll('\n', '<br>');
360
358
 
361
- const descriptions = [description, originDescription, urlText, originUrlText, getIframe(data, disableEmbed), getIframe(origin, disableEmbed), getImgs(data), getImgs(origin)]
362
- .filter(Boolean)
363
- .map((e) => e?.trim())
364
- .join('<br>');
359
+ const descriptions = [description, originDescription, urlText, originUrlText, getIframe(data, disableEmbed), getIframe(origin, disableEmbed), getImgs(data), getImgs(origin)]
360
+ .filter(Boolean)
361
+ .map((e) => e?.trim())
362
+ .join('<br>');
365
363
 
366
- return {
367
- title,
368
- description: descriptions,
369
- pubDate: data.module_author?.pub_ts ? parseDate(data.module_author.pub_ts, 'X') : undefined,
370
- link,
371
- author,
372
- category: category.length ? [...new Set(category)] : undefined,
373
- };
374
- })
364
+ return {
365
+ title,
366
+ description: descriptions,
367
+ pubDate: data.module_author?.pub_ts ? parseDate(data.module_author.pub_ts, 'X') : undefined,
368
+ link,
369
+ author,
370
+ category: category.length ? [...new Set(category)] : undefined,
371
+ };
372
+ })
375
373
  );
376
374
 
377
375
  return {
@@ -110,7 +110,9 @@ async function handler(ctx) {
110
110
  data.map(async (item) => {
111
111
  const parsed = JSONbig.parse(item.card);
112
112
  const data = parsed.apiSeasonInfo || (getTitle(parsed.item) ? parsed.item : parsed);
113
- const origin = parsed.origin ? JSONbig.parse(parsed.origin) : null;
113
+ // parsed.origin is already parsed, and it may be json or string.
114
+ // Don't parse it again, or it will cause an error.
115
+ const origin = parsed.origin || null;
114
116
 
115
117
  // img
116
118
  let imgHTML = '';
@@ -4,6 +4,7 @@ import cache from './cache';
4
4
  import { config } from '@/config';
5
5
  import utils from './utils';
6
6
  import ConfigNotFoundError from '@/errors/types/config-not-found';
7
+ import logger from '@/utils/logger';
7
8
 
8
9
  export const route: Route = {
9
10
  path: '/followings/video/:uid/:disableEmbed?',
@@ -53,10 +54,15 @@ async function handler(ctx) {
53
54
  Cookie: cookie,
54
55
  },
55
56
  });
56
- if (response.data.code === -6) {
57
- throw new ConfigNotFoundError('对应 uid 的 Bilibili 用户的 Cookie 已过期');
57
+ const data = response.data;
58
+ if (data.code) {
59
+ logger.error(JSON.stringify(data));
60
+ if (data.code === -6 || data.code === 4_100_000) {
61
+ throw new ConfigNotFoundError('对应 uid 的 Bilibili 用户的 Cookie 已过期');
62
+ }
63
+ throw new Error(`Got error code ${data.code} while fetching: ${data.message}`);
58
64
  }
59
- const cards = response.data.data.cards;
65
+ const cards = data.data.cards;
60
66
 
61
67
  const out = cards.map((card) => {
62
68
  const card_data = JSON.parse(card.card);
@@ -1,9 +1,10 @@
1
- import { Route } from '@/types';
1
+ import { Route, ViewType } from '@/types';
2
2
  import got from '@/utils/got';
3
3
 
4
4
  export const route: Route = {
5
5
  path: '/readlist/:listid',
6
- categories: ['social-media'],
6
+ categories: ['social-media', 'popular'],
7
+ view: ViewType.Articles,
7
8
  example: '/bilibili/readlist/25611',
8
9
  parameters: { listid: '文集 id, 可在专栏文集 URL 中找到' },
9
10
  features: {
@@ -66,6 +66,10 @@ function hexsign(e) {
66
66
  return o;
67
67
  }
68
68
 
69
+ function addRenderData(params, renderData) {
70
+ return `${params}&w_webid=${encodeURIComponent(renderData)}`;
71
+ }
72
+
69
73
  function addWbiVerifyInfo(params, wbiVerifyString) {
70
74
  const searchParams = new URLSearchParams(params);
71
75
  searchParams.sort();
@@ -91,8 +95,8 @@ function getDmImgList() {
91
95
  const dmImgList = JSON.parse(config.bilibili.dmImgList);
92
96
  return JSON.stringify([dmImgList[Math.floor(Math.random() * dmImgList.length)]]);
93
97
  }
94
- const x = Math.max(generateGaussianInteger(650, 5), 0);
95
- const y = Math.max(generateGaussianInteger(400, 5), 0);
98
+ const x = Math.max(generateGaussianInteger(1245, 5), 0);
99
+ const y = Math.max(generateGaussianInteger(1285, 5), 0);
96
100
  const path = [
97
101
  {
98
102
  x: 3 * x + 2 * y,
@@ -105,12 +109,92 @@ function getDmImgList() {
105
109
  return JSON.stringify(path);
106
110
  }
107
111
 
108
- function addDmVerifyInfo(params, dmImgList) {
112
+ function getDmImgInter() {
113
+ if (config.bilibili.dmImgInter !== undefined) {
114
+ const dmImgInter = JSON.parse(config.bilibili.dmImgInter);
115
+ return JSON.stringify([dmImgInter[Math.floor(Math.random() * dmImgInter.length)]]);
116
+ }
117
+ const p1 = getDmImgInterWh(274, 601);
118
+ const s1 = getDmImgInterOf(134, 30);
119
+ const p2 = getDmImgInterWh(332, 64);
120
+ const s2 = getDmImgInterOf(1101, 338);
121
+ const of = getDmImgInterOf(0, 0);
122
+ const wh = getDmImgInterWh(1245, 1285);
123
+ const ds = [
124
+ {
125
+ t: getDmImgInterT('div'),
126
+ c: getDmImgInterC('clearfix g-search search-container'),
127
+ p: [p1[0], p1[2], p1[1]],
128
+ s: [s1[2], s1[0], s1[1]],
129
+ },
130
+ {
131
+ t: getDmImgInterT('div'),
132
+ c: getDmImgInterC('wrapper'),
133
+ p: [p2[0], p2[2], p2[1]],
134
+ s: [s2[2], s2[0], s2[1]],
135
+ },
136
+ ];
137
+ return JSON.stringify({ ds, wh, of });
138
+ }
139
+
140
+ function getDmImgInterT(tag: string) {
141
+ return {
142
+ a: 4,
143
+ article: 29,
144
+ button: 7,
145
+ div: 2,
146
+ em: 27,
147
+ form: 17,
148
+ h1: 11,
149
+ h2: 12,
150
+ h3: 13,
151
+ h4: 14,
152
+ h5: 15,
153
+ h6: 16,
154
+ img: 5,
155
+ input: 6,
156
+ label: 25,
157
+ li: 10,
158
+ ol: 9,
159
+ option: 20,
160
+ p: 3,
161
+ section: 28,
162
+ select: 19,
163
+ span: 1,
164
+ strong: 26,
165
+ table: 21,
166
+ td: 23,
167
+ textarea: 18,
168
+ th: 24,
169
+ tr: 22,
170
+ ul: 8,
171
+ }[tag];
172
+ }
173
+
174
+ function getDmImgInterC(className: string) {
175
+ return Buffer.from(className).toString('base64').slice(0, -2);
176
+ }
177
+
178
+ function getDmImgInterOf(top: number, left: number) {
179
+ const seed = Math.floor(514 * Math.random());
180
+ return [3 * top + 2 * left + seed, 4 * top - 4 * left + 2 * seed, seed];
181
+ }
182
+
183
+ function getDmImgInterWh(width: number, height: number) {
184
+ const seed = Math.floor(114 * Math.random());
185
+ return [2 * width + 2 * height + 3 * seed, 4 * width - height + seed, seed];
186
+ }
187
+
188
+ function addDmVerifyInfo(params: string, dmImgList: string) {
109
189
  const dmImgStr = Buffer.from('no webgl').toString('base64').slice(0, -2);
110
190
  const dmCoverImgStr = Buffer.from('no webgl').toString('base64').slice(0, -2);
111
191
  return `${params}&dm_img_list=${dmImgList}&dm_img_str=${dmImgStr}&dm_cover_img_str=${dmCoverImgStr}`;
112
192
  }
113
193
 
194
+ function addDmVerifyInfoWithInter(params: string, dmImgList: string, dmImgInter: string) {
195
+ return `${addDmVerifyInfo(params, dmImgList)}&dm_img_inter=${dmImgInter}`;
196
+ }
197
+
114
198
  const bvidTime = 1_589_990_400;
115
199
 
116
200
  export default {
@@ -120,6 +204,9 @@ export default {
120
204
  hexsign,
121
205
  addWbiVerifyInfo,
122
206
  getDmImgList,
207
+ getDmImgInter,
123
208
  addDmVerifyInfo,
209
+ addDmVerifyInfoWithInter,
124
210
  bvidTime,
211
+ addRenderData,
125
212
  };
@@ -25,7 +25,7 @@ export const route: Route = {
25
25
  },
26
26
  ],
27
27
  name: 'UP 主投稿',
28
- maintainers: ['DIYgod'],
28
+ maintainers: ['DIYgod', 'Konano', 'pseudoyu'],
29
29
  handler,
30
30
  };
31
31
 
@@ -35,18 +35,17 @@ async function handler(ctx) {
35
35
  const cookie = await cache.getCookie();
36
36
  const wbiVerifyString = await cache.getWbiVerifyString();
37
37
  const dmImgList = utils.getDmImgList();
38
+ const dmImgInter = utils.getDmImgInter();
39
+ const renderData = await cache.getRenderData(uid);
38
40
  const [name, face] = await cache.getUsernameAndFaceFromUID(uid);
39
41
 
40
- // await got(`https://space.bilibili.com/${uid}/video?tid=0&page=1&keyword=&order=pubdate`, {
41
- // headers: {
42
- // Referer: `https://space.bilibili.com/${uid}/`,
43
- // Cookie: cookie,
44
- // },
45
- // });
46
- const params = utils.addWbiVerifyInfo(utils.addDmVerifyInfo(`mid=${uid}&ps=30&tid=0&pn=1&keyword=&order=pubdate&platform=web&web_location=1550101&order_avoided=true`, dmImgList), wbiVerifyString);
42
+ const params = utils.addWbiVerifyInfo(
43
+ utils.addRenderData(utils.addDmVerifyInfoWithInter(`mid=${uid}&ps=30&tid=0&pn=1&keyword=&order=pubdate&platform=web&web_location=1550101&order_avoided=true`, dmImgList, dmImgInter), renderData),
44
+ wbiVerifyString
45
+ );
47
46
  const response = await got(`https://api.bilibili.com/x/space/wbi/arc/search?${params}`, {
48
47
  headers: {
49
- Referer: `https://space.bilibili.com/${uid}/video?tid=0&page=1&keyword=&order=pubdate`,
48
+ Referer: `https://space.bilibili.com/${uid}/video?tid=0&pn=1&keyword=&order=pubdate`,
50
49
  Cookie: cookie,
51
50
  },
52
51
  });
@@ -83,7 +83,7 @@ async function handler(ctx) {
83
83
  `Danmaku: ${item.video_review} Comment: ${item.review}<br/>` +
84
84
  `<br/>${des}<br/>` +
85
85
  `<img src="${img}"><br/>` +
86
- `Match By: ${item.hit_columns.join(',')}` +
86
+ `Match By: ${item.hit_columns?.join(',') || ''}` +
87
87
  (disableEmbed ? '' : `<br><br>${utils.iframe(item.aid)}`),
88
88
  pubDate: parseDate(item.pubdate, 'X'),
89
89
  guid: item.arcurl,