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:
kdan
2022-04-25 10:37:48 +08:00
committed by GitHub
parent c9e423b8f1
commit 377c2c4d57
7 changed files with 124 additions and 0 deletions
+6
View File
@@ -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"/>
## 源仓库
### 源仓库更新
+38
View File
@@ -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,
};
};
+3
View File
@@ -0,0 +1,3 @@
module.exports = {
'/': ['kdanfly'],
};
+13
View File
@@ -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',
},
],
},
};
+3
View File
@@ -0,0 +1,3 @@
module.exports = function (router) {
router.get('/', require('./index'));
};
@@ -0,0 +1 @@
{{@ desc.article }}
+60
View File
@@ -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() === '&nbsp;') {
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,
};