RSSHub/lib/v2/cnki/debut.js

63 lines
2.2 KiB
JavaScript

const got = require('@/utils/got');
const cheerio = require('cheerio');
const { parseDate } = require('@/utils/parse-date');
const { art } = require('@/utils/render');
const path = require('path');
const rootUrl = 'https://chn.oversea.cnki.net';
module.exports = async (ctx) => {
const { name } = ctx.params;
const journalUrl = `${rootUrl}/knavi/JournalDetail?pcode=CjFD&pykm=${name}`;
const title = await got.get(journalUrl).then((res) => cheerio.load(res.data)('head > title').text());
const outlineUrl = `${rootUrl}/knavi/JournalDetail/GetnfAllOutline`;
const response = await got({
method: 'post',
url: outlineUrl,
form: {
pageIdx: '0',
type: '2',
pcode: 'CJFD',
pykm: name,
},
});
const $ = cheerio.load(response.data);
const list = $('dd')
.map((_, item) => ({
title: $(item).find('span.name > a').text().trim(),
link: `${rootUrl}/kcms/detail/${new URLSearchParams(new URL(`${rootUrl}/${$(item).find('span.name > a').attr('href')}`).search).get('url')}.html`,
pubDate: parseDate($(item).find('span.company').text(), 'YYYY-MM-DD HH:mm:ss'),
}))
.get();
const items = await Promise.all(
list.map((item) =>
ctx.cache.tryGet(item.link, async () => {
const detailResponse = await got.get(item.link);
const $ = cheerio.load(detailResponse.data);
item.description = art(path.join(__dirname, 'templates/desc.art'), {
author: $('h3.author > span')
.map((_, item) => $(item).text())
.get()
.join(' '),
company: $('a.author')
.map((_, item) => $(item).text())
.get()
.join(' '),
content: $('div.row > span.abstract-text').parent().text(),
});
return item;
})
)
);
ctx.state.data = {
title: `${title} - 全网首发`,
link: `https://navi.cnki.net/knavi/journals/${name}/detail`,
item: items,
};
};