RSSHub/lib/v2/wsj/news.js

52 lines
1.6 KiB
JavaScript

const got = require('@/utils/got');
const cheerio = require('cheerio');
const { asyncPoolAll, parseArticle } = require('./utils');
const hostMap = {
'en-us': 'https://www.wsj.com',
'zh-cn': 'https://cn.wsj.com/zh-hans',
'zh-tw': 'https://cn.wsj.com/zh-hant',
};
module.exports = async (ctx) => {
const lang = ctx.params.lang;
const category = ctx.params.category || '';
const host = hostMap[lang];
let subTitle = ` - ${lang.toUpperCase()}`;
let url = host;
if (category.length > 0) {
url = `${host}/news/${category}`;
subTitle = `${subTitle} - ${category}`;
}
const response = await got({
method: 'get',
url,
});
const $ = cheerio.load(response.data);
const contents = $('script:contains("window.__STATE__")').text();
const data = JSON.parse(contents.match(/\{.*\}/)[0]).data;
const filteredKeys = Object.entries(data)
.filter(([key, value]) => {
if (!key.startsWith('article')) {
return false;
}
const link = value.data.data.url;
return link.includes('wsj.com/articles/');
})
.map(([key]) => key);
const list = filteredKeys.map((key) => {
const item = {};
item.title = data[key].data.data.headline;
item.link = data[key].data.data.url;
item.test = key;
return item;
});
const items = await asyncPoolAll(10, list, (item) => parseArticle(item, ctx));
ctx.state.data = {
title: `WSJ${subTitle}`,
link: url,
description: `WSJ${subTitle}`,
item: items,
};
};