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,3 @@
1
+ module.exports = {
2
+ '/news': ['TonyRL'],
3
+ };
@@ -0,0 +1,59 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+ const { parseDate } = require('@/utils/parse-date');
4
+ const config = require('@/config').value;
5
+
6
+ module.exports = async (ctx) => {
7
+ const baseUrl = 'https://www.qbittorrent.org';
8
+
9
+ const response = await ctx.cache.tryGet(
10
+ `${baseUrl}/news.php`,
11
+ async () =>
12
+ (
13
+ await got(`${baseUrl}/news.php`, {
14
+ headers: {
15
+ Referer: baseUrl,
16
+ },
17
+ })
18
+ ).data,
19
+ config.cache.routeExpire,
20
+ false
21
+ );
22
+
23
+ const $ = cheerio.load(response);
24
+
25
+ const item = $('.stretcher')
26
+ .find('h3')
27
+ .toArray()
28
+ .map((item) => {
29
+ item = $(item);
30
+ const pubDate = item
31
+ .text()
32
+ .split(' - ')[0]
33
+ .replace(/\w{3,6}day/, '');
34
+ const title = item.text().split(' - ')[1];
35
+ let description = '';
36
+ // nextUntil() does not work here
37
+ while (item.next().length && item.next().get(0).tagName !== 'h3') {
38
+ item = item.next();
39
+ description += item.html();
40
+ }
41
+ return {
42
+ title,
43
+ description,
44
+ pubDate: parseDate(pubDate, 'MMMM D YYYY'),
45
+ };
46
+ });
47
+
48
+ ctx.state.data = {
49
+ title: 'qBittorrent News',
50
+ link: `${baseUrl}/news.php`,
51
+ item,
52
+ };
53
+
54
+ ctx.state.json = {
55
+ title: 'qBittorrent News',
56
+ link: `${baseUrl}/news.php`,
57
+ item,
58
+ };
59
+ };
@@ -0,0 +1,13 @@
1
+ module.exports = {
2
+ 'qbittorrent.org': {
3
+ _name: 'qBittorrent',
4
+ '.': [
5
+ {
6
+ title: 'News',
7
+ docs: 'https://docs.rsshub.app/program-update.html#qbittorrent',
8
+ source: ['/news.php', '/'],
9
+ target: '/qbittorrent/news',
10
+ },
11
+ ],
12
+ },
13
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = (router) => {
2
+ router.get('/news', require('./news'));
3
+ };
@@ -32,6 +32,7 @@ module.exports = async (ctx) => {
32
32
  normal
33
33
  .map((index, item) => {
34
34
  item = $(item);
35
+ item.find('span').remove();
35
36
  const title = item.text();
36
37
  const link = item.attr('href') || 'https://docs.rsshub.app/';
37
38
  return {
@@ -1,14 +1,17 @@
1
1
  const got = require('@/utils/got');
2
2
  const cheerio = require('cheerio');
3
3
  const iconv = require('iconv-lite');
4
+ const timezone = require('@/utils/timezone');
5
+ const { parseDate } = require('@/utils/parse-date');
4
6
 
5
7
  module.exports = async (ctx) => {
6
- const type = ctx.params.type || 'recommend';
7
- const time = ctx.params.time || '5';
8
- const sort = ctx.params.sort || '1';
8
+ const type = ctx.params.type ?? 'recommend';
9
+ const time = ctx.params.time ?? '5';
10
+ const sort = ctx.params.sort ?? '1';
9
11
 
10
12
  const rootUrl = 'http://blog.sciencenet.cn';
11
13
  const currentUrl = `${rootUrl}/blog.php?mod=${type}&type=list&op=${time}&ord=${sort}`;
14
+
12
15
  const response = await got({
13
16
  method: 'get',
14
17
  url: currentUrl,
@@ -17,31 +20,33 @@ module.exports = async (ctx) => {
17
20
 
18
21
  const $ = cheerio.load(iconv.decode(response.data, 'gbk'));
19
22
 
20
- const list = $('tr td a[title]')
21
- .slice(0, 15)
22
- .map((_, item) => {
23
+ let items = $('tr td a[title]')
24
+ .slice(0, ctx.query.limit ? parseInt(ctx.query.limit) : 50)
25
+ .toArray()
26
+ .map((item) => {
23
27
  item = $(item);
28
+
24
29
  return {
25
30
  title: item.text(),
26
31
  link: `${rootUrl}/${item.attr('href')}`,
27
32
  pubDate: new Date(item.next().text()).toUTCString(),
28
33
  };
29
- })
30
- .get();
34
+ });
31
35
 
32
- const items = await Promise.all(
33
- list.map((item) =>
36
+ items = await Promise.all(
37
+ items.map((item) =>
34
38
  ctx.cache.tryGet(item.link, async () => {
35
39
  const detailResponse = await got({
36
40
  method: 'get',
37
41
  url: item.link,
38
42
  responseType: 'buffer',
39
43
  });
44
+
40
45
  const content = cheerio.load(iconv.decode(detailResponse.data, 'gbk'));
41
46
 
42
47
  item.author = content('.xs2').text();
43
48
  item.description = content('#blog_article').html();
44
- item.pubDate = new Date(content('.xg1').eq(5).text()).toUTCString();
49
+ item.pubDate = timezone(parseDate(content('.xg1').eq(5).text()), +8);
45
50
 
46
51
  return item;
47
52
  })
@@ -49,7 +54,7 @@ module.exports = async (ctx) => {
49
54
  );
50
55
 
51
56
  ctx.state.data = {
52
- title: $('title').text(),
57
+ title: '科学网 - 精选博文',
53
58
  link: currentUrl,
54
59
  item: items,
55
60
  };
@@ -0,0 +1,4 @@
1
+ module.exports = {
2
+ '/blog/:type?/:time?/:sort?': ['nczitzk'],
3
+ '/user/:id': ['nczitzk'],
4
+ };
@@ -0,0 +1,19 @@
1
+ module.exports = {
2
+ 'sciencenet.cn': {
3
+ _name: '科学网',
4
+ blog: [
5
+ {
6
+ title: '精选博客',
7
+ docs: 'https://docs.rsshub.app/new-media.html#ke-xue-wang-jing-xuan-bo-ke',
8
+ source: ['/blog.php', '/'],
9
+ target: (params, url) => `/sciencenet/blog/${new URL(url).searchParams.get('mod')}/${new URL(url).searchParams.get('op')}/${new URL(url).searchParams.get('ord')}`,
10
+ },
11
+ {
12
+ title: '用户博客',
13
+ docs: 'https://docs.rsshub.app/new-media.html#ke-xue-wang-jing-xuan-bo-ke',
14
+ source: ['/u/:id', '/'],
15
+ target: '/sciencenet/user/:id',
16
+ },
17
+ ],
18
+ },
19
+ };
@@ -0,0 +1,4 @@
1
+ module.exports = function (router) {
2
+ router.get('/blog/:type?/:time?/:sort?', require('./blog'));
3
+ router.get('/user/:id', require('./user'));
4
+ };
@@ -0,0 +1,65 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+ const iconv = require('iconv-lite');
4
+ const timezone = require('@/utils/timezone');
5
+ const { parseDate } = require('@/utils/parse-date');
6
+
7
+ module.exports = async (ctx) => {
8
+ const id = ctx.params.id;
9
+
10
+ const rootUrl = 'https://blog.sciencenet.cn';
11
+ const currentUrl = `${rootUrl}/u/${id}`;
12
+
13
+ let response = await got({
14
+ method: 'get',
15
+ url: currentUrl,
16
+ responseType: 'buffer',
17
+ });
18
+
19
+ let $ = cheerio.load(iconv.decode(response.data, 'gbk'));
20
+
21
+ response = await got({
22
+ method: 'get',
23
+ url: $('.xg1 a').eq(1).attr('href'),
24
+ });
25
+
26
+ $ = cheerio.load(response.data);
27
+
28
+ let items = $('item')
29
+ .slice(0, ctx.query.limit ? parseInt(ctx.query.limit) : 50)
30
+ .toArray()
31
+ .map((item) => {
32
+ item = $(item);
33
+
34
+ return {
35
+ title: item.find('title').text(),
36
+ link: item.find('guid').text(),
37
+ };
38
+ });
39
+
40
+ items = await Promise.all(
41
+ items.map((item) =>
42
+ ctx.cache.tryGet(item.link, async () => {
43
+ const detailResponse = await got({
44
+ method: 'get',
45
+ url: item.link,
46
+ responseType: 'buffer',
47
+ });
48
+
49
+ const content = cheerio.load(iconv.decode(detailResponse.data, 'gbk'));
50
+
51
+ item.author = content('.xs2').text();
52
+ item.description = content('#blog_article').html();
53
+ item.pubDate = timezone(parseDate(content('.xg1').eq(5).text()), +8);
54
+
55
+ return item;
56
+ })
57
+ )
58
+ );
59
+
60
+ ctx.state.data = {
61
+ title: `科学网 - ${items[0].author}的博文`,
62
+ link: currentUrl,
63
+ item: items,
64
+ };
65
+ };
@@ -0,0 +1,59 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+ const { parseDate } = require('@/utils/parse-date');
4
+
5
+ const host = 'http://www.cmse.sdu.edu.cn/';
6
+ const typelist = ['通知公告', '学院新闻', '本科生教育', '研究生教育', '学术动态'];
7
+ const urlList = ['zxzx/tzgg.htm', 'zxzx/xyxw.htm', 'zxzx/bksjy.htm', 'zxzx/yjsjy.htm', 'zxzx/xsdt.htm'];
8
+
9
+ module.exports = async (ctx) => {
10
+ const type = ctx.params.type ? parseInt(ctx.params.type) : 0;
11
+ const link = new URL(urlList[type], host).href;
12
+ const response = await got(link);
13
+
14
+ const $ = cheerio.load(response.data);
15
+
16
+ let item = $('.article_list li')
17
+ .map((_, e) => {
18
+ e = $(e);
19
+ const a = e.find('a');
20
+ return {
21
+ title: a.text().trim(),
22
+ link: a.attr('href'),
23
+ pubDate: parseDate(e.find('.date').text(), 'YYYY/MM/DD'),
24
+ };
25
+ })
26
+ .get();
27
+
28
+ item = await Promise.all(
29
+ item
30
+ .filter((e) => e.link.startsWith('../info'))
31
+ .map((item) => {
32
+ item.link = new URL(item.link.slice('3'), host).href;
33
+ return ctx.cache.tryGet(item.link, async () => {
34
+ const response = await got(item.link);
35
+ const $ = cheerio.load(response.data);
36
+
37
+ item.title = $('.contentTitle').text();
38
+ item.author =
39
+ $('.contentTitle2')
40
+ .find('span')
41
+ .eq(1)
42
+ .text()
43
+ .trim()
44
+ .match(/作者:(.*)/)[1] || '山东大学材料科学与工程学院';
45
+ $('.contentTitle, .contentTitle2').remove();
46
+ item.description = $('.content_detail').html();
47
+
48
+ return item;
49
+ });
50
+ })
51
+ );
52
+
53
+ ctx.state.data = {
54
+ title: `山东大学材料科学与工程学院${typelist[type]}`,
55
+ description: $('title').text(),
56
+ link,
57
+ item,
58
+ };
59
+ };
@@ -0,0 +1,57 @@
1
+ const got = require('@/utils/got');
2
+ const cheerio = require('cheerio');
3
+ const { parseDate } = require('@/utils/parse-date');
4
+ const { finishArticleItem } = require('@/utils/wechat-mp');
5
+
6
+ const host = 'https://www.cs.sdu.edu.cn/';
7
+ const typelist = ['学院公告', '学术报告', '科技简讯'];
8
+ const urlList = ['xygg.htm', 'xsbg.htm', 'kjjx.htm'];
9
+
10
+ module.exports = async (ctx) => {
11
+ const type = ctx.params.type ? parseInt(ctx.params.type) : 0;
12
+ const link = new URL(urlList[type], host).href;
13
+
14
+ const response = await got(link);
15
+
16
+ const $ = cheerio.load(response.data);
17
+
18
+ let item = $('.dqlb ul li')
19
+ .map((_, e) => {
20
+ e = $(e);
21
+ const a = e.find('a');
22
+ return {
23
+ title: a.text().trim(),
24
+ link: a.attr('href').startsWith('info/') ? host + a.attr('href') : a.attr('href'),
25
+ pubDate: parseDate(e.find('.fr').text().trim(), 'YYYY-MM-DD'),
26
+ };
27
+ })
28
+ .get();
29
+
30
+ item = await Promise.all(
31
+ item.map((item) =>
32
+ ctx.cache.tryGet(item.link, async () => {
33
+ if (new URL(item.link).hostname === 'mp.weixin.qq.com') {
34
+ return finishArticleItem(ctx, item);
35
+ } else if (new URL(item.link).hostname !== 'www.cs.sdu.edu.cn') {
36
+ return item;
37
+ }
38
+ const response = await got(item.link);
39
+ const $ = cheerio.load(response.data);
40
+
41
+ item.title = $('.xqnr_tit h2').text().trim();
42
+ item.author = $('.xqnr_tit span').eq(1).text().trim().replace('编辑:', '') || '山东大学计算机科学与技术学院';
43
+ $('.xqnr_tit').remove();
44
+ item.description = $('form[name=_newscontent_fromname]').html();
45
+
46
+ return item;
47
+ })
48
+ )
49
+ );
50
+
51
+ ctx.state.data = {
52
+ title: `山东大学计算机科学与技术学院${typelist[type]}通知`,
53
+ description: $('title').text(),
54
+ link,
55
+ item,
56
+ };
57
+ };
@@ -0,0 +1,110 @@
1
+ module.exports = {
2
+ wh: {
3
+ news: {
4
+ name: '山东大学(威海)新闻网',
5
+ route: '/news',
6
+ source: ['/*path', '/'],
7
+ titlePrefix: '(威海)新闻网|',
8
+ docs: 'https://docs.rsshub.app/university.html#shan-dong-da-xue-wei-hai',
9
+ getTarget(url) {
10
+ return this.route + '/' + url.replace(/\.htm$/, '');
11
+ },
12
+ url: 'https://xinwen.wh.sdu.edu.cn/',
13
+ columns: {
14
+ xyyw: {
15
+ name: '校园要闻',
16
+ url: 'xyyw.htm',
17
+ },
18
+ xsdt: {
19
+ name: '学生动态',
20
+ url: 'xsdt.htm',
21
+ },
22
+ zhxw: {
23
+ name: '综合新闻',
24
+ url: 'zhxw.htm',
25
+ },
26
+ sdsd: {
27
+ name: '山大视点',
28
+ url: 'sdsd.htm',
29
+ },
30
+ jjxy: {
31
+ name: '菁菁校园',
32
+ url: 'jjxy.htm',
33
+ },
34
+ xyjx: {
35
+ name: '校园简讯',
36
+ url: 'xyjx.htm',
37
+ },
38
+ mjzc: {
39
+ name: '玛珈之窗',
40
+ url: 'mjzc.htm',
41
+ },
42
+ rdzt: {
43
+ name: '热点专题',
44
+ url: 'rdzt.htm',
45
+ },
46
+ mtsj: {
47
+ name: '媒体视角',
48
+ url: 'mtsj.htm',
49
+ },
50
+ gjsy: {
51
+ name: '高教视野',
52
+ url: 'gjsy.htm',
53
+ },
54
+ llxx: {
55
+ name: '理论学习',
56
+ url: 'llxx.htm',
57
+ },
58
+ },
59
+ },
60
+ jwc: {
61
+ name: '山东大学(威海)教务处',
62
+ route: '/jwc',
63
+ source: ['/*path', '/'],
64
+ titlePrefix: '(威海)教务处|',
65
+ docs: 'https://docs.rsshub.app/university.html#shan-dong-da-xue-wei-hai',
66
+ getTarget(url) {
67
+ return this.route + '/' + url.replace(/\.htm$/, '');
68
+ },
69
+ url: 'https://jwc.wh.sdu.edu.cn/',
70
+ columns: {
71
+ gzzd: {
72
+ name: '规章制度',
73
+ url: 'gzzd.htm',
74
+ },
75
+ zyjs: {
76
+ name: '专业建设',
77
+ url: 'zyjs.htm',
78
+ },
79
+ sjjx: {
80
+ name: '实践教学',
81
+ url: 'sjjx.htm',
82
+ },
83
+ zbfc: {
84
+ name: '支部风采',
85
+ url: 'zbfc.htm',
86
+ },
87
+ fwzn: {
88
+ name: '服务指南',
89
+ url: 'fwzn.htm',
90
+ },
91
+ jwyw: {
92
+ name: '教务要闻',
93
+ url: 'jwyw.htm',
94
+ },
95
+ gztz: {
96
+ name: '工作通知',
97
+ url: 'gztz.htm',
98
+ },
99
+ jwjb: {
100
+ name: '教务简报',
101
+ url: 'jwjb.htm',
102
+ },
103
+ cyxz: {
104
+ name: '常用下载',
105
+ url: 'cyxz.htm',
106
+ },
107
+ },
108
+ },
109
+ },
110
+ };
@@ -0,0 +1,55 @@
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 host = 'https://www.epe.sdu.edu.cn/';
7
+ const typelist = ['学院动态', '通知公告', '学术论坛'];
8
+ const urlList = ['zxzx/xydt.htm', 'zxzx/tzgg.htm', 'zxzx/xslt.htm'];
9
+
10
+ module.exports = async (ctx) => {
11
+ const type = ctx.params.type ? parseInt(ctx.params.type) : 0;
12
+ const link = new URL(urlList[type], host).href;
13
+ const response = await got(link);
14
+
15
+ const $ = cheerio.load(response.data);
16
+
17
+ let item = $('#page_right_main li a')
18
+ .map((_, e) => {
19
+ e = $(e);
20
+ return {
21
+ title: e.attr('title'),
22
+ link: e.attr('href'),
23
+ };
24
+ })
25
+ .get();
26
+
27
+ item = await Promise.all(
28
+ item
29
+ .filter((e) => e.link.startsWith('../info'))
30
+ .map((item) => {
31
+ item.link = new URL(item.link.slice('3'), host).href;
32
+ return ctx.cache.tryGet(item.link, async () => {
33
+ const response = await got(item.link);
34
+ const $ = cheerio.load(response.data);
35
+
36
+ const info = $('#show_info').text().split(/\s{4}/);
37
+ const date = info[0].split(':')[1];
38
+
39
+ item.title = $('#show_title').text().trim();
40
+ item.author = info[1].replace('编辑:', '') || '山东大学能源与动力工程学院';
41
+ item.description = $('#show_content').html();
42
+ item.pubDate = timezone(parseDate(date), +8);
43
+
44
+ return item;
45
+ });
46
+ })
47
+ );
48
+
49
+ ctx.state.data = {
50
+ title: `山东大学能源与动力工程学院${typelist[type]}`,
51
+ description: $('title').text(),
52
+ link,
53
+ item,
54
+ };
55
+ };
@@ -0,0 +1,15 @@
1
+ module.exports = async (link, ctx) => {
2
+ if (link.startsWith('https://xinwen.wh.sdu.edu.cn/')) {
3
+ return await require('./wh/news')(link, ctx);
4
+ }
5
+ if (link.startsWith('https://www.view.sdu.edu.cn/')) {
6
+ return await require('./view')(link, ctx);
7
+ }
8
+ if (link.startsWith('https://www.sdrj.sdu.edu.cn/')) {
9
+ return await require('./sdrj')(link, ctx);
10
+ }
11
+ if (link.startsWith('https://jwc.wh.sdu.edu.cn/')) {
12
+ return await require('./wh/jwc')(link, ctx);
13
+ }
14
+ return {};
15
+ };
@@ -0,0 +1,21 @@
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
+ module.exports = async (link, ctx) =>
7
+ await ctx.cache.tryGet(link, async () => {
8
+ let content, author, exactDate;
9
+ try {
10
+ const result = await got(link);
11
+ const $ = cheerio.load(result.data);
12
+ content = $('#vsb_content').html();
13
+ author = $("form[name='_newscontent_fromname'] > h1").text();
14
+ const exactDateLine = $("form[name='_newscontent_fromname'] > p.info").text().trim();
15
+ const exactDateText = exactDateLine.match(/^发布时间:(?<date>\d+\/\d+\/\d+\s\d{2}:\d{2}:\d{2})/).groups.date;
16
+ exactDate = timezone(parseDate(exactDateText, 'YYYY/MM/DD HH:mm:ss'), +8);
17
+ return { description: content, author, exactDate };
18
+ } catch (e) {
19
+ return { description: content, author, exactDate };
20
+ }
21
+ });
@@ -0,0 +1,21 @@
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
+ module.exports = async (link, ctx) =>
7
+ await ctx.cache.tryGet(link, async () => {
8
+ let content, author, exactDate;
9
+ try {
10
+ const result = await got(link);
11
+ const $ = cheerio.load(result.data);
12
+ content = $('#vsb_content').html();
13
+ author = $("form[name='_newscontent_fromname'] > div > p:last-of-type").text();
14
+ const exactDateLine = $('.news_tit > p:last-child').text();
15
+ const exactDateText = exactDateLine.match(/^发布日期:(?<date>\d+年\d+月\d+日\s\d{2}:\d{2})/).groups.date;
16
+ exactDate = timezone(parseDate(exactDateText, 'YYYY年MM月DD日 HH:mm'), +8);
17
+ return { description: content, author, exactDate };
18
+ } catch (e) {
19
+ return { description: content, author, exactDate };
20
+ }
21
+ });
@@ -0,0 +1,24 @@
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
+ module.exports = async (link, ctx) =>
7
+ await ctx.cache.tryGet(link, async () => {
8
+ let content, exactDate;
9
+ try {
10
+ const result = await got(link);
11
+ const $ = cheerio.load(result.data);
12
+ const form = $("form[name='_newscontent_fromname']");
13
+ form.find('h2').remove();
14
+ const exactDateElement = form.find('#author');
15
+ const exactDateStr = exactDateElement.text();
16
+ exactDateElement.remove();
17
+ content = form.html();
18
+ const exactDateText = exactDateStr.match(/^创建时间:(?<date>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})/).groups.date;
19
+ exactDate = timezone(parseDate(exactDateText, 'YYYY-MM-DD HH:mm:ss'), +8);
20
+ return { description: content, exactDate };
21
+ } catch (e) {
22
+ return { description: content, exactDate };
23
+ }
24
+ });
@@ -0,0 +1,21 @@
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
+ module.exports = async (link, ctx) =>
7
+ await ctx.cache.tryGet(link, async () => {
8
+ let content, author, exactDate;
9
+ try {
10
+ const result = await got(link);
11
+ const $ = cheerio.load(result.data);
12
+ content = $('#main-content').html();
13
+ author = $('#source').text();
14
+ const exactDateLine = $('.news_tit > p:last-child').text();
15
+ const exactDateText = exactDateLine.match(/^发布日期:(?<date>\d+年\d+月\d+日\s\d{2}:\d{2})/).groups.date;
16
+ exactDate = timezone(parseDate(exactDateText, 'YYYY年MM月DD日 HH:mm'), +8);
17
+ return { description: content, author, exactDate };
18
+ } catch (e) {
19
+ return { description: content, author, exactDate };
20
+ }
21
+ });
@@ -0,0 +1,9 @@
1
+ module.exports = {
2
+ '/cmse/:type?': ['Ji4n1ng'],
3
+ '/cs/:type?': ['Ji4n1ng'],
4
+ '/epe/:type?': ['Ji4n1ng'],
5
+ '/mech/:type?': ['Ji4n1ng'],
6
+ '/sc/:type?': ['Ji4n1ng'],
7
+ '/wh/news/:column?': ['kxxt'],
8
+ '/wh/jwc/:column?': ['kxxt'],
9
+ };