feat: add 网易新闻专栏 (#4775)

This commit is contained in:
Solist-X
2020-05-19 00:57:18 +08:00
committed by GitHub
parent 0608670091
commit 1cd6c93fbf
3 changed files with 136 additions and 0 deletions

View File

@@ -389,6 +389,18 @@ category 对应的关键词有
</Route> </Route>
## 网易新闻专栏
### 栏目
<Route author="Solist-X" example="/netease/news/special/1" path="/netease/news/special/:type?" :paramsDesc="['栏目']">
| 轻松一刻 | 槽值 | 人间 | 大国小民 | 三三有梗 | 数读 | 看客 | 下划线 | 谈心社 | 哒哒 | 胖编怪聊 | 曲一刀 | 今日之声 | 浪潮 | 沸点 |
| -------- | ---- | ---- | -------- | -------- | ---- | ---- | ------ | ------ | ---- | -------- | ------ | -------- | ---- | ---- |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
</Route>
## 卫报 The Guardian ## 卫报 The Guardian
通过提取文章全文,以提供比官方源更佳的阅读体验。 通过提取文章全文,以提供比官方源更佳的阅读体验。

View File

@@ -2691,6 +2691,9 @@ router.get('/umass/amherst/csnews', require('./routes/umass/amherst/csnews'));
// 飘花电影网 // 飘花电影网
router.get('/piaohua/hot', require('./routes/piaohua/hot')); router.get('/piaohua/hot', require('./routes/piaohua/hot'));
// 网易新闻专栏
router.get('/netease/news/special/:type?', require('./routes/netease/news/special'));
// 端传媒 // 端传媒
router.get('/initium/:type?/:language?', require('./routes/initium/full')); router.get('/initium/:type?/:language?', require('./routes/initium/full'));

View File

@@ -0,0 +1,121 @@
const got = require('@/utils/got');
const date = require('@/utils/date');
const cheerio = require('cheerio');
const typeMap = {
1: '轻松一刻',
2: '槽值',
3: '人间',
4: '大国小民',
5: '三三有梗',
6: '数读',
7: '看客',
8: '下划线',
9: '谈心社',
10: '哒哒',
11: '胖编怪聊',
12: '曲一刀',
13: '今日之声',
14: '浪潮',
15: '沸点',
};
module.exports = async (ctx) => {
if (!ctx.params.type) {
throw Error('Bad parameter. See <a href="https://docs.rsshub.app/game.html#wang-yi-da-shen">https://docs.rsshub.app/game.html#wang-yi-da-shen</a>');
}
const selectedType = parseInt(ctx.params.type);
let type;
switch (selectedType) {
case 1:
type = `BD21K0DLwangning`; // 轻松一刻
break;
case 2:
type = `CICMICLUwangning`; // 槽值
break;
case 3:
type = `CICMOMBLwangning`; // 人间
break;
case 4:
type = `CICMPVC5wangning`; // 大国小民
break;
case 5:
type = `CICMLCOUwangning`; // 三三有梗
break;
case 6:
type = `D551V75Cwangning`; // 数读
break;
case 7:
type = `D55253RHwangning`; // 看客
break;
case 8:
type = `D553A53Lwangning`; // 下划线
break;
case 9:
type = `D553PGHQwangning`; // 谈心社
break;
case 10:
type = `CICMS5BIwangning`; // 哒哒
break;
case 11:
type = `CQ9UDVKOwangning`; // 胖编怪聊
break;
case 12:
type = `CQ9UJIJNwangning`; // 曲一刀
break;
case 13:
type = `BD284UM8wangning`; // 今日之声
break;
case 14:
type = `CICMMGBHwangning`; // 浪潮
break;
case 15:
type = `D5543R68wangning`; // 沸点
break;
default:
break;
}
const url = `https://3g.163.com/touch/reconstruct/article/list/${type}/0-10.html`;
const response = await got.get(url);
const data = response.data;
const matches = data.replace(/\s/g, '').match(/artiList\((.*?)\]\}\)/);
const articlelist0 = matches[1].replace(/".*?wangning/, '"articles') + ']}';
const articlelist = JSON.parse(articlelist0);
const articles = articlelist.articles;
const items = await Promise.all(
articles.map(async (article) => {
const title = article.title;
let url = article.url;
const time0 = article.ptime;
const time = time0.slice(0, 10) + ' ' + time0.slice(10);
if (url === null || article.skipType === 'video') {
const skipurl = article.skipURL;
const vid = skipurl.match(/vid=(.*?)$/);
if (vid !== null) {
url = `https://3g.163.com/exclusive/video/${vid[1]}.html`;
}
}
const content = await ctx.cache.tryGet(url, async () => {
const article_response = await got.get(url);
const $ = cheerio.load(article_response.data);
return $('div[class="content"]').html() ? $('div[class="content"]').html() : $('div[class="video"]').html();
});
const list = {
title: title,
link: url,
description: content,
pubDate: date(time),
};
return Promise.resolve(list);
})
);
const selectedTypeName = typeMap[selectedType];
ctx.state.data = {
title: selectedTypeName ? `${selectedTypeName} - 网易专栏` : '网易专栏',
link: 'https://3g.163.com/touch/exclusive/?referFrom=163',
item: items,
};
};