Files
RSSHub/lib/v2/acfun/article.js
2022-07-04 22:10:54 +08:00

101 lines
3.3 KiB
JavaScript

const got = require('@/utils/got');
const cheerio = require('cheerio');
const { parseDate } = require('@/utils/parse-date');
const baseUrl = 'https://www.acfun.cn';
const categoryMap = {
184: {
title: '二次元画师',
realmId: 'realmId=18' + '&realmId=14' + '&realmId=51',
},
110: {
title: '综合',
realmId: 'realmId=5' + '&realmId=22' + '&realmId=28' + '&realmId=3' + '&realmId=4',
},
73: {
title: '生活情感',
realmId: 'realmId=50' + '&realmId=25' + '&realmId=34' + '&realmId=7' + '&realmId=6' + '&realmId=17' + '&realmId=1' + '&realmId=2' + '&realmId=49',
},
164: {
title: '游戏',
realmId: 'realmId=8' + '&realmId=53' + '&realmId=52' + '&realmId=11' + '&realmId=43' + '&realmId=44' + '&realmId=45' + '&realmId=46' + '&realmId=47',
},
74: {
title: '动漫文化',
realmId: 'realmId=13' + '&realmId=31' + '&realmId=48',
},
75: {
title: '漫画文学',
realmId: 'realmId=15' + '&realmId=23' + '&realmId=16',
},
};
const sortTypeEnum = ['createTime', 'lastCommentTime', 'hotScore'];
const timeRangeEnum = ['all', 'oneDay', 'threeDay', 'oneWeek', 'oneMonth'];
module.exports = async (ctx) => {
const { categoryId, sortType = 'createTime', timeRange = 'all' } = ctx.params;
if (!categoryMap[categoryId]) {
throw `Invalid category Id: ${categoryId}`;
}
if (!sortTypeEnum.includes(sortType)) {
throw `Invalid sort type: ${sortType}`;
}
if (!timeRangeEnum.includes(timeRange)) {
throw `Invalid time range: ${timeRange}`;
}
const url = `${baseUrl}/v/list${categoryId}/index.htm`;
const response = await got.post(
`${baseUrl}/rest/pc-direct/article/feed` +
'?cursor=first_page' +
'&onlyOriginal=false' +
'&limit=10' +
`&sortType=${sortType}` +
`&timeRange=${sortType === 'hotScore' ? timeRange : 'all'}` +
`&${categoryMap[categoryId].realmId}`,
{
headers: {
referer: url,
},
}
);
const list = response.data.data.map((item) => ({
title: item.title,
link: `${baseUrl}/a/ac${item.articleId}`,
author: item.userName,
pubDate: parseDate(item.createTime, 'x'),
category: item.realmName,
}));
const items = await Promise.all(
list.map((item) =>
ctx.cache.tryGet(item.link, async () => {
const response = await got(item.link, {
headers: {
referer: url,
},
});
const $ = cheerio.load(response.data);
const articleInfo = $('.main script')
.text()
.match(/window.articleInfo = (.*);\n\s*window.likeDomain/)[1];
const data = JSON.parse(articleInfo);
item.description = data.parts[0].content;
if (data.tagList) {
item.category = [item.category, ...data.tagList.map((tag) => tag.name)];
}
return item;
})
)
);
ctx.state.data = {
title: categoryMap[categoryId].title,
link: url,
item: items,
};
};