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.
- package/README.md +1 -1
- package/lib/config.js +3 -1
- package/lib/radar-rules.js +0 -92
- package/lib/router.js +68 -71
- package/lib/routes/tencent/wechat/miniprogram/framework.js +4 -2
- package/lib/utils/common-config.js +4 -0
- package/lib/utils/parse-date.js +8 -7
- package/lib/utils/rand-user-agent.js +29 -0
- package/lib/utils/request-wrapper.js +2 -5
- package/lib/utils/wechat-mp.js +106 -10
- package/lib/v2/agirls/index.js +6 -0
- package/lib/v2/bilibili/video.js +1 -0
- package/lib/v2/bookfere/category.js +36 -0
- package/lib/v2/bookfere/maintainer.js +3 -0
- package/lib/v2/bookfere/radar.js +11 -0
- package/lib/v2/bookfere/router.js +3 -0
- package/lib/v2/cankaoxiaoxi/index.js +81 -0
- package/lib/v2/cankaoxiaoxi/maintainer.js +3 -0
- package/lib/v2/cankaoxiaoxi/radar.js +61 -0
- package/lib/v2/cankaoxiaoxi/router.js +3 -0
- package/lib/{routes → v2}/cctv/category.js +1 -1
- package/lib/{routes → v2}/cctv/jx.js +6 -1
- package/lib/{routes → v2}/cctv/lm.js +1 -1
- package/lib/v2/cctv/maintainer.js +7 -0
- package/lib/v2/cctv/radar.js +41 -0
- package/lib/v2/cctv/router.js +7 -0
- package/lib/{routes → v2}/cctv/special.js +6 -4
- package/lib/{routes → v2}/cctv/utils/mzzlbg.js +8 -6
- package/lib/{routes → v2}/cctv/utils/news.js +25 -22
- package/lib/{routes → v2}/cctv/utils/xinwen1j1.js +20 -17
- package/lib/v2/cctv/xwlb.js +50 -0
- package/lib/v2/chinacef/experts.js +38 -0
- package/lib/v2/chinacef/hot.js +38 -0
- package/lib/v2/chinacef/index.js +39 -0
- package/lib/v2/chinacef/maintainer.js +5 -0
- package/lib/v2/chinacef/radar.js +25 -0
- package/lib/v2/chinacef/router.js +5 -0
- package/lib/v2/{wechat → chinacef}/templates/description.art +0 -0
- package/lib/v2/chinacef/utils.js +55 -0
- package/lib/v2/chinanews/index.js +65 -0
- package/lib/v2/chinanews/maintainer.js +3 -0
- package/lib/v2/chinanews/radar.js +13 -0
- package/lib/v2/chinanews/router.js +3 -0
- package/lib/v2/cnbeta/index.js +2 -1
- package/lib/v2/cnbeta/utils.js +1 -0
- package/lib/v2/dapenti/maintainer.js +4 -0
- package/lib/v2/dapenti/radar.js +27 -0
- package/lib/v2/dapenti/router.js +4 -0
- package/lib/{routes → v2}/dapenti/subject.js +1 -1
- package/lib/{routes → v2}/dapenti/tugua.js +1 -1
- package/lib/v2/dapenti/utils.js +75 -0
- package/lib/{routes → v2}/dongqiudi/daily.js +10 -13
- package/lib/v2/dongqiudi/maintainer.js +8 -0
- package/lib/{routes → v2}/dongqiudi/player_news.js +0 -0
- package/lib/v2/dongqiudi/radar.js +45 -0
- package/lib/{routes → v2}/dongqiudi/result.js +2 -1
- package/lib/v2/dongqiudi/router.js +8 -0
- package/lib/{routes → v2}/dongqiudi/special.js +0 -0
- package/lib/{routes → v2}/dongqiudi/team_news.js +0 -0
- package/lib/{routes → v2}/dongqiudi/top_news.js +12 -15
- package/lib/{routes → v2}/dongqiudi/utils.js +47 -28
- package/lib/v2/dut/defaults.js +53 -0
- package/lib/v2/dut/index.js +78 -0
- package/lib/v2/dut/maintainer.js +14 -0
- package/lib/v2/dut/radar.js +109 -0
- package/lib/v2/dut/router.js +4 -0
- package/lib/v2/dut/shortcuts.js +77 -0
- package/lib/{routes → v2}/dx2025/index.js +0 -0
- package/lib/v2/dx2025/maintainer.js +3 -0
- package/lib/v2/dx2025/radar.js +19 -0
- package/lib/v2/dx2025/router.js +3 -0
- package/lib/v2/e-hentai/radar.js +21 -3
- package/lib/v2/eagle/blog.js +47 -0
- package/lib/{routes → v2}/eagle/changelog.js +3 -1
- package/lib/v2/eagle/maintainer.js +4 -0
- package/lib/v2/eagle/radar.js +101 -0
- package/lib/v2/eagle/router.js +4 -0
- package/lib/{routes → v2}/ehentai/ehapi.js +50 -21
- package/lib/{routes → v2}/ehentai/favorites.js +4 -2
- package/lib/v2/ehentai/maintainer.js +5 -0
- package/lib/v2/ehentai/router.js +5 -0
- package/lib/{routes → v2}/ehentai/search.js +5 -3
- package/lib/{routes → v2}/ehentai/tag.js +4 -2
- package/lib/v2/firefox/index.js +7 -2
- package/lib/v2/fortunechina/index.js +1 -1
- package/lib/v2/github/comments.js +7 -0
- package/lib/v2/gitpod/blog.js +8 -0
- package/lib/v2/gov/maintainer.js +1 -0
- package/lib/v2/gov/nrta/news.js +63 -0
- package/lib/v2/gov/radar.js +11 -0
- package/lib/v2/gov/router.js +1 -0
- package/lib/v2/guancha/index.js +1 -1
- package/lib/v2/guangdiu/cheaps.js +28 -0
- package/lib/v2/guangdiu/index.js +44 -0
- package/lib/v2/guangdiu/maintainer.js +5 -0
- package/lib/v2/guangdiu/radar.js +25 -0
- package/lib/v2/guangdiu/rank.js +38 -0
- package/lib/v2/guangdiu/router.js +5 -0
- package/lib/{routes/guokr/calendar.js → v2/guokr/channel.js} +2 -2
- package/lib/v2/guokr/maintainer.js +4 -0
- package/lib/v2/guokr/radar.js +19 -0
- package/lib/v2/guokr/router.js +4 -0
- package/lib/{routes → v2}/guokr/scientific.js +3 -3
- package/lib/v2/hkej/index.js +9 -15
- package/lib/v2/hkepc/index.js +8 -0
- package/lib/v2/hket/index.js +10 -2
- package/lib/v2/huangz/index.js +29 -0
- package/lib/v2/huangz/maintainer.js +3 -0
- package/lib/v2/huangz/radar.js +13 -0
- package/lib/v2/huangz/router.js +3 -0
- package/lib/v2/huanqiu/index.js +65 -0
- package/lib/v2/huanqiu/maintainer.js +3 -0
- package/lib/v2/huanqiu/radar.js +13 -0
- package/lib/v2/huanqiu/router.js +3 -0
- package/lib/v2/miris/blog.js +19 -0
- package/lib/v2/miris/maintainer.js +3 -0
- package/lib/v2/miris/radar.js +11 -0
- package/lib/v2/miris/router.js +3 -0
- package/lib/v2/news/whxw.js +2 -2
- package/lib/v2/npm/package.js +1 -1
- package/lib/v2/npm/router.js +1 -1
- package/lib/v2/qbittorrent/maintainer.js +3 -0
- package/lib/v2/qbittorrent/news.js +59 -0
- package/lib/v2/qbittorrent/radar.js +13 -0
- package/lib/v2/qbittorrent/router.js +3 -0
- package/lib/v2/rsshub/sponsors.js +1 -0
- package/lib/{routes → v2}/sciencenet/blog.js +17 -12
- package/lib/v2/sciencenet/maintainer.js +4 -0
- package/lib/v2/sciencenet/radar.js +19 -0
- package/lib/v2/sciencenet/router.js +4 -0
- package/lib/v2/sciencenet/user.js +65 -0
- package/lib/v2/sdu/cmse.js +59 -0
- package/lib/v2/sdu/cs.js +57 -0
- package/lib/v2/sdu/data.js +110 -0
- package/lib/v2/sdu/epe.js +55 -0
- package/lib/v2/sdu/extractor/index.js +15 -0
- package/lib/v2/sdu/extractor/sdrj.js +21 -0
- package/lib/v2/sdu/extractor/view.js +21 -0
- package/lib/v2/sdu/extractor/wh/jwc.js +24 -0
- package/lib/v2/sdu/extractor/wh/news.js +21 -0
- package/lib/v2/sdu/maintainer.js +9 -0
- package/lib/v2/sdu/mech.js +60 -0
- package/lib/v2/sdu/radar.js +159 -0
- package/lib/v2/sdu/router.js +9 -0
- package/lib/v2/sdu/sc.js +61 -0
- package/lib/v2/sdu/wh/jwc.js +42 -0
- package/lib/v2/sdu/wh/news.js +38 -0
- package/lib/v2/stratechery/index.js +20 -0
- package/lib/v2/stratechery/maintainer.js +3 -0
- package/lib/v2/stratechery/radar.js +11 -0
- package/lib/v2/stratechery/router.js +3 -0
- package/lib/{routes → v2}/taptap/changelog.js +2 -1
- package/lib/v2/taptap/maintainer.js +5 -0
- package/lib/v2/taptap/radar.js +25 -0
- package/lib/v2/taptap/review.js +69 -0
- package/lib/v2/taptap/router.js +5 -0
- package/lib/v2/taptap/templates/videoPost.art +2 -0
- package/lib/v2/taptap/topic.js +79 -0
- package/lib/v2/taptap/utils.js +48 -0
- package/lib/v2/thecover/channel.js +66 -0
- package/lib/v2/thecover/maintainer.js +3 -0
- package/lib/v2/thecover/radar.js +13 -0
- package/lib/v2/thecover/router.js +3 -0
- package/lib/{routes → v2}/twreporter/category.js +7 -12
- package/lib/{routes → v2}/twreporter/fetch_article.js +5 -4
- package/lib/v2/twreporter/maintainer.js +5 -0
- package/lib/{routes → v2}/twreporter/newest.js +8 -13
- package/lib/v2/twreporter/photography.js +46 -0
- package/lib/v2/twreporter/radar.js +25 -0
- package/lib/v2/twreporter/router.js +5 -0
- package/lib/{routes/tencent → v2}/wechat/announce.js +3 -2
- package/lib/v2/wechat/ce.js +69 -0
- package/lib/v2/wechat/data258.js +137 -0
- package/lib/v2/wechat/ershcimi.js +35 -0
- package/lib/{routes/tencent → v2}/wechat/feeds.js +0 -0
- package/lib/v2/wechat/maintainer.js +11 -0
- package/lib/{routes/tencent → v2}/wechat/mp.js +0 -0
- package/lib/{routes/tencent → v2}/wechat/msgalbum.js +0 -0
- package/lib/v2/wechat/radar.js +76 -1
- package/lib/v2/wechat/router.js +11 -0
- package/lib/{routes/tencent → v2}/wechat/tgchannel.js +0 -0
- package/lib/{routes/tencent → v2}/wechat/uread.js +0 -0
- package/lib/{routes/tencent → v2}/wechat/wemp.js +0 -0
- package/lib/{routes/tencent → v2}/wechat/wxnmh.js +0 -0
- package/lib/{routes → v2}/xueqiu/favorite.js +2 -1
- package/lib/v2/xueqiu/fund.js +50 -0
- package/lib/{routes → v2}/xueqiu/hots.js +2 -1
- package/lib/v2/xueqiu/maintainer.js +10 -0
- package/lib/v2/xueqiu/radar.js +60 -0
- package/lib/v2/xueqiu/router.js +10 -0
- package/lib/{routes → v2}/xueqiu/snb.js +2 -1
- package/lib/{routes → v2}/xueqiu/stock_comments.js +4 -20
- package/lib/{routes → v2}/xueqiu/stock_info.js +2 -1
- package/lib/v2/xueqiu/templates/comments_description.art +10 -0
- package/lib/{routes → v2}/xueqiu/user.js +2 -1
- package/lib/{routes → v2}/xueqiu/user_stock.js +3 -2
- package/lib/v2/yunspe/maintainer.js +3 -0
- package/lib/v2/yunspe/newsflash.js +42 -0
- package/lib/v2/yunspe/radar.js +13 -0
- package/lib/v2/yunspe/router.js +3 -0
- package/lib/{routes → v2}/yystv/category.js +8 -8
- package/lib/{routes → v2}/yystv/docs.js +2 -2
- package/lib/v2/yystv/maintainer.js +4 -0
- package/lib/v2/yystv/radar.js +49 -0
- package/lib/v2/yystv/router.js +4 -0
- package/lib/{routes/universities → v2}/zju/career/index.js +14 -13
- package/lib/{routes/universities → v2}/zju/cst/custom.js +2 -1
- package/lib/{routes/universities → v2}/zju/cst/index.js +20 -24
- package/lib/v2/zju/grs/index.js +43 -0
- package/lib/v2/zju/list.js +66 -0
- package/lib/v2/zju/maintainer.js +8 -0
- package/lib/v2/zju/physics/index.js +52 -0
- package/lib/v2/zju/radar.js +139 -0
- package/lib/v2/zju/router.js +8 -0
- package/lib/views/atom.art +13 -1
- package/lib/views/welcome.art +4 -1
- package/package.json +13 -12
- package/lib/routes/cctv/xwlb.js +0 -48
- package/lib/routes/dapenti/utils.js +0 -73
- package/lib/routes/taptap/review.js +0 -39
- package/lib/routes/taptap/topic.js +0 -85
- package/lib/routes/tencent/wechat/_README +0 -1
- package/lib/routes/tencent/wechat/ce.js +0 -40
- package/lib/routes/tencent/wechat/ershcimi.js +0 -43
- package/lib/routes/twreporter/photography.js +0 -57
- package/lib/routes/universities/dut/index.js +0 -60
- package/lib/routes/universities/dut/subsite.js +0 -50
- package/lib/routes/universities/sdu/cmse.js +0 -55
- package/lib/routes/universities/sdu/cs.js +0 -55
- package/lib/routes/universities/sdu/epe.js +0 -54
- package/lib/routes/universities/sdu/mech.js +0 -58
- package/lib/routes/universities/sdu/sc.js +0 -56
- package/lib/routes/universities/zju/grs/index.js +0 -44
- package/lib/routes/universities/zju/list.js +0 -78
- package/lib/routes/universities/zju/physics/index.js +0 -55
- package/lib/routes/xueqiu/fund.js +0 -71
- package/lib/v2/wechat/templates/image.art +0 -1
|
@@ -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
|
+
};
|
|
@@ -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
|
|
7
|
-
const time = ctx.params.time
|
|
8
|
-
const sort = ctx.params.sort
|
|
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
|
-
|
|
21
|
-
.slice(0,
|
|
22
|
-
.
|
|
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
|
-
|
|
33
|
-
|
|
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 =
|
|
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:
|
|
57
|
+
title: '科学网 - 精选博文',
|
|
53
58
|
link: currentUrl,
|
|
54
59
|
item: items,
|
|
55
60
|
};
|
|
@@ -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,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
|
+
};
|
package/lib/v2/sdu/cs.js
ADDED
|
@@ -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
|
+
});
|