diff --git a/assets/radar-rules.js b/assets/radar-rules.js index dec70d15a..51143f377 100644 --- a/assets/radar-rules.js +++ b/assets/radar-rules.js @@ -483,6 +483,16 @@ }, ], }, + 'www.chicagotribune.com': { + _name: 'Chicago Tribune', + www: [ + { + title: 'Chicago Tribune', + docs: 'https://docs.rsshub.app/traditional_media.html#chicago-tribune', + source: '/', + }, + ], + }, 'haimaoba.com': { _name: '海猫吧', www: [ diff --git a/docs/en/traditional-media.md b/docs/en/traditional-media.md index 5ce3e96a9..5e138717b 100644 --- a/docs/en/traditional-media.md +++ b/docs/en/traditional-media.md @@ -26,6 +26,17 @@ Support major channels, refer to [BBC RSS feeds](https://www.bbc.co.uk/news/1062 +## Chicago Tribune + +### News + + + +Generates full-text that the official feed doesn't provide. +Refer to [Chicago Tribune's feed page](https://www.chicagotribune.com/about/ct-chicago-tribune-rss-feeds-htmlstory.html) for categories. For instance, `https://www.chicagotribune.com/arcio/rss/category/nation-world/` corresponds to `/chicagotribune/nation-world`. + + + ## China Dialogue ### Topics diff --git a/docs/traditional-media.md b/docs/traditional-media.md index 7b93cbcd9..4be7ae898 100644 --- a/docs/traditional-media.md +++ b/docs/traditional-media.md @@ -32,6 +32,17 @@ pageClass: routes +## Chicago Tribune + +### 新闻 + + + +相比官方 RSS,多提供全文。 +目录分类[见其网站](https://www.chicagotribune.com/about/ct-chicago-tribune-rss-feeds-htmlstory.html)。例如,`https://www.chicagotribune.com/arcio/rss/category/nation-world/` 对应的 RSSHub 路由是 `/chicagotribune/nation-world`。由于官方源的部分路由有两级,因此这里也相应需要填写子分类。 + + + ## e 公司 ### 快讯 diff --git a/lib/router.js b/lib/router.js index 21472c8bf..87c681e2c 100644 --- a/lib/router.js +++ b/lib/router.js @@ -2888,6 +2888,9 @@ router.get('/91ddcc/user/:user', require('./routes/91ddcc/user')); // BookwalkerTW热门新书 router.get('/bookwalkertw/news', require('./routes/bookwalkertw/news')); +// Chicago Tribune +router.get('/chicagotribune/:category/:subcategory?', require('./routes/chicagotribune/index')); + // Amazfit Watch Faces router.get('/amazfitwatchfaces/fresh/:model/:type?/:lang?', require('./routes/amazfitwatchfaces/fresh')); router.get('/amazfitwatchfaces/updated/:model/:type?/:lang?', require('./routes/amazfitwatchfaces/updated')); diff --git a/lib/routes/chicagotribune/index.js b/lib/routes/chicagotribune/index.js new file mode 100644 index 000000000..c06d9a644 --- /dev/null +++ b/lib/routes/chicagotribune/index.js @@ -0,0 +1,78 @@ +const cheerio = require('cheerio'); +const parser = require('@/utils/rss-parser'); +const got = require('@/utils/got'); + +module.exports = async (ctx) => { + const category = ctx.params.category; + const subcategory = ctx.params.subcategory; + const rssUrl = subcategory + ? `https://www.chicagotribune.com/arcio/rss/category/${category}/${subcategory}/?query=display_date:%5Bnow-2d+TO+now%5D+AND+revision.published:true&sort=display_date:desc#nt=instory-link` + : `https://www.chicagotribune.com/arcio/rss/category/${category}/?query=display_date:%5Bnow-2d+TO+now%5D+AND+revision.published:true&sort=display_date:desc#nt=instory-link`; + const feed = await parser.parseURL(rssUrl); + + const items = await Promise.all( + feed.items.map( + async (item) => + await ctx.cache.tryGet(item.link, async () => { + const response = await got({ + url: item.link, + method: 'get', + }); + const html = response.body; + const $ = cheerio.load(html); + const content = $('article > main > section#left'); + + const categories = $('meta[property="article:section"]') + .attr('content') + .split(',') + .map((e) => e.trim()) + .filter((e) => e !== ''); + + // Disable image lazyloading + content.find('img').each((i, e) => { + e = $(e); + e.attr('src', e.attr('data-src')); + }); + + // Remove unwanted DOMs + const unwanted_element_selectors = [ + '[data-pb-name="Recommender"]', + '.inline-ad', + '[data-type="newsletter-promo-card"]', + '[data-type="interstitial_link"]', + '[data-type="recommender"]', + '.recommender', + '[class*="pb-f-ads-"]', + ]; + unwanted_element_selectors.forEach((selector) => { + content.find(selector).each((i, e) => { + $(e).remove(); + }); + }); + + return { + title: item.title.trim(), + id: item.guid, + pubDate: new Date(item.pubDate).toUTCString(), + author: item.creator.trim(), + link: item.link, + summary: item.content.trim(), + description: content.html(), + category: categories, + icon: 'https://www.chicagotribune.com/pb/resources/images/ct_icons/144-iTunesArtwork.png', + logo: 'https://upload.wikimedia.org/wikipedia/commons/c/c4/Chicago_Tribune_Logo.svg', + }; + }) + ) + ); + + ctx.state.data = { + title: feed.title, + link: feed.link, + description: feed.description, + item: items, + language: 'en-us', + icon: 'https://www.chicagotribune.com/pb/resources/images/ct_icons/144-iTunesArtwork.png', + logo: 'https://upload.wikimedia.org/wikipedia/commons/c/c4/Chicago_Tribune_Logo.svg', + }; +};