UNPKG

rsshub

Version:
95 lines (81 loc) 3.52 kB
import { Route } from '@/types'; import cache from '@/utils/cache'; import got from '@/utils/got'; import { load } from 'cheerio'; import { isValidHost } from '@/utils/valid-host'; import { parseDate } from '@/utils/parse-date'; import timezone from '@/utils/timezone'; import { parseArticle } from './utils'; import InvalidParameterError from '@/errors/types/invalid-parameter'; export const route: Route = { path: '/:column/:category', categories: ['traditional-media'], example: '/caixin/finance/regulation', parameters: { column: '栏目名', category: '栏目下的子分类名' }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: true, supportScihub: false, }, name: '新闻分类', maintainers: ['idealclover'], handler, description: `Column 列表: | 经济 | 金融 | 政经 | 环科 | 世界 | 观点网 | 文化 | 周刊 | | ------- | ------- | ----- | ------- | ------------- | ------- | ------- | ------ | | economy | finance | china | science | international | opinion | culture | weekly | 以金融板块为例的 category 列表:(其余 column 以类似方式寻找) | 监管 | 银行 | 证券基金 | 信托保险 | 投资 | 创新 | 市场 | | ---------- | ---- | -------- | ---------------- | ---------- | ---------- | ------ | | regulation | bank | stock | insurance\_trust | investment | innovation | market | Category 列表: | 封面报道 | 开卷 | 社论 | 时事 | 编辑寄语 | 经济 | 金融 | 商业 | 环境与科技 | 民生 | 副刊 | | ---------- | ----- | --------- | ---------------- | ------------ | ------- | ------- | -------- | ----------------------- | ------- | ------ | | coverstory | first | editorial | current\_affairs | editor\_desk | economy | finance | business | environment\_technology | cwcivil | column |`, }; async function handler(ctx) { const category = ctx.req.param('category'); const column = ctx.req.param('column'); const url = `https://${column}.caixin.com/${category}`; if (!isValidHost(column)) { throw new InvalidParameterError('Invalid column'); } const response = await got(url); const $ = load(response.data); const title = $('head title').text(); const entity = JSON.parse( $('script') .text() .match(/var entity = ({.*?})/)[1] ); const { data: { datas: data }, } = await got('https://gateway.caixin.com/api/extapi/homeInterface.jsp', { searchParams: { subject: entity.id, type: 0, count: ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit')) : 25, picdim: '_266_177', start: 0, }, }); const list = data.map((item) => ({ title: item.desc, description: item.summ, link: item.link.replace('http://', 'https://'), pubDate: timezone(parseDate(item.time), +8), category: item.keyword.split(' '), audio: item.audioUrl, audio_image_url: item.pict.imgs[0].url, })); const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => parseArticle(item)))); return { title, link: url, description: '财新网 - 提供财经新闻及资讯服务', item: items, }; }