rsshub
Version:
Make RSS Great Again!
109 lines (99 loc) • 4.44 kB
text/typescript
import type { Data, DataItem, Route } from '@/types';
import ofetch from '@/utils/ofetch';
import cache from '@/utils/cache';
import { parseDate } from '@/utils/parse-date';
import type { ArticleDetailResponse, ArticleListResponse, DateListResponse, SectionListResponse } from './types';
import { art } from '@/utils/render';
import path from 'node:path';
import timezone from '@/utils/timezone';
import dayjs from 'dayjs';
import { load } from 'cheerio';
const SITE_ID = '811c18b08cf04e79be3b67d6902ee1a7';
const CODE = 'KJRB';
const API_HOST = 'https://epaper.stdaily.com/stdailynewspaperapi';
export const route: Route = {
path: '/digitalpaper',
categories: ['traditional-media'],
example: '/stdaily/digitalpaper',
name: '科技日报',
maintainers: ['lyqluis', 'KarasuShin'],
handler,
features: {
supportRadar: true,
},
radar: [
{
source: ['epaper.stdaily.com/statics/technology-site/index.html'],
target: '/digitalpaper',
},
],
};
async function handler() {
const dateListResponse = await ofetch<DateListResponse>(`${API_HOST}/uv/article/period/date`, {
method: 'POST',
body: {
code: CODE,
date: dayjs(new Date(), 'YYYY-MM-01'),
},
headers: { 'X-Requested-With': 'XMLHttpRequest' },
});
const lastDate = dateListResponse.obj.dateList.toSorted().at(-1);
const sectionListResponse = await ofetch<SectionListResponse>(`${API_HOST}/uv/article/period/periodTime`, {
method: 'POST',
body: {
code: CODE,
periodTime: lastDate,
siteId: SITE_ID,
},
headers: { 'X-Requested-With': 'XMLHttpRequest' },
});
const items = await Promise.all(
sectionListResponse.obj.editionList.map((section) =>
cache.tryGet(`stdaily:epaper:${section.id}`, async () => {
const { list } = await ofetch<ArticleListResponse>(`${API_HOST}/uv/article/article/editionId`, {
method: 'POST',
body: {
id: section.id,
siteId: SITE_ID,
},
headers: { 'X-Requested-With': 'XMLHttpRequest' },
});
return await Promise.all(
list.map(
async (article) =>
await cache.tryGet(`stddaily:epaper:article:${article.id}`, async () => {
const {
obj: { articleVo },
} = await ofetch<ArticleDetailResponse>(`${API_HOST}/uv/article/article/articleId`, {
method: 'POST',
body: {
code: CODE,
id: article.id,
siteId: SITE_ID,
},
headers: { 'X-Requested-With': 'XMLHttpRequest' },
});
return {
title: `${articleVo.editionName.match(/:(.*)/)?.[1]} - ${load(articleVo.title).text()}`,
description: art(path.join(__dirname, 'templates/description.art'), {
subtitle: articleVo.subtitle,
pics: articleVo.picList ?? [],
content: articleVo.content,
}),
pubDate: timezone(parseDate(articleVo.periodTime), +8),
author: articleVo.author,
link: `https://epaper.stdaily.com/statics/technology-site/index.html#/home?isDetail=1¤tNewsId=${article.id}¤tVersionName=${articleVo.editionName}¤tVersion=${Number(section.editionCode)}&timeValue=${articleVo.periodTime}`,
} as DataItem;
})
)
);
})
)
);
return {
title: '中国科技网 - 科技日报',
link: 'https://epaper.stdaily.com',
item: items.flat(),
image: 'https://www.stdaily.com/favicon.ico',
} as Data;
}