RSSHub/lib/routes/devolverdigital/blog.ts

77 lines
2.6 KiB
TypeScript

import { Route } from '@/types';
import cache from '@/utils/cache';
import got from '@/utils/got';
import { load } from 'cheerio';
export const route: Route = {
path: '/blog',
categories: ['blog'],
example: '/devolverdigital/blog',
parameters: {},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['devolverdigital.com/blog'],
},
],
name: 'Official Blogs',
maintainers: ['XXY233'],
handler,
url: 'devolverdigital.com/blog',
};
async function handler() {
const baseUrl = 'https://www.devolverdigital.com/blog';
const { data: response } = await got(baseUrl);
const $ = load(response);
const nextData = JSON.parse($('#__NEXT_DATA__').text());
const items = await Promise.all(
nextData.props.pageProps.posts.map((postData) => {
const postUrl = `${baseUrl}/post/${postData.id}`;
return cache.tryGet(postUrl, async () => {
const { data: postPage } = await got(postUrl);
const $page = load(postPage);
$page('noscript').remove();
const postContent = $page('div.flex > div > div > div > div:not([class])');
// img resource redirection and
// clean up absolute layouts for img and span
const imageUrls = postData.body.filter((item) => item.type === 'upload' && item.value.cloudinary.resource_type === 'image').map((item) => item.value.cloudinary.secure_url);
const allImageSpans = postContent.find('span > img').parent();
allImageSpans.each((spanIndex, span) => {
$(span).attr('style', $(span).attr('style').replace('position:absolute', ''));
const img = $(span).find('img');
img.attr('src', imageUrls[spanIndex]);
img.attr('style', img.attr('style').replace('position:absolute', '').replace('width:0', '').replace('height:0', ''));
});
return {
title: postData.title,
link: postUrl,
author: postData.author,
pubDate: Date.parse(postData.createdAt),
updated: Date.parse(postData.updatedAt),
description: postContent.html(),
};
});
})
);
return {
title: 'DevolverDigital Blog',
language: 'en-us',
link: 'https://www.devolverdigital.com/blog',
item: items,
};
}