Files
RSSHub/lib/v2/scitation/section.js
Derek b23e187a9c feat(route): add Scitation route (#9953)
* feat: upload files

* feat: add docs; update radar.js

* feat(fix): fix docs/en

* Update docs/en/journal.md

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* Update lib/v2/scitation/journal.js

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* Update lib/v2/scitation/journal.js

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* Update lib/v2/scitation/journal.js

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* Update lib/v2/scitation/section.js

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* Update lib/v2/scitation/section.js

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* Update lib/v2/scitation/section.js

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* Update lib/v2/scitation/templates/description.art

Co-authored-by: Tony <TonyRL@users.noreply.github.com>

* feat: remove config request

* Update lib/v2/scitation/templates/description.art
2022-06-15 22:44:38 -04:00

91 lines
3.0 KiB
JavaScript

const got = require('@/utils/got');
const cheerio = require('cheerio');
const path = require('path');
const { art } = require('@/utils/render');
const { CookieJar } = require('tough-cookie');
const cookieJar = new CookieJar();
module.exports = async (ctx) => {
const pub = ctx.params.pub;
const jrn = ctx.params.jrn;
const sec = ctx.params.sec.split('+').join(' ');
const host = `https://${pub}.scitation.org`;
const jrnlUrl = `${host}/toc/${jrn}/current?size=all`;
const response = await got(jrnlUrl, {
cookieJar,
});
const $ = cheerio.load(response.data);
const jrnlName = $('.header-journal-title').text();
const issueUrl = $('.row.js_issue.highlighted').find('a').attr('href');
const section = $('.subject-heading')
.map((_, item) => ({
name: $(item).text(),
}))
.get();
let list;
let ifContainSection = false;
for (let i = 0, l = section.length; i < l; i++) {
if (section[i].name === sec) {
ifContainSection = true;
}
}
if (ifContainSection === true) {
const secUrl = `${issueUrl}?tocSection=${sec}`;
const response2 = await got(secUrl, {
cookieJar,
});
const $2 = cheerio.load(response2.data);
list = $2('.card')
.map((_, item) => {
$2(item).find('.access-text').remove();
const title = $2(item).find('.hlFld-Title').text();
const authors = $2(item).find('.entryAuthor.all').text();
const img = $2(item).find('img').attr('src');
const link = $2(item).find('.ref.nowrap').attr('href');
const doi = link.replace('/doi/full/', '');
return {
title,
link,
doi,
authors,
img,
};
})
.get();
const renderDesc = (item) =>
art(path.join(__dirname, 'templates/description.art'), {
item,
});
await Promise.all(
list.map((item) =>
ctx.cache.tryGet(item.link, async () => {
const response3 = await got.post(host.concat('/action/PB2showAjaxAbstract'), {
cookieJar,
body: 'doi=' + item.doi,
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept-Encoding': 'gzip, deflate, br',
},
});
const $3 = cheerio.load(response3.data);
item.abstract = $3('span').text();
item.description = renderDesc(item);
return item;
})
)
);
}
ctx.state.data = {
title: jrnlName.concat(' - ', sec),
link: jrnlUrl,
item: list,
allowEmpty: true,
};
};