rsshub
Version:
Make RSS Great Again!
504 lines (457 loc) • 24.7 kB
text/typescript
import path from 'node:path';
import { type CheerioAPI, type Cheerio, load } from 'cheerio';
import type { Element } from 'domhandler';
import { type Context } from 'hono';
import { type DataItem, type Route, type Data, ViewType } from '@/types';
import { art } from '@/utils/render';
import cache from '@/utils/cache';
import ofetch from '@/utils/ofetch';
import { parseDate } from '@/utils/parse-date';
export const handler = async (ctx: Context): Promise<Data> => {
const { category = 'zxyw' } = ctx.req.param();
const limit: number = Number.parseInt(ctx.req.query('limit') ?? '11', 10);
const rootUrl: string = 'https://www.chinacdc.cn';
const targetUrl: string = new URL(category.endsWith('/') ? category : `${category}/`, rootUrl).href;
const response = await ofetch(targetUrl);
const $: CheerioAPI = load(response);
const language: string = $('html').prop('lang');
let items: DataItem[] = $('ul.xw_list li')
.slice(0, limit)
.toArray()
.map((item): DataItem => {
const $item: Cheerio<Element> = $(item);
const aEl: Cheerio<Element> = $item.find('a');
const title: string = aEl.prop('title') === undefined ? aEl.text() : aEl.prop('title');
const dateMatch = title.match(/(\d{4}-\d{2}-\d{2})$/);
let pubDate;
let cleanTitle = title;
if (dateMatch) {
pubDate = parseDate(dateMatch[0]);
cleanTitle = title.replace(/\d{4}-\d{2}-\d{2}$/, '').trim();
} else {
const spanText = $item.find('span').text().trim();
pubDate = spanText ? parseDate(spanText) : undefined;
}
const description: string = art(path.join(__dirname, 'templates/description.art'), {
intro: $item.find('p.zy').text(),
});
const imageSrc: string | undefined = $item.find('img').prop('src');
const imageType: string | undefined = imageSrc?.split(/\./).pop();
const image: string | undefined = imageSrc ? new URL(imageSrc, targetUrl).href : undefined;
const media: Record<string, Record<string, string>> = {};
if (imageType && image) {
media[imageType] = { url: image };
}
return {
title: cleanTitle,
description,
pubDate,
link: new URL(aEl.prop('href') as string, targetUrl).href,
content: {
html: description,
text: $item.find('p.zy').text(),
},
image,
banner: image,
language,
media: Object.keys(media).length > 0 ? media : undefined,
};
});
items = (
await Promise.all(
items.map((item) => {
if (!item.link && typeof item.link !== 'string') {
return item;
}
return cache.tryGet(item.link, async (): Promise<DataItem> => {
const detailResponse = await ofetch(item.link);
const $$: CheerioAPI = load(detailResponse);
const detailTitle: string = $$('h5').text();
const description: string = art(path.join(__dirname, 'templates/description.art'), {
description: $$('div.TRS_Editor').html(),
});
const detailDate = $$('span.fb em').text().trim();
const pubDate = detailDate ? parseDate(detailDate) : item.pubDate;
return {
title: detailTitle || item.title, // Use original title as fallback
description,
link: item.link,
pubDate,
content: {
html: description,
text: $$('div.TRS_Editor').text(),
},
image: item.image,
banner: item.banner,
language,
media: item.media,
};
});
})
)
).filter((_): _ is DataItem => true);
const author: string = $('title').text();
const title: string = $('div.erjiCurNav').text();
const feedImage: string = new URL($('img.logo').prop('src') as string, targetUrl).href;
return {
title: `${author} - ${title}`,
description: title,
link: targetUrl,
item: items,
allowEmpty: true,
image: feedImage,
author,
language,
id: targetUrl,
};
};
export const route: Route = {
path: '/:category{.+}?',
name: '通用',
url: 'www.chinacdc.cn',
maintainers: ['nczitzk'],
handler,
example: '/chinacdc/zxyw',
parameters: {
category: '分类,默认为 `zxyw`,即中心要闻,可在对应分类页 URL 中找到,Category, `zxyw`,即中心要闻 by default',
},
description: `::: tip
若订阅 [中心要闻](https://www.chinacdc.cn/zxyw/),网址为 \`https://www.chinacdc.cn/zxyw/\`,请截取 \`https://www.chinacdc.cn/\` 到末尾 \`/\` 的部分 \`zxyw\` 作为 \`category\` 参数填入,此时目标路由为 [\`/chinacdc/zxyw\`](https://rsshub.app/chinacdc/zxyw)。
:::
| [中心要闻](https://www.chinacdc.cn/zxyw/) | [通知公告](https://www.chinacdc.cn/tzgg/) |
| ----------------------------------------- | ----------------------------------------- |
| [zxyw](https://rsshub.app/chinacdc/zxyw) | [tzgg](https://rsshub.app/chinacdc/tzgg) |
<details>
<summary>更多分类</summary>
#### [党建园地](https://www.chinacdc.cn/dqgz/djgz/)
| [党建工作](https://www.chinacdc.cn/dqgz/djgz/) | [廉政文化](https://www.chinacdc.cn/djgz_13611/) | [工会工作](https://www.chinacdc.cn/ghgz/) | [团青工作](https://www.chinacdc.cn/tqgz/) | [理论学习](https://www.chinacdc.cn/tqgz_13618/) |
| -------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------------------- |
| [dqgz/djgz](https://rsshub.app/chinacdc/dqgz/djgz) | [dqgz/djgz_13611](https://rsshub.app/chinacdc/dqgz/djgz_13611) | [dqgz/ghgz](https://rsshub.app/chinacdc/dqgz/ghgz) | [dqgz/tqgz](https://rsshub.app/chinacdc/dqgz/tqgz) | [dqgz/tqgz_13618](https://rsshub.app/chinacdc/dqgz/tqgz_13618) |
#### [疾控应急](https://www.chinacdc.cn/jkyj/)
| [传染病](https://www.chinacdc.cn/jkyj/crb2/) | [突发公共卫生事件](https://www.chinacdc.cn/jkyj/tfggws/) | [慢性病与伤害防控](https://www.chinacdc.cn/jkyj/mxfcrxjb2/) | [烟草控制](https://www.chinacdc.cn/jkyj/yckz/) | [营养与健康](https://www.chinacdc.cn/jkyj/yyyjk2/) |
| -------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------ | -------------------------------------------------- | ------------------------------------------------------ |
| [jkyj/crb2](https://rsshub.app/chinacdc/jkyj/crb2) | [jkyj/tfggws](https://rsshub.app/chinacdc/jkyj/tfggws) | [jkyj/mxfcrxjb2](https://rsshub.app/chinacdc/jkyj/mxfcrxjb2) | [jkyj/yckz](https://rsshub.app/chinacdc/jkyj/yckz) | [jkyj/yyyjk2](https://rsshub.app/chinacdc/jkyj/yyyjk2) |
| [环境与健康](https://www.chinacdc.cn/jkyj/hjyjk/) | [职业卫生与中毒控制](https://www.chinacdc.cn/jkyj/hjwsyzdkz/) | [放射卫生](https://www.chinacdc.cn/jkyj/fsws/) | [免疫规划](https://www.chinacdc.cn/jkyj/mygh02/) | [结核病防控](https://www.chinacdc.cn/jkyj/jhbfk/) |
| ---------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------ | ---------------------------------------------------- |
| [jkyj/hjyjk](https://rsshub.app/chinacdc/jkyj/hjyjk) | [jkyj/hjwsyzdkz](https://rsshub.app/chinacdc/jkyj/hjwsyzdkz) | [jkyj/fsws](https://rsshub.app/chinacdc/jkyj/fsws) | [jkyj/mygh02](https://rsshub.app/chinacdc/jkyj/mygh02) | [jkyj/jhbfk](https://rsshub.app/chinacdc/jkyj/jhbfk) |
| [寄生虫病](https://www.chinacdc.cn/jkyj/jscb/) |
| -------------------------------------------------- |
| [jkyj/jscb](https://rsshub.app/chinacdc/jkyj/jscb) |
#### [科学研究](https://www.chinacdc.cn/kxyj/)
| [科技进展](https://www.chinacdc.cn/kxyj/kjjz/) | [学术动态](https://www.chinacdc.cn/kxyj/xsdt/) | [科研平台](https://www.chinacdc.cn/kxyj/xsjl/) | [科研亮点](https://www.chinacdc.cn/kxyj/kyld/) | [科技政策](https://www.chinacdc.cn/kxyj/kjzc/) |
| -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- |
| [kxyj/kjjz](https://rsshub.app/chinacdc/kxyj/kjjz) | [kxyj/xsdt](https://rsshub.app/chinacdc/kxyj/xsdt) | [kxyj/xsjl](https://rsshub.app/chinacdc/kxyj/xsjl) | [kxyj/kyld](https://rsshub.app/chinacdc/kxyj/kyld) | [kxyj/kjzc](https://rsshub.app/chinacdc/kxyj/kjzc) |
#### [教育培训](https://www.chinacdc.cn/jypx/)
| [研究生院](https://www.chinacdc.cn/jypx/yjsy/) | [继续教育](https://www.chinacdc.cn/jypx/jxjy/) | [博士后](https://www.chinacdc.cn/jypx/bsh/) | [中国现场流行病学培训项目(CFETP)](https://www.chinacdc.cn/jypx/CFETP/) |
| -------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------ |
| [jypx/yjsy](https://rsshub.app/chinacdc/jypx/yjsy) | [jypx/jxjy](https://rsshub.app/chinacdc/jypx/jxjy) | [jypx/bsh](https://rsshub.app/chinacdc/jypx/bsh) | [jypx/CFETP](https://rsshub.app/chinacdc/jypx/CFETP) |
#### [全球公卫](https://www.chinacdc.cn/qqgw/)
| [合作伙伴](https://www.chinacdc.cn/qqgw/hzhb/) | [世界卫生组织合作中心和参比实验室](https://www.chinacdc.cn/qqgw/wszz/) | [国际交流 (港澳台交流)](https://www.chinacdc.cn/qqgw/gjjl/) | [公共卫生援外与合作](https://www.chinacdc.cn/qqgw/ggws/) |
| -------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------- | -------------------------------------------------------- |
| [qqgw/hzhb](https://rsshub.app/chinacdc/qqgw/hzhb) | [qqgw/wszz](https://rsshub.app/chinacdc/qqgw/wszz) | [qqgw/gjjl](https://rsshub.app/chinacdc/qqgw/gjjl) | [qqgw/ggws](https://rsshub.app/chinacdc/qqgw/ggws) |
#### [人才建设](https://www.chinacdc.cn/rcjs/)
| [院士风采](https://www.chinacdc.cn/rcjs/ysfc/) | [首席专家](https://www.chinacdc.cn/rcjs/sxzj/) | [人才队伍](https://www.chinacdc.cn/rcjs/rcdw/) | [人才招聘](https://www.chinacdc.cn/rcjs/rczp/) |
| -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- |
| [rcjs/ysfc](https://rsshub.app/chinacdc/rcjs/ysfc) | [rcjs/sxzj](https://rsshub.app/chinacdc/rcjs/sxzj) | [rcjs/rcdw](https://rsshub.app/chinacdc/rcjs/rcdw) | [rcjs/rczp](https://rsshub.app/chinacdc/rcjs/rczp) |
#### [健康数据](https://www.chinacdc.cn/jksj/)
| [全国法定传染病疫情情况](https://www.chinacdc.cn/jksj/jksj01/) | [全国新型冠状病毒感染疫情情况](https://www.chinacdc.cn/jksj/xgbdyq/) | [重点传染病和突发公共卫生事件风险评估报告](https://www.chinacdc.cn/jksj/jksj02/) | [全球传染病事件风险评估报告](https://www.chinacdc.cn/jksj/jksj03/) | [全国预防接种异常反应监测信息概况](https://www.chinacdc.cn/jksj/jksj04_14209/) |
| -------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
| [jksj/jksj01](https://rsshub.app/chinacdc/jksj/jksj01) | [jksj/xgbdyq](https://rsshub.app/chinacdc/jksj/xgbdyq) | [jksj/jksj02](https://rsshub.app/chinacdc/jksj/jksj02) | [jksj/jksj03](https://rsshub.app/chinacdc/jksj/jksj03) | [jksj/jksj04_14209](https://rsshub.app/chinacdc/jksj/jksj04_14209) |
| [流感监测周报](https://www.chinacdc.cn/jksj/jksj04_14249/) | [全国急性呼吸道传染病哨点监测情况](https://www.chinacdc.cn/jksj/jksj04_14275/) | [健康报告](https://www.chinacdc.cn/jksj/jksj04/) |
| ------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------ |
| [jksj/jksj04_14249](https://rsshub.app/chinacdc/jksj/jksj04_14249) | [jksj/jksj04_14275](https://rsshub.app/chinacdc/jksj/jksj04_14275) | [jksj/jksj04](https://rsshub.app/chinacdc/jksj/jksj04) |
#### [健康科普](https://www.chinacdc.cn/jkkp/)
| [传染病](https://www.chinacdc.cn/jkkp/crb/) | [慢性非传染性疾病](https://www.chinacdc.cn/jkkp/mxfcrb/) | [免疫规划](https://www.chinacdc.cn/jkkp/mygh/) | [公共卫生事件](https://www.chinacdc.cn/jkkp/ggws/) | [烟草控制](https://www.chinacdc.cn/jkkp/yckz/) |
| ------------------------------------------------ | -------------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- |
| [jkkp/crb](https://rsshub.app/chinacdc/jkkp/crb) | [jkkp/mxfcrb](https://rsshub.app/chinacdc/jkkp/mxfcrb) | [jkkp/mygh](https://rsshub.app/chinacdc/jkkp/mygh) | [jkkp/ggws](https://rsshub.app/chinacdc/jkkp/ggws) | [jkkp/yckz](https://rsshub.app/chinacdc/jkkp/yckz) |
| [营养与健康](https://www.chinacdc.cn/jkkp/yyjk/) | [环境健康](https://www.chinacdc.cn/jkkp/hjjk/) | [职业健康与中毒控制](https://www.chinacdc.cn/jkkp/zyjk/) | [放射卫生](https://www.chinacdc.cn/jkkp/fsws/) |
| -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------- |
| [jkkp/yyjk](https://rsshub.app/chinacdc/jkkp/yyjk) | [jkkp/hjjk](https://rsshub.app/chinacdc/jkkp/hjjk) | [jkkp/zyjk](https://rsshub.app/chinacdc/jkkp/zyjk) | [jkkp/fsws](https://rsshub.app/chinacdc/jkkp/fsws) |
</details>
`,
categories: ['government'],
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportRadar: true,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['www.chinacdc.cn/:category'],
target: (params) => {
const category = params.category;
return `/chinacdc${category ? `/${category}` : ''}`;
},
},
{
title: '中心要闻',
source: ['www.chinacdc.cn/zxyw/'],
target: '/zxyw',
},
{
title: '通知公告',
source: ['www.chinacdc.cn/tzgg/'],
target: '/tzgg',
},
{
title: '党建园地 - 廉政文化',
source: ['www.chinacdc.cn/djgz_13611/'],
target: '/dqgz/djgz_13611',
},
{
title: '党建园地 - 党建工作',
source: ['www.chinacdc.cn/dqgz/'],
target: '/dqgz/djgz',
},
{
title: '党建园地 - 廉政文化',
source: ['www.chinacdc.cn/djgz_13611/'],
target: '/dqgz/djgz_13611',
},
{
title: '党建园地 - 工会工作',
source: ['www.chinacdc.cn/ghgz/'],
target: '/dqgz/ghgz',
},
{
title: '党建园地 - 团青工作',
source: ['www.chinacdc.cn/tqgz/'],
target: '/dqgz/tqgz',
},
{
title: '党建园地 - 理论学习',
source: ['www.chinacdc.cn/tqgz_13618/'],
target: '/dqgz/tqgz_13618',
},
{
title: '疾控应急 - 传染病',
source: ['www.chinacdc.cn/jkyj/crb2/'],
target: '/jkyj/crb2',
},
{
title: '疾控应急 - 突发公共卫生事件',
source: ['www.chinacdc.cn/jkyj/tfggws/'],
target: '/jkyj/tfggws',
},
{
title: '疾控应急 - 慢性病与伤害防控',
source: ['www.chinacdc.cn/jkyj/mxfcrxjb2/'],
target: '/jkyj/mxfcrxjb2',
},
{
title: '疾控应急 - 烟草控制',
source: ['www.chinacdc.cn/jkyj/yckz/'],
target: '/jkyj/yckz',
},
{
title: '疾控应急 - 营养与健康',
source: ['www.chinacdc.cn/jkyj/yyyjk2/'],
target: '/jkyj/yyyjk2',
},
{
title: '疾控应急 - 环境与健康',
source: ['www.chinacdc.cn/jkyj/hjyjk/'],
target: '/jkyj/hjyjk',
},
{
title: '疾控应急 - 职业卫生与中毒控制',
source: ['www.chinacdc.cn/jkyj/hjwsyzdkz/'],
target: '/jkyj/hjwsyzdkz',
},
{
title: '疾控应急 - 放射卫生',
source: ['www.chinacdc.cn/jkyj/fsws/'],
target: '/jkyj/fsws',
},
{
title: '疾控应急 - 免疫规划',
source: ['www.chinacdc.cn/jkyj/mygh02/'],
target: '/jkyj/mygh02',
},
{
title: '疾控应急 - 结核病防控',
source: ['www.chinacdc.cn/jkyj/jhbfk/'],
target: '/jkyj/jhbfk',
},
{
title: '疾控应急 - 寄生虫病',
source: ['www.chinacdc.cn/jkyj/jscb/'],
target: '/jkyj/jscb',
},
{
title: '科学研究 - 科技进展',
source: ['www.chinacdc.cn/kxyj/kjjz/'],
target: '/kxyj/kjjz',
},
{
title: '科学研究 - 学术动态',
source: ['www.chinacdc.cn/kxyj/xsdt/'],
target: '/kxyj/xsdt',
},
{
title: '科学研究 - 科研平台',
source: ['www.chinacdc.cn/kxyj/xsjl/'],
target: '/kxyj/xsjl',
},
{
title: '科学研究 - 科研亮点',
source: ['www.chinacdc.cn/kxyj/kyld/'],
target: '/kxyj/kyld',
},
{
title: '科学研究 - 科技政策',
source: ['www.chinacdc.cn/kxyj/kjzc/'],
target: '/kxyj/kjzc',
},
{
title: '教育培训 - 研究生院',
source: ['www.chinacdc.cn/jypx/yjsy/'],
target: '/jypx/yjsy',
},
{
title: '教育培训 - 继续教育',
source: ['www.chinacdc.cn/jypx/jxjy/'],
target: '/jypx/jxjy',
},
{
title: '教育培训 - 博士后',
source: ['www.chinacdc.cn/jypx/bsh/'],
target: '/jypx/bsh',
},
{
title: '教育培训 - 中国现场流行病学培训项目(CFETP)',
source: ['www.chinacdc.cn/jypx/CFETP/'],
target: '/jypx/CFETP',
},
{
title: '全球公卫 - 合作伙伴',
source: ['www.chinacdc.cn/qqgw/hzhb/'],
target: '/qqgw/hzhb',
},
{
title: '全球公卫 - 世界卫生组织合作中心和参比实验室',
source: ['www.chinacdc.cn/qqgw/wszz/'],
target: '/qqgw/wszz',
},
{
title: '全球公卫 - 国际交流 (港澳台交流)',
source: ['www.chinacdc.cn/qqgw/gjjl/'],
target: '/qqgw/gjjl',
},
{
title: '全球公卫 - 公共卫生援外与合作',
source: ['www.chinacdc.cn/qqgw/ggws/'],
target: '/qqgw/ggws',
},
{
title: '人才建设 - 院士风采',
source: ['www.chinacdc.cn/rcjs/ysfc/'],
target: '/rcjs/ysfc',
},
{
title: '人才建设 - 首席专家',
source: ['www.chinacdc.cn/rcjs/sxzj/'],
target: '/rcjs/sxzj',
},
{
title: '人才建设 - 人才队伍',
source: ['www.chinacdc.cn/rcjs/rcdw/'],
target: '/rcjs/rcdw',
},
{
title: '人才建设 - 人才招聘',
source: ['www.chinacdc.cn/rcjs/rczp/'],
target: '/rcjs/rczp',
},
{
title: '健康数据 - 全国法定传染病疫情情况',
source: ['www.chinacdc.cn/jksj/jksj01/'],
target: '/jksj/jksj01',
},
{
title: '健康数据 - 全国新型冠状病毒感染疫情情况',
source: ['www.chinacdc.cn/jksj/xgbdyq/'],
target: '/jksj/xgbdyq',
},
{
title: '健康数据 - 重点传染病和突发公共卫生事件风险评估报告',
source: ['www.chinacdc.cn/jksj/jksj02/'],
target: '/jksj/jksj02',
},
{
title: '健康数据 - 全球传染病事件风险评估报告',
source: ['www.chinacdc.cn/jksj/jksj03/'],
target: '/jksj/jksj03',
},
{
title: '健康数据 - 全国预防接种异常反应监测信息概况',
source: ['www.chinacdc.cn/jksj/jksj04_14209/'],
target: '/jksj/jksj04_14209',
},
{
title: '健康数据 - 流感监测周报',
source: ['www.chinacdc.cn/jksj/jksj04_14249/'],
target: '/jksj/jksj04_14249',
},
{
title: '健康数据 - 全国急性呼吸道传染病哨点监测情况',
source: ['www.chinacdc.cn/jksj/jksj04_14275/'],
target: '/jksj/jksj04_14275',
},
{
title: '健康数据 - 健康报告',
source: ['www.chinacdc.cn/jksj/jksj04/'],
target: '/jksj/jksj04',
},
{
title: '健康科普 - 传染病',
source: ['www.chinacdc.cn/jkkp/crb/'],
target: '/jkkp/crb',
},
{
title: '健康科普 - 慢性非传染性疾病',
source: ['www.chinacdc.cn/jkkp/mxfcrb/'],
target: '/jkkp/mxfcrb',
},
{
title: '健康科普 - 免疫规划',
source: ['www.chinacdc.cn/jkkp/mygh/'],
target: '/jkkp/mygh',
},
{
title: '健康科普 - 公共卫生事件',
source: ['www.chinacdc.cn/jkkp/ggws/'],
target: '/jkkp/ggws',
},
{
title: '健康科普 - 烟草控制',
source: ['www.chinacdc.cn/jkkp/yckz/'],
target: '/jkkp/yckz',
},
{
title: '健康科普 - 营养与健康',
source: ['www.chinacdc.cn/jkkp/yyjk/'],
target: '/jkkp/yyjk',
},
{
title: '健康科普 - 环境健康',
source: ['www.chinacdc.cn/jkkp/hjjk/'],
target: '/jkkp/hjjk',
},
{
title: '健康科普 - 职业健康与中毒控制',
source: ['www.chinacdc.cn/jkkp/zyjk/'],
target: '/jkkp/zyjk',
},
{
title: '健康科普 - 放射卫生',
source: ['www.chinacdc.cn/jkkp/fsws/'],
target: '/jkkp/fsws',
},
],
view: ViewType.Articles,
};