RSSHub/lib/v2/scmp/topic.js

68 lines
2.5 KiB
JavaScript

import cache from '@/utils/cache';
import { load } from 'cheerio';
import got from '@/utils/got';
import { parseDate } from '@/utils/parse-date';
const { parseItem } = require('./utils');
module.exports = async (ctx) => {
const topic = ctx.req.param('topic');
const limit = Number.parseInt(ctx.req.query('limit'), 10) || 30;
const pageUrl = `https://www.scmp.com/topics/${topic}`;
const { data: pageResponse } = await got(pageUrl);
const $ = load(pageResponse);
const nextData = JSON.parse($('script#__NEXT_DATA__').text());
const topicData = nextData.props.pageProps.payload.data.topic;
const variables = nextData.props.pageProps.operationDescriptor.root.variables;
const { data: apiResponse } = await got('https://apigw.scmp.com/content-delivery/v2', {
headers: {
apikey: 'MyYvyg8M9RTaevVlcIRhN5yRIqqVssNY',
'content-type': 'application/json',
},
searchParams: {
// got v11 does not support nested object in searchParams
extensions: JSON.stringify({
persistedQuery: {
sha256Hash: '8c951c1c2d4e94bc37d06dd94571552da4c0440c744acd00f2af84d3d8b6e2cf',
version: 1,
},
}),
operationName: 'topicContentListPaginationQuery',
variables: JSON.stringify({
applicationIds: variables.applicationIds,
count: limit,
scmpPlusPaywallTypeIds: variables.scmpPlusPaywallTypeIds,
id: topicData.id,
}),
},
});
const list = apiResponse.data.node.contents.edges.map(({ node }) => ({
title: node.headline,
summary: node.summary.text,
link: `https://www.scmp.com${node.urlAlias}`,
author: node.authors.map((a) => a.name).join(', '),
pubDate: parseDate(node.publishedDate, 'x'),
updated: parseDate(node.updatedDate, 'x'),
}));
const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => parseItem(item))));
ctx.set('json', {
nextData,
apiResponse,
});
ctx.set('data', {
title: topicData.name,
link: pageUrl,
description: topicData.description.text,
item: items,
language: 'en-hk',
icon: 'https://assets.i-scmp.com/static/img/icons/scmp-icon-256x256.png',
logo: 'https://customerservice.scmp.com/img/logo_scmp@2x.png',
image: 'https://assets-v2.i-scmp.com/production/_next/static/media/default-image.d1be8967.png',
});
};