rsshub 1.0.0-master.f97cdb2 → 1.0.0-master.fa3428f

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 (237) hide show
  1. package/README.md +1 -1
  2. package/lib/config.js +3 -1
  3. package/lib/radar-rules.js +0 -92
  4. package/lib/router.js +68 -71
  5. package/lib/routes/tencent/wechat/miniprogram/framework.js +4 -2
  6. package/lib/utils/common-config.js +4 -0
  7. package/lib/utils/parse-date.js +8 -7
  8. package/lib/utils/rand-user-agent.js +29 -0
  9. package/lib/utils/request-wrapper.js +2 -5
  10. package/lib/utils/wechat-mp.js +106 -10
  11. package/lib/v2/agirls/index.js +6 -0
  12. package/lib/v2/bilibili/video.js +1 -0
  13. package/lib/v2/bookfere/category.js +36 -0
  14. package/lib/v2/bookfere/maintainer.js +3 -0
  15. package/lib/v2/bookfere/radar.js +11 -0
  16. package/lib/v2/bookfere/router.js +3 -0
  17. package/lib/v2/cankaoxiaoxi/index.js +81 -0
  18. package/lib/v2/cankaoxiaoxi/maintainer.js +3 -0
  19. package/lib/v2/cankaoxiaoxi/radar.js +61 -0
  20. package/lib/v2/cankaoxiaoxi/router.js +3 -0
  21. package/lib/{routes → v2}/cctv/category.js +1 -1
  22. package/lib/{routes → v2}/cctv/jx.js +6 -1
  23. package/lib/{routes → v2}/cctv/lm.js +1 -1
  24. package/lib/v2/cctv/maintainer.js +7 -0
  25. package/lib/v2/cctv/radar.js +41 -0
  26. package/lib/v2/cctv/router.js +7 -0
  27. package/lib/{routes → v2}/cctv/special.js +6 -4
  28. package/lib/{routes → v2}/cctv/utils/mzzlbg.js +8 -6
  29. package/lib/{routes → v2}/cctv/utils/news.js +25 -22
  30. package/lib/{routes → v2}/cctv/utils/xinwen1j1.js +20 -17
  31. package/lib/v2/cctv/xwlb.js +50 -0
  32. package/lib/v2/chinacef/experts.js +38 -0
  33. package/lib/v2/chinacef/hot.js +38 -0
  34. package/lib/v2/chinacef/index.js +39 -0
  35. package/lib/v2/chinacef/maintainer.js +5 -0
  36. package/lib/v2/chinacef/radar.js +25 -0
  37. package/lib/v2/chinacef/router.js +5 -0
  38. package/lib/v2/{wechat → chinacef}/templates/description.art +0 -0
  39. package/lib/v2/chinacef/utils.js +55 -0
  40. package/lib/v2/chinanews/index.js +65 -0
  41. package/lib/v2/chinanews/maintainer.js +3 -0
  42. package/lib/v2/chinanews/radar.js +13 -0
  43. package/lib/v2/chinanews/router.js +3 -0
  44. package/lib/v2/cnbeta/index.js +2 -1
  45. package/lib/v2/cnbeta/utils.js +1 -0
  46. package/lib/v2/dapenti/maintainer.js +4 -0
  47. package/lib/v2/dapenti/radar.js +27 -0
  48. package/lib/v2/dapenti/router.js +4 -0
  49. package/lib/{routes → v2}/dapenti/subject.js +1 -1
  50. package/lib/{routes → v2}/dapenti/tugua.js +1 -1
  51. package/lib/v2/dapenti/utils.js +75 -0
  52. package/lib/{routes → v2}/dongqiudi/daily.js +10 -13
  53. package/lib/v2/dongqiudi/maintainer.js +8 -0
  54. package/lib/{routes → v2}/dongqiudi/player_news.js +0 -0
  55. package/lib/v2/dongqiudi/radar.js +45 -0
  56. package/lib/{routes → v2}/dongqiudi/result.js +2 -1
  57. package/lib/v2/dongqiudi/router.js +8 -0
  58. package/lib/{routes → v2}/dongqiudi/special.js +0 -0
  59. package/lib/{routes → v2}/dongqiudi/team_news.js +0 -0
  60. package/lib/{routes → v2}/dongqiudi/top_news.js +12 -15
  61. package/lib/{routes → v2}/dongqiudi/utils.js +47 -28
  62. package/lib/v2/dut/defaults.js +53 -0
  63. package/lib/v2/dut/index.js +78 -0
  64. package/lib/v2/dut/maintainer.js +14 -0
  65. package/lib/v2/dut/radar.js +109 -0
  66. package/lib/v2/dut/router.js +4 -0
  67. package/lib/v2/dut/shortcuts.js +77 -0
  68. package/lib/{routes → v2}/dx2025/index.js +0 -0
  69. package/lib/v2/dx2025/maintainer.js +3 -0
  70. package/lib/v2/dx2025/radar.js +19 -0
  71. package/lib/v2/dx2025/router.js +3 -0
  72. package/lib/v2/e-hentai/radar.js +21 -3
  73. package/lib/v2/eagle/blog.js +47 -0
  74. package/lib/{routes → v2}/eagle/changelog.js +3 -1
  75. package/lib/v2/eagle/maintainer.js +4 -0
  76. package/lib/v2/eagle/radar.js +101 -0
  77. package/lib/v2/eagle/router.js +4 -0
  78. package/lib/{routes → v2}/ehentai/ehapi.js +50 -21
  79. package/lib/{routes → v2}/ehentai/favorites.js +4 -2
  80. package/lib/v2/ehentai/maintainer.js +5 -0
  81. package/lib/v2/ehentai/router.js +5 -0
  82. package/lib/{routes → v2}/ehentai/search.js +5 -3
  83. package/lib/{routes → v2}/ehentai/tag.js +4 -2
  84. package/lib/v2/firefox/index.js +7 -2
  85. package/lib/v2/fortunechina/index.js +1 -1
  86. package/lib/v2/github/comments.js +7 -0
  87. package/lib/v2/gitpod/blog.js +8 -0
  88. package/lib/v2/gov/maintainer.js +1 -0
  89. package/lib/v2/gov/nrta/news.js +63 -0
  90. package/lib/v2/gov/radar.js +11 -0
  91. package/lib/v2/gov/router.js +1 -0
  92. package/lib/v2/guancha/index.js +1 -1
  93. package/lib/v2/guangdiu/cheaps.js +28 -0
  94. package/lib/v2/guangdiu/index.js +44 -0
  95. package/lib/v2/guangdiu/maintainer.js +5 -0
  96. package/lib/v2/guangdiu/radar.js +25 -0
  97. package/lib/v2/guangdiu/rank.js +38 -0
  98. package/lib/v2/guangdiu/router.js +5 -0
  99. package/lib/{routes/guokr/calendar.js → v2/guokr/channel.js} +2 -2
  100. package/lib/v2/guokr/maintainer.js +4 -0
  101. package/lib/v2/guokr/radar.js +19 -0
  102. package/lib/v2/guokr/router.js +4 -0
  103. package/lib/{routes → v2}/guokr/scientific.js +3 -3
  104. package/lib/v2/hkej/index.js +9 -15
  105. package/lib/v2/hkepc/index.js +8 -0
  106. package/lib/v2/hket/index.js +10 -2
  107. package/lib/v2/huangz/index.js +29 -0
  108. package/lib/v2/huangz/maintainer.js +3 -0
  109. package/lib/v2/huangz/radar.js +13 -0
  110. package/lib/v2/huangz/router.js +3 -0
  111. package/lib/v2/huanqiu/index.js +65 -0
  112. package/lib/v2/huanqiu/maintainer.js +3 -0
  113. package/lib/v2/huanqiu/radar.js +13 -0
  114. package/lib/v2/huanqiu/router.js +3 -0
  115. package/lib/v2/miris/blog.js +19 -0
  116. package/lib/v2/miris/maintainer.js +3 -0
  117. package/lib/v2/miris/radar.js +11 -0
  118. package/lib/v2/miris/router.js +3 -0
  119. package/lib/v2/news/whxw.js +2 -2
  120. package/lib/v2/npm/package.js +1 -1
  121. package/lib/v2/npm/router.js +1 -1
  122. package/lib/v2/qbittorrent/maintainer.js +3 -0
  123. package/lib/v2/qbittorrent/news.js +59 -0
  124. package/lib/v2/qbittorrent/radar.js +13 -0
  125. package/lib/v2/qbittorrent/router.js +3 -0
  126. package/lib/v2/rsshub/sponsors.js +1 -0
  127. package/lib/{routes → v2}/sciencenet/blog.js +17 -12
  128. package/lib/v2/sciencenet/maintainer.js +4 -0
  129. package/lib/v2/sciencenet/radar.js +19 -0
  130. package/lib/v2/sciencenet/router.js +4 -0
  131. package/lib/v2/sciencenet/user.js +65 -0
  132. package/lib/v2/sdu/cmse.js +59 -0
  133. package/lib/v2/sdu/cs.js +57 -0
  134. package/lib/v2/sdu/data.js +110 -0
  135. package/lib/v2/sdu/epe.js +55 -0
  136. package/lib/v2/sdu/extractor/index.js +15 -0
  137. package/lib/v2/sdu/extractor/sdrj.js +21 -0
  138. package/lib/v2/sdu/extractor/view.js +21 -0
  139. package/lib/v2/sdu/extractor/wh/jwc.js +24 -0
  140. package/lib/v2/sdu/extractor/wh/news.js +21 -0
  141. package/lib/v2/sdu/maintainer.js +9 -0
  142. package/lib/v2/sdu/mech.js +60 -0
  143. package/lib/v2/sdu/radar.js +159 -0
  144. package/lib/v2/sdu/router.js +9 -0
  145. package/lib/v2/sdu/sc.js +61 -0
  146. package/lib/v2/sdu/wh/jwc.js +42 -0
  147. package/lib/v2/sdu/wh/news.js +38 -0
  148. package/lib/v2/stratechery/index.js +20 -0
  149. package/lib/v2/stratechery/maintainer.js +3 -0
  150. package/lib/v2/stratechery/radar.js +11 -0
  151. package/lib/v2/stratechery/router.js +3 -0
  152. package/lib/{routes → v2}/taptap/changelog.js +2 -1
  153. package/lib/v2/taptap/maintainer.js +5 -0
  154. package/lib/v2/taptap/radar.js +25 -0
  155. package/lib/v2/taptap/review.js +69 -0
  156. package/lib/v2/taptap/router.js +5 -0
  157. package/lib/v2/taptap/templates/videoPost.art +2 -0
  158. package/lib/v2/taptap/topic.js +79 -0
  159. package/lib/v2/taptap/utils.js +48 -0
  160. package/lib/v2/thecover/channel.js +66 -0
  161. package/lib/v2/thecover/maintainer.js +3 -0
  162. package/lib/v2/thecover/radar.js +13 -0
  163. package/lib/v2/thecover/router.js +3 -0
  164. package/lib/{routes → v2}/twreporter/category.js +7 -12
  165. package/lib/{routes → v2}/twreporter/fetch_article.js +5 -4
  166. package/lib/v2/twreporter/maintainer.js +5 -0
  167. package/lib/{routes → v2}/twreporter/newest.js +8 -13
  168. package/lib/v2/twreporter/photography.js +46 -0
  169. package/lib/v2/twreporter/radar.js +25 -0
  170. package/lib/v2/twreporter/router.js +5 -0
  171. package/lib/{routes/tencent → v2}/wechat/announce.js +3 -2
  172. package/lib/v2/wechat/ce.js +69 -0
  173. package/lib/v2/wechat/data258.js +137 -0
  174. package/lib/v2/wechat/ershcimi.js +35 -0
  175. package/lib/{routes/tencent → v2}/wechat/feeds.js +0 -0
  176. package/lib/v2/wechat/maintainer.js +11 -0
  177. package/lib/{routes/tencent → v2}/wechat/mp.js +0 -0
  178. package/lib/{routes/tencent → v2}/wechat/msgalbum.js +0 -0
  179. package/lib/v2/wechat/radar.js +76 -1
  180. package/lib/v2/wechat/router.js +11 -0
  181. package/lib/{routes/tencent → v2}/wechat/tgchannel.js +0 -0
  182. package/lib/{routes/tencent → v2}/wechat/uread.js +0 -0
  183. package/lib/{routes/tencent → v2}/wechat/wemp.js +0 -0
  184. package/lib/{routes/tencent → v2}/wechat/wxnmh.js +0 -0
  185. package/lib/{routes → v2}/xueqiu/favorite.js +2 -1
  186. package/lib/v2/xueqiu/fund.js +50 -0
  187. package/lib/{routes → v2}/xueqiu/hots.js +2 -1
  188. package/lib/v2/xueqiu/maintainer.js +10 -0
  189. package/lib/v2/xueqiu/radar.js +60 -0
  190. package/lib/v2/xueqiu/router.js +10 -0
  191. package/lib/{routes → v2}/xueqiu/snb.js +2 -1
  192. package/lib/{routes → v2}/xueqiu/stock_comments.js +4 -20
  193. package/lib/{routes → v2}/xueqiu/stock_info.js +2 -1
  194. package/lib/v2/xueqiu/templates/comments_description.art +10 -0
  195. package/lib/{routes → v2}/xueqiu/user.js +2 -1
  196. package/lib/{routes → v2}/xueqiu/user_stock.js +3 -2
  197. package/lib/v2/yunspe/maintainer.js +3 -0
  198. package/lib/v2/yunspe/newsflash.js +42 -0
  199. package/lib/v2/yunspe/radar.js +13 -0
  200. package/lib/v2/yunspe/router.js +3 -0
  201. package/lib/{routes → v2}/yystv/category.js +8 -8
  202. package/lib/{routes → v2}/yystv/docs.js +2 -2
  203. package/lib/v2/yystv/maintainer.js +4 -0
  204. package/lib/v2/yystv/radar.js +49 -0
  205. package/lib/v2/yystv/router.js +4 -0
  206. package/lib/{routes/universities → v2}/zju/career/index.js +14 -13
  207. package/lib/{routes/universities → v2}/zju/cst/custom.js +2 -1
  208. package/lib/{routes/universities → v2}/zju/cst/index.js +20 -24
  209. package/lib/v2/zju/grs/index.js +43 -0
  210. package/lib/v2/zju/list.js +66 -0
  211. package/lib/v2/zju/maintainer.js +8 -0
  212. package/lib/v2/zju/physics/index.js +52 -0
  213. package/lib/v2/zju/radar.js +139 -0
  214. package/lib/v2/zju/router.js +8 -0
  215. package/lib/views/atom.art +13 -1
  216. package/lib/views/welcome.art +4 -1
  217. package/package.json +13 -12
  218. package/lib/routes/cctv/xwlb.js +0 -48
  219. package/lib/routes/dapenti/utils.js +0 -73
  220. package/lib/routes/taptap/review.js +0 -39
  221. package/lib/routes/taptap/topic.js +0 -85
  222. package/lib/routes/tencent/wechat/_README +0 -1
  223. package/lib/routes/tencent/wechat/ce.js +0 -40
  224. package/lib/routes/tencent/wechat/ershcimi.js +0 -43
  225. package/lib/routes/twreporter/photography.js +0 -57
  226. package/lib/routes/universities/dut/index.js +0 -60
  227. package/lib/routes/universities/dut/subsite.js +0 -50
  228. package/lib/routes/universities/sdu/cmse.js +0 -55
  229. package/lib/routes/universities/sdu/cs.js +0 -55
  230. package/lib/routes/universities/sdu/epe.js +0 -54
  231. package/lib/routes/universities/sdu/mech.js +0 -58
  232. package/lib/routes/universities/sdu/sc.js +0 -56
  233. package/lib/routes/universities/zju/grs/index.js +0 -44
  234. package/lib/routes/universities/zju/list.js +0 -78
  235. package/lib/routes/universities/zju/physics/index.js +0 -55
  236. package/lib/routes/xueqiu/fund.js +0 -71
  237. package/lib/v2/wechat/templates/image.art +0 -1
@@ -0,0 +1,63 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+ const { parseDate } = require('@/utils/parse-date');
4
+ const timezone = require('@/utils/timezone');
5
+
6
+ const categories = {
7
+ 112: '总局要闻',
8
+ 113: '公告公示',
9
+ 114: '工作动态',
10
+ };
11
+
12
+ module.exports = async (ctx) => {
13
+ const category = ctx.params.category ?? 112;
14
+
15
+ const rootUrl = 'http://www.nrta.gov.cn';
16
+
17
+ const currentUrl = `${rootUrl}/col/col${category}/index.html`;
18
+
19
+ const response = await got({
20
+ method: 'get',
21
+ url: currentUrl,
22
+ });
23
+
24
+ const regex = /<!\[CDATA\[([\s\S]*?)\]\]>(?=\s*<)/gi;
25
+ const data = response.data.replace(regex, '$1');
26
+
27
+ const $ = cheerio.load(data, {
28
+ normalizeWhitespace: true,
29
+ xmlMode: true,
30
+ });
31
+
32
+ const list = $('a', 'record')
33
+ .map((_, item) => {
34
+ item = $(item);
35
+ return {
36
+ link: item.attr('href'),
37
+ };
38
+ })
39
+ .get();
40
+ const items = await Promise.all(
41
+ list.map((item) =>
42
+ ctx.cache.tryGet(item.link, async () => {
43
+ const detailResponse = await got({
44
+ method: 'get',
45
+ url: item.link,
46
+ });
47
+ const content = cheerio.load(detailResponse.data);
48
+ item.title = content('td[id="artTitMob"]').text();
49
+ item.description = content('div[id="c"]').html();
50
+ item.pubDate = timezone(parseDate(content('.mobile_time.shareWarpTime').text().trim()), +8);
51
+ item.author = content('.mobile_time.shareFromz').text();
52
+ return item;
53
+ })
54
+ )
55
+ );
56
+ ctx.state.data = {
57
+ title: category in categories ? categories[category] : '其他',
58
+ link: `http://www.nrta.gov.cn/col/col${category}/index.html`,
59
+ description: '国家广播电视总局',
60
+ language: 'zh-cn',
61
+ item: items,
62
+ };
63
+ };
@@ -374,6 +374,17 @@ module.exports = {
374
374
  },
375
375
  ],
376
376
  },
377
+ 'nrta.gov.cn': {
378
+ _name: '国家广播电视总局',
379
+ '.': [
380
+ {
381
+ title: '分类',
382
+ docs: 'https://docs.rsshub.app/government.html#nrta-gov',
383
+ source: ['/col/*category'],
384
+ target: (params) => `/gov/nrta/news/${params.category.replace('col', '').replace('/index.html', '')}`,
385
+ },
386
+ ],
387
+ },
377
388
  'pbc.gov.cn': {
378
389
  _name: '中国人民银行',
379
390
  '.': [
@@ -17,6 +17,7 @@ module.exports = function (router) {
17
17
  router.get('/miit/wjgs', require('./miit/wjgs'));
18
18
  router.get('/miit/zcjd', require('./miit/zcjd'));
19
19
  router.get('/mee/ywdt/:category?', require('./mee/ywdt'));
20
+ router.get('/nrta/news/:category?', require('./nrta/news'));
20
21
  router.get('/pbc/goutongjiaoliu', require('./pbc/goutongjiaoliu'));
21
22
  router.get('/pbc/tradeAnnouncement', require('./pbc/tradeAnnouncement'));
22
23
  router.get('/pbc/gzlw', require('./pbc/gzlw'));
@@ -145,7 +145,7 @@ module.exports = async (ctx) => {
145
145
  }
146
146
 
147
147
  item.description = content('.all-txt').html() || content('.article-txt-content').html();
148
-
148
+ item.author = content('.author-intro p a').text() || content('.article-content div div h4 a').text() || content('.editor-intro p a').text() || content('.left-main > div.time.fix > span').eq(2).text();
149
149
  return item;
150
150
  })
151
151
  )
@@ -0,0 +1,28 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+ const { parseRelativeDate } = require('@/utils/parse-date');
4
+
5
+ const host = 'https://guangdiu.com';
6
+
7
+ module.exports = async (ctx) => {
8
+ const query = ctx.params.query ?? '';
9
+ const url = `${host}/cheaps.php${query ? `?${query}` : ''}`;
10
+
11
+ const response = await got(url);
12
+ const $ = cheerio.load(response.data);
13
+
14
+ const items = $('div.cheapitem.rightborder')
15
+ .map((_index, item) => ({
16
+ title: $(item).find('div.cheaptitle').text().trim() + $(item).find('a.cheappriceword').text(),
17
+ link: $(item).find('a.cheappriceword').attr('href'),
18
+ description: $(item).find('div.cheapimga').html(),
19
+ pubDate: parseRelativeDate($(item).find('span.cheapaddtimeword').text()),
20
+ }))
21
+ .get();
22
+
23
+ ctx.state.data = {
24
+ title: `逛丢 - 九块九`,
25
+ link: url,
26
+ item: items,
27
+ };
28
+ };
@@ -0,0 +1,44 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+ const { parseRelativeDate } = require('@/utils/parse-date');
4
+
5
+ const host = 'https://guangdiu.com';
6
+
7
+ module.exports = async (ctx) => {
8
+ const query = ctx.params.query ?? '';
9
+ let url;
10
+ if (query === 'c=us') {
11
+ url = `${host}/?c=us`;
12
+ } else {
13
+ url = `${host}/${query ? `cate.php?${query}` : ''}`;
14
+ }
15
+
16
+ const response = await got(url);
17
+ const $ = cheerio.load(response.data);
18
+ const list = $('#mainleft > div.zkcontent > div.gooditem')
19
+ .map((_index, item) => ({
20
+ title: $(item).find('a.goodname').text().trim(),
21
+ link: new URL($(item).find('div.iteminfoarea > h2 > a').attr('href'), host).href,
22
+ }))
23
+ .get();
24
+
25
+ const items = await Promise.all(
26
+ list.map((item) =>
27
+ ctx.cache.tryGet(item.link, async () => {
28
+ const detailResponse = await got(item.link);
29
+ const $ = cheerio.load(detailResponse.data);
30
+
31
+ item.description = $('#dabstract').html() + $('a.dgotobutton').html('前往购买');
32
+ item.pubDate = parseRelativeDate($('span.latesttime').text());
33
+
34
+ return item;
35
+ })
36
+ )
37
+ );
38
+
39
+ ctx.state.data = {
40
+ title: `逛丢 - ${query.indexOf('c=us') > -1 ? '海外' : '国内'}`,
41
+ link: url,
42
+ item: items,
43
+ };
44
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ '/rank': ['fatpandac'],
3
+ '/cheaps/:query?': ['fatpandac'],
4
+ '/:query?': ['Fatpandac'],
5
+ };
@@ -0,0 +1,25 @@
1
+ module.exports = {
2
+ 'guangdiu.com': {
3
+ _name: '逛丢',
4
+ '.': [
5
+ {
6
+ title: '折扣',
7
+ docs: 'https://docs.rsshub.app/shopping.html#guang-diu',
8
+ source: ['/', '/cate.php'],
9
+ target: (param, url) => `/guangdiu/${url.indexOf('?') > -1 ? url.split('?')[1] : ''}`,
10
+ },
11
+ {
12
+ title: '一小时风云榜',
13
+ docs: 'https://docs.rsshub.app/shopping.html#guang-diu',
14
+ source: ['/rank'],
15
+ target: '/guangdiu/rank',
16
+ },
17
+ {
18
+ title: '九块九',
19
+ docs: 'https://docs.rsshub.app/shopping.html#guang-diu',
20
+ source: ['/cheaps.php'],
21
+ target: (param, url) => `/guangdiu/${url.indexOf('?') > -1 ? url.split('?')[1] : ''}`,
22
+ },
23
+ ],
24
+ },
25
+ };
@@ -0,0 +1,38 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+ const { parseRelativeDate } = require('@/utils/parse-date');
4
+
5
+ const host = 'https://guangdiu.com';
6
+
7
+ module.exports = async (ctx) => {
8
+ const url = `${host}/rank.php`;
9
+
10
+ const response = await got(url);
11
+ const $ = cheerio.load(response.data);
12
+ const list = $('div.hourrankitem')
13
+ .map((_index, item) => ({
14
+ title: $(item).find('a.hourranktitle').text(),
15
+ link: new URL($(item).find('a.hourranktitle').attr('href'), host).href,
16
+ }))
17
+ .get();
18
+
19
+ const items = await Promise.all(
20
+ list.map((item) =>
21
+ ctx.cache.tryGet(item.link, async () => {
22
+ const detailResponse = await got(item.link);
23
+ const $ = cheerio.load(detailResponse.data);
24
+
25
+ item.description = $('#dabstract').html() + $('a.dgotobutton').html('前往购买');
26
+ item.pubDate = parseRelativeDate($('div.hourranktime').text());
27
+
28
+ return item;
29
+ })
30
+ )
31
+ );
32
+
33
+ ctx.state.data = {
34
+ title: `逛丢 - 一小时风云榜`,
35
+ link: url,
36
+ item: items,
37
+ };
38
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = function (router) {
2
+ router.get('/rank', require('./rank'));
3
+ router.get('/cheaps/:query?', require('./cheaps'));
4
+ router.get('/:query?', require('./index'));
5
+ };
@@ -3,7 +3,7 @@ const got = require('@/utils/got');
3
3
  async function loadFullPage(ctx, id) {
4
4
  const link = `https://apis.guokr.com/minisite/article/${id}.json`;
5
5
  const content = await ctx.cache.tryGet(link, async () => {
6
- const res = await got.get(link);
6
+ const res = await got(link);
7
7
  return res.data.result.content;
8
8
  });
9
9
  return content;
@@ -19,7 +19,7 @@ const channelMap = {
19
19
  module.exports = async (ctx) => {
20
20
  const channel = channelMap[ctx.params.channel] ? channelMap[ctx.params.channel] : ctx.params.channel;
21
21
 
22
- const response = await got.get(`https://www.guokr.com/apis/minisite/article.json?retrieve_type=by_wx&channel_key=${channel}&offset=0&limit=10`);
22
+ const response = await got(`https://www.guokr.com/apis/minisite/article.json?retrieve_type=by_wx&channel_key=${channel}&offset=0&limit=10`);
23
23
  const items = response.data.result;
24
24
 
25
25
  if (items.length === 0) {
@@ -0,0 +1,4 @@
1
+ module.exports = {
2
+ '/scientific': ['alphardex', 'nczitzk'],
3
+ '/:channel': ['DHPO', 'hoilc'],
4
+ };
@@ -0,0 +1,19 @@
1
+ module.exports = {
2
+ 'guokr.com': {
3
+ _name: '果壳网',
4
+ '.': [
5
+ {
6
+ title: '科学人',
7
+ docs: 'https://docs.rsshub.app/new-media.html#guo-ke-wang-ke-xue-ren',
8
+ source: ['/scientific', '/'],
9
+ target: '/guokr/scientific',
10
+ },
11
+ {
12
+ title: '专栏',
13
+ docs: 'https://docs.rsshub.app/new-media.html#guo-ke-wang-zhuan-lan',
14
+ source: ['/'],
15
+ target: '/guokr/:channel',
16
+ },
17
+ ],
18
+ },
19
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = function (router) {
2
+ router.get('/scientific', require('./scientific'));
3
+ router.get('/:channel', require('./channel'));
4
+ };
@@ -2,7 +2,7 @@ const got = require('@/utils/got');
2
2
  const cheerio = require('cheerio');
3
3
 
4
4
  module.exports = async (ctx) => {
5
- const response = await got.get('https://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&limit=20&offset=0');
5
+ const response = await got('https://www.guokr.com/apis/minisite/article.json?retrieve_type=by_subject&limit=20&offset=0');
6
6
 
7
7
  const result = response.data.result;
8
8
 
@@ -13,9 +13,9 @@ module.exports = async (ctx) => {
13
13
  item: await Promise.all(
14
14
  result.map((item) =>
15
15
  ctx.cache.tryGet(item.url, async () => {
16
- const res = await got.get(item.url);
16
+ const res = await got(item.url);
17
17
  const $ = cheerio.load(res.data);
18
- item.description = $('.eflYNZ #js_content').css('visibility', 'visible').html() || $('.bPfFQI').html();
18
+ item.description = $('.eflYNZ #js_content').css('visibility', 'visible').html() ?? $('.bxHoEL').html();
19
19
  return {
20
20
  title: item.title,
21
21
  description: item.description,
@@ -1,11 +1,12 @@
1
1
  const got = require('@/utils/got');
2
2
  const cheerio = require('cheerio');
3
- const dayjs = require('dayjs');
4
- const utc = require('dayjs/plugin/utc');
5
- const { parseDate } = require('@/utils/parse-date');
3
+ const { parseDate, parseRelativeDate } = require('@/utils/parse-date');
6
4
  const timezone = require('@/utils/timezone');
7
5
  const { art } = require('@/utils/render');
8
6
  const path = require('path');
7
+ const { CookieJar } = require('tough-cookie');
8
+
9
+ const cookieJar = new CookieJar();
9
10
 
10
11
  const categories = {
11
12
  index: {
@@ -57,16 +58,13 @@ module.exports = async (ctx) => {
57
58
  const cat = categories[category];
58
59
  const baseUrl = 'https://www2.hkej.com';
59
60
 
60
- dayjs.extend(utc);
61
- const yesterday = dayjs().utcOffset(8).subtract(1, 'day').format('YYYY-MM-DD');
62
- const today = dayjs().utcOffset(8).format('YYYY-MM-DD');
63
-
64
61
  const response = await got({
65
62
  method: 'get',
66
63
  url: baseUrl + cat.link,
67
64
  headers: {
68
65
  Referer: baseUrl,
69
66
  },
67
+ cookieJar,
70
68
  });
71
69
 
72
70
  const $ = cheerio.load(response.data);
@@ -102,6 +100,7 @@ module.exports = async (ctx) => {
102
100
  headers: {
103
101
  Referer: cat.link,
104
102
  },
103
+ cookieJar,
105
104
  });
106
105
  const content = cheerio.load(article.data);
107
106
 
@@ -123,19 +122,13 @@ module.exports = async (ctx) => {
123
122
  })
124
123
  .get();
125
124
 
126
- const pubDate = content('p.info span.date')
127
- .text()
128
- .trim()
129
- .replace('日', '')
130
- .replace('今', today)
131
- .replace('昨', yesterday)
132
- .replace(/[年月]/g, '-');
125
+ const pubDate = content('p.info span.date').text().trim();
133
126
 
134
127
  item.category = content('p.info span.cate a')
135
128
  .toArray()
136
129
  .map((e) => content(e).text().trim());
137
130
  item.description = renderDesc(articleImg, content('div#article-content').html());
138
- item.pubDate = timezone(parseDate(pubDate), +8);
131
+ item.pubDate = timezone(/(今|昨)/.test(pubDate) ? parseRelativeDate(pubDate) : parseDate(pubDate, 'YYYY M D'), +8);
139
132
 
140
133
  return item;
141
134
  })
@@ -156,5 +149,6 @@ module.exports = async (ctx) => {
156
149
  description: `信報網站(www.hkej.com)即時新聞${cat.name},提供${cat.description}。`,
157
150
  item: items,
158
151
  language: 'zh-hk',
152
+ cookieJar,
159
153
  };
160
154
  };
@@ -195,4 +195,12 @@ module.exports = async (ctx) => {
195
195
  language: 'zh-hk',
196
196
  item: items,
197
197
  };
198
+
199
+ ctx.state.json = {
200
+ title: feedTitle,
201
+ link: `https://www.hkepc.com/${category}`,
202
+ description: '電腦領域 HKEPC Hardware - 全港 No.1 PC網站',
203
+ language: 'zh-hk',
204
+ item: items,
205
+ };
198
206
  };
@@ -105,9 +105,17 @@ module.exports = async (ctx) => {
105
105
  );
106
106
 
107
107
  ctx.state.data = {
108
- title: String($('head meta[name=title]').attr('content').trim()),
108
+ title: $('head meta[name=title]').attr('content').trim(),
109
109
  link: baseUrl + '/' + category,
110
- description: String($('head meta[name=description]').attr('content').trim()),
110
+ description: $('head meta[name=description]').attr('content').trim(),
111
+ item: items,
112
+ language: 'zh-hk',
113
+ };
114
+
115
+ ctx.state.json = {
116
+ title: $('head meta[name=title]').attr('content').trim(),
117
+ link: baseUrl + '/' + category,
118
+ description: $('head meta[name=description]').attr('content').trim(),
111
119
  item: items,
112
120
  language: 'zh-hk',
113
121
  };
@@ -0,0 +1,29 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+
4
+ const BLOG_URL = 'https://blog.huangz.me/';
5
+
6
+ module.exports = async (ctx) => {
7
+ const resp = await got({
8
+ method: 'get',
9
+ url: BLOG_URL,
10
+ });
11
+ const $ = cheerio.load(resp.body);
12
+ const list = $('.toctree-l2');
13
+
14
+ const items = await Promise.all(
15
+ list.map((index, item) => {
16
+ const link = `${BLOG_URL}${$(item).find('a').attr('href')}`;
17
+
18
+ return ctx.cache.tryGet(link, () => ({
19
+ title: $(item).find('a').text(),
20
+ link,
21
+ }));
22
+ })
23
+ );
24
+ ctx.state.data = {
25
+ title: 'huangz/blog',
26
+ link: 'https://blog.huangz.me',
27
+ item: items,
28
+ };
29
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ '/': ['stormbuf'],
3
+ };
@@ -0,0 +1,13 @@
1
+ module.exports = {
2
+ 'huangz.me': {
3
+ _name: '黄健宏博客',
4
+ blog: [
5
+ {
6
+ title: '文章',
7
+ docs: 'https://docs.rsshub.app/blog.html#huang-jian-hong-bo-ke',
8
+ source: ['/*.html'],
9
+ target: '/huangz',
10
+ },
11
+ ],
12
+ },
13
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = function (router) {
2
+ router.get('/', require('./index'));
3
+ };
@@ -0,0 +1,65 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+ const { parseDate } = require('@/utils/parse-date');
4
+ const timezone = require('@/utils/timezone');
5
+
6
+ function getKeysRecursive(dic, key, attr, array) {
7
+ Object.values(dic).forEach((v) => {
8
+ if (v[key] !== undefined) {
9
+ getKeysRecursive(v[key], key, attr, array);
10
+ } else {
11
+ array.push(v[attr]);
12
+ }
13
+ });
14
+ return array;
15
+ }
16
+
17
+ module.exports = async (ctx) => {
18
+ const category = ctx.params.category ?? 'china';
19
+ const host = 'https://' + category + '.huanqiu.com';
20
+
21
+ const resp = await got({
22
+ method: 'get',
23
+ url: host.concat('/api/channel_pc'),
24
+ }).json();
25
+ const name = getKeysRecursive(resp.children, 'children', 'domain_name', [])[0];
26
+
27
+ const nodes = getKeysRecursive(resp.children, 'children', 'node', [])
28
+ .map((x) => '"' + x + '"')
29
+ .join();
30
+ const req = await got({
31
+ method: 'get',
32
+ url: host.concat('/api/list?node=') + nodes.concat(`&offset=0&limit=${ctx.query.limit ?? 20}`),
33
+ }).json();
34
+
35
+ let items = req.list
36
+ .filter((item) => item.aid)
37
+ .map((item) => ({
38
+ link: host.concat('/article/' + item.aid),
39
+ title: item.title,
40
+ }));
41
+
42
+ items = await Promise.all(
43
+ items.map((item) =>
44
+ ctx.cache.tryGet(item.link, async () => {
45
+ const detailResponse = await got({
46
+ method: 'get',
47
+ url: item.link,
48
+ });
49
+ const content = cheerio.load(detailResponse.data);
50
+ item.description = content('article').html();
51
+ item.author = content('span', '.source').text();
52
+ item.pubDate = timezone(parseDate(content('p.time').text()), +8);
53
+ return item;
54
+ })
55
+ )
56
+ );
57
+
58
+ ctx.state.data = {
59
+ title: `${name} - 环球网`,
60
+ link: host,
61
+ description: '环球网',
62
+ language: 'zh-cn',
63
+ item: items,
64
+ };
65
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ '/news/:category?': ['yuxinliu-alex'],
3
+ };
@@ -0,0 +1,13 @@
1
+ module.exports = {
2
+ 'huanqiu.com': {
3
+ _name: '环球网',
4
+ '.': [
5
+ {
6
+ title: '分类',
7
+ docs: 'https://docs.rsshub.app/traditional-media.html#huan-qiu',
8
+ source: '/',
9
+ target: '/news/huanqiu/:category?',
10
+ },
11
+ ],
12
+ },
13
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = function (router) {
2
+ router.get('/news/:category?', require('./index'));
3
+ };
@@ -0,0 +1,19 @@
1
+ const buildData = require('@/utils/common-config');
2
+
3
+ module.exports = async (ctx) => {
4
+ const link = 'https://blog.miris.design/';
5
+
6
+ ctx.state.data = await buildData({
7
+ link,
8
+ url: link,
9
+ title: 'Miris Whisper',
10
+ author: 'Miris',
11
+ description: 'Esoteric technical and sometimes personal stuff...',
12
+ item: {
13
+ item: 'ul > li',
14
+ title: `$('li > a').contents().filter(function () { return this.type === 'text' }).text()`,
15
+ link: `$('li > a').attr('href')`,
16
+ pubDate: `parseDate($('li > a > .date').text().slice(1, 11))`,
17
+ },
18
+ });
19
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ '/blog': ['chazeon'],
3
+ };
@@ -0,0 +1,11 @@
1
+ module.exports = {
2
+ 'miris.design': {
3
+ _name: 'Miris',
4
+ blog: [
5
+ {
6
+ title: 'Miris Whispers',
7
+ docs: 'https://docs.rsshub.app/en/blog.html#miris-design',
8
+ },
9
+ ],
10
+ },
11
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = function (router) {
2
+ router.get('/blog', require('./blog'));
3
+ };
@@ -36,7 +36,7 @@ module.exports = async (ctx) => {
36
36
 
37
37
  if (item.status !== 404) {
38
38
  const content = cheerio.load(detailResponse.data);
39
- const date = content('.header-time.left').text();
39
+ const date = content('.header-time.left').text() || content('.h-time').text() || content('.info').text();
40
40
  const author =
41
41
  content('.editor').text() ??
42
42
  content('.p-jc')
@@ -50,7 +50,7 @@ module.exports = async (ctx) => {
50
50
  content('#articleEdit').remove();
51
51
 
52
52
  item.description = content('#detail').html();
53
- item.pubDate = timezone(parseDate(date, 'YYYYMM/DD HH:mm:ss'), +8);
53
+ item.pubDate = timezone(parseDate(date, date.includes('/') ? 'YYYYMM/DD HH:mm:ss' : 'YYYY-MM-DD HH:mm:ss'), +8);
54
54
  }
55
55
 
56
56
  delete item.status;
@@ -3,7 +3,7 @@ const { art } = require('@/utils/render');
3
3
  const path = require('path');
4
4
 
5
5
  module.exports = async (ctx) => {
6
- const name = ctx.params.name;
6
+ const name = ctx.request.url.split('package/')[1];
7
7
  const packageDownloadLastMonthAPI = `https://api.npmjs.org/downloads/point/last-month/${name}`; // 按月统计
8
8
  const packageDownloadLastWeekAPI = `https://api.npmjs.org/downloads/point/last-week/${name}`; // 按周统计
9
9
  const packageDownloadLastDayAPI = `https://api.npmjs.org/downloads/point/last-day/${name}`; // 按天统计
@@ -1,3 +1,3 @@
1
1
  module.exports = function (router) {
2
- router.get('/package/:name', require('./package'));
2
+ router.get(/package[\w\d/-]+/, require('./package'));
3
3
  };