mirror of
https://github.com/DIYgod/RSSHub.git
synced 2026-08-30 16:55:08 +08:00
feat: remove notOperational routes - traditional media
This commit is contained in:
@@ -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' }] },
|
||||
|
||||
@@ -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: [
|
||||
|
||||
@@ -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'));
|
||||
|
||||
|
||||
@@ -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: '朝日新聞社のニュースサイト、朝日新聞デジタルの社会ニュースについてのページです',
|
||||
};
|
||||
};
|
||||
@@ -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,
|
||||
})),
|
||||
};
|
||||
};
|
||||
@@ -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',
|
||||
};
|
||||
};
|
||||
@@ -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(),
|
||||
};
|
||||
};
|
||||
@@ -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(),
|
||||
};
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -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(),
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
@@ -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;
|
||||
})
|
||||
)
|
||||
),
|
||||
};
|
||||
};
|
||||
@@ -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;
|
||||
})
|
||||
)
|
||||
),
|
||||
};
|
||||
};
|
||||
@@ -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`,
|
||||
};
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/:channel?': ['Fatpandac'],
|
||||
};
|
||||
@@ -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';
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = function (router) {
|
||||
router.get('/:channel?', require('./index'));
|
||||
};
|
||||
@@ -1,7 +1,6 @@
|
||||
module.exports = {
|
||||
'/lm/:id?': ['nczitzk'],
|
||||
'/photo/jx': ['nczitzk'],
|
||||
'/special/:id?': ['nczitzk'],
|
||||
'/xwlb': ['zengxs'],
|
||||
'/:category': ['idealclover', 'xyqfer'],
|
||||
};
|
||||
|
||||
@@ -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,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'));
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/paper/:id?': ['nczitzk'],
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -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]}`,
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = function (router) {
|
||||
router.get('/paper/:id?', require('./paper'));
|
||||
};
|
||||
@@ -1,2 +0,0 @@
|
||||
{{@ resource }}
|
||||
{{@ description }}
|
||||
@@ -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,6 +1,5 @@
|
||||
module.exports = {
|
||||
'/24/:category?': ['nczitzk'],
|
||||
'/find': ['nczitzk'],
|
||||
'/portrait': ['nczitzk'],
|
||||
'/sh': ['saury'],
|
||||
};
|
||||
|
||||
@@ -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,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'));
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
}),
|
||||
};
|
||||
};
|
||||
@@ -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,
|
||||
})),
|
||||
};
|
||||
};
|
||||
@@ -1,7 +1,5 @@
|
||||
module.exports = {
|
||||
'/download': ['nczitzk'],
|
||||
'/espresso': ['TonyRL'],
|
||||
'/gre-vocabulary': ['xyqfer'],
|
||||
'/global-business-review/:language?': ['prnake'],
|
||||
'/:endpoint': ['ImSingee'],
|
||||
};
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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,4 +1,3 @@
|
||||
module.exports = {
|
||||
'/myft/:key': ['HenryQW'],
|
||||
'/:language/:channel?': ['HenryQW', 'xyqfer'],
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -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,4 +1,3 @@
|
||||
module.exports = function (router) {
|
||||
router.get('/myft/:key', require('./myft'));
|
||||
router.get('/:language/:channel?', require('./channel'));
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/:site/:channel?': ['TimWu007'],
|
||||
};
|
||||
@@ -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: ['/'],
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = (router) => {
|
||||
router.get('/:site/:channel?', require('./index'));
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
{{ if thumb }}
|
||||
<img src="{{ thumb }}"><br>
|
||||
{{ /if }}
|
||||
@@ -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',
|
||||
};
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/:category?': ['TonyRL'],
|
||||
};
|
||||
@@ -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',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = function (router) {
|
||||
router.get('/:category?', require('./index'));
|
||||
};
|
||||
@@ -1 +0,0 @@
|
||||
{{@ desc }}
|
||||
@@ -1 +0,0 @@
|
||||
<figure><img alt="{{ alt }}" src="{{ src }}"><figcaption>{{ alt }}</figcaption></figure>
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -1,4 +0,0 @@
|
||||
module.exports = {
|
||||
'/hyrb/:id?': ['nczitzk'],
|
||||
'/hywb/:id?': ['nczitzk'],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = function (router) {
|
||||
router.get('/:type?/:id?', require('./index'));
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/:category?': ['tpnonthealps'],
|
||||
};
|
||||
@@ -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('/'))) : ''}`,
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = (router) => {
|
||||
router.get('/:category?', require('./category'));
|
||||
};
|
||||
@@ -1,8 +0,0 @@
|
||||
{{ if imgs }}
|
||||
{{ each imgs img }}
|
||||
<img src="{{ img }}"><br>
|
||||
{{ /each }}
|
||||
{{ /if }}
|
||||
{{ if content }}
|
||||
{{@ content }}
|
||||
{{ /if }}
|
||||
+1
-1
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -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,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'));
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/geopolitique': ['xdu'],
|
||||
};
|
||||
@@ -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',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = (router) => {
|
||||
router.get('/geopolitique', require('./geopolitique'));
|
||||
};
|
||||
@@ -1,6 +0,0 @@
|
||||
<p>{{ standFirst }}</p>
|
||||
{{ each bodyJson }}
|
||||
{{ if $value.type === 'text' }}
|
||||
<p>{{ $value.children[0].value }}</p>
|
||||
{{ /if }}
|
||||
{{ /each }}
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/hot/:lang?': ['TonyRL'],
|
||||
};
|
||||
@@ -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',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = (router) => {
|
||||
router.get('/hot/:lang?', require('./hot'));
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -1,4 +0,0 @@
|
||||
module.exports = {
|
||||
'/': ['xfangbao'],
|
||||
'/index': ['xfangbao'],
|
||||
};
|
||||
@@ -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',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,4 +0,0 @@
|
||||
module.exports = (router) => {
|
||||
router.get('/', require('./index'));
|
||||
router.redirect('/index', '/xwlb');
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'/:id?': ['5upernova-heng'],
|
||||
};
|
||||
@@ -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',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = (router) => {
|
||||
router.get('/:id?', require('.'));
|
||||
};
|
||||
@@ -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={['Author’s 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>
|
||||
|
||||
Reference in New Issue
Block a user