feat: add Academy of Management journals (#5807)

Co-authored-by: Henry Wang <hi@henry.wang>
This commit is contained in:
Ethan Shen 2020-10-10 04:45:17 +08:00 committed by GitHub
parent ad6135b0d2
commit fed0404c3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 162 additions and 1 deletions

View File

@ -4,6 +4,37 @@ pageClass: routes
# Scientific Journal
## arXiv
### Search Keyword
<RouteEn author="nczitzk" example="/arxiv/search_query=all:electron&start=0&max_results=10" path="/arxiv/:query" :paramsDesc="['query statement']" anticrawler="1">
See [arXiv API User Manual](https://arxiv.org/help/api/user-manual) to find out all query statements.
Fill in parameter `query` with content after `http://export.arxiv.org/api/query?`.
</RouteEn>
## Academy of Management
### Journal
<RouteEn author="nczitzk" example="/aom/journal/amr" path="/aom/journal/:id" :paramsDesc="['journal id, see below']">
| Id | Title |
| --------- | ------------------------------------------ |
| annals | Academy of Management Annals |
| amd | Academy of Management Discoveries |
| amgblproc | Academy of Management Global Proceedings |
| amj | Academy of Management Journal |
| amle | Academy of Management Learning & Education |
| amp | Academy of Management Perspectives |
| amproc | Academy of Management Proceedings |
| amr | Academy of Management Review |
</RouteEn>
## Cell Journal
<RouteEn author="yech1990" example="/cell/cell/current" path="/cell/cell/:category" supportScihub="1" />

View File

@ -16,6 +16,25 @@ pageClass: routes
</Route>
## Academy of Management
### Journal
<Route author="nczitzk" example="/aom/journal/amr" path="/aom/journal/:id" :paramsDesc="['期刊 id见下表']" supportScihub="1">
| Id | 名称 |
| --------- | ------------------------------------------ |
| annals | Academy of Management Annals |
| amd | Academy of Management Discoveries |
| amgblproc | Academy of Management Global Proceedings |
| amj | Academy of Management Journal |
| amle | Academy of Management Learning & Education |
| amp | Academy of Management Perspectives |
| amproc | Academy of Management Proceedings |
| amr | Academy of Management Review |
</Route>
## Cell
### 主刊
@ -123,7 +142,7 @@ pageClass: routes
### 最新文章(可筛选领域)
<Route author="emdoe yech1990" example="/pnas/Applied Mathematics" path="/pnas/:topic" :paramsDesc="['领域名称','可从 pnas.org 获得']" />
<Route author="emdoe yech1990" example="/pnas/Applied Mathematics" path="/pnas/:topic" :paramsDesc="['领域名称','可从 pnas.org 获得']" supportScihub="1"/>
- 通过 `/pnas/` + “领域名称” 来获取对应 “领域” 的最新文章Latest Research
若参数置空(`/pnas`)或为 latest`/pnas/latest`),则默认获取全部文章。

View File

@ -3260,6 +3260,9 @@ router.get('/appsales/:caty?/:time?', require('./routes/appsales/index'));
// CGTN
router.get('/cgtn/top', require('./routes/cgtn/top'));
// Academy of Management
router.get('/aom/journal/:id', require('./routes/aom/journal'));
// 巴哈姆特電玩資訊站
router.get('/gamer/hot/:bsn', require('./routes/gamer/hot'));

108
lib/routes/aom/journal.js Normal file
View File

@ -0,0 +1,108 @@
const got = require('@/utils/got');
const cheerio = require('cheerio');
const rootUrl = 'https://journals.aom.org';
const config = {
annals: {
title: 'Academy of Management Annals',
link: `${rootUrl}/journal/annals`,
},
amd: {
title: 'Academy of Management Discoveries',
link: `${rootUrl}/journal/amd`,
},
amgblproc: {
title: 'Academy of Management Global Proceedings',
link: `${rootUrl}/toc/amgblproc/current`,
},
amj: {
title: 'Academy of Management Journal',
link: `${rootUrl}/journal/amj`,
},
amle: {
title: 'Academy of Management Learning & Education',
link: `${rootUrl}/journal/amle`,
},
amp: {
title: 'Academy of Management Perspectives',
link: `${rootUrl}/journal/amp`,
},
amproc: {
title: 'Academy of Management Proceedings',
link: `${rootUrl}/toc/amproc/current`,
},
amr: {
title: 'Academy of Management Review',
link: `${rootUrl}/toc/amr/0`,
},
};
module.exports = async (ctx) => {
const cfg = config[ctx.params.id];
if (!cfg) {
throw Error('Bad id. See <a href="https://docs.rsshub.app/journal.html#academy-of-management-journal">docs</a>');
}
const currentUrl = cfg.link;
const firstResponse = await got({
method: 'get',
url: rootUrl,
});
const headers = {
cookie: `JSESSIONID=${firstResponse.headers['set-cookie'].join(' ').match(/JSESSIONID=(\S+);/)[1]}`,
};
const response = await got({
method: 'get',
url: currentUrl,
headers,
});
const $ = cheerio.load(response.data);
$('div[data-widget-def="topContentActionWidget"]').eq(2).remove();
$('div[data-widget-def="topContentActionWidget"]').eq(1).remove();
const list = $('h5')
.not('.border-top')
.map((_, item) => {
item = $(item);
const a = item.parent().get(0).tagName === 'a' ? item.parent() : item.find('a');
return {
title: a.attr('title'),
link: `${rootUrl}${a.attr('href')}`,
};
})
.get();
const items = await Promise.all(
list.map(
async (item) =>
await ctx.cache.tryGet(item.link, async () => {
const detailResponse = await got({
method: 'get',
url: item.link,
headers,
});
const content = cheerio.load(detailResponse.data);
content('.author-info').remove();
item.author = content('.loa-accordion').text();
item.doi = content('meta[name="dc.Identifier"]').attr('content');
item.description = content('.abstractInFull').html();
item.pubDate = new Date(content('meta[name="dc.Date"]').attr('content')).toUTCString();
return item;
})
)
);
ctx.state.data = {
title: cfg.title,
link: currentUrl,
item: items,
};
};