feat: remove notOperational routes - traditional media

This commit is contained in:
DIYgod
2023-12-19 22:03:27 +08:00
parent e9ba4f94e0
commit ea6ec949bf
84 changed files with 8 additions and 2793 deletions
-1
View File
@@ -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' }] },
-12
View File
@@ -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: [
-32
View File
@@ -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'));
-57
View File
@@ -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: '朝日新聞社のニュースサイト、朝日新聞デジタルの社会ニュースについてのページです',
};
};
-80
View File
@@ -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 = `<hr><hr><br><strong>${ititle}</strong><br><br>${iprecontent}${imaincontent}<hr><br><br>`;
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,
})),
};
};
-73
View File
@@ -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',
};
};
-58
View File
@@ -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: `<p>${description.join('</p><p>')}</p><img src="${itemPicUrl}">`,
pubDate: item.find('time.blog').attr('datetime'),
link: item.find('a').attr('href'),
};
})
.get(),
};
};
-55
View File
@@ -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: `<p>${description.join('</p><p>')}</p><img src="${itemPicUrl}">`,
link: item.find('a').attr('href'),
};
})
.get(),
};
};
-115
View File
@@ -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 <a href="https://docs.rsshub.app/routes/traditional-media#zhong-shi-dian-zi-bao">https://docs.rsshub.app/routes/traditional-media#zhong-shi-dian-zi-bao</a>');
}
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 = '<p>' + right.find('p.intro').text() + '...</p>';
if (img) {
desc = `<p><img src="${img}"></p>` + 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,
};
};
-55
View File
@@ -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,
};
};
-43
View File
@@ -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,
};
};
-30
View File
@@ -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(/<td align="right"><font color="#FFFFFF">(.*)/)[1];
const $ = cheerio.load(data.replace('<table width="177" border="0" cellspacing="1" cellpadding="0"', '<table id="content" width="177" border="0" cellspacing="1" cellpadding="0"'));
ctx.state.data = {
title: '香港商报PDF版',
link: currentUrl,
item: [
{
title: date,
link: currentUrl,
description: $('#content').html(),
pubDate: new Date(date.replace(/年|月/g, '-').replace(/日/, '')).toUTCString(),
},
],
};
};
-54
View File
@@ -1,54 +0,0 @@
const got = require('@/utils/got');
const cheerio = require('cheerio');
const config = {
linyi: 'http://linyi.qlwb.com.cn/yaowen/',
dezhou: 'http://dezhou.qlwb.com.cn/yaowen/',
weihai: 'http://jrwh.qlwb.com.cn/yaowen/',
zaozhuang: 'http://jrzz.qlwb.com.cn/yw/',
zibo: 'http://jrzb.qlwb.com.cn/yw/',
yantai: 'http://yantai.qlwb.com.cn/yantai/yaowen/',
weifang: 'http://jrwf.qlwb.com.cn/xw/',
heze: 'http://jrhz.qlwb.com.cn/jjhz/',
rizhao: 'http://jrrz.qlwb.com.cn/fbh/',
taishan: 'http://taian.qlwb.com.cn/fabu/',
liaocheng: 'http://www.qlwb.com.cn/news/sqds/liaocheng/',
jining: 'http://jryh.qlwb.com.cn/jiningxinwen/',
};
module.exports = async (ctx) => {
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;
})
)
),
};
};
-37
View File
@@ -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;
})
)
),
};
};
-70
View File
@@ -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 ? `<img src="${image}"><br>` : ''}${audio ? `<audio src="${audio}" controls></audio><br>` : ''}${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`,
};
};
-31
View File
@@ -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: `<img
src="${$(content_).find('.image-group-component img').attr('src')}">
<br>
${$(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,
};
};
-65
View File
@@ -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,
};
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/:channel?': ['Fatpandac'],
};
-157
View File
@@ -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';
}
},
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = function (router) {
router.get('/:channel?', require('./index'));
};
-1
View File
@@ -1,7 +1,6 @@
module.exports = {
'/lm/:id?': ['nczitzk'],
'/photo/jx': ['nczitzk'],
'/special/:id?': ['nczitzk'],
'/xwlb': ['zengxs'],
'/:category': ['idealclover', 'xyqfer'],
};
-6
View File
@@ -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',
-1
View File
@@ -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'));
};
-110
View File
@@ -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 += `<img src="${i.attr('photourl')}">`;
date = i.attr('time').replace(/年/g, '-').replace(/月/g, '-').replace(/日/g, '');
description = i.html();
});
item.description += `<p>${description}</p>`;
} 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,
};
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/paper/:id?': ['nczitzk'],
};
-89
View File
@@ -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,
};
};
-13
View File
@@ -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]}`,
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = function (router) {
router.get('/paper/:id?', require('./paper'));
};
@@ -1,2 +0,0 @@
{{@ resource }}
{{@ description }}
-49
View File
@@ -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,
};
};
-1
View File
@@ -1,6 +1,5 @@
module.exports = {
'/24/:category?': ['nczitzk'],
'/find': ['nczitzk'],
'/portrait': ['nczitzk'],
'/sh': ['saury'],
};
-6
View File
@@ -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',
-1
View File
@@ -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'));
};
-30
View File
@@ -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,
};
}),
};
};
-19
View File
@@ -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,
})),
};
};
-2
View File
@@ -1,7 +1,5 @@
module.exports = {
'/download': ['nczitzk'],
'/espresso': ['TonyRL'],
'/gre-vocabulary': ['xyqfer'],
'/global-business-review/:language?': ['prnake'],
'/:endpoint': ['ImSingee'],
};
-8
View File
@@ -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',
-2
View File
@@ -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'));
};
-1
View File
@@ -1,4 +1,3 @@
module.exports = {
'/myft/:key': ['HenryQW'],
'/:language/:channel?': ['HenryQW', 'xyqfer'],
};
-51
View File
@@ -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,
};
};
-13
View File
@@ -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',
},
],
},
};
-1
View File
@@ -1,4 +1,3 @@
module.exports = function (router) {
router.get('/myft/:key', require('./myft'));
router.get('/:language/:channel?', require('./channel'));
};
-137
View File
@@ -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 += '<blockquote>' + content('meta[name="description"]').attr('content') + '</blockquote>';
}
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,
};
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/:site/:channel?': ['TimWu007'],
};
-12
View File
@@ -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: ['/'],
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = (router) => {
router.get('/:site/:channel?', require('./index'));
};
-3
View File
@@ -1,3 +0,0 @@
{{ if thumb }}
<img src="{{ thumb }}"><br>
{{ /if }}
-122
View File
@@ -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',
};
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/:category?': ['TonyRL'],
};
-45
View File
@@ -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',
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = function (router) {
router.get('/:category?', require('./index'));
};
-1
View File
@@ -1 +0,0 @@
{{@ desc }}
-1
View File
@@ -1 +0,0 @@
<figure><img alt="{{ alt }}" src="{{ src }}"><figcaption>{{ alt }}</figcaption></figure>
-89
View File
@@ -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,
};
};
-4
View File
@@ -1,4 +0,0 @@
module.exports = {
'/hyrb/:id?': ['nczitzk'],
'/hywb/:id?': ['nczitzk'],
};
-22
View File
@@ -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,
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = function (router) {
router.get('/:type?/:id?', require('./index'));
};
-74
View File
@@ -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,
};
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/:category?': ['tpnonthealps'],
};
-13
View File
@@ -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('/'))) : ''}`,
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = (router) => {
router.get('/:category?', require('./category'));
};
-8
View File
@@ -1,8 +0,0 @@
{{ if imgs }}
{{ each imgs img }}
<img src="{{ img }}"><br>
{{ /each }}
{{ /if }}
{{ if content }}
{{@ content }}
{{ /if }}
+1 -1
View File
@@ -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,
};
-43
View File
@@ -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,
};
};
-6
View File
@@ -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',
-1
View File
@@ -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'));
-33
View File
@@ -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,
};
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/geopolitique': ['xdu'],
};
-13
View File
@@ -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',
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = (router) => {
router.get('/geopolitique', require('./geopolitique'));
};
-6
View File
@@ -1,6 +0,0 @@
<p>{{ standFirst }}</p>
{{ each bodyJson }}
{{ if $value.type === 'text' }}
<p>{{ $value.children[0].value }}</p>
{{ /if }}
{{ /each }}
-52
View File
@@ -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,
};
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/hot/:lang?': ['TonyRL'],
};
-13
View File
@@ -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',
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = (router) => {
router.get('/hot/:lang?', require('./hot'));
};
-40
View File
@@ -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,
};
};
-4
View File
@@ -1,4 +0,0 @@
module.exports = {
'/': ['xfangbao'],
'/index': ['xfangbao'],
};
-13
View File
@@ -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',
},
],
},
};
-4
View File
@@ -1,4 +0,0 @@
module.exports = (router) => {
router.get('/', require('./index'));
router.redirect('/index', '/xwlb');
};
-87
View File
@@ -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,
};
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
'/:id?': ['5upernova-heng'],
};
-13
View File
@@ -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',
},
],
},
};
-3
View File
@@ -1,3 +0,0 @@
module.exports = (router) => {
router.get('/:id?', require('.'));
};
+7 -451
View File
@@ -98,15 +98,6 @@
- 频道,如金融財經 `https://www.bbc.co.uk/zhongwen/trad/business/index.xml` 则为 `/bbc/traditionalchinese/business`.
</Route>
## Boston.com {#boston-com}
### News {#boston-com-news}
<Route author="oppilate" example="/boston/technology" path="/boston/:tag?" paramsDesc={['Tag']} notOperational="1">
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`.
</Route>
## 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`.
</Route>
## China Dialogue 中外对话 {#china-dialogue-zhong-wai-dui-hua}
### Topics {#china-dialogue-zhong-wai-dui-hua-topics}
<Route author="zoenglinghou" example="/chinadialogue/topics/cities" path="/chinadialogue/topics/:topic" paramsDesc={['Topics']} notOperational="1">
| 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 |
</Route>
### Columns {#china-dialogue-zhong-wai-dui-hua-columns}
<Route author="zoenglinghou" example="/chinadialogue/article" path="/chinadialogue/:column" paramsDesc={['栏目分类']} notOperational="1">
| Articles | Blogs | Culture | Reports |
| -------- | ----- | ------- | ------- |
| article | blog | culture | reports |
</Route>
### 福建新闻 {#china-dialogue-zhong-wai-dui-hua-fu-jian-xin-wen}
<Route author="jjlzg" example="/fjnews/fj/30" path="/fjnews/fznews" notOperational="1" />
### 九江新闻 {#china-dialogue-zhong-wai-dui-hua-jiu-jiang-xin-wen}
<Route author="jjlzg" example="/fjnews/jjnews" path="/fjnews/jjnews" notOperational="1" />
## China Times 中時電子報 {#china-times-zhong-shi-dian-zi-bao}
### News {#china-times-zhong-shi-dian-zi-bao-news}
<Route author="luyuhuang" example="/chinatimes/realtimenews" path="/chinatimes/:caty" paramsDesc={['category']} radar="1" notOperational="1">
| 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 |
</Route>
## ChinaFile {#chinafile}
### Reporting & Opinion {#chinafile-reporting-opinion}
@@ -239,15 +194,6 @@
- 频道包含多重路径,如 `http://www.ftchinese.com/rss/column/007000002` 则替换 `/` 为 `-` `/ft/chinese/column-007000002`.
</Route>
### myFT personal RSS {#financial-times-myft-personal-rss}
<Route author="HenryQW" example="/ft/myft/rss-key" path="/ft/myft/:key" paramsDesc={['the last part of myFT personal RSS address']} notOperational="1">
:::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`
:::
</Route>
## 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.
:::
</Route>
## Radio France 法国广播电台 {#radio-france-fa-guo-guang-bo-dian-tai}
### Géopolitique {#radio-france-fa-guo-guang-bo-dian-tai-geopolitique}
<Route author="xdu" example="/radiofrance/geopolitique" path="/radiofrance/geopolitique" notOperational="1">
French podcast on the international politics. This feed provides a better reading experience (full text) for the 3 latest articles.
</Route>
## 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}
<Route author="TonyRL" example="/rodong/news" path="/rodong/news/:language?" paramsDesc={['Language, see below, `ko` by default']} radar="1" notOperational="1">
<Route author="TonyRL" example="/rodong/news" path="/rodong/news/:language?" paramsDesc={['Language, see below, `ko` by default']} radar="1">
| 조선어 | 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#中文简繁体转换))
</Route>
## SBS {#sbs}
### Chinese {#sbs-chinese}
<Route author="nczitzk" example="/sbs/chinese" path="/sbs/chinese/:category?/:id?/:dialect?/:language?" paramsDesc={['Category, `news` or `podcast`, `news` by default', 'Id, see below, can be found in URL, `news` by default', 'Dialect, `mandarin` or `cantonese`, `mandarin` by default', 'Language, `zh-hans` or `zh-hant`, `zh-hans` by default']} notOperational="1">
:::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.
:::
</Route>
## 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}
<Route author="proletarius101" example="/scmp/3" path="/scmp/:category_id" paramsDesc={['Category']} notOperational="1">
<Route author="proletarius101" example="/scmp/3" path="/scmp/:category_id" paramsDesc={['Category']}>
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.
</Route>
@@ -642,12 +532,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li
| Portuguese | portuguese |
</Route>
## Taiwan News 台灣英文新聞 {#taiwan-news-tai-wan-ying-wen-xin-wen}
### Hot News {#taiwan-news-tai-wan-ying-wen-xin-wen-hot-news}
<Route author="TonyRL" example="/taiwannews/hot" path="/taiwannews/hot/:lang?" paramsDesc={['Language, `en` or `zh`, `en` by default']} radar="1" notOperational="1" />
## 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
<Route author="TonyRL" example="/economist/espresso" path="/economist/espresso" radar="1" />
### GRE Vocabulary {#the-economist-gre-vocabulary}
<Route author="xyqfer" example="/economist/gre-vocabulary" path="/economist/gre-vocabulary" notOperational="1" />
### Global Business Review {#the-economist-global-business-review}
<Route author="prnake" example="/economist/global-business-review/cn-en" path="/economist/global-business-review/:language?" paramsDesc={['Language, `en`, `cn`, `tw` are supported, support multiple options, default to cn-en']} radar="1" />
### Download {#the-economist-download}
<Route author="nczitzk" example="/economist/download" path="/economist/download" notOperational="1">
The download site: [http://www.cgx02.xyz/index.php?dir=/te](http://www.cgx02.xyz/index.php?dir=/te)
</Route>
## 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 |
</Route>
### News by author {#the-new-york-times-niu-yue-shi-bao-news-by-author}
<Route author="kevinschaul" example="/nytimes/author/farhad-manjoo" path="/nytimes/author/:byline" paramsDesc={['Authors name in New York Times URL format']} notOperational="1">
Provides all of the articles by the specified New York Times author.
</Route>
### 新闻简报 {#the-new-york-times-niu-yue-shi-bao-xin-wen-jian-bao}
<Route author="yueyericardo nczitzk" example="/nytimes/daily_briefing_chinese" path="/nytimes/daily_briefing_chinese">
@@ -822,14 +690,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li
| en | ja | mn | ru | zh |
</Route>
## Yahoo! by Author {#yahoo!-by-author}
### News {#yahoo!-by-author-news}
<Route author="loganrockmore" example="/yahoo-author/hannah-keyser" path="/yahoo-news/:author" paramsDesc={['Author']} notOperational="1">
Provides all of the articles by the specified Yahoo! author.
</Route>
## 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 |
</Route>
## 朝日新聞中文網(繁體中文版) {#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}
<Route author="nczitzk" example="/asahi" path="/asahi/:genre?/:category?" paramsDesc={['类型,见下表,默认为トップ', '分类,见下表,默认为空,即该类型下所有新闻']}>
:::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 |
</Route>
## 朝日新聞デジタル {#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
<Route author="saury" example="/eastday/sh" path="/eastday/sh" />
### 热点搜索 {#dong-fang-wang-re-dian-sou-suo}
<Route author="nczitzk" example="/eastday/find" path="/eastday/find" notOperational="1" />
### 原创 {#dong-fang-wang-yuan-chuang}
<Route author="nczitzk" example="/eastday/portrait" path="/eastday/portrait" />
@@ -1299,45 +1079,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li
| 城区 | 2980 |
</Route>
## 广州市融媒体中心 {#guang-zhou-shi-rong-mei-ti-zhong-xin}
### 频道 {#guang-zhou-shi-rong-mei-ti-zhong-xin-pin-dao}
<Route author="TimWu007" example="/gz-cmc/huacheng/shouye" path="/gz-cmc/:site/:channel?" paramsDesc={['站点代码', '频道代码']} notOperational="1">
已知支持的站点及对应的`站点代码`如下:
| 站点 / 客户端名 | 营运机构 | 代码 |
| :--------------------------------------------------------: | :--------------: | :--------------------------------------------: |
| [新花城](https://www.gz-cmc.com "新花城") | 广州日报社 | `huacheng` |
| [广州白云](https://guangzhoubaiyun.gz-cmc.com/ "广州白云") | 白云区融媒体中心 | `guangzhoubaiyun` |
| 到黄埔去 | 黄埔区融媒体中心 | `daohuangpuqu` |
| 掌上番禺 | 番禺区融媒体中心 | `zhangshangfanyu` <br />(注:此处非笔误 = = |
| 阅增城 | 增城区融媒体中心 | `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` |
</Route>
## 国际金融报栏目 {#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
<Route author="iamqiz nczitzk" example="/hebtv/nbszxd" path="/hebtv/nbszxd" radar="1" supportBT="1" supportPodcast="1" />
## 衡阳全搜索 {#heng-yang-quan-sou-suo}
### 衡阳日报 {#heng-yang-quan-sou-suo-heng-yang-ri-bao}
<Route author="nczitzk" example="/hyqss/hyrb" path="/hyqss/hyrb/:id?" paramsDesc={['编号,见下表,默认为全部']} notOperational="1">
| 版 | 编号 |
| ----------------- | ---- |
| 全部 | |
| 第 A01 版:版面一 | 1 |
| 第 A02 版:版面二 | 2 |
| 第 A03 版:版面三 | 3 |
| 第 A04 版:版面四 | 4 |
| 第 A05 版:版面五 | 5 |
| 第 A06 版:版面六 | 6 |
| 第 A07 版:版面七 | 7 |
| 第 A08 版:版面八 | 8 |
</Route>
### 衡阳晚报 {#heng-yang-quan-sou-suo-heng-yang-wan-bao}
<Route author="nczitzk" example="/hyqss/hywb" path="/hyqss/hywb/:id?" paramsDesc={['编号,见下表,默认为全部']} notOperational="1">
| 版 | 编号 |
| ----------------- | ---- |
| 全部 | |
| 第 A01 版:版面一 | 1 |
| 第 A02 版:版面二 | 2 |
| 第 A03 版:版面三 | 3 |
| 第 A04 版:版面四 | 4 |
| 第 A05 版:版面五 | 5 |
| 第 A06 版:版面六 | 6 |
| 第 A07 版:版面七 | 7 |
| 第 A08 版:版面八 | 8 |
</Route>
## 湖南日报 {#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 |
</Route>
## 理论网 {#li-lun-wang}
### 学习时报 {#li-lun-wang-xue-xi-shi-bao}
<Route author="nczitzk" example="/cntheory/paper" path="/cntheory/paper/:id?" paramsDesc={['板块,默认为全部']} notOperational="1">
如订阅 **第 A1 版:国内大局**,路由为 [`/cntheory/paper/国内大局`](https://rsshub.app/cntheory/paper/国内大局)。
</Route>
## 连线 Wired {#lian-xian-wired}
非订阅用户每月有阅读全文次数限制。
### 标签 {#lian-xian-wired-biao-qian}
<Route author="Naiqus" example="/wired/tag/bitcoin" path="/wired/tag/:tag" paramsDesc={['标签']} notOperational="1" />
## 联合早报 {#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) 这样的栏目都能被这个规则解析到,早报的大部分栏目都是这个样式的。你可以测试之后再订阅。
<Route author="lengthmin" example="/zaobao/wencui/politic" path="/zaobao/:type?/:section?" paramsDesc={['https://www.zaobao.com/**wencui**/politic 中的 **wencui**', 'https://www.zaobao.com/wencui/**politic** 中的 **politic**']} notOperational="1" />
<Route author="lengthmin" example="/zaobao/lifestyle/health" path="/zaobao/:type?/:section?" paramsDesc={['https://www.zaobao.com/**lifestyle**/health 中的 **lifestyle**', 'https://www.zaobao.com/lifestyle/**health** 中的 **health**']} notOperational="1" />
### 互动新闻 {#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}
<Route author="TimWu007" example="/southcn/nfapp/column/38" path="/southcn/nfapp/column/:column?" paramsDesc={['栏目或南方号 ID']} notOperational="1">
<Route author="TimWu007" example="/southcn/nfapp/column/38" path="/southcn/nfapp/column/:column?" paramsDesc={['栏目或南方号 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 |
</Route>
## 苹果新闻网 {#ping-guo-xin-wen-wang}
### 频道 {#ping-guo-xin-wen-wang-pin-dao}
<Route author="Fatpandac" example="/appledaily/home" path="/appledaily/:channel?" paramsDesc={['频道,默认为主页']} notOperational="1">
频道参数均可在官网获取,如:
`https://tw.appledaily.com/realtime/micromovie/` 对应 `/appledaily/micromovie`
`https://tw.appledaily.com/home/` 对应 `/appledaily/home`
</Route>
## 齐鲁晚报 {#qi-lu-wan-bao}
### 新闻 {#qi-lu-wan-bao-xin-wen}
<Route author="nczitzk" example="/qlwb/news" path="/qlwb/news" notOperational="1" />
### 今日城市 {#qi-lu-wan-bao-jin-ri-cheng-shi}
<Route author="nczitzk" example="/qlwb/city/:city" path="/qlwb/city" paramsDesc={['城市代码']} notOperational="1">
| 今日临沂 | 今日德州 | 今日威海 | 今日枣庄 | 今日淄博 | 今日烟台 | 今日潍坊 | 今日菏泽 | 今日日照 | 今日泰山 | 今日聊城 | 今日济宁 |
| -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | -------- | -------- | --------- | -------- |
| linyi | dezhou | weihai | zaozhuang | zibo | yantai | weifang | heze | rizhao | taishan | liaocheng | jining |
</Route>
## 齐鲁网 {#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`
</Route>
## 香港经济日报 {#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 全文输出及完善分类输出。
<Route author="TonyRL" example="/hket/sran001" path="/hket/:category?" paramsDesc={['分类,默认为全部新闻,可在 URL 中找到,部分见下表']} radar="1" notOperational="1">
<details>
<summary>分类</summary>
| 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 社会 |
</details>
</Route>
## 香港商报 {#xiang-gang-shang-bao}
### PDF 版 {#xiang-gang-shang-bao-pdf-ban}
<Route author="nczitzk" example="/hkcd/pdf" path="/hkcd/pdf" notOperational="1" />
## 新华每日电讯 {#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
<Route author="DIYgod" example="/bjnews/realtime" path="/bjnews/:category" paramsDesc={['新京报的栏目名,点击对应栏目后在地址栏找到']} />
### 电子报 {#xin-jing-bao-dian-zi-bao}
<Route author="MisteryMonster" example="/bjnews/epaper/A" path="/bjnews/epaper/:cat" paramsDesc={['新京报叠名:`A`,`B`,`C`,`D`, 特刊为`special`']} notOperational="1" />
## 新快报 {#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
:::
</Route>
### 新闻专题 {#yang-shi-xin-wen-xin-wen-zhuan-ti}
<Route author="nczitzk" example="/cctv/special/315" path="/cctv/special/:id?" paramsDesc={['专题 id,可在对应专题页 URL 中找到,默认为 `315` 即 3·15 晚会']} radar="1" notOperational="1">
:::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)
</Route>
### 专题 {#yang-shi-xin-wen-zhuan-ti}
<Route author="idealclover xyqfer" example="/cctv/world" path="/cctv/:category" paramsDesc={['分类名']} radar="1">
@@ -2396,10 +1975,6 @@ This route adds the missing photo and Link element. (Offical RSS doesn't have Li
<Route author="luyuhuang" example="/xinwenlianbo/index" path="/xinwenlianbo/index" radar="1" anticrawler="1" />
### 新闻联播文字版完整版 {#yang-shi-xin-wen-xin-wen-lian-bo-wen-zi-ban-wan-zheng-ban}
<Route author="xfangbao" example="/xwlb" path="/xwlb/index" radar="1" notOperational="1" />
### 央视网图片《镜象》 {#yang-shi-xin-wen-yang-shi-wang-tu-pian-%E3%80%8A-jing-xiang-%E3%80%8B}
<Route author="nczitzk" example="/cctv/photo/jx" path="/cctv/photo/jx" radar="1" />
@@ -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 |
</Route>
## 有線寬頻 i-CABLE {#you-xian-kuan-bin-i-cable}
### 有線新聞 | Cable News {#you-xian-kuan-bin-i-cable-you-xian-xin-wen-cable-news}
<Route author="tpnonthealps" example="/i-cable" path="/i-cable/:category?" paramsDesc={['分類,頁面內紅色標籤,下表僅列出部分,留空為全部']} radar="1" notOperational="1">
| 新聞資訊 | 財經資訊 | 港聞 | 兩岸國際 | 中國在線 | 體育 | 娛樂 |
| -------- | -------- | ---- | -------- | -------- | ---- | ---- |
</Route>
## 浙江在线 {#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}
<Route author="lyqluis" example="/stdaily/digitalpaper" path="/stdaily/digitalpaper" notOperational="1" />
<Route author="lyqluis" example="/stdaily/digitalpaper" path="/stdaily/digitalpaper" />
## 中国日报 {#zhong-guo-ri-bao}
### 英语点津 {#zhong-guo-ri-bao-ying-yu-dian-jin}
<Route author="sanmmm" example="/chinadaily/english/thelatest" path="/chinadaily/english/:category" paramsDesc={['目录分类']} notOperational="1">
<Route author="sanmmm" example="/chinadaily/english/thelatest" path="/chinadaily/english/:category" paramsDesc={['目录分类']}>
目录分类
| 最新 | 双语 | 热词 | 口语 | 译词 | 视频 | 听力 | 专栏 | 文件 | 考试 |
@@ -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}
<Route author="dzx-dzx" example="/cna/web/aall" path="/cna/web/:id?" paramsDesc={['分类 id,见上表。此參數默认为 aall']} />
## 组织人事报 {#zu-zhi-ren-shi-bao}
### 电子报 {#zu-zhi-ren-shi-bao-dian-zi-bao}
<Route author="5upernove-heng" example="/zuzhirenshi" path="/zuzhirenshi/:id?" paramsDesc={['报纸版号,默认为全部']} radar="1" notOperational="1">
| 第一版 要闻 | 第二版 要闻 | 第三版 人才 | 第四版 人社工作 | 第五版 基层党建 | 第六版 理论评论 | 第七版 史事通鉴 | 第八版 关注 |
| ----------- | ----------- | ----------- | --------------- | --------------- | --------------- | --------------- | ----------- |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
</Route>