feat: 添加【观察者网-首页】RSS (#3306)
This commit is contained in:
parent
39492ad904
commit
ba074edb7c
|
|
@ -283,7 +283,11 @@ pageClass: routes
|
|||
|
||||
<Route author="emdoe" example="/plainlaw/archives" path="/plainlaw/archives"/>
|
||||
|
||||
## 观察者风闻话题
|
||||
## 观察者网-中国关怀 全球视野
|
||||
|
||||
### 观察者首页
|
||||
|
||||
<Route author="Jeason0228" example="/guanchazhe/index/all" path="/guanchazhe/index/:type" :paramsDesc="['新闻汇总:默认home输出头条+3列新闻,others则为滚动新闻+热点+观察者付费,all则包括以上']" />
|
||||
|
||||
### 观察者风闻话题
|
||||
|
||||
|
|
|
|||
|
|
@ -1406,6 +1406,7 @@ router.get('/zfrontier/postlist/:type', require('./routes/zfrontier/postlist'));
|
|||
// 观察者风闻话题
|
||||
router.get('/guanchazhe/topic/:id', require('./routes/guanchazhe/topic'));
|
||||
router.get('/guanchazhe/personalpage/:uid', require('./routes/guanchazhe/personalpage'));
|
||||
router.get('/guanchazhe/index/:type', require('./routes/guanchazhe/index'));
|
||||
|
||||
// Hpoi 手办维基
|
||||
router.get('/hpoi/info/:type?', require('./routes/hpoi/info'));
|
||||
|
|
|
|||
|
|
@ -0,0 +1,342 @@
|
|||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
module.exports = async (ctx) => {
|
||||
const type = ctx.params.type;
|
||||
const host = 'https://www.guancha.cn';
|
||||
const ptype = {
|
||||
all: { name: '首页Feeds', url: 'https://www.guancha.cn/' },
|
||||
redian: { name: '热点新闻', url: 'https://www.guancha.cn/api/redian.htm' },
|
||||
member: { name: '观察者', url: 'https://www.guancha.cn/api/member.htm' },
|
||||
gundong: { name: '滚动新闻', url: 'https://www.guancha.cn/api/new_gundong.htm' },
|
||||
};
|
||||
// 定义list存放请求数据,htmlarr暂存html数据组,outList存放输出的数据组
|
||||
const list = [],
|
||||
htmlarr = [],
|
||||
temp = [],
|
||||
HomeFeeds = [],
|
||||
RedianFeeds = [],
|
||||
MemberFeeds = [],
|
||||
GundongFeeds = [];
|
||||
let AllFeeds = [];
|
||||
// 获取新闻url过来的时间/ID
|
||||
function getData(jscontent, option) {
|
||||
switch (option) {
|
||||
case 'date': {
|
||||
// eslint-disable-next-line
|
||||
let jsoutput = String(jscontent)
|
||||
.substr(-23, 10)
|
||||
// eslint-disable-next-line
|
||||
.replace(/\_/g, '-');
|
||||
return new Date(jsoutput).toLocaleDateString();
|
||||
}
|
||||
case 'urlid': {
|
||||
const jsoutput = String(jscontent).substr(-12, 6);
|
||||
return jsoutput;
|
||||
}
|
||||
default: {
|
||||
// console.log('default');
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 循环获取ptype每个请求的数据内容
|
||||
for (const key in ptype) {
|
||||
const link = ptype[key].url;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: link,
|
||||
headers: {
|
||||
Referer: host,
|
||||
},
|
||||
});
|
||||
// 由于数据结构不太一致,将所有的数据内容抽离提取成统一的对象
|
||||
if (key === 'all') {
|
||||
list[0] = response.data;
|
||||
}
|
||||
const $ = cheerio.load(list[0]);
|
||||
switch (key) {
|
||||
case 'all':
|
||||
// 获取头条 + 清理不带有h4标题的li
|
||||
htmlarr[0] = $('.content-headline').first();
|
||||
htmlarr[1] = $('.Review-item li h4').parent();
|
||||
htmlarr[2] = $('.img-List li h4').parent();
|
||||
$('.author-intro img')
|
||||
.parent()
|
||||
.remove();
|
||||
$('.module-img-head img')
|
||||
.parent()
|
||||
.remove();
|
||||
htmlarr[3] = $('[class="module-news gray"] .module-news-main')
|
||||
.first()
|
||||
.children();
|
||||
htmlarr[4] = $('[class="module-news-main mt15"]').children();
|
||||
temp.length = 0;
|
||||
temp.push(
|
||||
htmlarr[0].map((index, item) => {
|
||||
item = $(item);
|
||||
const herfString = item.find('h3>a').attr('href');
|
||||
const feed = {
|
||||
category: ptype[key].name + '头条',
|
||||
id: getData(herfString, 'urlid'),
|
||||
title: item
|
||||
.find('h3')
|
||||
.text()
|
||||
.trim(),
|
||||
pageurl: host + herfString,
|
||||
picurl: item
|
||||
.find('a>img')
|
||||
.first()
|
||||
.attr('src'),
|
||||
description:
|
||||
item
|
||||
.find('h3')
|
||||
.text()
|
||||
.trim() +
|
||||
`<img src="${item
|
||||
.find('a>img')
|
||||
.first()
|
||||
.attr('src')}" referrerpolicy="no-referrer" />`,
|
||||
date: getData(herfString, 'date'),
|
||||
};
|
||||
return feed;
|
||||
})
|
||||
);
|
||||
temp.push(
|
||||
htmlarr[1].map((index, item) => {
|
||||
item = $(item);
|
||||
const herfString = item.find('h4.module-title>a').attr('href');
|
||||
const feed = {
|
||||
category: ptype[key].name + '左1列',
|
||||
id: getData(herfString, 'urlid'),
|
||||
title: item
|
||||
.find('h4.module-title')
|
||||
.text()
|
||||
.trim(),
|
||||
pageurl: host + herfString,
|
||||
picurl: item.find('a.module-img>img').attr('src'),
|
||||
description:
|
||||
item
|
||||
.find('p.module-artile')
|
||||
.text()
|
||||
.trim() +
|
||||
`<br/><a href=${host}${herfString} target="_blank"><img src="` +
|
||||
item.find('a.module-img>img').attr('src') +
|
||||
`" referrerpolicy="no-referrer" /><br/>【全文阅读】</a>`,
|
||||
date: getData(herfString, 'date'),
|
||||
};
|
||||
return feed;
|
||||
})
|
||||
);
|
||||
temp.push(
|
||||
htmlarr[2].map((index, item) => {
|
||||
item = $(item);
|
||||
const herfString = item.find('h4.module-title>a').attr('href');
|
||||
const feed = {
|
||||
category: ptype[key].name + '中间+右边2列',
|
||||
id: getData(herfString, 'urlid'),
|
||||
title: item
|
||||
.find('h4.module-title')
|
||||
.text()
|
||||
.trim(),
|
||||
pageurl: item.find('div.fastRead-img a>img').attr('src'),
|
||||
picurl: item.find('a>img').attr('src'),
|
||||
description:
|
||||
item.find('.resemble-art').html() +
|
||||
`<br/><a href=${host}${herfString} target="_blank"><img src="` +
|
||||
item.find('div.fastRead-img a>img').attr('src') +
|
||||
`" referrerpolicy="no-referrer" /><br/>【全文阅读】</a>`,
|
||||
date: getData(herfString, 'date'),
|
||||
};
|
||||
return feed;
|
||||
})
|
||||
);
|
||||
temp.push(
|
||||
htmlarr[3].map((index, item) => {
|
||||
item = $(item);
|
||||
const herfString = item
|
||||
.find('a')
|
||||
.first()
|
||||
.attr('href');
|
||||
const feed = {
|
||||
category: ptype[key].name + '左列: 访谈、论坛',
|
||||
id: getData(herfString, 'urlid'),
|
||||
title: item
|
||||
.find('a')
|
||||
.first()
|
||||
.text(),
|
||||
pageurl: host + herfString,
|
||||
picurl: `0`,
|
||||
description:
|
||||
item
|
||||
.find('a')
|
||||
.first()
|
||||
.text() +
|
||||
item
|
||||
.find('p')
|
||||
.first()
|
||||
.text() +
|
||||
`<br/><a href=${host}${herfString} target="_blank"><br/>【全文阅读】</a>`,
|
||||
date: getData(herfString, 'date'),
|
||||
};
|
||||
return feed;
|
||||
})
|
||||
);
|
||||
temp.push(
|
||||
htmlarr[4].map((index, item) => {
|
||||
item = $(item);
|
||||
const herfString = item
|
||||
.find('a')
|
||||
.first()
|
||||
.attr('href');
|
||||
const feed = {
|
||||
category: ptype[key].name + '右列: 历史、深度',
|
||||
id: getData(herfString, 'urlid'),
|
||||
title: item
|
||||
.find('a')
|
||||
.first()
|
||||
.text(),
|
||||
pageurl: host + herfString,
|
||||
picurl: `0`,
|
||||
description:
|
||||
item
|
||||
.find('a')
|
||||
.first()
|
||||
.text() + `<br/><a href=${host}${herfString} target="_blank"><br/>【全文阅读】</a>`,
|
||||
date: getData(herfString, 'date'),
|
||||
};
|
||||
return feed;
|
||||
})
|
||||
);
|
||||
// 集结所有feeds对象给到HomeFeeds;
|
||||
for (let i = 0; i < temp.length; i++) {
|
||||
for (let k = 0; k < temp[i].length; k++) {
|
||||
HomeFeeds.push(temp[i][k]);
|
||||
}
|
||||
}
|
||||
// 检查数据获取条数
|
||||
// console.log(temp[0][3]);
|
||||
console.log('HomeFeeds数组长度:' + HomeFeeds.length, '头条:' + temp[0].length, '左1列:' + temp[1].length, '中右2列:' + temp[2].length, '访谈、论坛' + temp[3].length, '历史、深度' + temp[4].length);
|
||||
break;
|
||||
case 'redian':
|
||||
list[1] = response.data.items;
|
||||
temp.length = 0;
|
||||
temp.push(
|
||||
list[1].map((item) => ({
|
||||
category: ptype[key].name + '_热点',
|
||||
id: '0',
|
||||
title: '[热点]' + item.TITLE,
|
||||
pageurl: host + '/' + item.HTTP_URL,
|
||||
date: getData(item.HTTP_URL, 'date'),
|
||||
picurl: '0',
|
||||
}))
|
||||
);
|
||||
// 集结所有feeds对象给到RedianFeeds;
|
||||
for (let i = 0; i < temp.length; i++) {
|
||||
for (let k = 0; k < temp[i].length; k++) {
|
||||
RedianFeeds.push(temp[i][k]);
|
||||
}
|
||||
}
|
||||
// 检查数据获取条数
|
||||
// console.log(RedianFeeds);
|
||||
console.log('RedianFeeds数组长度:' + RedianFeeds.length, '热点:' + temp[0].length);
|
||||
break;
|
||||
case 'member':
|
||||
list[2] = response.data.items;
|
||||
temp.length = 0;
|
||||
temp.push(
|
||||
list[2].map((item) => ({
|
||||
category: ptype[key].name + '_右列观察员',
|
||||
id: item.id,
|
||||
title: '[付费]' + item.title,
|
||||
pageurl: 'https://member.guancha.cn/post/view?id=' + item.id,
|
||||
picurl: item.h_pic,
|
||||
description: item.title + `<img src="${item.h_pic}" referrerpolicy="no-referrer" />`,
|
||||
date: item.created_at,
|
||||
}))
|
||||
);
|
||||
// 集结所有feeds对象给到MemberFeeds;
|
||||
for (let i = 0; i < temp.length; i++) {
|
||||
for (let k = 0; k < temp[i].length; k++) {
|
||||
MemberFeeds.push(temp[i][k]);
|
||||
}
|
||||
}
|
||||
// 检查数据获取条数
|
||||
// console.log(MemberFeeds);
|
||||
console.log('MemberFeeds数组长度:' + MemberFeeds.length, '观察员:' + temp[0].length);
|
||||
break;
|
||||
case 'gundong':
|
||||
list[3] = response.data.fenghot;
|
||||
list[4] = response.data.member;
|
||||
list[5] = response.data.kuaixun;
|
||||
temp.length = 0;
|
||||
temp.push(
|
||||
list[5].map((item) => ({
|
||||
category: ptype[key].name + '_滚动新闻',
|
||||
id: '0',
|
||||
title: '[滚动新闻]' + item.TITLE,
|
||||
pageurl: host + '/' + item.HTTP_URL,
|
||||
picurl: '0',
|
||||
date: getData(item.HTTP_URL, 'date'),
|
||||
}))
|
||||
);
|
||||
temp.push(
|
||||
list[3].map((item) => ({
|
||||
category: ptype[key].name + '_风闻7天最热',
|
||||
id: item.id,
|
||||
title: '[风闻7天最热]' + item.title,
|
||||
pageurl: 'https://user.guancha.cn/main/content?id=' + item.id,
|
||||
picurl: '0',
|
||||
}))
|
||||
);
|
||||
temp.push(
|
||||
list[4].map((item) => ({
|
||||
category: ptype[key].name + '_观察员',
|
||||
id: item.id,
|
||||
title: '[观察员付费]' + item.title,
|
||||
pageurl: 'https://member.guancha.cn/post/view?id=' + item.id,
|
||||
picurl: '0',
|
||||
}))
|
||||
);
|
||||
|
||||
for (let i = 0; i < temp.length; i++) {
|
||||
for (let k = 0; k < temp[i].length; k++) {
|
||||
GundongFeeds.push(temp[i][k]);
|
||||
}
|
||||
}
|
||||
// 检查数据获取条数
|
||||
// console.log(GundongFeeds);
|
||||
console.log('GundongFeeds数组长度:' + GundongFeeds.length, '滚动新闻:' + temp[0].length, '风闻7天最热:' + temp[1].length, '观察员付费:' + temp[2].length);
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 集合所有数据,控制分类输出
|
||||
switch (type) {
|
||||
case 'all':
|
||||
AllFeeds = HomeFeeds.concat(RedianFeeds, MemberFeeds, GundongFeeds);
|
||||
break;
|
||||
case 'home':
|
||||
AllFeeds = HomeFeeds;
|
||||
break;
|
||||
case 'others':
|
||||
AllFeeds = RedianFeeds.concat(MemberFeeds, GundongFeeds);
|
||||
break;
|
||||
default:
|
||||
AllFeeds = HomeFeeds;
|
||||
break;
|
||||
}
|
||||
ctx.state.data = {
|
||||
title: `观察者-首页新闻`,
|
||||
link: host,
|
||||
description: `观察者网,致力于荟萃中外思想者精华,鼓励青年学人探索,建中西文化交流平台,为崛起中的精英提供决策参考。`,
|
||||
allowEmpty: true,
|
||||
item: AllFeeds.map((item) => ({
|
||||
title: item.title,
|
||||
description: item.description || item.title + `<br/><a href=${item.pageurl} target="_blank"><br/>【全文阅读】</a>`,
|
||||
pubDate: item.date || new Date().toLocaleDateString(),
|
||||
link: item.pageurl,
|
||||
category: item.category,
|
||||
author: item.category,
|
||||
guid: item.id,
|
||||
})),
|
||||
};
|
||||
};
|
||||
Loading…
Reference in New Issue