mirror of
https://github.com/DIYgod/RSSHub.git
synced 2026-08-31 01:01:11 +08:00
feat(route): add chinafactcheck (#9611)
* add(route): 首席经济学家论坛
* fix(route) : merge from FledgeXu
* fix(route) : merge from FledgeXu
* (fix) typo
* feat(route): remove radar from radar-rules.js
* Update lib/v2/chinacef/hot.js
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
* Update lib/v2/chinacef/router.js
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
* Update lib/v2/chinacef/maintainer.js
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
* Update lib/v2/chinacef/experts.js
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
* Update lib/v2/chinacef/experts.js
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
* Update hot.js
* Update experts.js
* docs: fix Route's path and example of chinacef
* Revert "docs: fix Route's path and example of chinacef"
This reverts commit 0ec9e7d9d6.
* docs: fix Route's path and example of chinacef
* feat(route): add chinafactcheck
Co-authored-by: linkai <linkai@mochasoft.com.cn>
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
This commit is contained in:
@@ -971,6 +971,12 @@ type 为 all 时,category 参数不支持 cost 和 free
|
||||
|
||||
<Route author="xyqfer" example="/oilprice/shanghai" path="/oilprice/:area" :paramsDesc="['地区拼音,详见[成品油价格网](http://oil.usd-cny.com/)']"/>
|
||||
|
||||
## 有据
|
||||
|
||||
### 最新文章列表
|
||||
|
||||
<Route author="kdanfly" example="/chinafactcheck" path="/chinafactcheck" radar="1" rssbud="1"/>
|
||||
|
||||
## 源仓库
|
||||
|
||||
### 源仓库更新
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
const utils = require('./utils');
|
||||
const cheerio = require('cheerio');
|
||||
const got = require('@/utils/got');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const rssTitle = '有据|国际新闻事实核查';
|
||||
|
||||
const response = await got('https://chinafactcheck.com');
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
const articlesLinkListNode = $('.post-info-box .post-thumb a')
|
||||
.map((_, item) => $(item).attr('href'))
|
||||
.get();
|
||||
const articlesLinkList = Array.from(new Set(articlesLinkListNode));
|
||||
|
||||
const articles = await Promise.all(
|
||||
articlesLinkList.map(async (item) => {
|
||||
const articlesLink = item;
|
||||
|
||||
const detail = await ctx.cache.tryGet(articlesLink, async () => await utils.getArticleDetail(articlesLink));
|
||||
|
||||
const element = {
|
||||
title: detail.title,
|
||||
author: detail.author,
|
||||
pubDate: detail.time,
|
||||
description: detail.description,
|
||||
link: articlesLink,
|
||||
};
|
||||
return element;
|
||||
})
|
||||
);
|
||||
|
||||
ctx.state.data = {
|
||||
title: rssTitle,
|
||||
link: utils.siteLink,
|
||||
item: articles,
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,3 @@
|
||||
module.exports = {
|
||||
'/': ['kdanfly'],
|
||||
};
|
||||
@@ -0,0 +1,13 @@
|
||||
module.exports = {
|
||||
'chinafactcheck.com': {
|
||||
_name: '有据',
|
||||
'.': [
|
||||
{
|
||||
title: '最新文章列表',
|
||||
docs: 'https://docs.rsshub.app/other.html#you-ju-zui-xin-wen-zhang-lie-biao',
|
||||
source: ['/'],
|
||||
target: '/chinafactcheck',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,3 @@
|
||||
module.exports = function (router) {
|
||||
router.get('/', require('./index'));
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
{{@ desc.article }}
|
||||
@@ -0,0 +1,60 @@
|
||||
const { art } = require('@/utils/render');
|
||||
const path = require('path');
|
||||
const cheerio = require('cheerio');
|
||||
const got = require('@/utils/got');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
|
||||
const siteLink = 'https://chinafactcheck.com';
|
||||
|
||||
const renderDesc = (desc) =>
|
||||
art(path.join(__dirname, 'templates/description.art'), {
|
||||
desc,
|
||||
});
|
||||
|
||||
const cleanDom = (dom) => {
|
||||
dom('*[style]').removeAttr('style');
|
||||
dom('br').remove();
|
||||
dom('span:empty').remove();
|
||||
dom('span').each((_, el) => {
|
||||
if (dom(el).html().trim() === ' ') {
|
||||
dom(el).remove();
|
||||
}
|
||||
});
|
||||
dom('p:empty').remove();
|
||||
dom('p').each((_, el) => {
|
||||
if (dom(el).html().trim() === '') {
|
||||
dom(el).remove();
|
||||
}
|
||||
});
|
||||
return dom;
|
||||
};
|
||||
|
||||
const getArticleDetail = async (link) => {
|
||||
const response = await got(link);
|
||||
const $ = cleanDom(cheerio.load(response.data));
|
||||
|
||||
const title = $('.content-head h2').text().trim();
|
||||
const author = $('.content-persons p span:last').text().trim();
|
||||
const time = parseDate($('.content-time').text().trim(), 'YYYY-MM-DD');
|
||||
|
||||
const description = {
|
||||
article: $('div[class=content-list-box]').html(),
|
||||
};
|
||||
return new ArticleDetail(title, author, time, renderDesc(description));
|
||||
};
|
||||
class ArticleDetail {
|
||||
constructor(title, author, time, description) {
|
||||
this.title = title;
|
||||
this.author = author;
|
||||
this.time = time;
|
||||
this.description = description;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
siteLink,
|
||||
renderDesc,
|
||||
cleanDom,
|
||||
getArticleDetail,
|
||||
ArticleDetail,
|
||||
};
|
||||
Reference in New Issue
Block a user