RSSHub/lib/routes/peopo/topic.ts

94 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { load } from 'cheerio';
import type { Route } from '@/types';
import cache from '@/utils/cache';
import got from '@/utils/got';
import { parseDate } from '@/utils/parse-date';
import timezone from '@/utils/timezone';
const baseUrl = 'https://www.peopo.org';
export const route: Route = {
path: '/topic/:topicId?',
categories: ['new-media'],
example: '/peopo/topic/159',
parameters: { topicId: '分類 ID見下表默認為社會關懷' },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['peopo.org/topic/:topicId'],
target: '/topic/:topicId',
},
],
name: '新聞分類',
maintainers: [],
handler,
description: `| 分類 | ID |
| -------- | --- |
| 社會關懷 | 159 |
| 生態環保 | 113 |
| 文化古蹟 | 143 |
| 社區改造 | 160 |
| 教育學習 | 161 |
| 農業 | 163 |
| 生活休閒 | 162 |
| 媒體觀察 | 164 |
| 運動科技 | 165 |
| 政治經濟 | 166 |
| 北台灣 | 223 |
| 中台灣 | 224 |
| 南台灣 | 225 |
| 東台灣 | 226 |
| 校園中心 | 167 |
| 原住民族 | 227 |
| 天然災害 | 168 |`,
};
async function handler(ctx) {
const { topicId = '159' } = ctx.req.param();
const url = `${baseUrl}/topic/${topicId}`;
const response = await got(url);
const $ = load(response.data);
const list = $('.view-list-title')
.toArray()
.map((item) => {
item = $(item);
return {
title: item.find('a').text(),
link: new URL(item.find('a').attr('href'), baseUrl).href,
};
});
const items = await Promise.all(
list.map((item) =>
cache.tryGet(item.link, async () => {
const response = await got(item.link);
const $ = load(response.data);
item.author = $('#user-info h3').text();
item.category = $('#node-terms .inline li')
.toArray()
.map((item) => $(item).find('a').text());
item.pubDate = timezone(parseDate($('.submitted span').text()), +8);
item.description = ($('.field-name-field-video-id .field-items').text() ? $('.field-name-field-video-id input').attr('value') : '') + $('.post_text_s .field-items').html();
return item;
})
)
);
return {
title: $('head title').text(),
link: url,
language: 'zh-TW',
item: items,
};
}