38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
import { parseDate } from '@/utils/parse-date';
|
|
import cache from '@/utils/cache';
|
|
import got from '@/utils/got';
|
|
import * as cheerio from 'cheerio';
|
|
|
|
export const parseList = (result) =>
|
|
result.map((item) => ({
|
|
title: item.title,
|
|
description: item.summary,
|
|
pubDate: parseDate(item.date_published),
|
|
link: `https://www.guokr.com/article/${item.id}/`,
|
|
author: item.author.nickname,
|
|
category: item.subject?.name,
|
|
id: item.id,
|
|
channels: item.channels,
|
|
}));
|
|
|
|
export const parseItem = (item) =>
|
|
cache.tryGet(item.link, async () => {
|
|
const { data: res } = await got(`https://apis.guokr.com/minisite/article/${item.id}.json`);
|
|
const $ = cheerio.load(res.result.content);
|
|
|
|
$('#meta_content').remove();
|
|
$('div').each((_, elem) => {
|
|
const $elem = $(elem);
|
|
$elem.attr('style', $elem.attr('style')?.replaceAll(/display:none;|visibility: hidden;/g, ''));
|
|
});
|
|
$('img').each((_, elem) => {
|
|
const $elem = $(elem);
|
|
if ($elem.attr('data-src')) {
|
|
$elem.attr('src', $elem.attr('data-src'));
|
|
}
|
|
});
|
|
item.description = $.html();
|
|
|
|
return item;
|
|
});
|