From ea6ec949bf619402fe7697680d34953f2eecc6a3 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Tue, 19 Dec 2023 22:03:27 +0800 Subject: [PATCH] feat: remove notOperational routes - traditional media --- assets/radar-rules.js | 1 - lib/radar-rules.js | 12 - lib/router.js | 32 -- lib/routes/asahi/area.js | 57 --- lib/routes/bjnews/epaper.js | 80 ---- lib/routes/boston/index.js | 73 ---- lib/routes/chinadialogue/column.js | 58 --- lib/routes/chinadialogue/topics.js | 55 --- lib/routes/chinatimes/index.js | 115 ------ lib/routes/fjnews/fznews.js | 55 --- lib/routes/fjnews/jjnews.js | 43 -- lib/routes/hkcd/pdf.js | 30 -- lib/routes/qlwb/city.js | 54 --- lib/routes/qlwb/news.js | 37 -- lib/routes/sbs/chinese.js | 70 ---- lib/routes/wired/tag.js | 31 -- lib/v2/appledaily/index.js | 65 --- lib/v2/appledaily/maintainer.js | 3 - lib/v2/appledaily/radar.js | 157 -------- lib/v2/appledaily/router.js | 3 - lib/v2/cctv/maintainer.js | 1 - lib/v2/cctv/radar.js | 6 - lib/v2/cctv/router.js | 1 - lib/v2/cctv/special.js | 110 ------ lib/v2/cntheory/maintainer.js | 3 - lib/v2/cntheory/paper.js | 89 ----- lib/v2/cntheory/radar.js | 13 - lib/v2/cntheory/router.js | 3 - lib/v2/cntheory/templates/description.art | 2 - lib/v2/eastday/find.js | 49 --- lib/v2/eastday/maintainer.js | 1 - lib/v2/eastday/radar.js | 6 - lib/v2/eastday/router.js | 1 - lib/v2/economist/download.js | 30 -- lib/v2/economist/gre-vocabulary.js | 19 - lib/v2/economist/maintainer.js | 2 - lib/v2/economist/radar.js | 8 - lib/v2/economist/router.js | 2 - lib/v2/ft/maintainer.js | 1 - lib/v2/ft/myft.js | 51 --- lib/v2/ft/radar.js | 13 - lib/v2/ft/router.js | 1 - lib/v2/gz-cmc/index.js | 137 ------- lib/v2/gz-cmc/maintainer.js | 3 - lib/v2/gz-cmc/radar.js | 12 - lib/v2/gz-cmc/router.js | 3 - lib/v2/gz-cmc/templates/description.art | 3 - lib/v2/hket/index.js | 122 ------ lib/v2/hket/maintainer.js | 3 - lib/v2/hket/radar.js | 45 --- lib/v2/hket/router.js | 3 - lib/v2/hket/templates/description.art | 1 - lib/v2/hket/templates/image.art | 1 - lib/v2/hyqss/index.js | 89 ----- lib/v2/hyqss/maintainer.js | 4 - lib/v2/hyqss/radar.js | 22 -- lib/v2/hyqss/router.js | 3 - lib/v2/i-cable/category.js | 74 ---- lib/v2/i-cable/maintainer.js | 3 - lib/v2/i-cable/radar.js | 13 - lib/v2/i-cable/router.js | 3 - lib/v2/i-cable/templates/desc.art | 8 - lib/v2/nhk/news.js | 2 +- lib/v2/nytimes/author.js | 43 -- lib/v2/nytimes/radar.js | 6 - lib/v2/nytimes/router.js | 1 - lib/v2/radiofrance/geopolitique.js | 33 -- lib/v2/radiofrance/maintainer.js | 3 - lib/v2/radiofrance/radar.js | 13 - lib/v2/radiofrance/router.js | 3 - lib/v2/radiofrance/templates/article.art | 6 - lib/v2/taiwannews/hot.js | 52 --- lib/v2/taiwannews/maintainer.js | 3 - lib/v2/taiwannews/radar.js | 13 - lib/v2/taiwannews/router.js | 3 - lib/v2/xwlb/index.js | 40 -- lib/v2/xwlb/maintainer.js | 4 - lib/v2/xwlb/radar.js | 13 - lib/v2/xwlb/router.js | 4 - lib/v2/zuzhirenshi/index.js | 87 ---- lib/v2/zuzhirenshi/maintainer.js | 3 - lib/v2/zuzhirenshi/radar.js | 13 - lib/v2/zuzhirenshi/router.js | 3 - website/docs/routes/traditional-media.mdx | 458 +--------------------- 84 files changed, 8 insertions(+), 2793 deletions(-) delete mode 100644 lib/routes/asahi/area.js delete mode 100644 lib/routes/bjnews/epaper.js delete mode 100644 lib/routes/boston/index.js delete mode 100644 lib/routes/chinadialogue/column.js delete mode 100644 lib/routes/chinadialogue/topics.js delete mode 100644 lib/routes/chinatimes/index.js delete mode 100644 lib/routes/fjnews/fznews.js delete mode 100644 lib/routes/fjnews/jjnews.js delete mode 100644 lib/routes/hkcd/pdf.js delete mode 100644 lib/routes/qlwb/city.js delete mode 100644 lib/routes/qlwb/news.js delete mode 100644 lib/routes/sbs/chinese.js delete mode 100644 lib/routes/wired/tag.js delete mode 100644 lib/v2/appledaily/index.js delete mode 100644 lib/v2/appledaily/maintainer.js delete mode 100644 lib/v2/appledaily/radar.js delete mode 100644 lib/v2/appledaily/router.js delete mode 100644 lib/v2/cctv/special.js delete mode 100644 lib/v2/cntheory/maintainer.js delete mode 100644 lib/v2/cntheory/paper.js delete mode 100644 lib/v2/cntheory/radar.js delete mode 100644 lib/v2/cntheory/router.js delete mode 100644 lib/v2/cntheory/templates/description.art delete mode 100644 lib/v2/eastday/find.js delete mode 100644 lib/v2/economist/download.js delete mode 100644 lib/v2/economist/gre-vocabulary.js delete mode 100644 lib/v2/ft/myft.js delete mode 100644 lib/v2/gz-cmc/index.js delete mode 100644 lib/v2/gz-cmc/maintainer.js delete mode 100644 lib/v2/gz-cmc/radar.js delete mode 100644 lib/v2/gz-cmc/router.js delete mode 100644 lib/v2/gz-cmc/templates/description.art delete mode 100644 lib/v2/hket/index.js delete mode 100644 lib/v2/hket/maintainer.js delete mode 100644 lib/v2/hket/radar.js delete mode 100644 lib/v2/hket/router.js delete mode 100644 lib/v2/hket/templates/description.art delete mode 100644 lib/v2/hket/templates/image.art delete mode 100644 lib/v2/hyqss/index.js delete mode 100644 lib/v2/hyqss/maintainer.js delete mode 100644 lib/v2/hyqss/radar.js delete mode 100644 lib/v2/hyqss/router.js delete mode 100644 lib/v2/i-cable/category.js delete mode 100644 lib/v2/i-cable/maintainer.js delete mode 100644 lib/v2/i-cable/radar.js delete mode 100644 lib/v2/i-cable/router.js delete mode 100644 lib/v2/i-cable/templates/desc.art delete mode 100644 lib/v2/nytimes/author.js delete mode 100644 lib/v2/radiofrance/geopolitique.js delete mode 100644 lib/v2/radiofrance/maintainer.js delete mode 100644 lib/v2/radiofrance/radar.js delete mode 100644 lib/v2/radiofrance/router.js delete mode 100644 lib/v2/radiofrance/templates/article.art delete mode 100644 lib/v2/taiwannews/hot.js delete mode 100644 lib/v2/taiwannews/maintainer.js delete mode 100644 lib/v2/taiwannews/radar.js delete mode 100644 lib/v2/taiwannews/router.js delete mode 100644 lib/v2/xwlb/index.js delete mode 100644 lib/v2/xwlb/maintainer.js delete mode 100644 lib/v2/xwlb/radar.js delete mode 100644 lib/v2/xwlb/router.js delete mode 100644 lib/v2/zuzhirenshi/index.js delete mode 100644 lib/v2/zuzhirenshi/maintainer.js delete mode 100644 lib/v2/zuzhirenshi/radar.js delete mode 100644 lib/v2/zuzhirenshi/router.js diff --git a/assets/radar-rules.js b/assets/radar-rules.js index b25731c043..b9f53d51be 100644 --- a/assets/radar-rules.js +++ b/assets/radar-rules.js @@ -117,7 +117,6 @@ }, ], }, - 'chinatimes.com': { _name: '中時電子報', www: [{ title: '新聞', docs: 'https://docs.rsshub.app/routes/traditional-media#zhong-shi-dian-zi-bao', source: '/:caty', target: (params) => '/chinatimes/' + params.caty }] }, 'govopendata.com': { _name: '新闻联播文字版', cn: [{ title: '新闻联播文字版', docs: 'https://docs.rsshub.app/routes/traditional-media#xin-wen-lian-bo-wen-zi-ban', source: '/xinwenlianbo', target: '/xinwenlianbo/index' }] }, 'steampowered.com': { _name: 'Steam', store: [{ title: 'search', docs: 'https://docs.rsshub.app/routes/game#steam', source: '/search/', target: (params, url) => `/steam/search/${new URL(url).searchParams}` }] }, 'xiaomi.cn': { _name: '小米社区', www: [{ title: '圈子', docs: 'https://docs.rsshub.app/routes/bbs#xiao-mi-she-qu', source: '/board/:boardId', target: '/mi/bbs/board/:boardId' }] }, diff --git a/lib/radar-rules.js b/lib/radar-rules.js index bb6356062e..2a28b87623 100644 --- a/lib/radar-rules.js +++ b/lib/radar-rules.js @@ -288,18 +288,6 @@ module.exports = { ], }, - 'chinatimes.com': { - _name: '中時電子報', - www: [ - { - title: '新聞', - docs: 'https://docs.rsshub.app/routes/traditional-media#zhong-shi-dian-zi-bao', - source: '/:caty', - target: (params) => '/chinatimes/' + params.caty, - }, - ], - }, - 'govopendata.com': { _name: '新闻联播文字版', cn: [ diff --git a/lib/router.js b/lib/router.js index fcb036837f..c94bfa57e1 100644 --- a/lib/router.js +++ b/lib/router.js @@ -102,7 +102,6 @@ router.get('/eztv/torrents/:imdb_id', lazyloadRouteHandler('./routes/eztv/imdb') // 新京报 router.get('/bjnews/:cat', lazyloadRouteHandler('./routes/bjnews/news')); -router.get('/bjnews/epaper/:cat', lazyloadRouteHandler('./routes/bjnews/epaper')); // 米哈游 router.get('/mihoyo/bh3/:type', lazyloadRouteHandler('./routes/mihoyo/bh3')); @@ -835,7 +834,6 @@ router.get('/gradcafe/result', lazyloadRouteHandler('./routes/gradcafe/result')) router.get('/shuhui/comics/:id', lazyloadRouteHandler('./routes/shuhui/comics')); // 朝日新闻 -router.get('/asahi/area/:id', lazyloadRouteHandler('./routes/asahi/area')); router.get('/asahi/:genre?/:category?', lazyloadRouteHandler('./routes/asahi/index')); // SoundCloud @@ -869,9 +867,6 @@ router.get('/curseforge/:gameid/:catagoryid/:projectid/files', lazyloadRouteHand // 西南财经大学 router.get('/swufe/seie/:type?', lazyloadRouteHandler('./routes/universities/swufe/seie')); -// Wired -router.get('/wired/tag/:tag', lazyloadRouteHandler('./routes/wired/tag')); - // 飞地 router.get('/enclavebooks/category/:id?', lazyloadRouteHandler('./routes/enclavebooks/category')); router.get('/enclavebooks/user/:uid', lazyloadRouteHandler('./routes/enclavebooks/user.js')); @@ -1273,9 +1268,6 @@ router.get('/itslide/new', lazyloadRouteHandler('./routes/itslide/new')); // Remote Work router.get('/remote-work/:caty?', lazyloadRouteHandler('./routes/remote-work/index')); -// China Times -router.get('/chinatimes/:caty', lazyloadRouteHandler('./routes/chinatimes/index')); - // chocolatey router.get('/chocolatey/software/:name?', lazyloadRouteHandler('./routes/chocolatey/software')); @@ -1351,18 +1343,11 @@ router.get('/xinquji/today/internal', lazyloadRouteHandler('./routes/xinquji/int // 英中协会 router.get('/gbcc/trust', lazyloadRouteHandler('./routes/gbcc/trust')); -// CBC -// router.get('/cbc/topics/:topic?', lazyloadRouteHandler('./routes/cbc/topics')); - // discuz // router.get('/discuz/:ver([7|x])/:cid([0-9]{2})/:link(.*)', lazyloadRouteHandler('./routes/discuz/discuz')); // router.get('/discuz/:ver([7|x])/:link(.*)', lazyloadRouteHandler('./routes/discuz/discuz')); // router.get('/discuz/:link(.*)', lazyloadRouteHandler('./routes/discuz/discuz')); -// China Dialogue 中外对话 -router.get('/chinadialogue/topics/:topic', lazyloadRouteHandler('./routes/chinadialogue/topics')); -router.get('/chinadialogue/:column', lazyloadRouteHandler('./routes/chinadialogue/column')); - // 人民日报社 国际金融报 router.get('/ifnews/:cid', lazyloadRouteHandler('./routes/ifnews/column')); @@ -1592,10 +1577,6 @@ router.get('/cpta/notice', lazyloadRouteHandler('./routes/cpta/notice')); // 广告网 router.get('/adquan/:type?', lazyloadRouteHandler('./routes/adquan/index')); -// 齐鲁晚报 -router.get('/qlwb/news', lazyloadRouteHandler('./routes/qlwb/news')); -router.get('/qlwb/city/:city', lazyloadRouteHandler('./routes/qlwb/city')); - // 金色财经 router.get('/jinse/lives', lazyloadRouteHandler('./routes/jinse/lives')); router.get('/jinse/timeline', lazyloadRouteHandler('./routes/jinse/timeline')); @@ -1712,9 +1693,6 @@ router.get('/egameqq/room/:id', lazyloadRouteHandler('./routes/tencent/egame/roo // 荔枝FM router.get('/lizhi/user/:id', lazyloadRouteHandler('./routes/lizhi/user')); -// Boston.com -router.get('/boston/:tag?', lazyloadRouteHandler('./routes/boston/index')); - // 场库 router.get('/changku', lazyloadRouteHandler('./routes/changku/index')); router.get('/changku/cate/:postid', lazyloadRouteHandler('./routes/changku/index')); @@ -1819,10 +1797,6 @@ router.get('/souyun/today', lazyloadRouteHandler('./routes/souyun/today')); // JustRun router.get('/justrun', lazyloadRouteHandler('./routes/justrun/index')); -// 福建新闻 -router.get('/fjnews/:city/:limit', lazyloadRouteHandler('./routes/fjnews/fznews')); -router.get('/fjnews/jjnews', lazyloadRouteHandler('./routes/fjnews/jjnews')); - // 中山网新闻 router.get('/zsnews/index/:cateid', lazyloadRouteHandler('./routes/zsnews/index')); @@ -2278,9 +2252,6 @@ router.get('/furaffinity/favorites/:username/:nsfw?', lazyloadRouteHandler('./ro router.get('/furaffinity/submission_comments/:id', lazyloadRouteHandler('./routes/furaffinity/submission_comments')); router.get('/furaffinity/journal_comments/:id', lazyloadRouteHandler('./routes/furaffinity/journal_comments')); -// 香港商报 -router.get('/hkcd/pdf', lazyloadRouteHandler('./routes/hkcd/pdf')); - // 博客来 router.get('/bookscomtw/newbooks/:category', lazyloadRouteHandler('./routes/bookscomtw/newbooks')); @@ -2430,9 +2401,6 @@ router.get('/blogs/foreverblog', lazyloadRouteHandler('./routes/blogs/foreverblo // Netflix router.get('/netflix/newsroom/:category?/:region?', lazyloadRouteHandler('./routes/netflix/newsroom')); -// SBS -router.get('/sbs/chinese/:category?/:id?/:dialect?/:language?', lazyloadRouteHandler('./routes/sbs/chinese')); - // QuestMobile // router.get('/questmobile/report/:category?/:label?', lazyloadRouteHandler('./routes/questmobile/report')); diff --git a/lib/routes/asahi/area.js b/lib/routes/asahi/area.js deleted file mode 100644 index e54dd0fb96..0000000000 --- a/lib/routes/asahi/area.js +++ /dev/null @@ -1,57 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const id = ctx.params.id; - - const rootUrl = 'https://www.asahi.com'; - const currentUrl = `${rootUrl}/area/${id}`; - - const response = await got({ - method: 'get', - url: currentUrl, - }); - - const $ = cheerio.load(response.data); - - $('.Time').remove(); - - const list = $('#MainInner .Section .List li a') - .slice(0, 6) - .map((_, item) => { - item = $(item); - const link = item.attr('href'); - - return { - link: link.indexOf('//') < 0 ? `${rootUrl}${link}` : `https:${link}`, - }; - }) - .get(); - - const items = await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const detailResponse = await got({ - method: 'get', - url: item.link, - }); - const content = cheerio.load(detailResponse.data); - - content('._30SFw, .-Oj2D, .notPrint').remove(); - - item.description = content('._3YqJ1').html(); - item.title = content('meta[name="TITLE"]').attr('content'); - item.pubDate = Date.parse(content('meta[name="pubdate"]').attr('content')); - - return item; - }) - ) - ); - - ctx.state.data = { - title: $('title').text(), - link: currentUrl, - item: items, - description: '朝日新聞社のニュースサイト、朝日新聞デジタルの社会ニュースについてのページです', - }; -}; diff --git a/lib/routes/bjnews/epaper.js b/lib/routes/bjnews/epaper.js deleted file mode 100644 index 17db2afaa3..0000000000 --- a/lib/routes/bjnews/epaper.js +++ /dev/null @@ -1,80 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const cat = ctx.params.cat.toUpperCase(); - - const today = new Date(); - const year = today.getFullYear(); // 获取时间 - const month = String(today.getMonth() + 1).padStart(2, '0'); - const day = String(today.getDate()).padStart(2, '0'); - // 获取当天报纸的首页 - const response = await got({ - method: 'get', - url: `http://epaper.bjnews.com.cn/html/${year}-${month}/${day}/node_1.htm`, - }); - - const data = response.data; - const $ = cheerio.load(data); - const listdata = $('div#artcile_list_wapper tr').get(); - // 根据必选参数判断是哪一叠 - const list = cat.indexOf('SPECIAL') === -1 ? listdata.filter((e) => $(e).find('a').text().substring(1, 2) === cat) : listdata.filter((e) => $(e).find('a').text().substring(1, 2) === '0'); - // 遍历该叠面里第N版导航链接,数组内容为A01头版内容,A02等 - const articledata = await Promise.all( - list.map(async (item) => { - const link = `http://epaper.bjnews.com.cn/html/${year}-${month}/${day}/${$(item).find('a').attr('href')}`; - // 缓存某叠下版面链接 - const cache = await ctx.cache.get(link); - if (cache) { - return Promise.resolve(JSON.parse(cache)); - } - - const response2 = await got({ - method: 'get', - url: link, - }); - - const articleHtml = response2.data; - const $2 = cheerio.load(articleHtml); - const paperarea = $2('ul.jcul li').get(); - // 遍历某板块,N版面的内容,到一个数组里。 - const innercontents = await Promise.all( - paperarea.map(async (item) => { - const contentdataurl = `http://epaper.bjnews.com.cn/html/${year}-${month}/${day}/${$(item).find('a').attr('href')}`; - const response3 = await got({ - method: 'get', - url: contentdataurl, - }); - - const contentHtml = response3.data; - const $3 = cheerio.load(contentHtml); - - const ititle = $3('div.rit h1').text(); - const iprecontent = $3('div.tpnr').html(); - const imaincontent = $3('founder-content').html(); - // 这里查看是正常输出的! - const icontent = `


${ititle}

${iprecontent}${imaincontent}


`; - return Promise.resolve(icontent); - }) - ); - // end - const single = { - description: innercontents, - title: `${year}-${month}-${day}|${$(item).text()}`, - link, - }; - ctx.cache.set(link, JSON.stringify(single)); - return Promise.resolve(single); - }) - ); - - ctx.state.data = { - title: `新京报电子报|${cat}叠`, - link: `http://epaper.bjnews.com.cn/html/${year}-${month}/${day}/node_1.htm`, - item: list.map((item, index) => ({ - title: articledata[index].title, - description: articledata[index].description, - link: articledata[index].link, - })), - }; -}; diff --git a/lib/routes/boston/index.js b/lib/routes/boston/index.js deleted file mode 100644 index c019681911..0000000000 --- a/lib/routes/boston/index.js +++ /dev/null @@ -1,73 +0,0 @@ -const cheerio = require('cheerio'); -const parser = require('@/utils/rss-parser'); -const got = require('@/utils/got'); - -module.exports = async (ctx) => { - const tag = ctx.params.tag; - const rssUrl = tag ? `https://www.boston.com/tag/${tag}/?feed=atom` : `https://www.boston.com/?feed=atom`; - const feed = await parser.parseURL(rssUrl); - - const items = await Promise.all( - feed.items.map((item) => - 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 = $('div.content-text-article'); - - // Disable image lazyloading - content.find('img').each((i, e) => { - e = $(e); - e.attr('src', e.attr('srcset')); - }); - - // Categories - const categories = []; - $('meta[property="article:tag"]').each((i, e) => { - categories.push(e.attribs.content); - }); - - // Updated date - const updatedAt = $('meta[property="article:modified_time"]').attr().content; - - // Summary - const summary = $('meta[property="og:description"]').attr().content; - - // Remove unwanted DOMs - const unwanted_element_selectors = ['.ad-container', '.content-toaster--newsletter']; - unwanted_element_selectors.forEach((selector) => { - content.find(selector).each((i, e) => { - $(e).remove(); - }); - }); - - return { - title: item.title.trim(), - id: item.link, - pubDate: new Date(item.pubDate).toUTCString(), - updated: new Date(updatedAt).toUTCString(), - author: item.author.trim(), - link: item.link, - summary: summary.trim(), - description: content.html(), - category: categories, - icon: 'https://www.boston.com/wp-content/themes/bdc/images/favicons/largetile.png', - logo: 'https://www.boston.com/wp-content/themes/bdc/images/favicons/largetile.png', - }; - }) - ) - ); - - ctx.state.data = { - title: feed.title, - link: feed.link, - description: feed.description, - item: items, - language: 'en-us', - icon: 'https://www.boston.com/wp-content/themes/bdc/images/favicons/largetile.png', - logo: 'https://www.boston.com/wp-content/themes/bdc/images/favicons/largetile.png', - }; -}; diff --git a/lib/routes/chinadialogue/column.js b/lib/routes/chinadialogue/column.js deleted file mode 100644 index cc204fc0ca..0000000000 --- a/lib/routes/chinadialogue/column.js +++ /dev/null @@ -1,58 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const column = ctx.params.column; - - const response = await got({ - method: 'get', - url: `https://www.chinadialogue.net/${column}`, - }); - - const data = response.data; - - const $ = cheerio.load(data); - const list = $('article.main-listing'); - let itemPicUrl; - let title; - let description; - - ctx.state.data = { - title: $('title').text(), - link: `https://www.chinadialogue.net/${column}`, - item: - list && - list - .map((index, item) => { - item = $(item); - itemPicUrl = item.find('img.img-responsive').attr('src'); - - title = []; - description = []; - - item.find('h1').each((index, element) => { - title.push( - $(element) - .text() - .replace(/(\r\n|\n|\r)/gm, '') - ); - }); - - item.find('p').each((index, element) => { - description.push( - $(element) - .text() - .replace(/(\r\n|\n|\r)/gm, '') - ); - }); - - return { - title: title.join(' | '), - description: `

${description.join('

')}

`, - pubDate: item.find('time.blog').attr('datetime'), - link: item.find('a').attr('href'), - }; - }) - .get(), - }; -}; diff --git a/lib/routes/chinadialogue/topics.js b/lib/routes/chinadialogue/topics.js deleted file mode 100644 index 2f66011d1b..0000000000 --- a/lib/routes/chinadialogue/topics.js +++ /dev/null @@ -1,55 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const topic = ctx.params.topic; - - const response = await got({ - method: 'get', - url: `https://www.chinadialogue.net/topics/${topic}`, - }); - - const data = response.data; - - const $ = cheerio.load(data); - const list = $('article.excerpt.col-md-6'); - let itemPicUrl; - let title; - let description; - - ctx.state.data = { - title: $('title') - .text() - .replace(/( 主题 >| Topics >)/gm, ''), - link: `https://www.chinadialogue.net/topics/${topic}`, - item: - list && - list - .map((index, item) => { - item = $(item); - itemPicUrl = item.find('img.img-responsive').attr('src'); - - title = []; - description = []; - - item.find('h1').each((index, element) => { - title.push( - $(element) - .text() - .replace(/(\r\n|\n|\r)/gm, '') - ); - }); - - item.find('p').each((index, element) => { - description.push($(element).text()); - }); - - return { - title: title.join(' | '), - description: `

${description.join('

')}

`, - link: item.find('a').attr('href'), - }; - }) - .get(), - }; -}; diff --git a/lib/routes/chinatimes/index.js b/lib/routes/chinatimes/index.js deleted file mode 100644 index c8ec545e95..0000000000 --- a/lib/routes/chinatimes/index.js +++ /dev/null @@ -1,115 +0,0 @@ -const url = require('url'); -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -const root_url = 'https://www.chinatimes.com'; - -const config = { - realtimenews: { - link: '/realtimenews/?chdtv', - title: 'China Times - Real Time News', - }, - politic: { - link: '/politic/?chdtv', - title: 'China Times - Politic', - }, - opinion: { - link: '/opinion/?chdtv', - title: 'China Times - Opinion', - }, - life: { - link: '/life/?chdtv', - title: 'China Times - Life', - }, - star: { - link: '/star/?chdtv', - title: 'China Times - Showbiz', - }, - money: { - link: '/money/?chdtv', - title: 'China Times - Finance', - }, - society: { - link: '/society/?chdtv', - title: 'China Times - Society', - }, - hottopic: { - link: '/hottopic/?chdtv', - title: 'China Times - Hot Topics', - }, - tube: { - link: '/tube/?chdtv', - title: 'China Times - Videos', - }, - world: { - link: '/world/?chdtv', - title: 'China Times - World', - }, - armament: { - link: '/armament/?chdtv', - title: 'China Times - Military', - }, - chinese: { - link: '/chinese/?chdtv', - title: 'China Times - Mainland & Taiwan', - }, - fashion: { - link: '/fashion/?chdtv', - title: 'China Times - Fashion', - }, - sports: { - link: '/sports/?chdtv', - title: 'China Times - Sports', - }, - technologynews: { - link: '/technologynews/?chdtv', - title: 'China Times - Technology News', - }, - travel: { - link: '/travel/?chdtv', - title: 'China Times - Travel', - }, - album: { - link: '/album/?chdtv', - title: 'China Times - Columns', - }, -}; - -module.exports = async (ctx) => { - const cfg = config[ctx.params.caty]; - if (!cfg) { - throw Error('Bad category. See https://docs.rsshub.app/routes/traditional-media#zhong-shi-dian-zi-bao'); - } - - const current_url = url.resolve(root_url, cfg.link); - const response = await got({ - method: 'get', - url: current_url, - }); - - const $ = cheerio.load(response.data); - const list = $('section.article-list ul div.row') - .map((_, item) => { - item = $(item); - const right = item.find('div.col'); - const a = right.find('h3.title a'); - const img = item.find('img.photo').attr('src'); - let desc = '

' + right.find('p.intro').text() + '...

'; - if (img) { - desc = `

` + desc; - } - return { - title: a.text(), - link: a.attr('href'), - pubDate: new Date(right.find('div.meta-info time').attr('datetime') + ' GMT+8').toUTCString(), - description: desc, - }; - }) - .get(); - - ctx.state.data = { - title: cfg.title, - link: current_url, - item: list, - }; -}; diff --git a/lib/routes/fjnews/fznews.js b/lib/routes/fjnews/fznews.js deleted file mode 100644 index ac88cf1c72..0000000000 --- a/lib/routes/fjnews/fznews.js +++ /dev/null @@ -1,55 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const url = require('url'); - -let host = 'http://news.fznews.com.cn/fzxw/'; -let citytitle = '福州新闻'; - -module.exports = async (ctx) => { - if (ctx.params.city === 'fj') { - host = 'http://news.fznews.com.cn/dsxw/'; - citytitle = '福建新闻'; - } else { - host = 'http://news.fznews.com.cn/fzxw/'; - citytitle = '福州新闻'; - } - - const response = await got.get(host); - const $ = cheerio.load(response.data); - const list = $('.li-h32f14 li:not(.clearfix)').slice(0, ctx.params.limit).get(); - const out = await Promise.all( - list.map(async (item) => { - const $ = cheerio.load(item); - const title = $('a').text(); - const itemUrl = url.resolve(host, $('a').attr('href')); - - const cache = await ctx.cache.get(itemUrl); - if (cache) { - return Promise.resolve(JSON.parse(cache)); - } - - const res = await got.get(itemUrl); - const capture = cheerio.load(res.data); - const contents = capture('.zhengwen').html(); - const time = capture('div.laiyuan div.left').text().substring(0, 19); - const author = capture('.laiyuan').text().replace('分享到:', ''); - - const single = { - title, - link: itemUrl, - guid: itemUrl, - author, - description: contents, - pubDate: new Date(time).toUTCString(), - }; - - return Promise.resolve(single); - }) - ); - - ctx.state.data = { - title: citytitle, - link: host, - item: out, - }; -}; diff --git a/lib/routes/fjnews/jjnews.js b/lib/routes/fjnews/jjnews.js deleted file mode 100644 index 89c72e302c..0000000000 --- a/lib/routes/fjnews/jjnews.js +++ /dev/null @@ -1,43 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const url = require('url'); -const host = 'http://tt.m.jxnews.com.cn/jjtop/'; - -module.exports = async (ctx) => { - const response = await got.get(host); - const $ = cheerio.load(response.data); - const list = $('li.col-xs-12').get(); - const out = await Promise.all( - list.map(async (item) => { - const $ = cheerio.load(item); - const title = $('.list-text-style').text(); - const itemUrl = url.resolve(host, $('a').attr('href')); - - const cache = await ctx.cache.get(itemUrl); - if (cache) { - return Promise.resolve(JSON.parse(cache)); - } - - const res = await got.get(itemUrl); - const capture = cheerio.load(res.data); - const contents = capture('content').html(); - const time = capture('div.col-xs-8').text().substring(0, 19); - - const single = { - title, - link: itemUrl, - guid: itemUrl, - description: contents, - pubDate: new Date(time).toUTCString(), - }; - - return Promise.resolve(single); - }) - ); - - ctx.state.data = { - title: '九江新闻', - link: host, - item: out, - }; -}; diff --git a/lib/routes/hkcd/pdf.js b/lib/routes/hkcd/pdf.js deleted file mode 100644 index 88866711cc..0000000000 --- a/lib/routes/hkcd/pdf.js +++ /dev/null @@ -1,30 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const iconv = require('iconv-lite'); - -module.exports = async (ctx) => { - const rootUrl = 'http://hk.hkcd.com'; - const currentUrl = `${rootUrl}/pdf/index.htm`; - const response = await got({ - method: 'get', - url: currentUrl, - responseType: 'buffer', - }); - - const data = iconv.decode(response.data, 'gb2312'); - const date = data.match(/(.*)/)[1]; - const $ = cheerio.load(data.replace(' { - const newsUrl = config[ctx.params.city]; - - const response = await got({ - method: 'get', - url: newsUrl, - }); - - const $ = cheerio.load(response.data); - const list = $('ul.list.list-point li a') - .slice(0, 10) - .map((_, item) => { - item = $(item); - return { - title: item.text(), - link: item.attr('href'), - }; - }) - .get(); - - ctx.state.data = { - title: $('title').text(), - link: newsUrl, - item: await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const res = await got({ method: 'get', url: item.link }); - const content = cheerio.load(res.data); - item.description = content('div.article-content').html(); - item.pubDate = new Date(content('span.date').text() + ' GMT+8').toUTCString(); - return item; - }) - ) - ), - }; -}; diff --git a/lib/routes/qlwb/news.js b/lib/routes/qlwb/news.js deleted file mode 100644 index 41ae2efe49..0000000000 --- a/lib/routes/qlwb/news.js +++ /dev/null @@ -1,37 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const newsUrl = 'http://news.qlwb.com.cn/news/'; - const response = await got({ - method: 'get', - url: newsUrl, - }); - const $ = cheerio.load(response.data); - const list = $('ul.list.list-point li a') - .slice(0, 10) - .map((_, item) => { - item = $(item); - return { - title: item.text(), - link: item.attr('href'), - }; - }) - .get(); - - ctx.state.data = { - title: $('title').text(), - link: newsUrl, - item: await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const res = await got({ method: 'get', url: item.link }); - const content = cheerio.load(res.data); - item.description = content('div.article-content').html(); - item.pubDate = new Date(content('span.date').text() + ' GMT+8').toUTCString(); - return item; - }) - ) - ), - }; -}; diff --git a/lib/routes/sbs/chinese.js b/lib/routes/sbs/chinese.js deleted file mode 100644 index db236b2c73..0000000000 --- a/lib/routes/sbs/chinese.js +++ /dev/null @@ -1,70 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const { parseDate } = require('@/utils/parse-date'); - -module.exports = async (ctx) => { - const id = ctx.params.id ?? 'news'; - const dialect = ctx.params.dialect ?? 'mandarin'; - const category = ctx.params.category ?? 'news'; - const language = ctx.params.language ?? dialect === 'mandarin' ? 'zh-hans' : 'zh-hant'; - - const rootUrl = 'https://www.sbs.com.au'; - const currentUrl = `${rootUrl}/language/${dialect}/${category === 'podcast' ? `${language}/podcast/${id}` : `${id}/${language}`}`; - - const response = await got({ - method: 'get', - url: currentUrl, - }); - - const $ = cheerio.load(response.data); - - const list = $('.headline, .audio-playlist__item-more') - .find('a') - .map((_, item) => { - item = $(item); - - return { - link: `${rootUrl}${item.attr('href')}`, - }; - }) - .get(); - - const items = await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const detailResponse = await got({ - method: 'get', - url: item.link, - }); - - const content = cheerio.load(detailResponse.data); - - content('.block__container').remove(); - - const audio = content('a[download]')?.attr('href') ?? ''; - const image = content('meta[itemprop="image"]')?.attr('content').split('/crop/')[0] ?? ''; - - item.title = content('meta[property="og:title"]').attr('content'); - item.author = content('.article__meta-author').text().trim().replace('By', ''); - item.pubDate = parseDate(content('meta[itemprop="datePublished"]').attr('content')); - item.description = `${image ? `
` : ''}${audio ? `
` : ''}${content('.text-body').html()}`; - - if (audio) { - item.itunes_item_image = image; - item.enclosure_url = audio; - item.enclosure_type = 'audio/mpeg'; - } - - return item; - }) - ) - ); - - ctx.state.data = { - title: `${$('meta[property="og:title"]').attr('content')} - SBS中文`, - link: currentUrl, - item: items, - itunes_author: 'SBS中文', - image: `${rootUrl}/language/img/logos/in-language/logo_chinese.svg`, - }; -}; diff --git a/lib/routes/wired/tag.js b/lib/routes/wired/tag.js deleted file mode 100644 index b645aacb3e..0000000000 --- a/lib/routes/wired/tag.js +++ /dev/null @@ -1,31 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const url = `https://www.wired.com/tag/${ctx.params.tag}/page`; - - const response = await got({ - method: 'get', - url, - }); - - const $ = cheerio.load(response.data); - const list = $('.archive-list-component__items li'); - - const posts = list - .map((index_, content_) => ({ - title: $(content_).find('.archive-item-component__title').text(), - description: ` -
- ${$(content_).find('.archive-item-component__desc').text()}`, - link: `https://www.wired.com${$(content_).find('.archive-item-component__link').attr('href')}`, - })) - .get(); - - ctx.state.data = { - title: `Wired - ${ctx.params.tag}`, - link: url, - item: posts, - }; -}; diff --git a/lib/v2/appledaily/index.js b/lib/v2/appledaily/index.js deleted file mode 100644 index 086af98715..0000000000 --- a/lib/v2/appledaily/index.js +++ /dev/null @@ -1,65 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const { parseDate } = require('@/utils/parse-date'); -const timezone = require('@/utils/timezone'); - -const rootUrl = 'https://tw.appledaily.com'; - -const channelMap = { - home: '首頁', - recommend: '焦点', - new: '最新', - hot: '热门', - life: '生活', - entertainment: '娱乐', - local: '社会', - property: '财经地产', - international: '国际', - politics: '政治', - gadget: '3C车城', - supplement: '吃喝玩乐', - sports: '体育', - forum: '苹评理', - micromovie: '微视频', -}; - -module.exports = async (ctx) => { - const channel = ctx.params.channel ?? 'home'; - const url = `${rootUrl}${channel === 'home' ? '/' : `/realtime/${channel}`}`; - - const response = await got.get(url); - const $ = cheerio.load(response.data); - const list = $('div.flex-feature') - .slice(0, ctx.query.limit ? parseInt(ctx.query.limit) : 25) - .map((_, item) => { - const title = $(item).find('span.headline').text(); - const link = $(item).find('a').attr('href'); - const pubDate = timezone(parseDate($(item).find('div.timestamp').text(), 'YYYY/MM/DD HH:mm'), +8); - - return { - title, - link, - pubDate, - }; - }) - .get(); - - const items = await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const detailResponse = await got(item.link); - const content = cheerio.load(detailResponse.data); - content('.TW-DESKTOP-AD, .TW-MOBILE-AD, .TW-MOBILE-AD-WRAP').remove(); - item.description = content('div.promo-item-container.box--position-relative') + content('#articleBody').html(); - - return item; - }) - ) - ); - - ctx.state.data = { - title: `蘋果日報 - ${channelMap[channel]}`, - link: url, - item: items, - }; -}; diff --git a/lib/v2/appledaily/maintainer.js b/lib/v2/appledaily/maintainer.js deleted file mode 100644 index 27645c3d78..0000000000 --- a/lib/v2/appledaily/maintainer.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - '/:channel?': ['Fatpandac'], -}; diff --git a/lib/v2/appledaily/radar.js b/lib/v2/appledaily/radar.js deleted file mode 100644 index d1281de754..0000000000 --- a/lib/v2/appledaily/radar.js +++ /dev/null @@ -1,157 +0,0 @@ -module.exports = { - 'appledaily.com': { - _name: '苹果新闻网', - tw: [ - { - title: '首頁', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/:channel'], - target: (params) => { - if (params.channel === 'home') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '焦点', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'recommend') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '最新', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'new') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '热门', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'hot') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '生活', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'life') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '娱乐', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'entertainment') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '社会', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'local') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '财经地产', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'property') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '国际', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'international') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '政治', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'politics') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '3C车城', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'gadget') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '吃喝玩乐', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'supplement') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '体育', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'sports') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '苹评理', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'forum') { - return '/appledaily/:channel'; - } - }, - }, - { - title: '微视频', - docs: 'https://docs.rsshub.app/routes/traditional-media#ping-guo-xin-wen-wang', - source: ['/realtime/:channel'], - target: (params) => { - if (params.channel === 'micromovie') { - return '/appledaily/:channel'; - } - }, - }, - ], - }, -}; diff --git a/lib/v2/appledaily/router.js b/lib/v2/appledaily/router.js deleted file mode 100644 index 91b8719d66..0000000000 --- a/lib/v2/appledaily/router.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function (router) { - router.get('/:channel?', require('./index')); -}; diff --git a/lib/v2/cctv/maintainer.js b/lib/v2/cctv/maintainer.js index 1e903f2108..cbc856567e 100644 --- a/lib/v2/cctv/maintainer.js +++ b/lib/v2/cctv/maintainer.js @@ -1,7 +1,6 @@ module.exports = { '/lm/:id?': ['nczitzk'], '/photo/jx': ['nczitzk'], - '/special/:id?': ['nczitzk'], '/xwlb': ['zengxs'], '/:category': ['idealclover', 'xyqfer'], }; diff --git a/lib/v2/cctv/radar.js b/lib/v2/cctv/radar.js index e278787cf3..0d4771f1dd 100644 --- a/lib/v2/cctv/radar.js +++ b/lib/v2/cctv/radar.js @@ -2,12 +2,6 @@ module.exports = { 'cctv.com': { _name: '央视新闻', news: [ - { - title: '新闻专题', - docs: 'https://docs.rsshub.app/routes/traditional-media#yang-shi-xin-wen', - source: ['/special/*id'], - target: (params) => `/cctv/special/${params.id.split('/')[0]}`, - }, { title: '专题', docs: 'https://docs.rsshub.app/routes/traditional-media#yang-shi-xin-wen', diff --git a/lib/v2/cctv/router.js b/lib/v2/cctv/router.js index 2e0c7847cc..1599030b9c 100644 --- a/lib/v2/cctv/router.js +++ b/lib/v2/cctv/router.js @@ -1,7 +1,6 @@ module.exports = (router) => { router.get('/lm/:id?', require('./lm')); router.get('/photo/jx', require('./jx')); - router.get('/special/:id?', require('./special')); router.get('/xwlb', require('./xwlb')); router.get('/:category', require('./category')); }; diff --git a/lib/v2/cctv/special.js b/lib/v2/cctv/special.js deleted file mode 100644 index 47f4781f82..0000000000 --- a/lib/v2/cctv/special.js +++ /dev/null @@ -1,110 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const { parseDate } = require('@/utils/parse-date'); -const timezone = require('@/utils/timezone'); - -module.exports = async (ctx) => { - ctx.params.id = ctx.params.id ?? '315'; - - let rootUrl; - - if (ctx.params.id === '315') { - rootUrl = `https://315.cctv.com`; - } else { - rootUrl = `https://news.cctv.com/special/${ctx.params.id}/index.shtml`; - } - - const response = await got({ - method: 'get', - url: rootUrl, - }); - - const $ = cheerio.load(response.data); - const list = $('h3>a, h4>a') - .slice(0, 10) - .map((_, item) => { - item = $(item); - return { - title: item.text(), - link: item.attr('href'), - }; - }) - .get(); - - const items = await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - let date; - - if (item.link.indexOf('photo.cctv.com') > 0) { - const imageLink = item.link.split('.shtml')[0] + '.xml?randomNum=26'; - const imageResponse = await got({ - method: 'get', - url: imageLink, - }); - const images = cheerio.load(imageResponse.data); - - let description; - - item.description = ''; - - images('li') - .get() - .forEach((i) => { - i = images(i); - item.description += ``; - date = i.attr('time').replace(/年/g, '-').replace(/月/g, '-').replace(/日/g, ''); - description = i.html(); - }); - - item.description += `

${description}

`; - } else { - const detailResponse = await got({ - method: 'get', - url: item.link, - }); - const content = cheerio.load(detailResponse.data); - const match = detailResponse.data.match(/publishDate ="(.*)";/); - - if (match === null) { - let dateSpan; - - if (content('div.info span').html() !== null) { - dateSpan = content('div.info span').text(); - } else if (content('div.info1').html() !== null) { - dateSpan = content('div.info1').text().split(' | ')[1]; - } else { - dateSpan = content('span.time').text(); - } - - date = timezone(parseDate(dateSpan, 'YYYY年MM月DD日 HH:mm:ss'), +8); - } else { - const dateString = match[1]; - date = timezone(parseDate(dateString, 'YYYYMMDDHHmmss'), +8); - } - - if (content('#content_area').html() !== null) { - item.description = content('#content_area').html(); - } else if (content('div.cnt_bd').html() !== null) { - content('div.function,h1,h2').remove(); - item.description = content('div.cnt_bd').html(); - } else if (content('#text_area').html() !== null) { - item.description = content('#text_area').html(); - } else { - item.description = content('div.con').html(); - } - } - - item.pubDate = date; - - return item; - }) - ) - ); - - ctx.state.data = { - title: `${$('title').text().split('_')[0]} - 新闻专题 - 央视网`, - link: rootUrl, - item: items, - }; -}; diff --git a/lib/v2/cntheory/maintainer.js b/lib/v2/cntheory/maintainer.js deleted file mode 100644 index f146840f72..0000000000 --- a/lib/v2/cntheory/maintainer.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - '/paper/:id?': ['nczitzk'], -}; diff --git a/lib/v2/cntheory/paper.js b/lib/v2/cntheory/paper.js deleted file mode 100644 index afe3756a5d..0000000000 --- a/lib/v2/cntheory/paper.js +++ /dev/null @@ -1,89 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const { parseDate } = require('@/utils/parse-date'); -const { art } = require('@/utils/render'); -const path = require('path'); - -module.exports = async (ctx) => { - const id = ctx.params.id; - - const rootUrl = 'https://paper.cntheory.com'; - - let response = await got({ - method: 'get', - url: rootUrl, - }); - - response = await got({ - method: 'get', - url: `${rootUrl}/${response.data.match(/URL=(.*)"/)[1]}`, - }); - - const $ = cheerio.load(response.data); - - const matches = response.data.match(/images\/(\d{4}-\d{2}\/\d{2})\/\w+\/\w+_brief/); - const link = `${rootUrl}/html/${matches[1]}`; - - let items = []; - - await Promise.all( - $('#pageLink') - .toArray() - .filter((p) => (id ? $(p).text().split(':').pop() === id : true)) - .map((p) => `${link}/${$(p).attr('href').replace(/\.\//, '')}`) - .map(async (p) => { - const pageResponse = await got({ - method: 'get', - url: p, - }); - - const page = cheerio.load(pageResponse.data); - - items.push( - ...page('table') - .last() - .find('a') - .toArray() - .map((a) => `${link}/${$(a).attr('href')}`) - ); - }) - ); - - items = await Promise.all( - items.map((item) => - ctx.cache.tryGet(item, async () => { - const detailResponse = await got({ - method: 'get', - url: item, - }); - - const content = cheerio.load(detailResponse.data); - - return { - link: item, - title: content('h1').text(), - pubDate: parseDate(matches[1], 'YYYY-MM/DD'), - enclosure_url: `${rootUrl}${ - content('.ban_t a') - .first() - .attr('href') - .match(/(\/images.*)/)[1] - }`, - description: art(path.join(__dirname, 'templates/description.art'), { - resource: content('#reslist') - .html() - .replace(/display:none;/g, ''), - description: content('founder-content').html(), - }), - }; - }) - ) - ); - - ctx.state.data = { - title: `学习时报${id ? ` - ${id}` : ''}`, - link: rootUrl, - item: items, - allowEmpty: true, - }; -}; diff --git a/lib/v2/cntheory/radar.js b/lib/v2/cntheory/radar.js deleted file mode 100644 index 88efdb14cf..0000000000 --- a/lib/v2/cntheory/radar.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - 'cntheory.com': { - _name: '理论网', - paper: [ - { - title: '学习时报', - docs: 'https://docs.rsshub.app/routes/traditional-media#li-lun-wang-xue-xi-shi-bao', - source: ['/'], - target: (params, url) => `/cntheory/paper/${new URL(url).toString().match(/-(\w+)\.htm/)[1]}`, - }, - ], - }, -}; diff --git a/lib/v2/cntheory/router.js b/lib/v2/cntheory/router.js deleted file mode 100644 index 896721b6d8..0000000000 --- a/lib/v2/cntheory/router.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function (router) { - router.get('/paper/:id?', require('./paper')); -}; diff --git a/lib/v2/cntheory/templates/description.art b/lib/v2/cntheory/templates/description.art deleted file mode 100644 index 6276cecf55..0000000000 --- a/lib/v2/cntheory/templates/description.art +++ /dev/null @@ -1,2 +0,0 @@ -{{@ resource }} -{{@ description }} \ No newline at end of file diff --git a/lib/v2/eastday/find.js b/lib/v2/eastday/find.js deleted file mode 100644 index cfc21d599a..0000000000 --- a/lib/v2/eastday/find.js +++ /dev/null @@ -1,49 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const timezone = require('@/utils/timezone'); -const { parseDate } = require('@/utils/parse-date'); - -module.exports = async (ctx) => { - const rootUrl = 'https://apin.eastday.com'; - const currentUrl = `${rootUrl}/api/news/Find`; - - const response = await got({ - method: 'post', - url: currentUrl, - json: { - currentPage: 1, - newsType: 1, - pageSize: 30, - query: '', - }, - }); - - const list = response.data.newsList.list.map((item) => ({ - link: item.url, - title: item.title, - pubDate: timezone(parseDate(item.time), +8), - })); - - const items = await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const detailResponse = await got({ - method: 'get', - url: item.link, - }); - - const content = cheerio.load(detailResponse.data); - - item.description = content('.detail').html(); - - return item; - }) - ) - ); - - ctx.state.data = { - title: '热点搜索 - 东方网', - link: 'https://news.eastday.com/china/index_K43594.html', - item: items, - }; -}; diff --git a/lib/v2/eastday/maintainer.js b/lib/v2/eastday/maintainer.js index 31d8b218de..51e8842f95 100644 --- a/lib/v2/eastday/maintainer.js +++ b/lib/v2/eastday/maintainer.js @@ -1,6 +1,5 @@ module.exports = { '/24/:category?': ['nczitzk'], - '/find': ['nczitzk'], '/portrait': ['nczitzk'], '/sh': ['saury'], }; diff --git a/lib/v2/eastday/radar.js b/lib/v2/eastday/radar.js index e5e2b11929..23d0117ee1 100644 --- a/lib/v2/eastday/radar.js +++ b/lib/v2/eastday/radar.js @@ -18,12 +18,6 @@ module.exports = { }, ], www: [ - { - title: '热点搜索', - docs: 'https://docs.rsshub.app/routes/traditional-media#dong-fang-wang-re-dian-sou-suo', - source: '/', - target: '/eastday/find', - }, { title: '原创', docs: 'https://docs.rsshub.app/routes/traditional-media#dong-fang-wang-yuan-chuang', diff --git a/lib/v2/eastday/router.js b/lib/v2/eastday/router.js index 899d65fd01..f0ac0beae6 100644 --- a/lib/v2/eastday/router.js +++ b/lib/v2/eastday/router.js @@ -1,6 +1,5 @@ module.exports = function (router) { router.get('/24/:category?', require('./24')); - router.get('/find', require('./find')); router.get('/portrait', require('./portrait')); router.get('/sh', require('./sh')); }; diff --git a/lib/v2/economist/download.js b/lib/v2/economist/download.js deleted file mode 100644 index cb13b39195..0000000000 --- a/lib/v2/economist/download.js +++ /dev/null @@ -1,30 +0,0 @@ -const url = require('url'); -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -const link = 'http://www.cgx02.xyz/index.php?dir=/te'; - -module.exports = async (ctx) => { - const response = await got({ - method: 'get', - url: link, - }); - - const $ = cheerio.load(response.data); - const items = $('tbody tr').not('#id1').not('#id2').not('#id3').get(); - - ctx.state.data = { - title: '经济学人 the Economist', - link, - item: items.map((item) => { - item = $(item); - const one = item.find('td').eq(0); - return { - title: one.find('a').text(), - link: url.resolve('http://www.cgx02.xyz/', one.find('a').attr('href')), - pubDate: new Date(item.find('td.layui-hide-xs').eq(1).text()).toUTCString(), - enclosure_url: item.link, - }; - }), - }; -}; diff --git a/lib/v2/economist/gre-vocabulary.js b/lib/v2/economist/gre-vocabulary.js deleted file mode 100644 index 39bb747b3d..0000000000 --- a/lib/v2/economist/gre-vocabulary.js +++ /dev/null @@ -1,19 +0,0 @@ -const got = require('@/utils/got'); - -module.exports = async (ctx) => { - const response = await got({ - method: 'get', - url: 'https://gre.economist.com/api/keywords.json', - }); - - const word = response.data; - - ctx.state.data = { - title: 'The Economist GRE Vocabulary', - link: 'https://gre.economist.com/gre-advice/gre-vocabulary/which-words-study/most-common-gre-vocabulary-list-organized-difficulty', - item: word.map((item) => ({ - title: item, - description: item, - })), - }; -}; diff --git a/lib/v2/economist/maintainer.js b/lib/v2/economist/maintainer.js index b6651af240..ce9d6dccdc 100644 --- a/lib/v2/economist/maintainer.js +++ b/lib/v2/economist/maintainer.js @@ -1,7 +1,5 @@ module.exports = { - '/download': ['nczitzk'], '/espresso': ['TonyRL'], - '/gre-vocabulary': ['xyqfer'], '/global-business-review/:language?': ['prnake'], '/:endpoint': ['ImSingee'], }; diff --git a/lib/v2/economist/radar.js b/lib/v2/economist/radar.js index 4cb04a0915..9e3ccee9f3 100644 --- a/lib/v2/economist/radar.js +++ b/lib/v2/economist/radar.js @@ -15,14 +15,6 @@ module.exports = { target: '/economist/espresso', }, ], - gre: [ - { - title: 'GRE Vocabulary', - docs: 'https://docs.rsshub.app/routes/traditional-media#the-economist', - source: ['/', '/gre-advice/gre-vocabulary/which-words-study/most-common-gre-vocabulary-list-organized-difficulty'], - target: '/economist/gre-vocabulary', - }, - ], }, 'businessreview.global': { _name: 'The Economist', diff --git a/lib/v2/economist/router.js b/lib/v2/economist/router.js index 6781cb0138..bb74085425 100644 --- a/lib/v2/economist/router.js +++ b/lib/v2/economist/router.js @@ -1,7 +1,5 @@ module.exports = (router) => { - router.get('/download', require('./download')); router.get('/espresso', require('./espresso')); - router.get('/gre-vocabulary', require('./gre-vocabulary')); router.get('/global-business-review/:language?', require('./global-business-review')); router.get('/:endpoint', require('./full')); }; diff --git a/lib/v2/ft/maintainer.js b/lib/v2/ft/maintainer.js index 3aa6462681..8a46d5a55a 100644 --- a/lib/v2/ft/maintainer.js +++ b/lib/v2/ft/maintainer.js @@ -1,4 +1,3 @@ module.exports = { - '/myft/:key': ['HenryQW'], '/:language/:channel?': ['HenryQW', 'xyqfer'], }; diff --git a/lib/v2/ft/myft.js b/lib/v2/ft/myft.js deleted file mode 100644 index fbb87baf84..0000000000 --- a/lib/v2/ft/myft.js +++ /dev/null @@ -1,51 +0,0 @@ -const got = require('@/utils/got'); -const parser = require('@/utils/rss-parser'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const ProcessFeed = (content) => { - // clean up the article - content.find('div.o-share, aside, div.o-ads').remove(); - - return content.html(); - }; - - const link = `https://www.ft.com/myft/following/${ctx.params.key}.rss`; - - const feed = await parser.parseURL(link); - - const items = await Promise.all( - feed.items.map((item) => - ctx.cache.tryGet(item.link, async () => { - const response = await got({ - method: 'get', - url: item.link, - headers: { - Referer: 'https://www.facebook.com', - }, - }); - - const $ = cheerio.load(response.data); - - item.description = ProcessFeed($('article.js-article__content-body')); - item.category = [$('.n-content-tag--with-follow').text()].concat( - $('.article__right-bottom a.concept-list__concept') - .map((i, e) => $(e).text().trim()) - .get() - ); - item.author = $('a.n-content-tag--author') - .map((i, e) => $(e).text()) - .get(); - - return item; - }) - ) - ); - - ctx.state.data = { - title: `FT.com - myFT`, - link, - description: `FT.com - myFT`, - item: items, - }; -}; diff --git a/lib/v2/ft/radar.js b/lib/v2/ft/radar.js index 9a49b381ef..0f7df9fe83 100644 --- a/lib/v2/ft/radar.js +++ b/lib/v2/ft/radar.js @@ -6,19 +6,6 @@ module.exports = { title: 'FT 中文网', docs: 'https://docs.rsshub.app/routes/traditional-media#financial-times', }, - { - title: 'myFT 个人 RSS', - docs: 'https://docs.rsshub.app/routes/traditional-media#financial-times', - }, - ], - }, - 'ft.com': { - _name: 'Financial Times', - '.': [ - { - title: 'myFT personal RSS', - docs: 'https://docs.rsshub.app/routes/en/traditional-media#financial-times', - }, ], }, }; diff --git a/lib/v2/ft/router.js b/lib/v2/ft/router.js index 11cf5c86a6..763e369745 100644 --- a/lib/v2/ft/router.js +++ b/lib/v2/ft/router.js @@ -1,4 +1,3 @@ module.exports = function (router) { - router.get('/myft/:key', require('./myft')); router.get('/:language/:channel?', require('./channel')); }; diff --git a/lib/v2/gz-cmc/index.js b/lib/v2/gz-cmc/index.js deleted file mode 100644 index 161b2bf3c0..0000000000 --- a/lib/v2/gz-cmc/index.js +++ /dev/null @@ -1,137 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const timezone = require('@/utils/timezone'); -const { parseDate } = require('@/utils/parse-date'); -const { art } = require('@/utils/render'); -const path = require('path'); - -module.exports = async (ctx) => { - let channel = ''; - let site = ''; - let siteName = '广州市融媒体中心'; - let siteLink = 'https://www.gz-cmc.com/'; - switch (ctx.params.site) { - case 'huacheng': - case 'xinhuacheng': - case 'hc': - case 'guangzhou': - case 'gz': - case '': - channel = ctx.params.channel ?? 'shouye'; - site = 'huacheng'; - siteName = '广州日报——新花城'; - siteLink = `https://huacheng.gz-cmc.com/channel/${channel}/index.html`; - break; - - case 'daohuangpuqu': - case 'huangpu': - case 'hp': - channel = ctx.params.channel ?? 'sy'; - if (channel === 'wanqushibao' || channel === 'wqsb') { - channel = 'hpxsd'; - } - site = 'daohuangpuqu'; - siteName = '黄埔融媒——到黄埔去'; - siteLink = 'https://www.gz-cmc.com/html/download.html?siteId=cd4f63bdfdfd41749c7e304bc0d7a6df'; // no website available for this site - break; - - case 'zhangshangfanyu': - case 'zhangshangpanyu': - case 'panyu': - case 'py': - channel = ctx.params.channel ?? 'shouye'; - site = 'zhangshangfanyu'; // not a typo here... - siteName = '番禺融媒——掌上番禺'; - siteLink = 'https://www.gz-cmc.com/html/download.html?siteId=d755df8bb9fb49ee96052f7dee58d21b'; // no website available for this site - break; - - case 'yuezengcheng': - case 'zengcheng': - case 'zc': - channel = ctx.params.channel ?? 'shouye'; - site = 'yuezengcheng'; - siteName = '增城融媒——阅增城'; - siteLink = 'https://www.gz-cmc.com/html/download.html?siteId=78fa6d06b0dd4f27abf341e5efde035a'; // no website available for this site - break; - - case 'guangzhoubaiyun': - case 'baiyun': - case 'by': - channel = ctx.params.channel ?? 'sy'; - site = 'guangzhoubaiyun'; - siteName = '白云融媒——广州白云'; - siteLink = `https://guangzhoubaiyun.gz-cmc.com/channel/${channel}/index.html`; - break; - - default: - channel = ctx.params.channel; - site = ctx.params.site; - break; - } - const apiUrl = `https://${site}.gz-cmc.com/json/channel/${channel}/list.json`; - - const response = await got({ - method: 'get', - url: apiUrl, - }); - - let result = []; - if (site === 'daohuangpuqu' && channel === 'hpxsd') { - const { data: newResponse } = await got(response.data.list[0].data.detailJsonPath); - result = newResponse.dataList; - if (newResponse.nextJsonUrl) { - const { data: nextResponse } = await got(newResponse.nextJsonUrl); - result = [...result, ...nextResponse.dataList]; - } - } else { - result = response.data.list; - } - - const list = result - .filter((i) => i.data.contentType === 1 && i.data.linkType === 0) - .map((item) => ({ - title: item.data.title, - description: art(path.join(__dirname, 'templates/description.art'), { - thumb: item.data.mCoverImg, - }), - pubDate: timezone(parseDate(item.data.lastpublishTime), +8), - link: item.data.url, - author: item.data.author, - })); - - const items = await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const detailResponse = await got({ - method: 'get', - url: item.link, - }); - - const content = cheerio.load(detailResponse.data); - content('.broadcast-container').remove(); - - if (content('meta[name="description"]').attr('content')) { - item.description += '
' + content('meta[name="description"]').attr('content') + '
'; - } - item.description += content('.article-source').html() ?? ''; - - if (site === 'daohuangpuqu') { - const articleContent = content('script') - .text() - .match(/contentTxt ="(.*)";/); - item.description += articleContent ? articleContent[1].replace(/\\/g, '') : ''; - } else { - item.description += content('#articleContent').html(); - } - - return item; - }) - ) - ); - - ctx.state.data = { - title: siteName, - link: siteLink, - item: items, - }; -}; diff --git a/lib/v2/gz-cmc/maintainer.js b/lib/v2/gz-cmc/maintainer.js deleted file mode 100644 index f7a851f994..0000000000 --- a/lib/v2/gz-cmc/maintainer.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - '/:site/:channel?': ['TimWu007'], -}; diff --git a/lib/v2/gz-cmc/radar.js b/lib/v2/gz-cmc/radar.js deleted file mode 100644 index 294d044222..0000000000 --- a/lib/v2/gz-cmc/radar.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - 'gz-cmc.com': { - _name: '广州市融媒体中心', - '.': [ - { - title: '频道', - docs: 'https://docs.rsshub.app/routes/traditional-media#guang-zhou-shi-rong-mei-ti-zhong-xin', - source: ['/'], - }, - ], - }, -}; diff --git a/lib/v2/gz-cmc/router.js b/lib/v2/gz-cmc/router.js deleted file mode 100644 index e7e5ab375c..0000000000 --- a/lib/v2/gz-cmc/router.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = (router) => { - router.get('/:site/:channel?', require('./index')); -}; diff --git a/lib/v2/gz-cmc/templates/description.art b/lib/v2/gz-cmc/templates/description.art deleted file mode 100644 index 2113e70635..0000000000 --- a/lib/v2/gz-cmc/templates/description.art +++ /dev/null @@ -1,3 +0,0 @@ -{{ if thumb }} -
-{{ /if }} \ No newline at end of file diff --git a/lib/v2/hket/index.js b/lib/v2/hket/index.js deleted file mode 100644 index 3997b17b8e..0000000000 --- a/lib/v2/hket/index.js +++ /dev/null @@ -1,122 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const { parseDate } = require('@/utils/parse-date'); -const timezone = require('@/utils/timezone'); -const path = require('path'); -const { art } = require('@/utils/render'); - -const urlMap = { - srac: { - baseUrl: 'https://china.hket.com', - }, - sran: { - baseUrl: 'https://inews.hket.com', - }, - srat: { - baseUrl: 'https://topick.hket.com', - }, - sraw: { - baseUrl: 'https://wealth.hket.com', - }, -}; - -module.exports = async (ctx) => { - const category = ctx.params.category ?? 'sran001'; - const baseUrl = urlMap[category.substring(0, 4)].baseUrl; - - const response = await got({ - method: 'get', - url: baseUrl + '/' + category, - headers: { - Referer: 'https://www.hket.com', - }, - }); - - const $ = cheerio.load(response.data); - - const list = $('div.listing-title > a') - .map((_, item) => { - item = $(item); - return { - title: item.text().trim(), - link: item.attr('href').startsWith('/') - ? // remove tracking parameters - baseUrl + item.attr('href').split('?')[0].substring(0, item.attr('href').lastIndexOf('/')) - : item.attr('href').split('?')[0].substring(0, item.attr('href').lastIndexOf('/')), - }; - }) - .get(); - - const items = await Promise.all( - list && - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const article = await got({ - method: 'get', - url: item.link, - headers: { - Referer: baseUrl + '/' + category, - }, - }); - const content = cheerio.load(article.data); - - // extract categories - const categories = content('.contentTags-container > .hotkey-container-wrapper > .hotkey-container > a') - .toArray() - .map((e) => content(e).text().trim()); - - // remove unwanted elements - content('p.adunit').remove(); - content('p.article-detail_caption').remove(); - content('div.template-default.hket-row.detail-widget.show-xs-img.relatedContents-container').remove(); - content('div.template-default.hket-row.no-padding.detail-widget').remove(); - content('div.gallery-related-container').remove(); - content('div.contentTags-container').remove(); - content('div.article-details-center-sharing-btn').remove(); - content('source').remove(); - content('span.click-to-enlarge').remove(); - content('span').each((_, e) => { - if (content(e).text().startsWith('+')) { - content(e).remove(); - } - }); - - // fix lazyload image and caption - content('img').each((_, e) => { - e = content(e); - e.after( - art(path.join(__dirname, 'templates/image.art'), { - alt: e.attr('data-alt'), - src: e.attr('data-src') ?? e.attr('src'), - }) - ); - e.remove(); - }); - - item.category = categories; - item.description = art(path.join(__dirname, 'templates/description.art'), { - desc: content('div.article-detail-body-container').html(), - }); - item.pubDate = timezone(parseDate(content('.article-details-info-container_date').text().trim()), +8); - - return item; - }) - ) - ); - - ctx.state.data = { - title: $('head meta[name=title]').attr('content').trim(), - link: baseUrl + '/' + category, - description: $('head meta[name=description]').attr('content').trim(), - item: items, - language: 'zh-hk', - }; - - ctx.state.json = { - title: $('head meta[name=title]').attr('content').trim(), - link: baseUrl + '/' + category, - description: $('head meta[name=description]').attr('content').trim(), - item: items, - language: 'zh-hk', - }; -}; diff --git a/lib/v2/hket/maintainer.js b/lib/v2/hket/maintainer.js deleted file mode 100644 index 9644afe025..0000000000 --- a/lib/v2/hket/maintainer.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - '/:category?': ['TonyRL'], -}; diff --git a/lib/v2/hket/radar.js b/lib/v2/hket/radar.js deleted file mode 100644 index 90ddd6d0d9..0000000000 --- a/lib/v2/hket/radar.js +++ /dev/null @@ -1,45 +0,0 @@ -module.exports = { - 'hket.com': { - _name: '香港经济日报', - china: [ - { - title: '新闻', - docs: 'https://docs.rsshub.app/routes/traditional-media#xiang-gang-jing-ji-ri-bao', - source: ['/:category/*'], - target: '/hket/:category', - }, - ], - inews: [ - { - title: '新闻', - docs: 'https://docs.rsshub.app/routes/traditional-media#xiang-gang-jing-ji-ri-bao', - source: ['/:category/*'], - target: '/hket/:category', - }, - ], - topick: [ - { - title: '新闻', - docs: 'https://docs.rsshub.app/routes/traditional-media#xiang-gang-jing-ji-ri-bao', - source: ['/:category/*'], - target: '/hket/:category', - }, - ], - wealth: [ - { - title: '新闻', - docs: 'https://docs.rsshub.app/routes/traditional-media#xiang-gang-jing-ji-ri-bao', - source: ['/:category/*'], - target: '/hket/:category', - }, - ], - www: [ - { - title: '新闻', - docs: 'https://docs.rsshub.app/routes/traditional-media#xiang-gang-jing-ji-ri-bao', - source: ['/'], - target: '/hket', - }, - ], - }, -}; diff --git a/lib/v2/hket/router.js b/lib/v2/hket/router.js deleted file mode 100644 index cf781366fd..0000000000 --- a/lib/v2/hket/router.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function (router) { - router.get('/:category?', require('./index')); -}; diff --git a/lib/v2/hket/templates/description.art b/lib/v2/hket/templates/description.art deleted file mode 100644 index 7755ee9f6b..0000000000 --- a/lib/v2/hket/templates/description.art +++ /dev/null @@ -1 +0,0 @@ -{{@ desc }} diff --git a/lib/v2/hket/templates/image.art b/lib/v2/hket/templates/image.art deleted file mode 100644 index 5bf7052394..0000000000 --- a/lib/v2/hket/templates/image.art +++ /dev/null @@ -1 +0,0 @@ -
{{ alt }}
{{ alt }}
diff --git a/lib/v2/hyqss/index.js b/lib/v2/hyqss/index.js deleted file mode 100644 index cba66931b7..0000000000 --- a/lib/v2/hyqss/index.js +++ /dev/null @@ -1,89 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const timezone = require('@/utils/timezone'); -const { parseDate } = require('@/utils/parse-date'); - -module.exports = async (ctx) => { - const type = ctx.params.type ?? 'hyrb'; - const isDaily = type === 'hyrb'; - - const id = ctx.params.id; - - const rootUrl = 'http://epaper.hyqss.cn'; - const currentUrl = `${rootUrl}${isDaily ? '' : `/${type}`}`; - - let response = await got({ - method: 'get', - url: currentUrl, - }); - - const url = response.data.match(/URL=(.*)"/)[1]; - - response = await got({ - method: 'get', - url: `${currentUrl}/${id ? url.replace(/node_\d+\.htm/, `node_19${isDaily ? '62' : '74'}${id}.htm`) : url}`, - }); - - const $ = cheerio.load(response.data); - - const matches = url.match(/html\/(.*)\/node/); - const link = `${rootUrl}/${isDaily ? '' : 'hywb/'}html/${matches[1]}`; - - let items = $('#main-ed-articlenav-list') - .first() - .find('a') - .toArray() - .map((a) => `${link}/${$(a).attr('href')}`); - - if (!id) { - await Promise.all( - $('#bmdhTable') - .find('#pageLink') - .toArray() - .map((p) => `${link}/${$(p).attr('href')}`) - .map(async (p) => { - const pageResponse = await got({ - method: 'get', - url: p, - }); - - const page = cheerio.load(pageResponse.data); - - items.push( - ...page('#main-ed-articlenav-list') - .first() - .find('a') - .toArray() - .map((a) => `${link}/${page(a).attr('href')}`) - ); - }) - ); - } - - items = await Promise.all( - items.map((item) => - ctx.cache.tryGet(item, async () => { - const detailResponse = await got({ - method: 'get', - url: item, - }); - - const content = cheerio.load(detailResponse.data); - - return { - link: item, - title: content('.font01').text(), - description: content('#ozoom').html(), - pubDate: timezone(parseDate(matches[1], 'YYYY-MM/DD'), +8), - }; - }) - ) - ); - - ctx.state.data = { - title: `衡阳${isDaily ? '日' : '晚'}报${id ? ` - ${$('strong').first().parent().text()}` : ''}`, - link: currentUrl, - item: items, - allowEmpty: true, - }; -}; diff --git a/lib/v2/hyqss/maintainer.js b/lib/v2/hyqss/maintainer.js deleted file mode 100644 index ca9e7a4524..0000000000 --- a/lib/v2/hyqss/maintainer.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - '/hyrb/:id?': ['nczitzk'], - '/hywb/:id?': ['nczitzk'], -}; diff --git a/lib/v2/hyqss/radar.js b/lib/v2/hyqss/radar.js deleted file mode 100644 index cd218eccc2..0000000000 --- a/lib/v2/hyqss/radar.js +++ /dev/null @@ -1,22 +0,0 @@ -const radars = [ - { - title: '衡阳日报', - docs: 'https://docs.rsshub.app/routes/journal#heng-yang-quan-sou-suo-heng-yang-ri-bao', - source: ['/'], - target: '/hnrb/hyrb/:id?', - }, - { - title: '衡阳晚报', - docs: 'https://docs.rsshub.app/routes/journal#heng-yang-quan-sou-suo-heng-yang-wan-bao', - source: ['/'], - target: '/hnrb/hywb/:id?', - }, -]; - -module.exports = { - 'hyqss.cn': { - _name: '衡阳全搜索', - '.': radars, - epaper: radars, - }, -}; diff --git a/lib/v2/hyqss/router.js b/lib/v2/hyqss/router.js deleted file mode 100644 index 5f136f299b..0000000000 --- a/lib/v2/hyqss/router.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function (router) { - router.get('/:type?/:id?', require('./index')); -}; diff --git a/lib/v2/i-cable/category.js b/lib/v2/i-cable/category.js deleted file mode 100644 index bc2e1643c2..0000000000 --- a/lib/v2/i-cable/category.js +++ /dev/null @@ -1,74 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const { parseDate } = require('@/utils/parse-date'); -const { art } = require('@/utils/render'); -const { join } = require('path'); - -module.exports = async (ctx) => { - const { category } = ctx.params; - const { limit = '100' } = ctx.query; - const baseUrl = 'https://www.i-cable.com'; - - let link; - let id; - if (category) { - const categoryDetail = await ctx.cache.tryGet(`i-cable:category:${category}`, async () => { - const { data: res } = await got(`${baseUrl}/wp-json/wp/v2/categories`, { - searchParams: { - search: category, - }, - }); - const data = res[0]; - if (!data) { - throw Error('Invalid category'); - } - return { - id: data.id, - link: data.link, - }; - }); - id = categoryDetail.id; - link = categoryDetail.link; - } - - const { data: response } = await got(`${baseUrl}/wp-json/wp/v2/posts`, { - searchParams: { - per_page: limit, - categories: id, - _embed: 1, - }, - }); - - const items = response.map((item) => { - const $ = cheerio.load(item.content.rendered, null, false); - $('img').each((_, img) => { - img = $(img); - const src = img.attr('src'); - if (src.match(/-\d+x\d+.(jpg|png)$/)) { - img.attr('src', src.replace(/-\d+x\d+.(jpg|png)$/, '.$1')); - } - img.removeAttr('srcset'); - }); - return { - title: item.title.rendered, - description: art(join(__dirname, 'templates/desc.art'), { - content: $.html(), - imgs: item.yoast_head_json.og_image.map((img) => img.url).filter((i) => !i.endsWith('Open-Graph-2.png')), - }), - pubDate: parseDate(item.date_gmt), // 2023-05-11T15:07:51 - updated: parseDate(item.modified_gmt), - guid: item.guid.rendered, - link: item.link, - author: item._embedded.author.map((author) => author.name).join(', '), - category: item._embedded['wp:term'][0].map((category) => category.name), - }; - }); - - ctx.state.data = { - title: `${category || '主頁'} | 有線寬頻 i-CABLE`, - description: '24小時無間斷緊貼香港本地及國際新聞,即時報道新聞事件的最新發展。內容包括時事、財經、體育、天氣消息等多元化資訊。', - image: 'https://icable-prod.s3.ap-southeast-1.amazonaws.com/wp-content/uploads/2022/05/19010704/Open-Graph-1.png', - link: link || baseUrl, - item: items, - }; -}; diff --git a/lib/v2/i-cable/maintainer.js b/lib/v2/i-cable/maintainer.js deleted file mode 100644 index 79e4a54320..0000000000 --- a/lib/v2/i-cable/maintainer.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - '/:category?': ['tpnonthealps'], -}; diff --git a/lib/v2/i-cable/radar.js b/lib/v2/i-cable/radar.js deleted file mode 100644 index 6eeeda4ded..0000000000 --- a/lib/v2/i-cable/radar.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - 'i-cable.com': { - _name: '有線寬頻 i-CABLE', - '.': [ - { - title: '有線新聞 | Cable News', - docs: 'https://docs.rsshub.app/routes/traditional-media#you-xian-kuan-pin-i-cable', - source: ['/category/*path', '/'], - target: (params) => `/i-cable${params.path ? decodeURIComponent(params.path.slice(params.path.lastIndexOf('/'))) : ''}`, - }, - ], - }, -}; diff --git a/lib/v2/i-cable/router.js b/lib/v2/i-cable/router.js deleted file mode 100644 index 7eece4711e..0000000000 --- a/lib/v2/i-cable/router.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = (router) => { - router.get('/:category?', require('./category')); -}; diff --git a/lib/v2/i-cable/templates/desc.art b/lib/v2/i-cable/templates/desc.art deleted file mode 100644 index 28ed587391..0000000000 --- a/lib/v2/i-cable/templates/desc.art +++ /dev/null @@ -1,8 +0,0 @@ -{{ if imgs }} - {{ each imgs img }} -
- {{ /each }} -{{ /if }} -{{ if content }} - {{@ content }} -{{ /if }} diff --git a/lib/v2/nhk/news.js b/lib/v2/nhk/news.js index d44c68d870..455d7ab6ea 100644 --- a/lib/v2/nhk/news.js +++ b/lib/v2/nhk/news.js @@ -34,7 +34,7 @@ module.exports = async (ctx) => { ); ctx.state.data = { - title: `${Object.values(meta.data.config.navigation.header).find((h) => h.keyname === 'topstories').name} | NHK WORLD-JAPAN News`, + title: `${Object.values(meta.data.config.navigation.header).find((h) => h.keyname === 'topstories')?.name} | NHK WORLD-JAPAN News`, link: `${baseUrl}/nhkworld/${lang}/news/list/`, item: items, }; diff --git a/lib/v2/nytimes/author.js b/lib/v2/nytimes/author.js deleted file mode 100644 index a11c22b824..0000000000 --- a/lib/v2/nytimes/author.js +++ /dev/null @@ -1,43 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const byline = ctx.params.byline; - - const authorUrl = `https://www.nytimes.com/by/${byline}`; - - const response = await got({ - method: 'get', - url: authorUrl, - }); - const data = response.data; - const $ = cheerio.load(data); - - const authorName = $('h1').text(); - - const items = $('#stream-panel li') - .map((index, elem) => { - const $item = $(elem); - const $info = $item.find('div > div'); - const title = $info.find('h3').text(); - const href = $info.find('a').attr('href'); - const link = new URL(href, authorUrl); - const description = $info.find('a > p').text(); - const author = $info.find('a p > span').text(); - - return { - title, - author, - description, - link, - }; - }) - .get() - .filter((d) => d.title); - - ctx.state.data = { - title: `${authorName} - The New York Times`, - link: authorUrl, - item: items, - }; -}; diff --git a/lib/v2/nytimes/radar.js b/lib/v2/nytimes/radar.js index 3d40374df0..af7af1168e 100644 --- a/lib/v2/nytimes/radar.js +++ b/lib/v2/nytimes/radar.js @@ -14,12 +14,6 @@ module.exports = { source: ['/books/best-sellers/:category', '/books/best-sellers/'], target: '/nytimes/book/:category', }, - { - title: '作者新闻', - docs: 'https://docs.rsshub.app/routes/traditional-media#niu-yue-shi-bao', - source: '/by/:byline', - target: '/nytimes/author/:byline', - }, { title: '新闻', docs: 'https://docs.rsshub.app/routes/traditional-media#niu-yue-shi-bao', diff --git a/lib/v2/nytimes/router.js b/lib/v2/nytimes/router.js index d61871ef59..68a8a1d4d8 100644 --- a/lib/v2/nytimes/router.js +++ b/lib/v2/nytimes/router.js @@ -1,5 +1,4 @@ module.exports = (router) => { - router.get('/author/:byline', require('./author.js')); router.get('/book/:category?', require('./book.js')); router.get('/daily_briefing_chinese', require('./daily_briefing_chinese')); router.get('/:lang?', require('./index')); diff --git a/lib/v2/radiofrance/geopolitique.js b/lib/v2/radiofrance/geopolitique.js deleted file mode 100644 index 50e0c87403..0000000000 --- a/lib/v2/radiofrance/geopolitique.js +++ /dev/null @@ -1,33 +0,0 @@ -const path = require('path'); -const got = require('@/utils/got'); -const parser = require('@/utils/rss-parser'); -const { art } = require('@/utils/render'); - -module.exports = async (ctx) => { - const feed = await parser.parseURL('https://radiofrance-podcast.net/podcast09/rss_10009.xml'); - - const items = await Promise.all( - // only retrieve the full text for the first 3 items - feed.items.slice(0, 3).map((item) => - ctx.cache.tryGet(item.link, async () => { - const uri = item.link.slice(item.link.indexOf('/franceinter')); - const apiurl = 'https://www.radiofrance.fr/api/v2.1/path?value=' + encodeURIComponent(uri); - const { data } = await got(apiurl); - - delete item.content; - delete item.contentSnippet; - - item.description = art(path.join(__dirname, 'templates/article.art'), data.content); - return item; - }) - ) - ); - - ctx.state.data = { - title: feed.title, - link: feed.link, - description: feed.description, - item: items, - language: feed.language, - }; -}; diff --git a/lib/v2/radiofrance/maintainer.js b/lib/v2/radiofrance/maintainer.js deleted file mode 100644 index 0abbe714b1..0000000000 --- a/lib/v2/radiofrance/maintainer.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - '/geopolitique': ['xdu'], -}; diff --git a/lib/v2/radiofrance/radar.js b/lib/v2/radiofrance/radar.js deleted file mode 100644 index 341ae53161..0000000000 --- a/lib/v2/radiofrance/radar.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - 'radiofrance.fr': { - _name: 'Radio France', - www: [ - { - title: 'Géopolitique', - docs: 'https://docs.rsshub.app/routes/traditional-media#fa-guo-guang-bo-dian-tai', - source: ['/franceinter/podcasts/geopolitique', '/'], - target: '/radiofrance/geopolitique', - }, - ], - }, -}; diff --git a/lib/v2/radiofrance/router.js b/lib/v2/radiofrance/router.js deleted file mode 100644 index 55bcc39947..0000000000 --- a/lib/v2/radiofrance/router.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = (router) => { - router.get('/geopolitique', require('./geopolitique')); -}; diff --git a/lib/v2/radiofrance/templates/article.art b/lib/v2/radiofrance/templates/article.art deleted file mode 100644 index 83bb4f424b..0000000000 --- a/lib/v2/radiofrance/templates/article.art +++ /dev/null @@ -1,6 +0,0 @@ -

{{ standFirst }}

-{{ each bodyJson }} -{{ if $value.type === 'text' }} -

{{ $value.children[0].value }}

-{{ /if }} -{{ /each }} diff --git a/lib/v2/taiwannews/hot.js b/lib/v2/taiwannews/hot.js deleted file mode 100644 index 23b78ef3d8..0000000000 --- a/lib/v2/taiwannews/hot.js +++ /dev/null @@ -1,52 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const { parseDate } = require('@/utils/parse-date'); -const timezone = require('@/utils/timezone'); -const baseUrl = 'https://www.taiwannews.com.tw'; - -module.exports = async (ctx) => { - const { lang = 'en' } = ctx.params; - const url = `${baseUrl}/${lang}/index`; - const response = await got(url); - const $ = cheerio.load(response.data); - - const list = $('.mod_group-columns .container-fluid .row') - .toArray() - .map((item) => { - item = $(item); - const a = item.find('a'); - return { - title: a.attr('title'), - link: new URL(a.attr('href'), baseUrl).href, - pubDate: timezone(parseDate(item.find('.entry-date span').eq(1).text(), 'YYYY/MM/DD HH:mm'), +8), - }; - }); - - const items = await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const response = await got(item.link); - const $ = cheerio.load(response.data); - - item.author = $('.article-author').text(); - item.category = $('.tagcloud a') - .toArray() - .map((a) => $(a).attr('title')); - - $('.article-head-wrapper, div[id^=div-gpt-ad-], div[class^=hidden-], footer').remove(); - $('.container-fluid').eq(2).remove(); - - item.description = $('.mod_single-column').html(); - return item; - }) - ) - ); - - ctx.state.data = { - title: `${$('.categories').eq(0).text()} - ${$('head title').text()}`, - description: $('meta[name="description"]').attr('content'), - link: url, - item: items, - language: lang, - }; -}; diff --git a/lib/v2/taiwannews/maintainer.js b/lib/v2/taiwannews/maintainer.js deleted file mode 100644 index b1ee634e01..0000000000 --- a/lib/v2/taiwannews/maintainer.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - '/hot/:lang?': ['TonyRL'], -}; diff --git a/lib/v2/taiwannews/radar.js b/lib/v2/taiwannews/radar.js deleted file mode 100644 index 3ff196b169..0000000000 --- a/lib/v2/taiwannews/radar.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - 'taiwannews.com.tw': { - _name: '台灣英文新聞', - '.': [ - { - title: '最新熱門消息', - docs: 'https://docs.rsshub.app/routes/traditional-media#tai-wan-ying-wen-xin-wen', - source: '/:lang/index', - target: '/taiwannews/hot/:lang', - }, - ], - }, -}; diff --git a/lib/v2/taiwannews/router.js b/lib/v2/taiwannews/router.js deleted file mode 100644 index 17d5e886fa..0000000000 --- a/lib/v2/taiwannews/router.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = (router) => { - router.get('/hot/:lang?', require('./hot')); -}; diff --git a/lib/v2/xwlb/index.js b/lib/v2/xwlb/index.js deleted file mode 100644 index 6cbe8bca20..0000000000 --- a/lib/v2/xwlb/index.js +++ /dev/null @@ -1,40 +0,0 @@ -const cheerio = require('cheerio'); -const got = require('@/utils/got'); -const { parseDate, parseRelativeDate } = require('@/utils/parse-date'); -const timezone = require('@/utils/timezone'); - -module.exports = async (ctx) => { - const url = 'http://www.xwlb.com.cn/cctv.html'; - - const { data: res } = await got(url); - const $ = cheerio.load(res); - const list = $('.block .post') - .toArray() - .map((item) => { - item = $(item); - const dateStr = item.find('.info .date').text(); - return { - title: item.find('h2 a').text(), - link: item.find('h2 a').attr('href'), - pubDate: timezone(dateStr.includes('-') ? parseDate(dateStr, 'MM-DD') : parseRelativeDate(dateStr), +8), - }; - }); - - const out = await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const { data: res } = await got(item.link); - const $ = cheerio.load(res); - $('.adsbygoogle, #myFlash').remove(); - item.description = $('.single').html(); - return item; - }) - ) - ); - - ctx.state.data = { - title: $('head title').text(), - link: url, - item: out, - }; -}; diff --git a/lib/v2/xwlb/maintainer.js b/lib/v2/xwlb/maintainer.js deleted file mode 100644 index 6950f5dc73..0000000000 --- a/lib/v2/xwlb/maintainer.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - '/': ['xfangbao'], - '/index': ['xfangbao'], -}; diff --git a/lib/v2/xwlb/radar.js b/lib/v2/xwlb/radar.js deleted file mode 100644 index 023c6c9825..0000000000 --- a/lib/v2/xwlb/radar.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - 'xwlb.com.cn': { - _name: '新闻联播直播', - '.': [ - { - title: '新闻联播文字版完整版', - docs: 'https://docs.rsshub.app/routes/traditional-media#yang-shi-xin-wen', - source: ['/cctv.html', '/'], - target: '/xwlb', - }, - ], - }, -}; diff --git a/lib/v2/xwlb/router.js b/lib/v2/xwlb/router.js deleted file mode 100644 index 123a849255..0000000000 --- a/lib/v2/xwlb/router.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = (router) => { - router.get('/', require('./index')); - router.redirect('/index', '/xwlb'); -}; diff --git a/lib/v2/zuzhirenshi/index.js b/lib/v2/zuzhirenshi/index.js deleted file mode 100644 index 11dca39c93..0000000000 --- a/lib/v2/zuzhirenshi/index.js +++ /dev/null @@ -1,87 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -const timezone = require('@/utils/timezone'); -const { parseDate } = require('@/utils/parse-date'); - -function parseJavascript(jsCode) { - // Parse Release Date, SubLanMuList, AreaInfoList - const ReleaseDateRegex = /var ReleaseDate\s*=\s*"([^"]+)";/; - const ReleaseDateMatch = jsCode.match(ReleaseDateRegex); - const ReleaseDate = ReleaseDateMatch ? ReleaseDateMatch[1] : null; - - const SubLanMuListRegex = /var SubLanMuList\s*=\s*(\[.+?\]);/; - const SubLanMuListMatch = jsCode.match(SubLanMuListRegex); - const SubLanMuList = SubLanMuListMatch ? JSON.parse(SubLanMuListMatch[1]) : null; - - const InfoListRegex = /var InfoList\s*=\s*(\[.+?\]);/; - const InfoListMatch = jsCode.match(InfoListRegex); - const InfoList = InfoListMatch ? JSON.parse(InfoListMatch[1]) : null; - - return { - ReleaseDate, - SubLanMuList, - InfoList, - }; -} - -async function getArticle(link) { - const response = await got(link); - const $ = cheerio.load(response.data); - const title = $('div.listhottitle3').text().trim(); - const pubDate = timezone(parseDate($('.innertop').clone().children().remove().end().text().trim(), 'YYYY/MM/DD'), +8); - const description = $('.innercontent').html(); - return { - title, - link, - pubDate, - description, - }; -} - -async function getPageInfo(url) { - const response = await got(url); - const $ = cheerio.load(response.data); - const jsCode = $('script').text().split('$(function')[0]; - return parseJavascript(jsCode); -} - -async function getPageContents(releaseDate, id, ctx) { - const baseUrl = `http://www.zuzhirenshi.com/dianzibao`; - const link = `${baseUrl}/${releaseDate}/${id}/index.htm`; - const info = await getPageInfo(link); - const items = await Promise.all( - info.InfoList.map((article) => { - const link = `${baseUrl}/${releaseDate}/${id}/${article.infoid}.htm`; - const item = ctx.cache.tryGet(link, async () => { - const item = await getArticle(link); - return item; - }); - return item; - }) - ); - return items; -} - -module.exports = async (ctx) => { - const url = 'http://www.zuzhirenshi.com/dianzibao/index.htm'; - const info = await getPageInfo(url); - const releaseDate = info.ReleaseDate; - const id = ctx.params.id || 0; - let items = []; - if (id === 0) { - const promises = []; - for (let i = 1; i <= info.SubLanMuList.length; i++) { - promises.push(getPageContents(releaseDate, i, ctx)); - } - const results = await Promise.all(promises); - items = results.reduce((a, b) => a.concat(b), []); - } else { - items = await getPageContents(releaseDate, id, ctx); - } - const titleSuffix = id ? `${String(info.SubLanMuList[id - 1].lmmc)}` : '全部'; - ctx.state.data = { - title: `组织人事报 - ${titleSuffix} - ${releaseDate}`, - link: 'https://www.zuzhirenshi.com/dianzibao/index.htm', - item: items, - }; -}; diff --git a/lib/v2/zuzhirenshi/maintainer.js b/lib/v2/zuzhirenshi/maintainer.js deleted file mode 100644 index b2b6aa22af..0000000000 --- a/lib/v2/zuzhirenshi/maintainer.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - '/:id?': ['5upernova-heng'], -}; diff --git a/lib/v2/zuzhirenshi/radar.js b/lib/v2/zuzhirenshi/radar.js deleted file mode 100644 index 14116ffcc5..0000000000 --- a/lib/v2/zuzhirenshi/radar.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - 'zuzhirenshi.com': { - _name: '组织人事报', - '.': [ - { - title: '日报', - docs: 'https://docs.rsshub.app/routes/traditional-media#zu-zhi-ren-shi-bao', - source: ['/dianzibao/*'], - target: '/zuzhirenshi', - }, - ], - }, -}; diff --git a/lib/v2/zuzhirenshi/router.js b/lib/v2/zuzhirenshi/router.js deleted file mode 100644 index ef6369cb2a..0000000000 --- a/lib/v2/zuzhirenshi/router.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = (router) => { - router.get('/:id?', require('.')); -}; diff --git a/website/docs/routes/traditional-media.mdx b/website/docs/routes/traditional-media.mdx index 0a3a84e9b5..b1b04c17c0 100644 --- a/website/docs/routes/traditional-media.mdx +++ b/website/docs/routes/traditional-media.mdx @@ -98,15 +98,6 @@ - 频道,如金融財經 `https://www.bbc.co.uk/zhongwen/trad/business/index.xml` 则为 `/bbc/traditionalchinese/business`. -## Boston.com {#boston-com} - -### News {#boston-com-news} - - - Generates full-text feeds that the official feed doesn't provide. - Refer to [Boston.com's feed page](https://www.boston.com/rss-feeds) for tags. For instance, `https://www.boston.com/tag/local-news/?feed=rss` corresponds to `/boston/local-news`. - - ## Caixin Global {#caixin-global} ### Latest News {#caixin-global-latest-news} @@ -128,42 +119,6 @@ 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 中外对话 {#china-dialogue-zhong-wai-dui-hua} - -### Topics {#china-dialogue-zhong-wai-dui-hua-topics} - - - | Business | Cities | Climate Change | Conservation | Governance & Law | Health and Food | Natural Disasters | Pollution | Science & Tech | Security | Water | - | -------- | ------ | ------------------------- | ------------ | ------------------ | --------------- | ----------------- | --------- | ---------------- | -------- | ----- | - | business | cities | climate-change-and-energy | conservation | governance-and-law | health-and-food | natural-disasters | pollution | science-and-tech | security | water | - - -### Columns {#china-dialogue-zhong-wai-dui-hua-columns} - - - | Articles | Blogs | Culture | Reports | - | -------- | ----- | ------- | ------- | - | article | blog | culture | reports | - - -### 福建新闻 {#china-dialogue-zhong-wai-dui-hua-fu-jian-xin-wen} - - - -### 九江新闻 {#china-dialogue-zhong-wai-dui-hua-jiu-jiang-xin-wen} - - - -## China Times 中時電子報 {#china-times-zhong-shi-dian-zi-bao} - -### News {#china-times-zhong-shi-dian-zi-bao-news} - - - | realtimenews | politic | opinion | life | star | money | society | hottopic | tube | world | armament | chinese | fashion | sports | technologynews | travel | album | - | -------------- | ------- | ------- | ---- | ------- | ------- | ------- | ---------- | ------ | ----- | -------- | ----------------- | ------- | ------ | --------------- | ------ | ------- | - | Real Time News | Politic | Opinion | Life | Showbiz | Finance | Society | Hot Topics | Videos | World | Military | Mainland & Taiwan | Fashion | Sports | Technology News | Travel | Columns | - - ## ChinaFile {#chinafile} ### Reporting & Opinion {#chinafile-reporting-opinion} @@ -239,15 +194,6 @@ - 频道包含多重路径,如 `http://www.ftchinese.com/rss/column/007000002` 则替换 `/` 为 `-` `/ft/chinese/column-007000002`. -### myFT personal RSS {#financial-times-myft-personal-rss} - - - :::tip - - Visit ft.com -> myFT -> Contact Preferences to enable personal RSS feed, see [help.ft.com](https://help.ft.com/faq/email-alerts-and-contact-preferences/what-is-myft-rss-feed/) - - Obtain the key from the personal RSS address, it looks like `12345678-abcd-4036-82db-vdv20db024b8` - ::: - - ## Korean Central News Agency (KCNA) 朝鲜中央通讯社 {#korean-central-news-agency-kcna-chao-xian-zhong-yang-tong-xun-she} ### News {#korean-central-news-agency-kcna-chao-xian-zhong-yang-tong-xun-she-news} @@ -409,14 +355,6 @@ Only `s00017` is in English. ::: -## Radio France 法国广播电台 {#radio-france-fa-guo-guang-bo-dian-tai} - -### Géopolitique {#radio-france-fa-guo-guang-bo-dian-tai-geopolitique} - - - French podcast on the international politics. This feed provides a better reading experience (full text) for the 3 latest articles. - - ## Radio Free Asia (RFA) 自由亚洲电台 {#radio-free-asia-rfa-zi-you-ya-zhou-dian-tai} ### News {#radio-free-asia-rfa-zi-you-ya-zhou-dian-tai-news} @@ -481,7 +419,7 @@ You can use `sophi=true` query parameter to invoke the **experimental** method, ### News {#rodong-sinmun-lao-dong-xin-wen-news} - + | 조선어 | English | 中文 | | ------ | ------- | ---- | | ko | en | cn | @@ -517,54 +455,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li (`opencc` 是 RSSHub 的通用参数,详情请参阅 [「中文简繁体转换」](/parameter#中文简繁体转换)) -## SBS {#sbs} - -### Chinese {#sbs-chinese} - - - :::tip - When subscribing to podcasts, fill `category` with **podcast**. For example, URL to [SBS 普通话电台](https://www.sbs.com.au/chinese/mandarin/zh-hans/podcast/sbs-mandarin) is `https://www.sbs.com.au/chinese/mandarin/zh-hans/podcast/sbs-mandarin`, with **sbs-mandarin** as `id`, **mandarin** as `dialect`, `language` as **zh-hans**, and the route is [`/sbs/chinese/podcast/sbs-mandarin/mandarin/zh-hans`](https://rsshub.app/sbs/chinese/podcast/sbs-mandarin/mandarin/zh-hans). - ::: - - | 新闻 | 澳大利亚新闻 | 国际新闻 | ​ 商业与财经 | - | ---- | --------------- | ------------------ | ---------------- | - | news | australian-news | international-news | business-finance | - - | 澳中关系 | ​ 移民与签证 | Stories in English | - | ------------------------- | ------------ | ------------------ | - | australia-china-relations | immigration | english | - - | COVID-19 专题报道 | 澳大利亚华人 | 澳大利亚生活 | 教育 | - | ----------------- | ------------------ | ----------------- | --------- | - | coronavirus | australian-chinese | life-in-australia | education | - - | 健康 | 吃喝玩乐 | 艺术人文 | 澳洲定居指南 | - | ------ | ------------------------- | --------------- | ---------------- | - | health | food-travel-entertainment | cultural-events | settlement-guide | - - SBS Mandarin Programs: - - | SBS 普通话播客 | 解读澳洲 | 疫苗快报 | - | -------------- | ------------------- | -------------------------- | - | sbs-mandarin | australia-explained | covid-vaccine-daily-update | - - SBS Cantonese Programs: - - | SBS 廣東話節目 Podcast | 疫苗快報 | 美食速遞 | 我不是名人 | - | ---------------------- | ------------------- | --------------- | ------------------- | - | sbs-cantonese | covid-vaccine-daily | gourmet-express | my-australian-story | - - | 健康快樂人 | 園藝趣談 | 寰宇金融 | 文化 360 | 科技世界 | - | ------------------ | -------------- | -------------- | ----------- | ---------------- | - | healthy-happy-life | gardening-tips | global-finance | culture-360 | technology-world | - - :::tip - Mostly, you can omit `language`, for the reason that **madarin** is with **zh-hans** and **cantonese** is with **zh-hant** by default. For example, the route of [SBS 普通话电台](https://www.sbs.com.au/chinese/mandarin/zh-hans/podcast/sbs-mandarin) is [`/sbs/chinese/podcast/sbs-mandarin/mandarin/zh-hans`](https://rsshub.app/sbs/chinese/podcast/sbs-mandarin/mandarin/zh-hans), which can also be [`/sbs/chinese/podcast/sbs-mandarin/mandarin`](https://rsshub.app/sbs/chinese/podcast/sbs-mandarin/mandarin). - - You still can customize `language`, however, it is important to note that not all pages are available in bilingual versions. - ::: - - ## Solidot {#solidot} ### 最新消息 {#solidot-zui-xin-xiao-xi} @@ -585,7 +475,7 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li ### News {#south-china-morning-post-nan-hua-zao-bao-news} - + See the [official RSS page](https://www.scmp.com/rss) to get the ID of each category. This route provides fulltext that the offical feed doesn't. @@ -642,12 +532,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li | Portuguese | portuguese | -## Taiwan News 台灣英文新聞 {#taiwan-news-tai-wan-ying-wen-xin-wen} - -### Hot News {#taiwan-news-tai-wan-ying-wen-xin-wen-hot-news} - - - ## The Atlantic {#the-atlantic} ### News {#the-atlantic-news} @@ -670,20 +554,10 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li -### GRE Vocabulary {#the-economist-gre-vocabulary} - - - ### Global Business Review {#the-economist-global-business-review} -### Download {#the-economist-download} - - - The download site: [http://www.cgx02.xyz/index.php?dir=/te](http://www.cgx02.xyz/index.php?dir=/te) - - ## The Guardian 卫报 {#the-guardian-wei-bao} ### Editorial {#the-guardian-wei-bao-editorial} @@ -714,12 +588,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li | (empty) | dual | en | dual-traditionalchinese | traditionalchinese | -### News by author {#the-new-york-times-niu-yue-shi-bao-news-by-author} - - - Provides all of the articles by the specified New York Times author. - - ### 新闻简报 {#the-new-york-times-niu-yue-shi-bao-xin-wen-jian-bao} @@ -822,14 +690,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li | en | ja | mn | ru | zh | -## Yahoo! by Author {#yahoo!-by-author} - -### News {#yahoo!-by-author-news} - - - Provides all of the articles by the specified Yahoo! author. - - ## Yomiuri Shimbun 読売新聞 {#yomiuri-shimbun-du-mai-xin-wen} ### News {#yomiuri-shimbun-du-mai-xin-wen-news} @@ -955,82 +815,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li | 参考人物 | cankaorw | -## 朝日新聞中文網(繁體中文版) {#chao-ri-xin-wen-zhong-wen-wang-fan-ti-zhong-wen-ban} - -:::tip -朝日新闻中文网已于 2021 年 3 月 31 日关闭。 -::: - -### 新聞 {#chao-ri-xin-wen-zhong-wen-wang-fan-ti-zhong-wen-ban-xin-wen} - - - :::tip - 以下小标题即类型 `genre`,标题下表格中为对应类型的分类 `category`,两者需要配合使用。 - - 如订阅 **社会** 类型中的 **事件・事故・裁判** 分类,填入 [`/asahi/national/incident`](http://rsshub.app/asahi/national/incident)。 - - 若类型下没有分类,如 **トップ** 类型,直接填入 [`/asahi/top`](http://rsshub.app/asahi/top)。 - - 或者欲订阅该类型下的所有分类,如订阅 **社会** 中的所有分类,则直接将分类 `category` 留空,即 [`/asahi/national`](http://rsshub.app/asahi/national)。 - ::: - - トップ top - - 社会 national - - | 事件・事故・裁判 | 災害・交通情報 | その他・話題 | おくやみ | - | ---------------- | -------------- | ------------ | ---------- | - | incident | calamity | etc | obituaries | - - 経済 business - - | 産業・商品 | 金融・財政 | 経済政策 | 労働・雇用 | 市況・統計 | - | ---------- | ---------- | -------------- | ---------- | ---------- | - | industry | finance | economicpolicy | work | statistics | - - 政治 politics - - | 国政 | 地方政治 | 発言録 | 世論調査 | - | ---------- | -------- | ------------ | -------- | - | government | local | hatsugenroku | yoron | - - 国際 international - - | アジア・太平洋 | 北米 | 中南米 | ヨーロッパ | 中東 | アフリカ | 国連・その他 | - | -------------- | -------- | -------- | ---------- | ---------- | -------- | ------------ | - | asia | namerica | samerica | europe | middleeast | africa | etc | - - スポーツ sports - - | 野球 | サッカー | 相撲 | フィギュア | ゴルフ | 一般スポーツ | 東京オリンピック 2020 | 東京パラリンピック 2020 | - | -------- | -------- | ---- | ------------------- | ------ | ------------ | --------------------- | ----------------------- | - | baseball | soccer | sumo | winter\_figureskate | golf | general | olympics | paralympics | - - IT・科学 tech\_science - - | 環境・エネルギー | 科学 | デジもの | 企業・サービス | 製品ファイル | - | ---------------- | ------- | -------- | -------------- | ------------ | - | eco | science | digital | service | products | - - 文化・芸能 culture - - | 映画 | 音楽 | アイドル | アート | テレビ・芸能 | 舞台・演芸 | マンガ・アニメ・ゲーム | ひと・歴史 | 囲碁 | 将棋 | - | ------ | ----- | -------- | ------ | ------------ | ---------- | ---------------------- | ---------- | ---- | ------ | - | movies | music | idol | art | showbiz | stage | manga | history | igo | shougi | - - ライフ life - - | 介護 | 働き方・就活 | 食・料理 | - | --------- | ------------ | -------- | - | eldercare | hataraku | food | - - 教育・子育て edu - - | 小中高 | 大学 | 教育制度・話題 | 教育問題 | 地域の教育ニュース | 吹奏楽 | 合唱 | 子育て | ハグスタ | - | ------- | ---------- | -------------- | -------- | ------------------ | --------- | ------ | -------- | -------- | - | student | university | system | issue | chiiki | suisogaku | gassho | hagukumu | msta | - - ## 朝日新聞デジタル {#chao-ri-xin-wen-%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB} ### 新聞 {#chao-ri-xin-wen-%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB-xin-wen} @@ -1183,10 +967,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li -### 热点搜索 {#dong-fang-wang-re-dian-sou-suo} - - - ### 原创 {#dong-fang-wang-yuan-chuang} @@ -1299,45 +1079,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li | 城区 | 2980 | -## 广州市融媒体中心 {#guang-zhou-shi-rong-mei-ti-zhong-xin} - -### 频道 {#guang-zhou-shi-rong-mei-ti-zhong-xin-pin-dao} - - - 已知支持的站点及对应的`站点代码`如下: - - | 站点 / 客户端名 | 营运机构 | 代码 | - | :--------------------------------------------------------: | :--------------: | :--------------------------------------------: | - | [新花城](https://www.gz-cmc.com "新花城") | 广州日报社 | `huacheng` | - | [广州白云](https://guangzhoubaiyun.gz-cmc.com/ "广州白云") | 白云区融媒体中心 | `guangzhoubaiyun` | - | 到黄埔去 | 黄埔区融媒体中心 | `daohuangpuqu` | - | 掌上番禺 | 番禺区融媒体中心 | `zhangshangfanyu`
(注:此处非笔误 = =) | - | 阅增城 | 增城区融媒体中心 | `yuezengcheng` | - - 如有上表未列出的站点,欢迎补充。 - - `频道代码`获取方式: - - 1. 在对应频道 url 后的参数中获取,如`首页`的栏目 url 为`https://huacheng.gz-cmc.com/channel/shouye/index.html`, `频道代码`即为`shouye`。 - 2. 进入相应站点的客户端后抓包。 - - 黄埔、增城、番禺三区的站点无网页,需采用抓包的方式获取频道代码。现列出部分: - - | 频道名 | 代码 | - | :------------------------: | :------: | - | 黄埔 - 首页 | `sy` | - | 黄埔 -《湾区时报》最新一期 | `hpxsd` | - | 黄埔 - 民生 | `ms` | - | 黄埔 - 企明星 | `qmx` | - | 增城 - 首页 | `shouye` | - | 增城 - 身边 | `sb` | - | 增城 - 本地 | `zcfb` | - | 番禺 - 首页 | `shouye` | - | 番禺 - 身边 | `yw` | - | 番禺 - 生活 | `sh` | - | 番禺 - 教育 | `jy` | -
- ## 国际金融报栏目 {#guo-ji-jin-rong-bao-lan-mu} ### 栏目 {#guo-ji-jin-rong-bao-lan-mu-lan-mu} @@ -1352,40 +1093,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li -## 衡阳全搜索 {#heng-yang-quan-sou-suo} - -### 衡阳日报 {#heng-yang-quan-sou-suo-heng-yang-ri-bao} - - - | 版 | 编号 | - | ----------------- | ---- | - | 全部 | | - | 第 A01 版:版面一 | 1 | - | 第 A02 版:版面二 | 2 | - | 第 A03 版:版面三 | 3 | - | 第 A04 版:版面四 | 4 | - | 第 A05 版:版面五 | 5 | - | 第 A06 版:版面六 | 6 | - | 第 A07 版:版面七 | 7 | - | 第 A08 版:版面八 | 8 | - - -### 衡阳晚报 {#heng-yang-quan-sou-suo-heng-yang-wan-bao} - - - | 版 | 编号 | - | ----------------- | ---- | - | 全部 | | - | 第 A01 版:版面一 | 1 | - | 第 A02 版:版面二 | 2 | - | 第 A03 版:版面三 | 3 | - | 第 A04 版:版面四 | 4 | - | 第 A05 版:版面五 | 5 | - | 第 A06 版:版面六 | 6 | - | 第 A07 版:版面七 | 7 | - | 第 A08 版:版面八 | 8 | - - ## 湖南日报 {#hu-nan-ri-bao} ### 电子刊物 {#hu-nan-ri-bao-dian-zi-kan-wu} @@ -1585,22 +1292,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li | hakka | political | medical | local | international | -## 理论网 {#li-lun-wang} - -### 学习时报 {#li-lun-wang-xue-xi-shi-bao} - - - 如订阅 **第 A1 版:国内大局**,路由为 [`/cntheory/paper/国内大局`](https://rsshub.app/cntheory/paper/国内大局)。 - - -## 连线 Wired {#lian-xian-wired} - -非订阅用户每月有阅读全文次数限制。 - -### 标签 {#lian-xian-wired-biao-qian} - - - ## 联合早报 {#lian-he-zao-bao} :::warning @@ -1625,9 +1316,9 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li ### 其他栏目 {#lian-he-zao-bao-qi-ta-lan-mu} -除了上面两个兼容规则之外,联合早报网站里所有页面形如 [https://www.zaobao.com/wencui/politic](https://www.zaobao.com/wencui/politic) 这样的栏目都能被这个规则解析到,早报的大部分栏目都是这个样式的。你可以测试之后再订阅。 +除了上面两个兼容规则之外,联合早报网站里所有页面形如 [https://www.zaobao.com/lifestyle/health](https://www.zaobao.com/lifestyle/health) 这样的栏目都能被这个规则解析到,早报的大部分栏目都是这个样式的。你可以测试之后再订阅。 - + ### 互动新闻 {#lian-he-zao-bao-hu-dong-xin-wen} @@ -1683,7 +1374,7 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li ### 南方 +(按栏目 ID) {#nan-fang-wang-nan-fang-an-lan-mu-id} - + :::tip 若此处输入的是栏目 ID(而非南方号 ID),则该接口会返回与输入栏目相关联栏目的文章。例如,输入栏目 ID `38`(广州),则返回的结果还会包含 ID 为 `3547`(市长报道集)的文章。 ::: @@ -1921,32 +1612,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li | 2 | 4 | 3 | 453 | -## 苹果新闻网 {#ping-guo-xin-wen-wang} - -### 频道 {#ping-guo-xin-wen-wang-pin-dao} - - - 频道参数均可在官网获取,如: - - `https://tw.appledaily.com/realtime/micromovie/` 对应 `/appledaily/micromovie` - - `https://tw.appledaily.com/home/` 对应 `/appledaily/home` - - -## 齐鲁晚报 {#qi-lu-wan-bao} - -### 新闻 {#qi-lu-wan-bao-xin-wen} - - - -### 今日城市 {#qi-lu-wan-bao-jin-ri-cheng-shi} - - - | 今日临沂 | 今日德州 | 今日威海 | 今日枣庄 | 今日淄博 | 今日烟台 | 今日潍坊 | 今日菏泽 | 今日日照 | 今日泰山 | 今日聊城 | 今日济宁 | - | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | -------- | -------- | --------- | -------- | - | linyi | dezhou | weihai | zaozhuang | zibo | yantai | weifang | heze | rizhao | taishan | liaocheng | jining | - - ## 齐鲁网 {#qi-lu-wang} ### 电视节目 {#qi-lu-wang-dian-shi-jie-mu} @@ -2181,78 +1846,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li `https://www.soundofhope.org/term/203` 对应 `/soundofhope/term/203` -## 香港经济日报 {#xiang-gang-jing-ji-ri-bao} - -### 新闻 {#xiang-gang-jing-ji-ri-bao-xin-wen} - -香港经济日报已有提供简单 RSS,详细可前往官方网站: [https://www.hket.com/rss](https://www.hket.com/rss) - -此路由主要补全官方 RSS 全文输出及完善分类输出。 - - -
- 分类 - - | sran001 | sran008 | sran010 | sran011 | sran012 | srat006 | - | -------- | -------- | -------- | -------- | -------- | -------- | - | 全部新闻 | 财经地产 | 科技信息 | 国际新闻 | 商业新闻 | 香港新闻 | - - | sran009 | sran009-1 | sran009-2 | sran009-3 | sran009-4 | sran009-5 | sran009-6 | - | -------- | --------- | --------- | ---------- | --------- | --------- | --------- | - | 即时财经 | 股市 | 新股 IPO | 新经济追踪 | 当炒股 | 宏观解读 | Hot Talk | - - | sran011-1 | sran011-2 | sran011-3 | - | --------- | ------------ | ------------ | - | 环球政治 | 环球经济金融 | 环球社会热点 | - - | sran016 | sran016-1 | sran016-2 | sran016-3 | sran016-4 | sran016-5 | - | ---------- | ---------- | ---------- | ---------- | ---------- | -------------- | - | 大湾区主页 | 大湾区发展 | 大湾区工作 | 大湾区买楼 | 大湾区消费 | 大湾区投资理财 | - - | srac002 | srac003 | srac004 | srac005 | - | -------- | -------- | -------- | -------- | - | 即时中国 | 经济脉搏 | 国情动向 | 社会热点 | - - | srat001 | srat008 | srat055 | srat069 | srat070 | - | ------- | ------- | -------- | -------- | --------- | - | 话题 | 观点 | 休闲消费 | 娱乐新闻 | TOPick TV | - - | srat052 | srat052-1 | srat052-2 | srat052-3 | - | -------- | --------- | ---------- | --------- | - | 健康主页 | 食用安全 | 医生诊症室 | 保健美颜 | - - | srat053 | srat053-1 | srat053-2 | srat053-3 | srat053-4 | - | -------- | --------- | --------- | --------- | ---------- | - | 亲子主页 | 儿童健康 | 育儿经 | 教育 | 亲子好去处 | - - | srat053-6 | srat053-61 | srat053-62 | srat053-63 | srat053-64 | - | ----------- | ---------- | ---------- | ---------- | ---------- | - | Band 1 学堂 | 幼稚园 | 中小学 | 尖子教室 | 海外升学 | - - | srat072-1 | srat072-2 | srat072-3 | srat072-4 | - | ---------- | ---------- | ---------------- | ----------------- | - | 健康身心活 | 抗癌新方向 | 「糖」「心」解密 | 风湿不再 你我自在 | - - | sraw007 | sraw009 | sraw010 | sraw011 | sraw012 | sraw014 | sraw018 | sraw019 | - | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | - | 全部博客 | Bloggers | 收息攻略 | 精明消费 | 退休规划 | 个人增值 | 财富管理 | 绿色金融 | - - | sraw015 | sraw015-07 | sraw015-08 | sraw015-09 | sraw015-10 | - | -------- | ---------- | ---------- | ---------- | ---------- | - | 移民百科 | 海外置业 | 移民攻略 | 移民点滴 | 海外理财 | - - | sraw020 | sraw020-1 | sraw020-2 | sraw020-3 | sraw020-4 | - | -------- | ------------ | --------- | --------- | --------- | - | ESG 主页 | ESG 趋势政策 | ESG 投资 | ESG 企业 | ESG 社会 | -
-
- -## 香港商报 {#xiang-gang-shang-bao} - -### PDF 版 {#xiang-gang-shang-bao-pdf-ban} - - - ## 新华每日电讯 {#xin-hua-mei-ri-dian-xun} ### 今日 {#xin-hua-mei-ri-dian-xun-jin-ri} @@ -2271,10 +1864,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li -### 电子报 {#xin-jing-bao-dian-zi-bao} - - - ## 新快报 {#xin-kuai-bao} ### 新闻 {#xin-kuai-bao-xin-wen} @@ -2374,16 +1963,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li ::: -### 新闻专题 {#yang-shi-xin-wen-xin-wen-zhuan-ti} - - - :::tip - 如 [2020 年国家网络安全宣传周](https://news.cctv.com/special/2020gjwlaqxcz/index.shtml) 的专题页 URL 为 `https://news.cctv.com/special/2020gjwlaqxcz/index.shtml`。其专题 id 即为 `2020gjwlaqxcz`。 - ::: - - 此处查看 [所有新闻专题](http://news.cctv.com/special/index.shtml) - - ### 专题 {#yang-shi-xin-wen-zhuan-ti} @@ -2396,10 +1975,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li -### 新闻联播文字版完整版 {#yang-shi-xin-wen-xin-wen-lian-bo-wen-zi-ban-wan-zheng-ban} - - - ### 央视网图片《镜象》 {#yang-shi-xin-wen-yang-shi-wang-tu-pian-%E3%80%8A-jing-xiang-%E3%80%8B} @@ -2422,15 +1997,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li | 18 | 5261 | 6030 | 13352 | 83422 | 100418 | 13074 | 12252 | 12212 | -## 有線寬頻 i-CABLE {#you-xian-kuan-bin-i-cable} - -### 有線新聞 | Cable News {#you-xian-kuan-bin-i-cable-you-xian-xin-wen-cable-news} - - - | 新聞資訊 | 財經資訊 | 港聞 | 兩岸國際 | 中國在線 | 體育 | 娛樂 | - | -------- | -------- | ---- | -------- | -------- | ---- | ---- | - - ## 浙江在线 {#zhe-jiang-zai-xian} ### 浙报集团系列报刊 {#zhe-jiang-zai-xian-zhe-bao-ji-tuan-xi-lie-bao-kan} @@ -2454,13 +2020,13 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li ### 科技日报 {#zhong-guo-ke-ji-wang-ke-ji-ri-bao} - + ## 中国日报 {#zhong-guo-ri-bao} ### 英语点津 {#zhong-guo-ri-bao-ying-yu-dian-jin} - + 目录分类 | 最新 | 双语 | 热词 | 口语 | 译词 | 视频 | 听力 | 专栏 | 文件 | 考试 | @@ -2509,13 +2075,3 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li ### 分类 (网页爬虫方法) {#zhong-yang-tong-xun-she-fen-lei-wang-ye-pa-chong-fang-fa} - -## 组织人事报 {#zu-zhi-ren-shi-bao} - -### 电子报 {#zu-zhi-ren-shi-bao-dian-zi-bao} - - - | 第一版 要闻 | 第二版 要闻 | 第三版 人才 | 第四版 人社工作 | 第五版 基层党建 | 第六版 理论评论 | 第七版 史事通鉴 | 第八版 关注 | - | ----------- | ----------- | ----------- | --------------- | --------------- | --------------- | --------------- | ----------- | - | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -