rsshub 1.0.0-master.f9ec483 → 1.0.0-master.fa1dcc5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/lib/config.ts +42 -1
  2. package/lib/middleware/access-control.ts +3 -3
  3. package/lib/middleware/cache.ts +5 -3
  4. package/lib/middleware/template.test.ts +6 -0
  5. package/lib/middleware/template.tsx +3 -1
  6. package/lib/router.js +0 -6
  7. package/lib/routes/141jav/index.ts +1 -1
  8. package/lib/routes/141ppv/index.ts +1 -1
  9. package/lib/routes/36kr/hot-list.ts +1 -1
  10. package/lib/routes/36kr/index.ts +1 -1
  11. package/lib/routes/78dm/index.ts +429 -43
  12. package/lib/routes/78dm/namespace.ts +2 -0
  13. package/lib/routes/78dm/templates/description.art +17 -0
  14. package/lib/routes/abc/index.ts +10 -9
  15. package/lib/routes/aeon/category.ts +1 -1
  16. package/lib/routes/aeon/type.ts +1 -1
  17. package/lib/routes/afr/latest.ts +69 -0
  18. package/lib/routes/afr/namespace.ts +7 -0
  19. package/lib/routes/afr/navigation.ts +75 -0
  20. package/lib/routes/afr/query.ts +349 -0
  21. package/lib/routes/afr/utils.ts +80 -0
  22. package/lib/routes/aibase/discover.ts +1 -1
  23. package/lib/routes/aibase/news.ts +1 -1
  24. package/lib/routes/aibase/topic.ts +1 -1
  25. package/lib/routes/air-level/index.ts +49 -0
  26. package/lib/routes/air-level/levelrank.ts +65 -0
  27. package/lib/routes/air-level/namespace.ts +12 -0
  28. package/lib/routes/ajcass/namespace.ts +11 -0
  29. package/lib/routes/ajcass/shxyj.ts +73 -0
  30. package/lib/routes/alpinelinux/pkgs.ts +2 -2
  31. package/lib/routes/anime1/anime.ts +1 -1
  32. package/lib/routes/apnews/utils.ts +6 -2
  33. package/lib/routes/appleinsider/index.ts +1 -1
  34. package/lib/routes/aqara/region.ts +1 -1
  35. package/lib/routes/asus/bios.ts +0 -1
  36. package/lib/routes/baoyu/index.ts +57 -0
  37. package/lib/routes/baoyu/namespace.ts +8 -0
  38. package/lib/routes/bilibili/article.ts +37 -14
  39. package/lib/routes/bilibili/dynamic.ts +15 -7
  40. package/lib/routes/bilibili/followings-dynamic.ts +2 -2
  41. package/lib/routes/bilibili/manga-update.ts +3 -0
  42. package/lib/routes/bilibili/ranking.ts +188 -117
  43. package/lib/routes/bilibili/reply.ts +2 -0
  44. package/lib/routes/bilibili/templates/description.art +2 -0
  45. package/lib/routes/bing/daily-wallpaper.ts +5 -1
  46. package/lib/routes/bsky/posts.ts +0 -1
  47. package/lib/routes/bsky/templates/post.art +8 -1
  48. package/lib/routes/buaa/lib/space/newbook.ts +1 -1
  49. package/lib/routes/c114/namespace.ts +2 -0
  50. package/lib/routes/c114/roll.ts +71 -42
  51. package/lib/routes/cags/edu/index.ts +84 -0
  52. package/lib/routes/cags/namespace.ts +9 -0
  53. package/lib/routes/caixin/article.ts +1 -1
  54. package/lib/routes/caixin/blog.ts +2 -3
  55. package/lib/routes/caixin/category.ts +1 -1
  56. package/lib/routes/caixin/latest.ts +12 -16
  57. package/lib/routes/caixin/namespace.ts +1 -1
  58. package/lib/routes/caixin/utils-fulltext.ts +51 -0
  59. package/lib/routes/caixin/utils.ts +37 -37
  60. package/lib/routes/cara/likes.ts +1 -1
  61. package/lib/routes/cara/portfolio.ts +1 -1
  62. package/lib/routes/cara/timeline.ts +1 -1
  63. package/lib/routes/ccfa/index.ts +11 -11
  64. package/lib/routes/chub/characters.ts +1 -1
  65. package/lib/routes/cnbeta/namespace.ts +1 -1
  66. package/lib/routes/cngold/index.ts +195 -0
  67. package/lib/routes/cngold/namespace.ts +9 -0
  68. package/lib/routes/cnki/author.ts +120 -48
  69. package/lib/routes/cnki/utils.ts +4 -4
  70. package/lib/routes/coomer/artist.ts +1 -1
  71. package/lib/routes/coomer/namespace.ts +1 -1
  72. package/lib/routes/coomer/posts.ts +2 -2
  73. package/lib/routes/coomer/utils.ts +1 -1
  74. package/lib/routes/cpcaauto/index.ts +22 -22
  75. package/lib/routes/cs/zzkx.ts +1 -1
  76. package/lib/routes/csdn/blog.ts +17 -13
  77. package/lib/routes/cybersecurityventures/namespace.ts +7 -0
  78. package/lib/routes/cybersecurityventures/news.ts +121 -0
  79. package/lib/routes/cybersecurityventures/types.ts +17 -0
  80. package/lib/routes/daily/discussed.ts +22 -21
  81. package/lib/routes/daily/index.ts +14 -11
  82. package/lib/routes/daily/namespace.ts +1 -1
  83. package/lib/routes/daily/source.ts +186 -0
  84. package/lib/routes/daily/upvoted.ts +17 -17
  85. package/lib/routes/daily/user.ts +6 -23
  86. package/lib/routes/daily/utils.ts +27 -32
  87. package/lib/routes/dataguidance/index.ts +19 -30
  88. package/lib/routes/dcfever/news.ts +1 -1
  89. package/lib/routes/dcfever/reviews.ts +1 -1
  90. package/lib/routes/dcfever/trading-search.ts +1 -1
  91. package/lib/routes/dcfever/trading.ts +1 -1
  92. package/lib/routes/deeplearning/namespace.ts +3 -1
  93. package/lib/routes/deeplearning/templates/description.art +21 -0
  94. package/lib/routes/deeplearning/the-batch.ts +296 -0
  95. package/lib/routes/deepmind/blog.ts +1 -1
  96. package/lib/routes/digitalcameraworld/news.ts +1 -1
  97. package/lib/routes/discord/discord-api.ts +44 -2
  98. package/lib/routes/discord/search.ts +106 -0
  99. package/lib/routes/dn/news.ts +1 -1
  100. package/lib/routes/dockerhub/repositories.ts +42 -0
  101. package/lib/routes/dongqiudi/daily.ts +1 -1
  102. package/lib/routes/dw/namespace.ts +6 -0
  103. package/lib/routes/dw/news.ts +89 -0
  104. package/lib/routes/dw/rss.ts +62 -0
  105. package/lib/routes/dw/templates/description.art +23 -0
  106. package/lib/routes/dw/templates/liveblog.art +13 -0
  107. package/lib/routes/dw/templates/video.art +14 -0
  108. package/lib/routes/dw/utils.ts +172 -0
  109. package/lib/routes/ecnu/jwc.ts +5 -1
  110. package/lib/routes/espn/news.ts +1 -1
  111. package/lib/routes/fashionnetwork/namespace.ts +1 -1
  112. package/lib/routes/flyert/forum.ts +99 -0
  113. package/lib/routes/flyert/namespace.ts +1 -0
  114. package/lib/routes/flyert/templates/description.art +21 -0
  115. package/lib/routes/flyert/util.ts +188 -0
  116. package/lib/routes/follow/profile.ts +2 -2
  117. package/lib/routes/foresightnews/article.ts +1 -1
  118. package/lib/routes/foresightnews/column.ts +1 -1
  119. package/lib/routes/foresightnews/index.ts +3 -1
  120. package/lib/routes/foresightnews/news.ts +1 -1
  121. package/lib/routes/freecomputerbooks/index.ts +0 -10
  122. package/lib/routes/ftm/index.ts +1 -1
  123. package/lib/routes/furaffinity/art.ts +85 -0
  124. package/lib/routes/furaffinity/browse.ts +58 -0
  125. package/lib/routes/furaffinity/commissions.ts +55 -0
  126. package/lib/routes/furaffinity/home.ts +80 -0
  127. package/lib/routes/furaffinity/journal-comments.ts +64 -0
  128. package/lib/routes/furaffinity/journals.ts +56 -0
  129. package/lib/routes/furaffinity/namespace.ts +7 -0
  130. package/lib/routes/furaffinity/search.ts +72 -0
  131. package/lib/routes/furaffinity/shouts.ts +56 -0
  132. package/lib/routes/furaffinity/status.ts +58 -0
  133. package/lib/routes/furaffinity/submission-comments.ts +64 -0
  134. package/lib/{routes-deprecated/furaffinity/user.js → routes/furaffinity/user.ts} +53 -41
  135. package/lib/routes/furaffinity/watchers.ts +62 -0
  136. package/lib/routes/furaffinity/watching.ts +62 -0
  137. package/lib/routes/google/developers.ts +71 -0
  138. package/lib/routes/google/news.ts +26 -6
  139. package/lib/routes/gov/cbirc/index.ts +35 -35
  140. package/lib/routes/hamel/index.ts +81 -0
  141. package/lib/routes/hamel/namespace.ts +7 -0
  142. package/lib/routes/hellogithub/volume.ts +3 -0
  143. package/lib/routes/hket/index.ts +13 -1
  144. package/lib/routes/hostmonit/cloudflareyesv6.ts +1 -1
  145. package/lib/routes/hrbeu/sec/list.ts +80 -0
  146. package/lib/routes/hrbust/jwzx.ts +6 -0
  147. package/lib/routes/hunau/gfxy/index.ts +1 -1
  148. package/lib/routes/hunau/ied.ts +1 -1
  149. package/lib/routes/hunau/jwc.ts +1 -1
  150. package/lib/routes/hunau/xky/index.ts +1 -1
  151. package/lib/routes/hust/gs.ts +4 -3
  152. package/lib/routes/idolmaster/namespace.ts +7 -0
  153. package/lib/routes/idolmaster/news.ts +112 -0
  154. package/lib/routes/ieee/author.ts +95 -0
  155. package/lib/routes/ikea/cn/low-price.ts +2 -1
  156. package/lib/routes/imdb/chart.ts +1 -1
  157. package/lib/routes/inspirehep/author.ts +9 -1
  158. package/lib/routes/isct/namespace.ts +11 -0
  159. package/lib/routes/isct/news.ts +66 -0
  160. package/lib/routes/javtrailers/casts.ts +41 -0
  161. package/lib/routes/javtrailers/categories.ts +40 -0
  162. package/lib/routes/javtrailers/namespace.ts +7 -0
  163. package/lib/routes/javtrailers/studios.ts +39 -0
  164. package/lib/routes/javtrailers/templates/description.art +31 -0
  165. package/lib/routes/javtrailers/types.ts +59 -0
  166. package/lib/routes/javtrailers/utils.ts +48 -0
  167. package/lib/routes/jiemian/list.ts +1 -1
  168. package/lib/routes/jiuyangongshe/community.ts +1 -1
  169. package/lib/routes/jlu/phy/index.ts +55 -0
  170. package/lib/routes/joins/chinese.ts +13 -13
  171. package/lib/routes/kcna/news.ts +7 -5
  172. package/lib/routes/keep/user.ts +1 -1
  173. package/lib/routes/langchain/index.ts +74 -0
  174. package/lib/routes/langchain/namespace.ts +7 -0
  175. package/lib/routes/last-origin/namespace.ts +7 -0
  176. package/lib/routes/last-origin/news.ts +65 -0
  177. package/lib/routes/linkresearcher/index.ts +108 -46
  178. package/lib/routes/linkresearcher/namespace.ts +8 -2
  179. package/lib/routes/linkresearcher/templates/bilingual.art +7 -0
  180. package/lib/routes/linkresearcher/types.ts +103 -0
  181. package/lib/routes/liulinblog/itnews.ts +1 -1
  182. package/lib/routes/lofter/collection.ts +1 -1
  183. package/lib/routes/lofter/tag.ts +1 -1
  184. package/lib/routes/logrocket/index.ts +71 -0
  185. package/lib/routes/logrocket/namespace.ts +7 -0
  186. package/lib/routes/m-78/namespace.ts +7 -0
  187. package/lib/routes/m-78/news.ts +115 -0
  188. package/lib/routes/m-78/types.ts +13 -0
  189. package/lib/routes/mastodon/account-id.ts +1 -1
  190. package/lib/routes/mastodon/acct.ts +1 -1
  191. package/lib/routes/mastodon/timeline-local.ts +2 -2
  192. package/lib/routes/mastodon/timeline-remote.ts +2 -2
  193. package/lib/routes/mastodon/utils.ts +1 -1
  194. package/lib/routes/metacritic/index.ts +1 -1
  195. package/lib/routes/mi/utils.ts +1 -1
  196. package/lib/routes/mihoyo/bbs/official.ts +2 -1
  197. package/lib/routes/misskey/utils.ts +19 -1
  198. package/lib/routes/mittrchina/index.ts +2 -2
  199. package/lib/routes/natgeo/natgeo.ts +25 -24
  200. package/lib/routes/nbd/daily.ts +1 -1
  201. package/lib/routes/nielsberglund/index.ts +78 -0
  202. package/lib/routes/nielsberglund/namespace.ts +7 -0
  203. package/lib/routes/nytimes/rss.ts +57 -0
  204. package/lib/routes/openrice/chart.ts +68 -0
  205. package/lib/routes/openrice/templates/chart.art +9 -0
  206. package/lib/routes/openrice/voting.ts +84 -0
  207. package/lib/routes/oschina/news.ts +26 -7
  208. package/lib/routes/patreon/feed.ts +126 -0
  209. package/lib/routes/patreon/namespace.ts +7 -0
  210. package/lib/routes/patreon/templates/description.art +39 -0
  211. package/lib/routes/patreon/types.ts +387 -0
  212. package/lib/routes/pixiv/api/get-illust-detail.ts +22 -0
  213. package/lib/routes/pixiv/novel-api/content/nsfw.ts +73 -0
  214. package/lib/routes/pixiv/novel-api/content/sfw.ts +63 -0
  215. package/lib/routes/pixiv/novel-api/content/types.ts +254 -0
  216. package/lib/routes/pixiv/novel-api/content/utils.ts +133 -0
  217. package/lib/routes/pixiv/novel-api/series/nsfw.ts +84 -0
  218. package/lib/routes/pixiv/novel-api/series/sfw.ts +70 -0
  219. package/lib/routes/pixiv/novel-api/series/types.ts +94 -0
  220. package/lib/routes/pixiv/novel-api/user-novels/nsfw.ts +82 -0
  221. package/lib/routes/pixiv/novel-api/user-novels/sfw.ts +74 -0
  222. package/lib/routes/pixiv/novel-api/user-novels/types.ts +133 -0
  223. package/lib/routes/pixiv/novel-series.ts +52 -0
  224. package/lib/routes/pixiv/novels.ts +69 -44
  225. package/lib/routes/pixiv/utils.ts +3 -0
  226. package/lib/routes/plurk/anonymous.ts +1 -1
  227. package/lib/routes/plurk/hotlinks.ts +1 -1
  228. package/lib/routes/plurk/news.ts +1 -1
  229. package/lib/routes/plurk/search.ts +1 -1
  230. package/lib/routes/qstheory/index.ts +121 -0
  231. package/lib/routes/qstheory/magazine.ts +64 -0
  232. package/lib/routes/qstheory/namespace.ts +7 -0
  233. package/lib/routes/qstheory/utils.ts +25 -0
  234. package/lib/routes/ruc/ai.ts +1 -1
  235. package/lib/routes/scmp/coronavirus.ts +1 -1
  236. package/lib/routes/scu/jwc/tzgg.ts +75 -0
  237. package/lib/routes/scu/namespace.ts +7 -0
  238. package/lib/routes/scu/scupi/_utils.ts +62 -0
  239. package/lib/routes/scu/scupi/notice.ts +41 -0
  240. package/lib/routes/solidot/namespace.ts +1 -1
  241. package/lib/routes/stbu/jsjxy.ts +4 -1
  242. package/lib/routes/steam/search.ts +7 -0
  243. package/lib/routes/sycl/feeds.ts +1 -1
  244. package/lib/routes/syosetu/dev.ts +67 -0
  245. package/lib/routes/syosetu/index.ts +85 -0
  246. package/lib/routes/syosetu/namespace.ts +2 -2
  247. package/lib/routes/syosetu/ranking-isekai.ts +93 -0
  248. package/lib/routes/syosetu/ranking-r18.ts +192 -0
  249. package/lib/routes/syosetu/ranking.ts +285 -0
  250. package/lib/routes/syosetu/search.ts +161 -0
  251. package/lib/routes/syosetu/templates/description.art +73 -0
  252. package/lib/routes/syosetu/types/ranking-r18.ts +60 -0
  253. package/lib/routes/syosetu/types/ranking.ts +67 -0
  254. package/lib/routes/syosetu/types/search.ts +138 -0
  255. package/lib/routes/syosetu/utils.ts +50 -0
  256. package/lib/routes/telegram/channel.ts +31 -1
  257. package/lib/routes/telegram/scripts/get-telegram-session.mjs +16 -6
  258. package/lib/routes/telegram/stickerpack.ts +1 -1
  259. package/lib/routes/telegram/tglib/channel.ts +12 -9
  260. package/lib/routes/telegram/tglib/client.ts +13 -9
  261. package/lib/routes/test/index.ts +4 -0
  262. package/lib/routes/theblockbeats/index.ts +1 -1
  263. package/lib/routes/thegradient/index.ts +80 -0
  264. package/lib/routes/thegradient/namespace.ts +7 -0
  265. package/lib/routes/theinitium/app.ts +4 -0
  266. package/lib/routes/thepaper/channel.ts +1 -1
  267. package/lib/routes/thepaper/factpaper.ts +1 -1
  268. package/lib/routes/thepaper/featured.ts +1 -1
  269. package/lib/routes/thepaper/list.ts +1 -1
  270. package/lib/routes/thepaper/user.ts +174 -0
  271. package/lib/routes/tongji/sem/_utils.ts +65 -0
  272. package/lib/routes/tongji/sem/notice.ts +58 -0
  273. package/lib/routes/toutiao/a-bogus.ts +540 -0
  274. package/lib/routes/toutiao/namespace.ts +7 -0
  275. package/lib/routes/toutiao/templates/video.art +7 -0
  276. package/lib/routes/toutiao/types.ts +443 -0
  277. package/lib/routes/toutiao/user.ts +127 -0
  278. package/lib/routes/twitter/api/mobile-api/api.ts +8 -0
  279. package/lib/routes/twitter/api/web-api/utils.ts +21 -9
  280. package/lib/routes/twitter/namespace.ts +1 -0
  281. package/lib/routes/twitter/utils.ts +7 -1
  282. package/lib/routes/vertikal/latest.ts +73 -0
  283. package/lib/routes/vertikal/namespace.ts +7 -0
  284. package/lib/routes/vice/topic.ts +1 -1
  285. package/lib/routes/vocus/publication.ts +1 -1
  286. package/lib/routes/vocus/user.ts +1 -1
  287. package/lib/routes/wallstreetcn/calendar.ts +90 -0
  288. package/lib/routes/wallstreetcn/hot.ts +2 -2
  289. package/lib/routes/wallstreetcn/live.ts +1 -1
  290. package/lib/routes/wallstreetcn/news.ts +5 -3
  291. package/lib/routes/weibo/timeline.ts +3 -2
  292. package/lib/routes/wellcee/rent.ts +1 -1
  293. package/lib/routes/wufazhuce/namespace.ts +7 -0
  294. package/lib/routes/wufazhuce/one.ts +90 -0
  295. package/lib/routes/xiaoheihe/discount.ts +72 -28
  296. package/lib/routes/xiaohongshu/user.ts +40 -3
  297. package/lib/routes/xiaohongshu/util.ts +112 -105
  298. package/lib/routes/xsijishe/rank.ts +33 -7
  299. package/lib/routes/xueqiu/cookies.ts +13 -18
  300. package/lib/routes/yahoo/news/listid.ts +4 -1
  301. package/lib/routes/yahoo/news/provider-helper.ts +4 -1
  302. package/lib/routes/yahoo/news/provider.ts +4 -1
  303. package/lib/routes/yande/post.ts +13 -3
  304. package/lib/routes/youtube/user.ts +37 -25
  305. package/lib/routes/zhonglun/index.ts +5 -6
  306. package/lib/routes/zjut/cs/index.ts +1 -1
  307. package/lib/utils/got.ts +2 -1
  308. package/lib/utils/helpers.test.ts +13 -1
  309. package/lib/utils/helpers.ts +10 -0
  310. package/lib/utils/ofetch.ts +3 -0
  311. package/lib/utils/request-rewriter/fetch.test.ts +94 -0
  312. package/lib/utils/request-rewriter/fetch.ts +14 -1
  313. package/lib/views/error.tsx +1 -1
  314. package/package.json +40 -37
  315. package/lib/routes/78dm/templates/image.art +0 -1
  316. package/lib/routes/deeplearning/thebatch.ts +0 -74
  317. package/lib/routes/syosetu/chapter.ts +0 -87
  318. package/lib/routes/xiaohongshu/notes.ts +0 -39
  319. package/lib/routes-deprecated/furaffinity/browse.js +0 -44
  320. package/lib/routes-deprecated/furaffinity/commissions.js +0 -39
  321. package/lib/routes-deprecated/furaffinity/favorites.js +0 -56
  322. package/lib/routes-deprecated/furaffinity/gallery.js +0 -56
  323. package/lib/routes-deprecated/furaffinity/home.js +0 -72
  324. package/lib/routes-deprecated/furaffinity/journal-comments.js +0 -50
  325. package/lib/routes-deprecated/furaffinity/journals.js +0 -49
  326. package/lib/routes-deprecated/furaffinity/scraps.js +0 -56
  327. package/lib/routes-deprecated/furaffinity/search.js +0 -56
  328. package/lib/routes-deprecated/furaffinity/shouts.js +0 -40
  329. package/lib/routes-deprecated/furaffinity/status.js +0 -38
  330. package/lib/routes-deprecated/furaffinity/submission-comments.js +0 -50
  331. package/lib/routes-deprecated/furaffinity/watchers.js +0 -47
  332. package/lib/routes-deprecated/furaffinity/watching.js +0 -47
  333. package/lib/routes-deprecated/ieee/author.js +0 -30
  334. package/lib/routes-deprecated/qstheory/index.js +0 -122
@@ -0,0 +1,65 @@
1
+ import { Route } from '@/types';
2
+ import ofetch from '@/utils/ofetch'; // 统一使用的请求库
3
+ import { load } from 'cheerio'; // 类似 jQuery 的 API HTML 解析器
4
+
5
+ export const route: Route = {
6
+ path: ['/rank/:status?'],
7
+ radar: [
8
+ {
9
+ source: ['m.air-level.com/rank/:status', 'm.air-level.com/rank'],
10
+ target: '/rank/:status',
11
+ },
12
+ ],
13
+ parameters: {
14
+ status: '地区',
15
+ },
16
+ name: '空气质量排行',
17
+ maintainers: ['lifetraveler'],
18
+ example: '/air-level/rank/best,/air-level/rank',
19
+ handler,
20
+ };
21
+
22
+ async function handler(ctx) {
23
+ const status = ctx.req.param('status');
24
+ const currentUrl = 'https://m.air-level.com/rank';
25
+ const response = await ofetch(currentUrl);
26
+ const $ = load(response);
27
+ let table = '';
28
+ let title = '';
29
+
30
+ const titleBest = $('body > div.container > div.row.page > div:nth-child(1) > div:nth-child(5) > h3').text().replaceAll('[]', '');
31
+ const tableBest = $('body > div.container > div.row.page > div:nth-child(1) > div:nth-child(5) > table').html();
32
+ const titleWorst = $('body > div.container > div.row.page > div:nth-child(1) > div:nth-child(3) > h3').text().replaceAll('[]', '');
33
+ const tableWorst = $('body > div.container > div.row.page > div:nth-child(1) > div:nth-child(3) > table').html();
34
+
35
+ if (status) {
36
+ if (status === 'best') {
37
+ title = titleBest;
38
+ table = `<table border="1 solid black">${tableBest}</table>`;
39
+ }
40
+
41
+ if (status === 'worsest') {
42
+ title = titleWorst;
43
+ table = `<table border="1 solid black">${tableWorst}</table>`;
44
+ }
45
+ } else {
46
+ title = $('body > div.container > div.row.page > div:nth-child(1) > h2').text().replaceAll('[]', '');
47
+ table = `${titleBest}<br/><table border="1 solid black">${tableBest}</table><br/><table border="1 solid black">${titleWorst}<br/>${tableWorst}</table>`;
48
+ }
49
+
50
+ const pubtime = $('body > div.container > div.row.page > div:nth-child(1) > h4').text();
51
+ const items = [
52
+ {
53
+ title,
54
+ link: currentUrl,
55
+ description: table,
56
+ guid: pubtime,
57
+ },
58
+ ];
59
+ return {
60
+ title,
61
+ item: items,
62
+ description: '空气质量排行',
63
+ link: currentUrl,
64
+ };
65
+ }
@@ -0,0 +1,12 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: 'Air-Level',
5
+ url: 'air-level.com',
6
+ description: `
7
+ - 可以订阅每个城市的空气质量,按照拼音订阅
8
+ - 支持订阅每天的实时排名
9
+ `,
10
+ categories: ['forecast'],
11
+ lang: 'zh-CN',
12
+ };
@@ -0,0 +1,11 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: '社科期刊网',
5
+ url: 'ajcass.com',
6
+ description: '中国社会科学院学术期刊方阵',
7
+ lang: 'zh-CN',
8
+ zh: {
9
+ name: '社科期刊网',
10
+ },
11
+ };
@@ -0,0 +1,73 @@
1
+ import { Route } from '@/types';
2
+ import got from '@/utils/got';
3
+ import { load } from 'cheerio';
4
+ import { parseDate } from '@/utils/parse-date';
5
+
6
+ export const route: Route = {
7
+ path: '/shxyj/:year?/:issue?',
8
+ categories: ['journal'],
9
+ example: '/ajcass/shxyj/2024/1',
10
+ parameters: { year: 'Year of the issue, `null` for the lastest', issue: 'Issue number, `null` for the lastest' },
11
+ features: {
12
+ requireConfig: false,
13
+ requirePuppeteer: false,
14
+ antiCrawler: false,
15
+ supportBT: false,
16
+ supportPodcast: false,
17
+ supportScihub: false,
18
+ },
19
+ name: '社会学研究',
20
+ maintainers: ['CNYoki'],
21
+ handler,
22
+ };
23
+
24
+ async function handler(ctx) {
25
+ let { year, issue } = ctx.req.param();
26
+
27
+ if (!year) {
28
+ const response = await got('https://shxyj.ajcass.com/');
29
+ const $ = load(response.body);
30
+ const latestIssueText = $('p.hod.pop').first().text();
31
+
32
+ const match = latestIssueText.match(/(\d{4}) Vol\.(\d+):/);
33
+ if (match) {
34
+ year = match[1];
35
+ issue = match[2];
36
+ } else {
37
+ throw new Error('无法获取最新的 year 和 issue');
38
+ }
39
+ }
40
+
41
+ const url = `https://shxyj.ajcass.com/Magazine/?Year=${year}&Issue=${issue}`;
42
+ const response = await got(url);
43
+ const $ = load(response.body);
44
+
45
+ const items = $('#tab tr')
46
+ .toArray()
47
+ .map((item) => {
48
+ const $item = $(item);
49
+ const articleTitle = $item.find('a').first().text().trim();
50
+ const articleLink = $item.find('a').first().attr('href');
51
+ const summary = $item.find('li').eq(1).text().replace('[摘要]', '').trim();
52
+ const authors = $item.find('li').eq(2).text().replace('作者:', '').trim();
53
+ const pubDate = parseDate(`${year}-${Number.parseInt(issue) * 2}`);
54
+
55
+ if (articleTitle && articleLink) {
56
+ return {
57
+ title: articleTitle,
58
+ link: `https://shxyj.ajcass.com${articleLink}`,
59
+ description: summary,
60
+ author: authors,
61
+ pubDate,
62
+ };
63
+ }
64
+ return null;
65
+ })
66
+ .filter((item) => item !== null);
67
+
68
+ return {
69
+ title: `社会学研究 ${year}年第${issue}期`,
70
+ link: url,
71
+ item: items,
72
+ };
73
+ }
@@ -55,7 +55,7 @@ function parseTableToJSON(tableHTML: string) {
55
55
  package: $(row).find('.package a').text().trim(),
56
56
  packageUrl: $(row).find('.package a').attr('href')?.trim(),
57
57
  description: $(row).find('.package a').attr('aria-label')?.trim(),
58
- version: $(row).find('.version a').text().trim(),
58
+ version: $(row).find('.version').text().trim(),
59
59
  project: $(row).find('.url a').attr('href')?.trim(),
60
60
  license: $(row).find('.license').text().trim(),
61
61
  branch: $(row).find('.branch').text().trim(),
@@ -73,7 +73,7 @@ async function handler(ctx: Context): Promise<Data> {
73
73
  const query = new URLSearchParams(routeParams);
74
74
  query.append('name', name);
75
75
  const link = `https://pkgs.alpinelinux.org/packages?${query.toString()}`;
76
- const key = `alpinelinux:${query.toString()}`;
76
+ const key = `alpinelinux:packages:${query.toString()}`;
77
77
  const rowData = (await cache.tryGet(
78
78
  key,
79
79
  async () => {
@@ -38,7 +38,7 @@ async function handler(ctx) {
38
38
 
39
39
  const $ = load(response);
40
40
 
41
- const title = $('page-title').text().trim();
41
+ const title = $('.page-title').text().trim();
42
42
 
43
43
  const items = $('article')
44
44
  .toArray()
@@ -51,10 +51,14 @@ export function fetchArticle(item) {
51
51
  // Live
52
52
  ldjson = rawLdjson;
53
53
 
54
+ const url = new URL(item.link);
55
+ const description = url.hash ? $(url.hash).parent().find('.LiveBlogPost-body').html() : ldjson.description;
56
+ const pubDate = url.hash ? parseDate(Number.parseInt($(url.hash).parent().attr('data-posted-date-timestamp'), 10)) : parseDate(ldjson.coverageStartTime);
57
+
54
58
  return {
55
59
  category: ldjson.keywords,
56
- pubDate: parseDate(ldjson.coverageStartTime),
57
- description: ldjson.description,
60
+ pubDate,
61
+ description,
58
62
  guid: $("meta[name='brightspot.contentId']").attr('content'),
59
63
  ...item,
60
64
  };
@@ -6,7 +6,7 @@ import { parseDate } from '@/utils/parse-date';
6
6
 
7
7
  export const route: Route = {
8
8
  path: '/:category?',
9
- categories: ['new-media'],
9
+ categories: ['new-media', 'popular'],
10
10
  example: '/appleinsider',
11
11
  parameters: { category: 'Category, see below, News by default' },
12
12
  features: {
@@ -14,5 +14,5 @@ function handler(ctx) {
14
14
 
15
15
  const { region = 'en', type = 'news' } = ctx.req.param();
16
16
  const redirectTo = `/aqara/${region}/category/${types[type]}`;
17
- ctx.redirect(redirectTo);
17
+ ctx.set('redirect', redirectTo);
18
18
  }
@@ -91,7 +91,6 @@ export const route: Route = {
91
91
  'www.asus.com/:region/laptops/:productLine/:series/:model',
92
92
  'www.asus.com/:region/motherboards-components/:productLine/:series/:model',
93
93
  'www.asus.com/:region/networking-iot-servers/:productLine/:series/:model',
94
- 'asus.com.cn/',
95
94
  ],
96
95
  target: '/bios/:model',
97
96
  },
@@ -0,0 +1,57 @@
1
+ import { Route, DataItem } from '@/types';
2
+ import got from '@/utils/got';
3
+ import { load } from 'cheerio';
4
+ import { parseDate } from '@/utils/parse-date';
5
+ import parser from '@/utils/rss-parser';
6
+ import cache from '@/utils/cache';
7
+
8
+ export const route: Route = {
9
+ path: '/blog',
10
+ categories: ['blog'],
11
+ example: '/baoyu/blog',
12
+ radar: [
13
+ {
14
+ source: ['baoyu.io/'],
15
+ },
16
+ ],
17
+ url: 'baoyu.io/',
18
+ name: 'Blog',
19
+ maintainers: ['liyaozhong'],
20
+ handler,
21
+ description: '宝玉 - 博客文章',
22
+ };
23
+
24
+ async function handler() {
25
+ const rootUrl = 'https://baoyu.io';
26
+ const feedUrl = `${rootUrl}/feed.xml`;
27
+
28
+ const feed = await parser.parseURL(feedUrl);
29
+
30
+ const items = await Promise.all(
31
+ feed.items.map((item) => {
32
+ const link = item.link;
33
+
34
+ return cache.tryGet(link as string, async () => {
35
+ const response = await got(link);
36
+ const $ = load(response.data);
37
+
38
+ const container = $('.container');
39
+ const content = container.find('.prose').html() || '';
40
+
41
+ return {
42
+ title: item.title,
43
+ description: content,
44
+ link,
45
+ pubDate: item.pubDate ? parseDate(item.pubDate) : undefined,
46
+ author: item.creator || '宝玉',
47
+ } as DataItem;
48
+ });
49
+ })
50
+ );
51
+
52
+ return {
53
+ title: '宝玉的博客',
54
+ link: rootUrl,
55
+ item: items,
56
+ };
57
+ }
@@ -0,0 +1,8 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: '宝玉',
5
+ url: 'baoyu.io',
6
+ description: '宝玉的博客',
7
+ lang: 'zh-CN',
8
+ };
@@ -1,8 +1,10 @@
1
1
  import { Route } from '@/types';
2
2
  import got from '@/utils/got';
3
3
  import cache from './cache';
4
-
4
+ import cacheGeneral from '@/utils/cache';
5
+ import { load } from 'cheerio';
5
6
  import { parseDate } from '@/utils/parse-date';
7
+
6
8
  export const route: Route = {
7
9
  path: '/user/article/:uid',
8
10
  categories: ['social-media'],
@@ -21,8 +23,8 @@ export const route: Route = {
21
23
  source: ['space.bilibili.com/:uid'],
22
24
  },
23
25
  ],
24
- name: 'UP 主专栏',
25
- maintainers: ['lengthmin', 'Qixingchen'],
26
+ name: 'UP 主图文',
27
+ maintainers: ['lengthmin', 'Qixingchen', 'hyoban'],
26
28
  handler,
27
29
  };
28
30
 
@@ -31,24 +33,45 @@ async function handler(ctx) {
31
33
  const name = await cache.getUsernameFromUID(uid);
32
34
  const response = await got({
33
35
  method: 'get',
34
- url: `https://api.bilibili.com/x/space/article?mid=${uid}&pn=1&ps=10&sort=publish_time&jsonp=jsonp`,
36
+ url: `https://api.bilibili.com/x/polymer/web-dynamic/v1/opus/feed/space?host_mid=${uid}`,
35
37
  headers: {
36
- Referer: `https://space.bilibili.com/${uid}/`,
38
+ Referer: `https://space.bilibili.com/${uid}/article`,
37
39
  },
38
40
  });
39
41
  const data = response.data.data;
40
- const title = `${name} 的 bilibili 专栏`;
42
+ const title = `${name} 的 bilibili 图文`;
41
43
  const link = `https://space.bilibili.com/${uid}/article`;
42
- const description = `${name} 的 bilibili 专栏`;
44
+ const description = `${name} 的 bilibili 图文`;
45
+ const cookie = await cache.getCookie();
46
+
43
47
  const item = await Promise.all(
44
- data.articles.map(async (item) => {
45
- const { url: art_url, description: eDescription } = await cache.getArticleDataFromCvid(item.id, uid);
46
- const publishDate = parseDate(item.publish_time * 1000);
48
+ data.items.map(async (item) => {
49
+ const link = 'https:' + item.jump_url;
50
+ const data = await cacheGeneral.tryGet(
51
+ link,
52
+ async () =>
53
+ (
54
+ await got({
55
+ method: 'get',
56
+ url: link,
57
+ headers: {
58
+ Referer: `https://space.bilibili.com/${uid}/article`,
59
+ Cookie: cookie,
60
+ },
61
+ })
62
+ ).data
63
+ );
64
+
65
+ const $ = load(data as string);
66
+ const description = $('.opus-module-content').html();
67
+ const pubDate = $('.opus-module-author__pub__text').text().replace('编辑于 ', '');
68
+
47
69
  const single = {
48
- title: item.title,
49
- link: art_url,
50
- description: eDescription,
51
- pubDate: publishDate,
70
+ title: item.content,
71
+ link,
72
+ description: description || item.content,
73
+ // 2019年11月11日 08:50
74
+ pubDate: pubDate ? parseDate(pubDate, 'YYYY年MM月DD日 HH:mm') : undefined,
52
75
  };
53
76
  return single;
54
77
  })
@@ -19,7 +19,7 @@ export const route: Route = {
19
19
  | 键 | 含义 | 接受的值 | 默认值 |
20
20
  | ---------- | --------------------------------- | -------------- | ------ |
21
21
  | showEmoji | 显示或隐藏表情图片 | 0/1/true/false | false |
22
- | embed | 默认开启内嵌视频 | 任意值 | |
22
+ | embed | 默认开启内嵌视频 | 0/1/true/false | true |
23
23
  | useAvid | 视频链接使用 AV 号 (默认为 BV 号) | 0/1/true/false | false |
24
24
  | directLink | 使用内容直链 | 0/1/true/false | false |
25
25
  | hideGoods | 隐藏带货动态 | 0/1/true/false | false |
@@ -117,6 +117,7 @@ const getIframe = (data?: Modules, embed: boolean = true) => {
117
117
  if (aid === undefined && bvid === undefined) {
118
118
  return '';
119
119
  }
120
+ // 不通过 utils.renderUGCDescription 渲染 img/description 以兼容其他格式的动态
120
121
  return utils.renderUGCDescription(embed, '', '', aid, undefined, bvid);
121
122
  };
122
123
 
@@ -146,7 +147,10 @@ const getImgs = (data?: Modules) => {
146
147
  if (major[type]?.cover) {
147
148
  imgUrls.push(major[type].cover);
148
149
  }
149
- return imgUrls.map((url) => `<img src="${url}">`).join('');
150
+ return imgUrls
151
+ .filter(Boolean)
152
+ .map((url) => `<img src="${url}">`)
153
+ .join('');
150
154
  };
151
155
 
152
156
  const getUrl = (item?: Item2, useAvid = false) => {
@@ -226,7 +230,7 @@ async function handler(ctx) {
226
230
  const uid = ctx.req.param('uid');
227
231
  const routeParams = Object.fromEntries(new URLSearchParams(ctx.req.param('routeParams')));
228
232
  const showEmoji = fallback(undefined, queryToBoolean(routeParams.showEmoji), false);
229
- const embed = !ctx.req.param('embed');
233
+ const embed = fallback(undefined, queryToBoolean(routeParams.embed), true);
230
234
  const displayArticle = ctx.req.query('mode') === 'fulltext';
231
235
  const useAvid = fallback(undefined, queryToBoolean(routeParams.useAvid), false);
232
236
  const directLink = fallback(undefined, queryToBoolean(routeParams.directLink), false);
@@ -255,7 +259,12 @@ async function handler(ctx) {
255
259
 
256
260
  const rssItems = await Promise.all(
257
261
  items
258
- .filter((item) => !hideGoods || item.modules.module_dynamic?.additional?.type !== 'ADDITIONAL_TYPE_GOODS')
262
+ .filter((item) => {
263
+ if (hideGoods) {
264
+ return item.modules.module_dynamic?.additional?.type !== 'ADDITIONAL_TYPE_GOODS';
265
+ }
266
+ return true;
267
+ })
259
268
  .map(async (item) => {
260
269
  // const parsed = JSONbig.parse(item.card);
261
270
 
@@ -354,10 +363,9 @@ async function handler(ctx) {
354
363
  // 换行处理
355
364
  description = description.replaceAll('\r\n', '<br>').replaceAll('\n', '<br>');
356
365
  originDescription = originDescription.replaceAll('\r\n', '<br>').replaceAll('\n', '<br>');
357
-
358
- const descriptions = [description, originDescription, urlText, originUrlText, getIframe(data, embed), getIframe(origin, embed), getImgs(data), getImgs(origin)]
359
- .filter(Boolean)
366
+ const descriptions = [description, getIframe(data, embed), getImgs(data), urlText, originDescription, getIframe(origin, embed), getImgs(origin), originUrlText]
360
367
  .map((e) => e?.trim())
368
+ .filter(Boolean)
361
369
  .join('<br>');
362
370
 
363
371
  return {
@@ -18,7 +18,7 @@ export const route: Route = {
18
18
  | 键 | 含义 | 接受的值 | 默认值 |
19
19
  | ---------- | --------------------------------- | -------------- | ------ |
20
20
  | showEmoji | 显示或隐藏表情图片 | 0/1/true/false | false |
21
- | embed | 默认开启内嵌视频 | 任意值 | |
21
+ | embed | 默认开启内嵌视频 | 0/1/true/false | true |
22
22
  | useAvid | 视频链接使用 AV 号 (默认为 BV 号) | 0/1/true/false | false |
23
23
  | directLink | 使用内容直链 | 0/1/true/false | false |
24
24
  | hideGoods | 隐藏带货动态 | 0/1/true/false | false |
@@ -55,7 +55,7 @@ async function handler(ctx) {
55
55
  const routeParams = querystring.parse(ctx.req.param('routeParams'));
56
56
 
57
57
  const showEmoji = fallback(undefined, queryToBoolean(routeParams.showEmoji), false);
58
- const embed = !ctx.req.param('embed');
58
+ const embed = fallback(undefined, queryToBoolean(routeParams.embed), true);
59
59
  const displayArticle = fallback(undefined, queryToBoolean(routeParams.displayArticle), false);
60
60
 
61
61
  const name = await cache.getUsernameFromUID(uid);
@@ -28,6 +28,8 @@ async function handler(ctx) {
28
28
  const comic_id = ctx.req.param('comicid').startsWith('mc') ? ctx.req.param('comicid').replace('mc', '') : ctx.req.param('comicid');
29
29
  const link = `https://manga.bilibili.com/detail/mc${comic_id}`;
30
30
 
31
+ const spi_response = await got('https://api.bilibili.com/x/frontend/finger/spi');
32
+
31
33
  const response = await got({
32
34
  method: 'POST',
33
35
  url: `https://manga.bilibili.com/twirp/comic.v2.Comic/ComicDetail?device=pc&platform=web`,
@@ -36,6 +38,7 @@ async function handler(ctx) {
36
38
  },
37
39
  headers: {
38
40
  Referer: link,
41
+ Cookie: `buvid3=${spi_response.data.data.b_3}; buvid4=${spi_response.data.data.b_4}`,
39
42
  },
40
43
  });
41
44
  const data = response.data.data;