rsshub
Version:
Make RSS Great Again!
58 lines (50 loc) • 2.19 kB
text/typescript
import cache from '@/utils/cache';
import { load } from 'cheerio';
import ofetch from '@/utils/ofetch';
import { parseDate } from '@/utils/parse-date';
import { art } from '@/utils/render';
import path from 'node:path';
import randUserAgent from '@/utils/rand-user-agent';
const UA = randUserAgent({ browser: 'chrome', os: 'android', device: 'mobile' });
const getArticleDetails = async (items) => {
const list = await Promise.all(
items.map((item) =>
cache.tryGet(item.link, async () => {
const url = item.link;
const html = await ofetch(url, {
headers: {
'User-Agent': UA,
},
});
const $ = load(html);
let data = JSON.parse($('script#__NEXT_DATA__').text());
const list = data.props.pageProps.urqlState;
const keyWithContent = Object.keys(list).filter((key) => list[key].data.includes('content'));
data = JSON.parse(list[keyWithContent].data).article;
item.title = data.shareTitle;
item.category = data.categories.map((category) => category.slug);
for (const channel of data.channels) {
item.category.push(channel.slug);
}
item.content = data.content.filter((item) => item.innerHtml !== undefined && item.innerHtml !== '');
item.caption = data.dek;
if (data.leadArt) {
item.imgUrl = data.leadArt.image?.url;
item.imgAlt = data.leadArt.image?.altText;
item.imgCaption = data.leadArt.image?.attributionText;
}
item.description = art(path.join(__dirname, 'templates/article-description.art'), {
item,
});
return {
title: item.title,
pubDate: parseDate(item.pubDate),
link: item.link,
description: item.description,
};
})
)
);
return list;
};
export { getArticleDetails };