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,103 @@
1
+ import { Data, DataItem, Route } from '@/types';
2
+ import cache from '@/utils/cache';
3
+ import got from '@/utils/got';
4
+ import { load } from 'cheerio';
5
+ import dayjs from 'dayjs';
6
+
7
+ export const route: Route = {
8
+ path: '/latest',
9
+ categories: ['reading'],
10
+ example: '/yilinzazhi/latest',
11
+ radar: [
12
+ {
13
+ source: ['www.yilinzazhi.com'],
14
+ target: '/',
15
+ },
16
+ ],
17
+ name: '近期文章汇总',
18
+ maintainers: ['g0ngjie'],
19
+ handler,
20
+ url: 'www.yilinzazhi.com',
21
+ description: '最近一期的文章汇总',
22
+ };
23
+
24
+ type Stage = {
25
+ link: string;
26
+ title: string;
27
+ };
28
+
29
+ type Catalog = {
30
+ title: string;
31
+ tables: Data[];
32
+ };
33
+
34
+ async function handler(): Promise<Data> {
35
+ const baseUrl = 'https://www.yilinzazhi.com/';
36
+ const response = await got(baseUrl);
37
+ const $ = load(response.data);
38
+
39
+ const currentYear = dayjs().year();
40
+ const yearSection = $('.year-section')
41
+ .toArray()
42
+ .find((el) =>
43
+ $(el)
44
+ .find('.year-title')
45
+ .text()
46
+ .includes(currentYear + '')
47
+ );
48
+
49
+ const stage = $(yearSection!)
50
+ .find('a')
51
+ .map<typeof yearSection, Stage>(function () {
52
+ const aTag = $(this);
53
+ const link = baseUrl + aTag.attr('href');
54
+ const title = aTag.text();
55
+ return { link, title };
56
+ })
57
+ .toArray()[0];
58
+
59
+ const catalogs = (await cache.tryGet(stage.link, async () => {
60
+ const stageRes = await got(stage.link);
61
+ const $$ = load(stageRes.data);
62
+ const catalogsEl = $$('.maglistbox dl').toArray();
63
+ const children = catalogsEl.map<Catalog>((catalog) => {
64
+ const title = $$(catalog).find('dt span').text();
65
+ const tables = $$(catalog)
66
+ .find('a')
67
+ .toArray()
68
+ .map<Data>((aTag) => {
69
+ const href = $$(aTag).attr('href')!;
70
+ const yearType = currentYear + href.substring(4, 5);
71
+ return {
72
+ title: $$(aTag).text(),
73
+ link: `${baseUrl}${currentYear}/yl${yearType}/${href}`,
74
+ };
75
+ });
76
+ return { title, tables };
77
+ });
78
+ return children;
79
+ })) as Catalog[];
80
+
81
+ const contents: Data[] = catalogs.flatMap((catalog) => catalog.tables);
82
+
83
+ const items = (await Promise.all(
84
+ contents.map(
85
+ async (target) =>
86
+ await cache.tryGet(target.link!, async () => {
87
+ const detailRes = await got(target.link);
88
+ const $$ = load(detailRes.data);
89
+ const detailContainer = $$('.blkContainerSblk.collectionContainer');
90
+
91
+ target.description = detailContainer.html()!;
92
+
93
+ return target;
94
+ })
95
+ )
96
+ )) as DataItem[];
97
+
98
+ return {
99
+ title: '意林 - 近期文章汇总',
100
+ link: stage.link,
101
+ item: items,
102
+ };
103
+ }
@@ -0,0 +1,8 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: '意林杂志',
5
+ url: 'www.yilinzazhi.com',
6
+ categories: ['reading'],
7
+ description: '',
8
+ };
@@ -1,4 +1,4 @@
1
- import { Route } from '@/types';
1
+ import { Route, ViewType } from '@/types';
2
2
  import cache from '@/utils/cache';
3
3
  import utils from './utils';
4
4
  import { config } from '@/config';
@@ -7,7 +7,8 @@ import ConfigNotFoundError from '@/errors/types/config-not-found';
7
7
 
8
8
  export const route: Route = {
9
9
  path: '/playlist/:id/:embed?',
10
- categories: ['social-media'],
10
+ categories: ['social-media', 'popular'],
11
+ view: ViewType.Videos,
11
12
  example: '/youtube/playlist/PLqQ1RwlxOgeLTJ1f3fNMSwhjVgaWKo_9Z',
12
13
  parameters: { id: 'YouTube playlist id', embed: 'Default to embed the video, set to any value to disable embedding' },
13
14
  features: {
@@ -1,7 +1,8 @@
1
- import { Route } from '@/types';
2
- import got from '@/utils/got';
1
+ import type { Route, DataItem } from '@/types';
2
+ import ofetch from '@/utils/ofetch';
3
3
  import { load } from 'cheerio';
4
4
  import { parseRelativeDate } from '@/utils/parse-date';
5
+ import cache from '@/utils/cache';
5
6
 
6
7
  export const route: Route = {
7
8
  path: '/docs',
@@ -22,34 +23,42 @@ export const route: Route = {
22
23
  },
23
24
  ],
24
25
  name: '游研社 - 全部文章',
25
- maintainers: ['HaitianLiu'],
26
+ maintainers: ['HaitianLiu', 'yy4382'],
26
27
  handler,
27
28
  url: 'yystv.cn/docs',
28
29
  };
29
30
 
30
31
  async function handler() {
31
32
  const url = `https://www.yystv.cn/docs`;
32
- const response = await got({
33
- method: 'get',
34
- url,
35
- });
33
+ const response = await ofetch(url);
36
34
 
37
- const data = response.data;
38
- const $ = load(data);
35
+ const $ = load(response);
39
36
 
40
- const items = $('.list-container li')
41
- .slice(0, 18)
42
- .map(function () {
37
+ const itemList = $('.list-container li')
38
+ .toArray()
39
+ .map((item) => {
40
+ const itemElement = $(item);
43
41
  const info = {
44
- title: $('.list-article-title', this).text(),
45
- link: 'https://www.yystv.cn' + $('a', this).attr('href'),
46
- pubDate: parseRelativeDate($('.c-999', this).text()),
47
- author: $('.handler-author-link', this).text(),
48
- description: $('.list-article-intro', this).text(),
42
+ title: itemElement.find('.list-article-title').text(),
43
+ link: 'https://www.yystv.cn' + itemElement.find('a').attr('href'),
44
+ pubDate: parseRelativeDate(itemElement.find('.c-999').text()),
45
+ author: itemElement.find('.handler-author-link').text(),
46
+ description: itemElement.find('.list-article-intro').text(),
49
47
  };
50
48
  return info;
51
- })
52
- .get();
49
+ }) satisfies DataItem[];
50
+
51
+ const items = (await Promise.all(
52
+ itemList.map(
53
+ (item) =>
54
+ cache.tryGet(item.link, async () => {
55
+ const resp = await ofetch(item.link);
56
+ const $ = load(resp);
57
+ item.description = $('#main section.article-section .doc-content > div').html() || item.description;
58
+ return item;
59
+ }) as Promise<DataItem>
60
+ )
61
+ )) satisfies DataItem[];
53
62
 
54
63
  return {
55
64
  title: '游研社-' + $('title').text(),
@@ -38,7 +38,7 @@ const parseList = async (
38
38
  }> => {
39
39
  const response = await got_ins.get(baseUrl + sectionUrl);
40
40
  const $ = load(response.data);
41
- let data = /realtime/.test(sectionUrl) ? $('.on-listing-pages') : $('.article-list').find('.article-type');
41
+ let data = $('.card-listing .card');
42
42
  if (data.length === 0) {
43
43
  // for HK version
44
44
  data = $('.clearfix').find('.list-block');
@@ -104,48 +104,7 @@ const parseList = async (
104
104
 
105
105
  const articleBody = articleBodyNode.html();
106
106
 
107
- const imageDataArray = [];
108
- if ($1('.inline-figure-img').length) {
109
- // for SG version
110
- imageDataArray.push({
111
- type: 'normalHTML',
112
- html: $1('.inline-figure-img')
113
- .html()
114
- .replace(/\/\/.*\.com\/s3fs-public/, '//static.zaobao.com/s3fs-public')
115
- .replace(/s3\/files/, 's3fs-public'),
116
- });
117
- }
118
- if ($1('.body-content .loadme picture img').length) {
119
- // Unused?
120
- imageDataArray.push({
121
- type: 'data',
122
- src: $1('.body-content .loadme picture source')
123
- .attr('data-srcset')
124
- .replace(/\/\/.*\.com\/s3fs-public/, '//static.zaobao.com/s3fs-public')
125
- .replace(/s3\/files/, 's3fs-public'),
126
- title: $1('.body-content .loadme picture img').attr('title'),
127
- });
128
- }
129
- if ($1('.inline-figure-gallery').length) {
130
- // for SG version
131
- imageDataArray.push({
132
- type: 'normalHTML',
133
- html: $1('.inline-figure-gallery')
134
- .html()
135
- .replaceAll(/\/\/.*\.com\/s3fs-public/g, '//static.zaobao.com/s3fs-public')
136
- .replaceAll('s3/files', 's3fs-public'),
137
- });
138
- }
139
- if ($1('#carousel-article').length) {
140
- // for HK version, HK version of multi images use same selector as single image, so g is needed for all pages
141
- imageDataArray.push({
142
- type: 'normalHTML',
143
- html: $1('#carousel-article .carousel-inner')
144
- .html()
145
- .replaceAll(/\/\/.*\.com\/s3fs-public/g, '//static.zaobao.com/s3fs-public')
146
- .replaceAll('s3/files', 's3fs-public'),
147
- });
148
- }
107
+ const imageDataArray = processImageData($1);
149
108
 
150
109
  return {
151
110
  // <- for SG version -> for HK version
@@ -182,4 +141,43 @@ const orderContent = (parent) => {
182
141
  }
183
142
  };
184
143
 
144
+ interface ImageData {
145
+ type: string;
146
+ html: string;
147
+ src?: string;
148
+ title?: string;
149
+ }
150
+
151
+ const processImageData = ($1) => {
152
+ const imageDataArray: ImageData[] = [];
153
+
154
+ const imageSelectors = [
155
+ '.inline-figure-img', // for SG version
156
+ '.body-content .loadme picture img', // Unused?
157
+ '.inline-figure-gallery', // for SG version
158
+ '#carousel-article', // for HK version, HK version of multi images use same selector as single image, so g is needed for all pages
159
+ ];
160
+
161
+ for (const selector of imageSelectors) {
162
+ if ($1(selector).length) {
163
+ let html = $1(selector === '#carousel-article' ? '#carousel-article .carousel-inner' : selector).html();
164
+
165
+ if (html) {
166
+ html = html.replaceAll(/\/\/.*\.com\/s3fs-public/g, '//static.zaobao.com/s3fs-public').replaceAll('s3/files', 's3fs-public');
167
+
168
+ imageDataArray.push({
169
+ type: selector === '.body-content .loadme picture img' ? 'data' : 'normalHTML',
170
+ html,
171
+ ...(selector === '.body-content .loadme picture img' && {
172
+ src: $1('.body-content .loadme picture source').attr('data-srcset'),
173
+ title: $1(selector).attr('title'),
174
+ }),
175
+ });
176
+ }
177
+ }
178
+ }
179
+
180
+ return imageDataArray;
181
+ };
182
+
185
183
  export { parseList, orderContent };
@@ -2,6 +2,7 @@ import { Route, ViewType } from '@/types';
2
2
  import got from '@/utils/got';
3
3
  import { header, processImage, getSignedHeader } from './utils';
4
4
  import { parseDate } from '@/utils/parse-date';
5
+ import sanitizeHtml from 'sanitize-html';
5
6
 
6
7
  export const route: Route = {
7
8
  path: '/people/activities/:id',
@@ -75,7 +76,7 @@ async function handler(ctx) {
75
76
  url = `https://zhuanlan.zhihu.com/p/${detail.id}`;
76
77
  break;
77
78
  case 'pin':
78
- title = detail.excerpt_title;
79
+ title = sanitizeHtml(detail.excerpt_title);
79
80
  author = detail.author.name;
80
81
  for (const contentItem of detail.content) {
81
82
  switch (contentItem.type) {
@@ -1,7 +1,7 @@
1
1
  import { Route } from '@/types';
2
2
  import cache from '@/utils/cache';
3
3
  import got from '@/utils/got';
4
- import { header, processImage } from './utils';
4
+ import { getCookieValueByKey, header, processImage } from './utils';
5
5
  import { parseDate } from '@/utils/parse-date';
6
6
 
7
7
  export const route: Route = {
@@ -29,9 +29,13 @@ export const route: Route = {
29
29
 
30
30
  async function handler(ctx) {
31
31
  const id = ctx.req.param('id');
32
+
33
+ const zc0 = getCookieValueByKey('z_c0');
34
+
32
35
  const headers = {
33
36
  'User-Agent': 'ZhihuHybrid com.zhihu.android/Futureve/6.59.0 Mozilla/5.0 (Linux; Android 10; GM1900 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/85.0.4183.127 Mobile Safari/537.36',
34
37
  Referer: `https://www.zhihu.com/people/${id}/answers`,
38
+ Cookie: zc0 ? `z_c0=${zc0}` : '',
35
39
  };
36
40
 
37
41
  const response = await got({
@@ -2,6 +2,8 @@
2
2
  // https://blog.csdn.net/zjq592767809/article/details/126512798
3
3
  // https://blog.csdn.net/zhoumi_/article/details/126659351
4
4
 
5
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
6
+
5
7
  function i(e, t, n) {
6
8
  (t[n] = 255 & (e >>> 24)), (t[n + 1] = 255 & (e >>> 16)), (t[n + 2] = 255 & (e >>> 8)), (t[n + 3] = 255 & e);
7
9
  }
@@ -60,10 +60,13 @@ async function handler(ctx) {
60
60
  const questionId = e.target.question.id;
61
61
  return `${urlBase}/question/${questionId}/answer/${id}`;
62
62
  }
63
+ case 'pin':
63
64
  case 'article':
64
65
  return e.target.url;
65
66
  case 'question':
66
67
  return `${urlBase}/question/${id}`;
68
+ default:
69
+ return;
67
70
  }
68
71
  return '';
69
72
  };
@@ -111,11 +114,12 @@ async function handler(ctx) {
111
114
  link,
112
115
  author: e.target.author ? e.target.author.name : '',
113
116
  guid: link,
117
+ category: [e.verb],
114
118
  };
115
119
  };
116
120
 
117
121
  const out = feeds
118
- .filter((e) => e.verb && e.verb !== 'MEMBER_VOTEUP_ARTICLE' && e.verb !== 'MEMBER_VOTEUP_ANSWER')
122
+ .filter((e) => e.verb)
119
123
  .map((e) => {
120
124
  if (e && e.type && e.type === 'feed_group') {
121
125
  // A feed group contains a list of feeds whose structure is the same as a single feed
@@ -134,6 +138,7 @@ async function handler(ctx) {
134
138
  description,
135
139
  pubDate,
136
140
  guid,
141
+ category: [e.verb],
137
142
  };
138
143
  }
139
144
  return buildItem(e);
@@ -56,6 +56,13 @@ export const processImage = (content: string) => {
56
56
  return $.html();
57
57
  };
58
58
 
59
+ export const getCookieValueByKey = (key: string) =>
60
+ config.zhihu.cookies
61
+ ?.split(';')
62
+ .map((e) => e.trim())
63
+ .find((e) => e.startsWith(key + '='))
64
+ ?.slice(key.length + 1);
65
+
59
66
  export const getSignedHeader = async (url: string, apiPath: string) => {
60
67
  // Because the API of zhihu.com has changed, we must use the value of `d_c0` (extracted from cookies) to calculate
61
68
  // `x-zse-96`. So first get `d_c0`, then get the actual data of a ZhiHu question. In this way, we don't need to
@@ -63,8 +70,12 @@ export const getSignedHeader = async (url: string, apiPath: string) => {
63
70
 
64
71
  // fisrt: get cookie(dc_0) from zhihu.com
65
72
  const dc0 = await cache.tryGet('zhihu:cookies:d_c0', async () => {
66
- const response1 = await ofetch.raw(url);
67
- const zseCk = response1._data.match(/var e="__zse_ck",t=\(typeof __g\.ck == 'string' && __g\.ck\)\|\|"([\w+/=]*?)",_=6048e5;/)?.[1];
73
+ if (getCookieValueByKey('d_c0')) {
74
+ return getCookieValueByKey('d_c0');
75
+ }
76
+ const response1 = await ofetch.raw('https://static.zhihu.com/zse-ck/v3.js');
77
+ const script = await response1._data.text();
78
+ const zseCk = script.match(/__g\.ck\|\|"([\w+/=\\]*?)",_=/)?.[1];
68
79
 
69
80
  const response2 = zseCk
70
81
  ? await ofetch.raw(url, {
@@ -95,11 +106,8 @@ export const getSignedHeader = async (url: string, apiPath: string) => {
95
106
  const f = `${xzse93}+${apiPath}+${dc0}`;
96
107
  const xzse96 = '2.0_' + g_encrypt(md5(f));
97
108
 
98
- const zc0 = config.zhihu.cookies
99
- ?.split(';')
100
- .map((e) => e.trim())
101
- .find((e) => e.includes('z_c0'))
102
- ?.slice('z_c0='.length);
109
+ const zc0 = getCookieValueByKey('z_c0');
110
+
103
111
  return {
104
112
  cookie: `d_c0=${dc0}${zc0 ? `;z_c0=${zc0}` : ''}`,
105
113
  'x-zse-96': xzse96,
@@ -29,12 +29,19 @@ export const route: Route = {
29
29
 
30
30
  async function handler(ctx) {
31
31
  const id = ctx.req.param('id');
32
+ // 知乎专栏链接存在两种格式, 一种以 'zhuanlan.' 开头, 另一种新增的以 'c_' 结尾
33
+ let url = `https://zhuanlan.zhihu.com/${id}`;
34
+ if (id.search('c_') === 0) {
35
+ url = `https://www.zhihu.com/column/${id}`;
36
+ }
32
37
 
38
+ const signedHeader = await getSignedHeader(url, `https://www.zhihu.com/api/v4/columns/${id}/items`);
33
39
  const listRes = await got({
34
40
  method: 'get',
35
41
  url: `https://www.zhihu.com/api/v4/columns/${id}/items`,
36
42
  headers: {
37
43
  ...header,
44
+ ...signedHeader,
38
45
  Referer: `https://zhuanlan.zhihu.com/${id}`,
39
46
  },
40
47
  });
@@ -44,19 +51,13 @@ async function handler(ctx) {
44
51
  url: `https://www.zhihu.com/api/v4/columns/${id}/pinned-items`,
45
52
  headers: {
46
53
  ...header,
54
+ ...signedHeader,
47
55
  Referer: `https://zhuanlan.zhihu.com/${id}`,
48
56
  },
49
57
  });
50
58
 
51
59
  listRes.data.data = [...listRes.data.data, ...pinnedRes.data.data];
52
60
 
53
- // 知乎专栏链接存在两种格式, 一种以 'zhuanlan.' 开头, 另一种新增的以 'c_' 结尾
54
- let url = `https://zhuanlan.zhihu.com/${id}`;
55
- if (id.search('c_') === 0) {
56
- url = `https://www.zhihu.com/column/${id}`;
57
- }
58
-
59
- const signedHeader = await getSignedHeader(url, `https://www.zhihu.com/api/v4/columns/${id}/items`);
60
61
  const infoRes = await got(url, {
61
62
  headers: {
62
63
  ...signedHeader,
@@ -63,6 +63,13 @@ export interface QATopic extends BasicTopic {
63
63
  question: {
64
64
  images?: TopicImage[];
65
65
  text?: string;
66
+ owner?: {
67
+ avatar_url: string;
68
+ description: string;
69
+ location: string;
70
+ name: string;
71
+ user_id: number;
72
+ };
66
73
  };
67
74
  }
68
75
 
@@ -140,6 +147,8 @@ export interface TopicImage {
140
147
 
141
148
  export type Topic = TalkTopic | QATopic | TaskTopic | SolutionTopic;
142
149
 
150
+ export type ResponseData = UserInfo | GroupInfo | Topic[];
151
+
143
152
  export type UserInfoResponse = BasicResponse<UserInfo>;
144
153
 
145
154
  export type GroupInfoResponse = BasicResponse<GroupInfo>;
@@ -1,10 +1,10 @@
1
1
  import got from '@/utils/got';
2
- import type { TopicImage, Topic, BasicResponse } from './types';
2
+ import type { TopicImage, Topic, BasicResponse, ResponseData } from './types';
3
3
  import { parseDate } from '@/utils/parse-date';
4
4
  import { config } from '@/config';
5
5
  import type { DataItem } from '@/types';
6
6
 
7
- export async function customFetch<T extends BasicResponse<any>>(path: string, retryCount = 0): Promise<T['resp_data']> {
7
+ export async function customFetch<T extends BasicResponse<ResponseData>>(path: string, retryCount = 0): Promise<T['resp_data']> {
8
8
  const apiUrl = 'https://api.zsxq.com/v2';
9
9
 
10
10
  const response = await got(apiUrl + path, {
@@ -46,8 +46,9 @@ export function generateTopicDataItem(topics: Topic[]): DataItem[] {
46
46
  case 'q&a':
47
47
  title = topic.question?.text?.split('\n')[0] ?? '问答';
48
48
  description = parseTopicContent(topic.question?.text, topic.question?.images);
49
+ description = `<blockquote>${String(topic.question?.owner?.name ?? '匿名用户')} 提问:${description}</blockquote>`;
49
50
  if (topic.answered) {
50
- description += '<br><br>';
51
+ description += '<br>' + topic.answer?.owner.name + ' 回答:<br><br>';
51
52
  description += parseTopicContent(topic.answer?.text, topic.answer?.images);
52
53
  }
53
54
  break;
package/lib/setup.test.ts CHANGED
@@ -31,7 +31,7 @@ const server = setupServer(
31
31
  choices: [
32
32
  {
33
33
  message: {
34
- content: 'Summary of the article.',
34
+ content: 'AI processed content.',
35
35
  },
36
36
  },
37
37
  ],
package/lib/types.ts CHANGED
@@ -286,3 +286,9 @@ export type RadarItem = {
286
286
  document: Document
287
287
  ) => string);
288
288
  };
289
+
290
+ export type RadarDomain = {
291
+ _name: string;
292
+ } & {
293
+ [subdomain: string]: RadarItem[];
294
+ };
@@ -64,7 +64,7 @@ export default {
64
64
  }
65
65
  if (key) {
66
66
  if (maxAge !== config.cache.contentExpire) {
67
- // Only set cacheTtlKey if maxAge !== contentExpire
67
+ // intentionally store the cache ttl if it is not the default value
68
68
  clients.redisClient.set(getCacheTtlKey(key), maxAge, 'EX', maxAge);
69
69
  }
70
70
  return clients.redisClient.set(key, value, 'EX', maxAge); // setMode: https://redis.io/commands/set