rsshub 1.0.0-master.f7cdf8b → 1.0.0-master.f7f8b7a

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 (273) hide show
  1. package/README.md +3 -3
  2. package/lib/config.js +21 -8
  3. package/lib/middleware/cache/index.js +4 -3
  4. package/lib/middleware/cache/redis.js +3 -3
  5. package/lib/middleware/onerror.js +8 -0
  6. package/lib/middleware/template.js +79 -85
  7. package/lib/router.js +7 -7
  8. package/lib/routes/index.js +6 -13
  9. package/lib/utils/common-utils.js +2 -6
  10. package/lib/utils/render.js +2 -0
  11. package/lib/v2/1point3acres/maintainer.js +2 -2
  12. package/lib/v2/95mm/utils.js +3 -2
  13. package/lib/v2/aliyun/notice.js +1 -1
  14. package/lib/v2/amazon/maintainer.js +1 -1
  15. package/lib/v2/apnews/topics.js +1 -1
  16. package/lib/v2/arcteryx/maintainer.js +3 -3
  17. package/lib/v2/bangumi/maintainer.js +1 -0
  18. package/lib/v2/bangumi/radar.js +6 -0
  19. package/lib/v2/bangumi/router.js +1 -0
  20. package/lib/v2/bangumi/tv/user/wish.js +38 -0
  21. package/lib/v2/bellroy/maintainer.js +1 -1
  22. package/lib/v2/bilibili/cache.js +10 -7
  23. package/lib/v2/bilibili/maintainer.js +1 -0
  24. package/lib/v2/bilibili/platform.js +43 -0
  25. package/lib/v2/bilibili/radar.js +8 -0
  26. package/lib/v2/bilibili/router.js +1 -0
  27. package/lib/v2/bilibili/video.js +8 -1
  28. package/lib/v2/bossdesign/index.js +41 -0
  29. package/lib/v2/bossdesign/maintainer.js +3 -0
  30. package/lib/v2/bossdesign/radar.js +13 -0
  31. package/lib/v2/bossdesign/router.js +3 -0
  32. package/lib/v2/brave/latest.js +4 -2
  33. package/lib/v2/buaa/maintainer.js +4 -0
  34. package/lib/v2/buaa/news/index.js +46 -0
  35. package/lib/v2/buaa/radar.js +21 -0
  36. package/lib/v2/buaa/router.js +4 -0
  37. package/lib/v2/buaa/sme.js +59 -0
  38. package/lib/v2/cfachina/analygarden.js +60 -0
  39. package/lib/v2/cfachina/maintainer.js +3 -0
  40. package/lib/v2/cfachina/radar.js +13 -0
  41. package/lib/v2/cfachina/router.js +3 -0
  42. package/lib/v2/cna/maintainer.js +1 -0
  43. package/lib/v2/cna/radar.js +6 -0
  44. package/lib/v2/cna/router.js +1 -0
  45. package/lib/v2/cna/web/index.js +62 -0
  46. package/lib/v2/cste/radar.js +1 -1
  47. package/lib/v2/dahecube/radar.js +40 -4
  48. package/lib/v2/dongqiudi/utils.js +1 -1
  49. package/lib/v2/douban/maintainer.js +1 -0
  50. package/lib/v2/douban/other/discussion.js +58 -0
  51. package/lib/v2/douban/radar.js +8 -0
  52. package/lib/v2/douban/router.js +1 -0
  53. package/lib/v2/dut/defaults.js +4 -0
  54. package/lib/v2/dut/index.js +21 -9
  55. package/lib/v2/dut/maintainer.js +8 -7
  56. package/lib/v2/dut/radar.js +37 -29
  57. package/lib/v2/dut/shortcuts.js +5 -0
  58. package/lib/v2/egsea/flash.js +30 -0
  59. package/lib/v2/egsea/maintainer.js +3 -0
  60. package/lib/v2/egsea/radar.js +13 -0
  61. package/lib/v2/egsea/router.js +3 -0
  62. package/lib/v2/fisher-spb/news.js +1 -2
  63. package/lib/v2/fosshub/radar.js +1 -1
  64. package/lib/v2/fxiaoke/crm.js +63 -0
  65. package/lib/v2/fxiaoke/maintainer.js +3 -0
  66. package/lib/v2/fxiaoke/radar.js +37 -0
  67. package/lib/v2/fxiaoke/router.js +3 -0
  68. package/lib/v2/gdsrx/index.js +72 -0
  69. package/lib/v2/gdsrx/maintainer.js +3 -0
  70. package/lib/v2/gdsrx/radar.js +61 -0
  71. package/lib/v2/gdsrx/router.js +3 -0
  72. package/lib/v2/gogoanimehd/radar.js +1 -1
  73. package/lib/v2/gogoanimehd/recent-releases.js +1 -1
  74. package/lib/v2/google/alerts.js +33 -0
  75. package/lib/v2/google/maintainer.js +1 -0
  76. package/lib/v2/google/router.js +1 -0
  77. package/lib/v2/gov/maintainer.js +9 -2
  78. package/lib/v2/gov/moa/zdscxx.js +104 -0
  79. package/lib/v2/gov/mot/index.js +66 -0
  80. package/lib/v2/gov/nea/ghs.js +58 -0
  81. package/lib/v2/gov/nifdc/index.js +40 -33
  82. package/lib/v2/gov/radar.js +232 -4
  83. package/lib/v2/gov/router.js +10 -2
  84. package/lib/v2/gov/safe/business.js +8 -0
  85. package/lib/v2/gov/safe/complaint.js +8 -0
  86. package/lib/v2/gov/safe/templates/message.art +25 -0
  87. package/lib/v2/gov/safe/util.js +87 -0
  88. package/lib/v2/gov/zhengce/index.js +99 -0
  89. package/lib/v2/greasyfork/maintainer.js +1 -0
  90. package/lib/v2/greasyfork/router.js +1 -0
  91. package/lib/v2/greasyfork/scripts.js +25 -20
  92. package/lib/{routes/universities → v2}/harvard/health/blog.js +8 -7
  93. package/lib/v2/harvard/maintainer.js +3 -0
  94. package/lib/v2/harvard/radar.js +13 -0
  95. package/lib/v2/harvard/router.js +3 -0
  96. package/lib/v2/huxiu/briefColumn.js +13 -25
  97. package/lib/v2/huxiu/channel.js +28 -0
  98. package/lib/v2/huxiu/club.js +30 -0
  99. package/lib/v2/huxiu/collection.js +14 -26
  100. package/lib/v2/huxiu/maintainer.js +8 -5
  101. package/lib/v2/huxiu/member.js +27 -0
  102. package/lib/v2/huxiu/moment.js +11 -25
  103. package/lib/v2/huxiu/radar.js +24 -16
  104. package/lib/v2/huxiu/router.js +7 -4
  105. package/lib/v2/huxiu/search.js +16 -21
  106. package/lib/v2/huxiu/tag.js +13 -25
  107. package/lib/v2/huxiu/templates/description.art +46 -0
  108. package/lib/v2/huxiu/util.js +460 -0
  109. package/lib/v2/ifi-audio/maintainer.js +1 -1
  110. package/lib/v2/imiker/jinghua.js +87 -0
  111. package/lib/v2/imiker/maintainer.js +3 -0
  112. package/lib/v2/imiker/radar.js +13 -0
  113. package/lib/v2/imiker/router.js +3 -0
  114. package/lib/v2/imiker/templates/description.art +32 -0
  115. package/lib/v2/inoreader/maintainer.js +1 -1
  116. package/lib/v2/instagram/common-utils.js +7 -4
  117. package/lib/v2/instagram/templates/images.art +9 -2
  118. package/lib/v2/instagram/templates/video.art +4 -1
  119. package/lib/v2/instagram/web-api/index.js +30 -9
  120. package/lib/v2/instagram/web-api/utils.js +149 -25
  121. package/lib/v2/kemono/index.js +26 -2
  122. package/lib/v2/kemono/radar.js +1 -1
  123. package/lib/v2/kepu/live.js +89 -0
  124. package/lib/v2/kepu/maintainer.js +3 -0
  125. package/lib/v2/kepu/radar.js +13 -0
  126. package/lib/v2/kepu/router.js +3 -0
  127. package/lib/v2/kepu/templates/description.art +33 -0
  128. package/lib/v2/leetcode/maintainer.js +1 -1
  129. package/lib/v2/lightnovel/lightNovel.js +62 -0
  130. package/lib/v2/lightnovel/maintainer.js +3 -0
  131. package/lib/v2/lightnovel/radar.js +13 -0
  132. package/lib/v2/lightnovel/router.js +3 -0
  133. package/lib/v2/line/radar.js +1 -1
  134. package/lib/v2/liquipedia/cs_matches.js +52 -0
  135. package/lib/v2/liquipedia/dota2_matches.js +47 -0
  136. package/lib/v2/liquipedia/maintainer.js +4 -0
  137. package/lib/v2/liquipedia/radar.js +19 -0
  138. package/lib/v2/liquipedia/router.js +4 -0
  139. package/lib/v2/magazinelib/maintainer.js +1 -1
  140. package/lib/v2/mihoyo/radar.js +1 -1
  141. package/lib/v2/missav/maintainer.js +3 -0
  142. package/lib/v2/missav/new.js +36 -0
  143. package/lib/v2/missav/radar.js +13 -0
  144. package/lib/v2/missav/router.js +3 -0
  145. package/lib/v2/missav/templates/preview.art +3 -0
  146. package/lib/v2/modb/maintainer.js +3 -0
  147. package/lib/v2/modb/radar.js +13 -0
  148. package/lib/v2/modb/router.js +3 -0
  149. package/lib/v2/modb/topic.js +59 -0
  150. package/lib/v2/nature/cover.js +32 -42
  151. package/lib/v2/nature/highlight.js +2 -2
  152. package/lib/v2/nature/news-and-comment.js +2 -2
  153. package/lib/v2/nature/news.js +2 -2
  154. package/lib/v2/nature/research.js +2 -2
  155. package/lib/v2/nature/siteindex.js +5 -5
  156. package/lib/v2/nature/utils.js +124 -5
  157. package/lib/v2/ncu/jwc.js +33 -0
  158. package/lib/v2/ncu/maintainer.js +3 -0
  159. package/lib/v2/ncu/radar.js +13 -0
  160. package/lib/v2/ncu/router.js +3 -0
  161. package/lib/v2/nmtv/radar.js +1 -1
  162. package/lib/v2/oo-software/radar.js +1 -1
  163. package/lib/v2/patagonia/maintainer.js +1 -1
  164. package/lib/v2/phoronix/index.js +177 -48
  165. package/lib/v2/phoronix/maintainer.js +1 -1
  166. package/lib/v2/phoronix/radar.js +3 -3
  167. package/lib/v2/phoronix/router.js +1 -1
  168. package/lib/v2/picnob/maintainer.js +1 -1
  169. package/lib/v2/picnob/templates/desc.art +3 -3
  170. package/lib/v2/picnob/user.js +74 -37
  171. package/lib/v2/picnob/utils.js +24 -0
  172. package/lib/v2/qbitai/category.js +27 -0
  173. package/lib/v2/qbitai/maintainer.js +4 -0
  174. package/lib/v2/qbitai/radar.js +19 -0
  175. package/lib/v2/qbitai/router.js +4 -0
  176. package/lib/v2/qbitai/tag.js +27 -0
  177. package/lib/v2/questmobile/maintainer.js +3 -0
  178. package/lib/v2/questmobile/radar.js +18 -0
  179. package/lib/v2/questmobile/report.js +127 -0
  180. package/lib/v2/questmobile/router.js +3 -0
  181. package/lib/v2/questmobile/templates/description.art +17 -0
  182. package/lib/v2/readhub/daily.js +43 -0
  183. package/lib/v2/readhub/index.js +19 -72
  184. package/lib/v2/readhub/maintainer.js +1 -0
  185. package/lib/v2/readhub/radar.js +6 -0
  186. package/lib/v2/readhub/router.js +1 -0
  187. package/lib/v2/readhub/util.js +69 -0
  188. package/lib/v2/routledge/book-series.js +78 -0
  189. package/lib/v2/routledge/maintainer.js +3 -0
  190. package/lib/v2/routledge/radar.js +13 -0
  191. package/lib/v2/routledge/router.js +3 -0
  192. package/lib/v2/routledge/templates/description.art +7 -0
  193. package/lib/v2/showstart/artist.js +15 -0
  194. package/lib/v2/showstart/brand.js +15 -0
  195. package/lib/v2/showstart/const.js +4 -0
  196. package/lib/v2/showstart/event.js +18 -0
  197. package/lib/v2/showstart/maintainer.js +6 -0
  198. package/lib/v2/showstart/radar.js +40 -0
  199. package/lib/v2/showstart/router.js +6 -0
  200. package/lib/v2/showstart/search.js +51 -0
  201. package/lib/v2/showstart/service.js +166 -0
  202. package/lib/v2/showstart/utils.js +92 -0
  203. package/lib/v2/snowpeak/maintainer.js +1 -1
  204. package/lib/v2/sony/maintainer.js +1 -1
  205. package/lib/v2/sse/disclosure.js +4 -3
  206. package/lib/v2/sspu/jwc.js +44 -0
  207. package/lib/v2/sspu/maintainer.js +3 -0
  208. package/lib/v2/sspu/radar.js +13 -0
  209. package/lib/v2/sspu/router.js +3 -0
  210. package/lib/v2/techcrunch/maintainer.js +1 -1
  211. package/lib/v2/theatlantic/maintainer.js +1 -1
  212. package/lib/v2/thepaper/radar.js +2 -2
  213. package/lib/v2/threads/index.js +20 -150
  214. package/lib/v2/threads/utils.js +147 -0
  215. package/lib/v2/twitter/keyword.js +1 -3
  216. package/lib/v2/twitter/media.js +1 -5
  217. package/lib/v2/twitter/user.js +1 -3
  218. package/lib/v2/twitter/utils.js +5 -3
  219. package/lib/v2/twitter/web-api/constants.js +80 -68
  220. package/lib/v2/twitter/web-api/twitter-api.js +96 -103
  221. package/lib/v2/uniqlo/maintainer.js +3 -0
  222. package/lib/v2/uniqlo/new.js +62 -0
  223. package/lib/v2/uniqlo/radar.js +12 -0
  224. package/lib/v2/uniqlo/router.js +3 -0
  225. package/lib/v2/wechat/maintainer.js +1 -1
  226. package/lib/v2/weibo/maintainer.js +1 -1
  227. package/lib/v2/weibo/radar.js +1 -1
  228. package/lib/v2/weibo/router.js +1 -1
  229. package/lib/v2/weibo/search/hot.js +118 -7
  230. package/lib/v2/weibo/search/template/digest.art +17 -0
  231. package/lib/v2/xiaohongshu/util.js +17 -7
  232. package/lib/v2/xmnn/docs.js +0 -0
  233. package/lib/v2/xmnn/maintainer.js +1 -0
  234. package/lib/v2/xmnn/news.js +65 -0
  235. package/lib/v2/xmnn/radar.js +67 -1
  236. package/lib/v2/xmnn/router.js +1 -0
  237. package/lib/v2/xsijishe/maintainer.js +1 -0
  238. package/lib/v2/xsijishe/radar.js +12 -0
  239. package/lib/v2/xsijishe/rank.js +60 -0
  240. package/lib/v2/xsijishe/router.js +1 -0
  241. package/lib/v2/yahoo/maintainer.js +2 -0
  242. package/lib/v2/yahoo/news/tw/index.js +24 -0
  243. package/lib/v2/yahoo/news/tw/provider-helper.js +22 -0
  244. package/lib/v2/yahoo/news/tw/provider.js +24 -0
  245. package/lib/v2/yahoo/news/tw/utils.js +129 -0
  246. package/lib/v2/yahoo/radar.js +29 -1
  247. package/lib/v2/yahoo/router.js +4 -1
  248. package/lib/v2/yahoo/templates/youtube.art +1 -0
  249. package/lib/v2/yuque/book.js +6 -1
  250. package/lib/v2/yuque/utils.js +16 -0
  251. package/lib/v2/zagg/maintainer.js +1 -1
  252. package/lib/views/error.art +1 -1
  253. package/lib/views/rss3-ums.js +62 -0
  254. package/lib/views/welcome.art +1 -1
  255. package/package.json +45 -39
  256. package/lib/routes/egsea/flash.js +0 -40
  257. package/lib/routes/gov/moa/sjzxfb.js +0 -20
  258. package/lib/routes/liquipedia/dota2_matches.js +0 -50
  259. package/lib/routes/questmobile/report.js +0 -121
  260. package/lib/routes/uniqlo/stylingbook.js +0 -24
  261. package/lib/routes/universities/buaa/news/index.js +0 -66
  262. package/lib/routes/universities/buaa/utils.js +0 -57
  263. package/lib/v2/gov/zhengce/zuixin.js +0 -39
  264. package/lib/v2/huxiu/article.js +0 -33
  265. package/lib/v2/huxiu/author.js +0 -36
  266. package/lib/v2/huxiu/templates/brief.art +0 -22
  267. package/lib/v2/huxiu/templates/img.art +0 -3
  268. package/lib/v2/huxiu/templates/moment.art +0 -16
  269. package/lib/v2/huxiu/templates/video.art +0 -7
  270. package/lib/v2/huxiu/utils.js +0 -154
  271. package/lib/v2/twitter/web-api/twitter-got.js +0 -113
  272. /package/lib/{routes → v2}/gov/moa/moa.js +0 -0
  273. /package/lib/v2/yahoo/news/{index.js → us/index.js} +0 -0
@@ -0,0 +1,52 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+
4
+ module.exports = async (ctx) => {
5
+ const team = ctx.params.team;
6
+
7
+ const rootUrl = 'https://liquipedia.net';
8
+ const currentUrl = `${rootUrl}/counterstrike/${team}/Matches`;
9
+
10
+ const response = await got({
11
+ method: 'get',
12
+ url: currentUrl,
13
+ });
14
+
15
+ const $ = cheerio.load(response.data);
16
+ const list = $('.recent-matches-bg-lose, .recent-matches-bg-win');
17
+
18
+ const matches = list
19
+ .map((_, item) => {
20
+ item = $(item);
21
+
22
+ const getRes = () => {
23
+ if (item.attr('class') === 'recent-matches-bg-lose') {
24
+ return 'LOSS';
25
+ } else {
26
+ return 'WIN';
27
+ }
28
+ };
29
+ const result = getRes();
30
+
31
+ const infoList = item.find('td');
32
+
33
+ const time = infoList.eq(0).text() + ' ' + infoList.eq(1).text();
34
+ const tournament = infoList.eq(6).text();
35
+ const score = infoList.eq(7).text();
36
+ const opponent = infoList.eq(8).text();
37
+
38
+ return {
39
+ title: `[${result}] ${team} ${score} ${opponent} on ${tournament}`,
40
+ description: `${time}, ${team} ${score} ${opponent} on ${tournament}`,
41
+ link: currentUrl,
42
+ guid: currentUrl + time,
43
+ };
44
+ })
45
+ .get();
46
+
47
+ ctx.state.data = {
48
+ title: `[Counter-Strike] ${team} Match Results From Liquipedia`,
49
+ link: currentUrl,
50
+ item: matches,
51
+ };
52
+ };
@@ -0,0 +1,47 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+ const { parseDate } = require('@/utils/parse-date');
4
+
5
+ module.exports = async (ctx) => {
6
+ const team = ctx.params.id;
7
+ const url = `https://liquipedia.net/dota2/${team}`;
8
+ const response = await got({
9
+ method: 'get',
10
+ url,
11
+ });
12
+
13
+ const data = response.data;
14
+
15
+ const $ = cheerio.load(data);
16
+ const list = $('div.recent-matches > table > tbody > tr[style]');
17
+
18
+ ctx.state.data = {
19
+ title: `Liquipedia Dota2 ${team} Matches`,
20
+ link: url,
21
+ item: list?.toArray().map((item) => {
22
+ item = $(item);
23
+ let message = '';
24
+ if (item.attr('style') === 'background:rgb(240, 255, 240)') {
25
+ message = '胜';
26
+ } else if (item.attr('style') === 'background:rgb(249, 240, 242)') {
27
+ message = '败';
28
+ } else {
29
+ message = '平';
30
+ }
31
+ const date = item.find('td:nth-child(1)').text();
32
+ const time = item.find('td:nth-child(2)').text();
33
+ const tournament = item.find('td:nth-child(6) > a').text();
34
+ const dateTime = parseDate(date + ' ' + time);
35
+ const score = item.find('td:nth-child(7)').text();
36
+ const vs_team = item.find('td:nth-child(8) > span > span.team-template-text > a').text();
37
+
38
+ return {
39
+ title: `[${message}] ${score} ${vs_team}`,
40
+ description: `At ${tournament}, ${team} ${score} ${vs_team}`,
41
+ pubDate: dateTime,
42
+ link: url,
43
+ guid: url + dateTime,
44
+ };
45
+ }),
46
+ };
47
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = {
2
+ '/counterstrike/matches/:team': ['CookiePieWw'],
3
+ '/dota2/matches/:id': ['wzekin'],
4
+ };
@@ -0,0 +1,19 @@
1
+ module.exports = {
2
+ 'liquipedia.net': {
3
+ _name: 'Liquipedia',
4
+ '.': [
5
+ {
6
+ title: 'Counter Strike Match Results',
7
+ docs: 'https://docs.rsshub.app/routes/game#liquipedia',
8
+ source: ['/counterstrike/:id/Matches', '/dota2/:id'],
9
+ target: '/liquipedia/counterstrike/matches/:id',
10
+ },
11
+ {
12
+ title: 'Dota2 战队最近比赛结果',
13
+ docs: 'https://docs.rsshub.app/routes/game#liquipedia',
14
+ source: ['/dota2/:id'],
15
+ target: '/liquipedia/dota2/matches/:id',
16
+ },
17
+ ],
18
+ },
19
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = (router) => {
2
+ router.get('/counterstrike/matches/:team', require('./cs_matches.js'));
3
+ router.get('/dota2/matches/:id', require('./dota2_matches.js'));
4
+ };
@@ -1,3 +1,3 @@
1
1
  module.exports = {
2
- '/latest-magazine/:query?': ['NavePnow'],
2
+ '/latest-magazine/:query?': ['EthanWng97'],
3
3
  };
@@ -45,7 +45,7 @@ module.exports = {
45
45
  if (!gids) {
46
46
  return '';
47
47
  }
48
- const { type = '2' } = new URL(url).searchParams;
48
+ const type = new URL(url).searchParams.get('type') || '1';
49
49
  const page_size = '20';
50
50
  const last_id = '';
51
51
  return `/mihoyo/bbs/official/${gids}/${type}/${page_size}/${last_id}`;
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ '/new': ['TonyRL'],
3
+ };
@@ -0,0 +1,36 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+ const { art } = require('@/utils/render');
4
+ const { join } = require('path');
5
+
6
+ module.exports = async (ctx) => {
7
+ const baseUrl = 'https://missav.com';
8
+ const { data: response } = await got(`${baseUrl}/dm397/new`);
9
+ const $ = cheerio.load(response);
10
+
11
+ const items = $('.grid .group')
12
+ .toArray()
13
+ .map((item) => {
14
+ item = $(item);
15
+ const title = item.find('.text-secondary');
16
+ const poster = new URL(item.find('img').data('src'));
17
+ poster.searchParams.set('class', 'normal');
18
+ const video = item.find('video').data('src');
19
+ return {
20
+ title: title.text().trim(),
21
+ link: title.attr('href'),
22
+ description: art(join(__dirname, 'templates/preview.art'), {
23
+ poster: poster.href,
24
+ video,
25
+ type: video.split('.').pop(),
26
+ }),
27
+ };
28
+ });
29
+
30
+ ctx.state.data = {
31
+ title: $('head title').text(),
32
+ description: $('head meta[name="description"]').attr('content'),
33
+ link: baseUrl,
34
+ item: items,
35
+ };
36
+ };
@@ -0,0 +1,13 @@
1
+ module.exports = {
2
+ 'missav.com': {
3
+ _name: 'MissAV.com',
4
+ '.': [
5
+ {
6
+ title: '最近更新',
7
+ docs: 'https://docs.rsshub.app/multimedia#missav-com',
8
+ source: ['/dm397/new', '/new', '/'],
9
+ target: '/missav/new',
10
+ },
11
+ ],
12
+ },
13
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = (router) => {
2
+ router.get('/new', require('./new'));
3
+ };
@@ -0,0 +1,3 @@
1
+ <video controls preload="none" poster="{{ poster }}">
2
+ <source src="{{ video }}" type="{{ type }}">
3
+ </video>
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ '/topic/:id': ['yueneiqi'],
3
+ };
@@ -0,0 +1,13 @@
1
+ module.exports = {
2
+ 'modb.pro': {
3
+ _name: '墨天轮',
4
+ '.': [
5
+ {
6
+ title: '合辑',
7
+ docs: 'https://docs.rsshub.app/routes/programming#mo-tian-lun',
8
+ source: ['/', '/topic/:id'],
9
+ target: (params) => `/modb/topic/${params.id}`,
10
+ },
11
+ ],
12
+ },
13
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = (router) => {
2
+ router.get('/topic/:id', require('./topic'));
3
+ };
@@ -0,0 +1,59 @@
1
+ const cheerio = require('cheerio');
2
+ const got = require('@/utils/got');
3
+ const logger = require('@/utils/logger');
4
+ const timezone = require('@/utils/timezone');
5
+ const { parseDate } = require('@/utils/parse-date');
6
+
7
+ module.exports = async (ctx) => {
8
+ const baseUrl = 'https://www.modb.pro';
9
+ const topicId = ctx.params.id;
10
+ const response = await got({
11
+ url: `${baseUrl}/api/columns/getKnowledge`,
12
+ searchParams: {
13
+ pageNum: 1,
14
+ pageSize: 20,
15
+ columnId: topicId,
16
+ },
17
+ }).json();
18
+ const list = response.list.map((item) => {
19
+ let doc = {};
20
+ let baseLink = {};
21
+ switch (item.type) {
22
+ case 0:
23
+ doc = item.knowledge;
24
+ baseLink = `${baseUrl}/db`;
25
+ break;
26
+ case 1:
27
+ doc = item.dbDoc;
28
+ baseLink = `${baseUrl}/doc`;
29
+ break;
30
+ default:
31
+ logger.error(`unknown type ${item.type}`);
32
+ }
33
+
34
+ return {
35
+ title: doc.title,
36
+ link: `${baseLink}/${item.rid}`,
37
+ pubDate: timezone(parseDate(item.createdTime), +8),
38
+ author: doc.createdByName,
39
+ category: doc.tags,
40
+ };
41
+ });
42
+
43
+ const items = await Promise.all(
44
+ list.map((item) =>
45
+ ctx.cache.tryGet(item.link, async () => {
46
+ const { data: response } = await got(item.link);
47
+ const $ = cheerio.load(response);
48
+ item.description = $('div.editor-content-styl.article-style').first().html();
49
+ return item;
50
+ })
51
+ )
52
+ );
53
+
54
+ ctx.state.data = {
55
+ title: '墨天轮合辑',
56
+ link: `${baseUrl}/topic/${topicId}`,
57
+ item: items,
58
+ };
59
+ };
@@ -18,56 +18,46 @@ const got = require('@/utils/got');
18
18
  const cheerio = require('cheerio');
19
19
  const { parseDate } = require('@/utils/parse-date');
20
20
  const { baseUrl, journalMap } = require('./utils');
21
+ const { CookieJar } = require('tough-cookie');
21
22
 
22
23
  module.exports = async (ctx) => {
23
- const journals = journalMap.items;
24
+ const cookieJar = new CookieJar();
25
+
26
+ await got('https://www.nature.com', { cookieJar });
27
+
28
+ const journals = journalMap.items
29
+ .filter((j) => j.id)
30
+ .map((j) => ({
31
+ ...j,
32
+ link: `${baseUrl}/${j.title}/current-issue`,
33
+ }));
34
+
24
35
  const out = await Promise.all(
25
- journals
26
- .filter((j) => j.id)
27
- .map(async (journal) => {
28
- // get the lastest volumn and issue id
29
- const pageURL = `${baseUrl}/${journal.title}/current-issue`;
30
- const cookieData = await got
31
- .extend({
32
- prefixUrl: 'https://idp.nature.com/authorize',
33
- followRedirect: false,
34
- })
35
- .get(`?response_type=cookie&client_id=grover&redirect_uri=${encodeURI(pageURL)}`)
36
- .then((response) => response.headers['set-cookie'].join(' '));
37
- const issueURL = await got
38
- .extend({
39
- prefixUrl: pageURL,
40
- headers: {
41
- cookie: cookieData,
42
- },
43
- followRedirect: false,
44
- })
45
- .get('')
46
- .then((response) => response.headers.location);
47
- const capturingRegex = /volumes\/(?<volumes>\d+)\/issues\/(?<issues>\d+)/;
48
- const { volumes, issues } = issueURL.match(capturingRegex).groups;
36
+ journals.map((journal) =>
37
+ ctx.cache.tryGet(journal.link, async () => {
38
+ const { id, name } = journal;
49
39
 
50
- const address = `${baseUrl}${issueURL}`;
51
- return ctx.cache.tryGet(address, async () => {
52
- const id = journal.id;
53
- const imageURL = `https://media.springernature.com/full/springer-static/cover-hires/journal/${id}/${volumes}/${issues}?as=webp`;
54
- const contents = `<div align="center"><img src="${imageURL}" alt="Volume ${volumes} Issue ${issues}"></div>`;
40
+ const response = await got(journal.link, { cookieJar });
55
41
 
56
- const response = await got(address);
57
- const $ = cheerio.load(response.data);
58
- const date = $('title').text().split(',')[1].trim();
59
- const issueDescription = $('div[data-test=issue-description]').html() ?? '';
42
+ const capturingRegex = /volumes\/(?<volume>\d+)\/issues\/(?<issue>\d+)/;
43
+ const { volume, issue } = response.url.match(capturingRegex).groups;
44
+ const imageUrl = `https://media.springernature.com/full/springer-static/cover-hires/journal/${id}/${volume}/${issue}?as=webp`;
45
+ const contents = `<div align="center"><img src="${imageUrl}" alt="Volume ${volume} Issue ${issue}"></div>`;
60
46
 
61
- const single = {
62
- title: `${journal.name} | Volume ${volumes} Issue ${issues}`,
63
- description: contents + issueDescription,
64
- link: address,
65
- pubDate: parseDate(date, 'MMMM YYYY'),
66
- };
67
- return single;
68
- });
47
+ const $ = cheerio.load(response.data);
48
+ const date = $('title').text().split(',')[1].trim();
49
+ const issueDescription = $('div[data-test=issue-description]').html() ?? '';
50
+
51
+ return {
52
+ title: `${name} | Volume ${volume} Issue ${issue}`,
53
+ description: contents + issueDescription,
54
+ link: response.url,
55
+ pubDate: parseDate(date, 'MMMM YYYY'),
56
+ };
69
57
  })
58
+ )
70
59
  );
60
+
71
61
  ctx.state.data = {
72
62
  title: 'Nature Covers Story',
73
63
  description: 'Find out the cover story of some Nature journals.',
@@ -1,12 +1,12 @@
1
1
  const cheerio = require('cheerio');
2
2
  const got = require('@/utils/got');
3
- const { baseUrl, getArticleList, getArticle } = require('./utils');
3
+ const { baseUrl, cookieJar, getArticleList, getArticle } = require('./utils');
4
4
 
5
5
  module.exports = async (ctx) => {
6
6
  const { journal = 'nature' } = ctx.params;
7
7
  const url = `${baseUrl}/${journal}/articles?type=research-highlight`;
8
8
 
9
- const res = await got(url);
9
+ const res = await got(url, { cookieJar });
10
10
  const $ = cheerio.load(res.data);
11
11
 
12
12
  let items = getArticleList($);
@@ -14,13 +14,13 @@
14
14
 
15
15
  const cheerio = require('cheerio');
16
16
  const got = require('@/utils/got');
17
- const { baseUrl, getArticleList, getArticle } = require('./utils');
17
+ const { baseUrl, cookieJar, getArticleList, getArticle } = require('./utils');
18
18
 
19
19
  module.exports = async (ctx) => {
20
20
  const journal = ctx.params.journal;
21
21
  const pageURL = `${baseUrl}/${journal}/news-and-comment`;
22
22
 
23
- const pageResponse = await got(pageURL);
23
+ const pageResponse = await got(pageURL, { cookieJar });
24
24
  const pageCapture = cheerio.load(pageResponse.data);
25
25
  const pageDescription = pageCapture('meta[name=description]').attr('content') || 'Nature, a nature research journal';
26
26
 
@@ -1,11 +1,11 @@
1
1
  const cheerio = require('cheerio');
2
2
  const got = require('@/utils/got');
3
3
  const { parseDate } = require('@/utils/parse-date');
4
- const { baseUrl, getArticle } = require('./utils');
4
+ const { baseUrl, cookieJar, getArticle } = require('./utils');
5
5
 
6
6
  module.exports = async (ctx) => {
7
7
  const url = `${baseUrl}/latest-news`;
8
- const res = await got(url);
8
+ const res = await got(url, { cookieJar });
9
9
  const $ = cheerio.load(res.data);
10
10
 
11
11
  let items = $('.c-article-item__content')
@@ -15,13 +15,13 @@
15
15
 
16
16
  const cheerio = require('cheerio');
17
17
  const got = require('@/utils/got');
18
- const { baseUrl, getArticleList, getDataLayer, getArticle } = require('./utils');
18
+ const { baseUrl, cookieJar, getArticleList, getDataLayer, getArticle } = require('./utils');
19
19
 
20
20
  module.exports = async (ctx) => {
21
21
  const journal = ctx.params.journal ?? 'nature';
22
22
  const pageURL = `${baseUrl}/${journal}/research-articles`;
23
23
 
24
- const pageResponse = await got(pageURL);
24
+ const pageResponse = await got(pageURL, { cookieJar });
25
25
  const pageCapture = cheerio.load(pageResponse.data);
26
26
 
27
27
  const pageTitle = getDataLayer(pageCapture).content.journal.title;
@@ -1,9 +1,9 @@
1
1
  const got = require('@/utils/got');
2
2
  const cheerio = require('cheerio');
3
- const { baseUrl } = require('./utils');
3
+ const { baseUrl, cookieJar } = require('./utils');
4
4
 
5
5
  module.exports = async (ctx) => {
6
- const response = await got(`${baseUrl}/siteindex`);
6
+ const response = await got(`${baseUrl}/siteindex`, { cookieJar });
7
7
  const $ = cheerio.load(response.data);
8
8
 
9
9
  let items = $('li[class^="grid mq640-grid-12"]')
@@ -11,7 +11,7 @@ module.exports = async (ctx) => {
11
11
  .map((item) => {
12
12
  item = $(item);
13
13
  return {
14
- title: item.find('a').attr('href').replace('/', ''),
14
+ title: item.find('a').attr('href').replaceAll('/', ''),
15
15
  name: item.find('a').text(),
16
16
  link: baseUrl + item.find('a').attr('href'),
17
17
  };
@@ -20,7 +20,7 @@ module.exports = async (ctx) => {
20
20
  items = await Promise.all(
21
21
  items.map((item) =>
22
22
  ctx.cache.tryGet(`nature:siteindex:${item.title}`, async () => {
23
- const response = await got(item.link);
23
+ const response = await got(item.link, { cookieJar });
24
24
  const $ = cheerio.load(response.data);
25
25
 
26
26
  delete item.link;
@@ -39,7 +39,7 @@ module.exports = async (ctx) => {
39
39
 
40
40
  ctx.state.data = {
41
41
  title: 'Nature siteindex',
42
- link: baseUrl + '/siteindex',
42
+ link: response.url,
43
43
  item: items,
44
44
  };
45
45
  ctx.state.json = {