diff --git a/docs/new-media.md b/docs/new-media.md index d945fa4907..078ba0b2e7 100644 --- a/docs/new-media.md +++ b/docs/new-media.md @@ -283,7 +283,11 @@ pageClass: routes -## 观察者风闻话题 +## 观察者网-中国关怀 全球视野 + +### 观察者首页 + + ### 观察者风闻话题 diff --git a/lib/router.js b/lib/router.js index 21a2576825..1de3b458c4 100644 --- a/lib/router.js +++ b/lib/router.js @@ -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')); diff --git a/lib/routes/guanchazhe/index.js b/lib/routes/guanchazhe/index.js new file mode 100644 index 0000000000..ec9be15c3b --- /dev/null +++ b/lib/routes/guanchazhe/index.js @@ -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() + + ``, + 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() + + `

【全文阅读】
`, + 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() + + `

【全文阅读】
`, + 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() + + `

【全文阅读】
`, + 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() + `

【全文阅读】
`, + 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 + ``, + 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 + `

【全文阅读】
`, + pubDate: item.date || new Date().toLocaleDateString(), + link: item.pageurl, + category: item.category, + author: item.category, + guid: item.id, + })), + }; +};