UNPKG

rsshub

Version:
61 lines (51 loc) 1.88 kB
import { Route, ViewType } from '@/types'; import ofetch from '@/utils/ofetch'; import { load } from 'cheerio'; import { parseDate } from '@/utils/parse-date'; import timezone from '@/utils/timezone'; import { isValidHost } from '@/utils/valid-host'; import InvalidParameterError from '@/errors/types/invalid-parameter'; import MarkdownIt from 'markdown-it'; const md = MarkdownIt({ html: true, }); export const route: Route = { path: '/posts/:site', categories: ['blog'], example: '/posts/walnut', parameters: { site: '站点名,原则上只要是 `{site}.hedwig.pub` 都可以匹配' }, features: { supportRadar: false, }, name: 'Posts', url: 'hedwig.pub', maintainers: ['zwithz', 'GetToSet'], view: ViewType.Articles, handler: async (ctx) => { const { site } = ctx.req.param(); if (!isValidHost(site)) { throw new InvalidParameterError('Invalid site'); } const baseUrl = `https://${site}.hedwig.pub`; const response = await ofetch(baseUrl); const $ = load(response); const text = $('script#__NEXT_DATA__').text(); const json = JSON.parse(text); const pageProps = json.props.pageProps; const list = pageProps.issuesByNewsletter.map((item) => { const description = item.blocks.reduce((desc, block) => desc + md.render(block.markdown.text), ''); return { title: item.subject, description, pubDate: timezone(parseDate(item.publishAt, 'YYYY-MM-DDTHH:mm:ss.SSS[Z]'), +0), link: `${baseUrl}/i/${item.urlFriendlyName}`, }; }); return { title: pageProps.newsletter.name, description: pageProps.newsletter.about, link: baseUrl, item: list, }; }, };