rsshub
Version:
Make RSS Great Again!
47 lines (41 loc) • 1.39 kB
text/typescript
import { Route } from '@/types';
import { load } from 'cheerio';
import ofetch from '@/utils/ofetch';
import { getData } from './utils';
export const route: Route = {
path: '/topic/:topic',
categories: ['new-media'],
example: '/psyche/topic/therapeia',
parameters: { topic: 'Topic' },
radar: [
{
source: ['psyche.co/:topic'],
},
],
name: 'Topics',
maintainers: ['emdoe'],
handler,
description: 'Supported categories: Therapeia, Eudaimonia, and Poiesis.',
};
async function handler(ctx) {
const url = `https://psyche.co/${ctx.req.param('topic')}`;
const response = await ofetch(url);
const $ = load(response);
const data = JSON.parse($('script#__NEXT_DATA__').text());
const articles = data.props.pageProps.articles;
const prefix = `https://psyche.co/_next/data/${data.buildId}`;
const list = Object.keys(articles).flatMap((type) =>
articles[type].edges.map((item) => ({
title: item.node.title,
link: `https://psyche.co/${type}/${item.node.slug}`,
json: `${prefix}/${type}/${item.node.slug}.json`,
}))
);
const items = await getData(list);
return {
title: `Psyche | ${data.props.pageProps.section.title}`,
link: url,
description: data.props.pageProps.section.metaDescription,
item: items,
};
}