diff --git a/lib/v2/weibo/maintainer.js b/lib/v2/weibo/maintainer.js index f6091f396..0e1231675 100644 --- a/lib/v2/weibo/maintainer.js +++ b/lib/v2/weibo/maintainer.js @@ -2,7 +2,7 @@ module.exports = { '/group/:gid/:gname?/:routeParams?': ['monologconnor', 'Rongronggg9'], '/keyword/:keyword/:routeParams?': ['DIYgod', 'Rongronggg9'], '/oasis/user/:userid': ['kt286'], - '/search/hot': ['xyqfer'], + '/search/hot/:fulltext?': ['xyqfer', 'shinemoon'], '/super_index/:id/:type?/:routeParams?': ['zengxs', 'Rongronggg9'], '/timeline/:uid/:feature?/:routeParams?': ['zytomorrow', 'DIYgod', 'Rongronggg9'], '/user/:uid/:routeParams?': ['DIYgod', 'iplusx', 'Rongronggg9'], diff --git a/lib/v2/weibo/radar.js b/lib/v2/weibo/radar.js index 10c354418..30ad3837f 100644 --- a/lib/v2/weibo/radar.js +++ b/lib/v2/weibo/radar.js @@ -30,7 +30,7 @@ module.exports = { title: '热搜榜', docs: 'https://docs.rsshub.app/routes/social-media#wei-bo', source: '/top/summary', - target: '/weibo/search/hot', + target: '/weibo/search/hot/:fulltext?', }, ], }, diff --git a/lib/v2/weibo/router.js b/lib/v2/weibo/router.js index ec4a2dc86..fbce7664d 100644 --- a/lib/v2/weibo/router.js +++ b/lib/v2/weibo/router.js @@ -2,7 +2,7 @@ module.exports = (router) => { router.get('/group/:gid/:gname?/:routeParams?', require('./group')); router.get('/keyword/:keyword/:routeParams?', require('./keyword')); router.get('/oasis/user/:userid', require('./oasis/user')); - router.get('/search/hot', require('./search/hot')); + router.get('/search/hot/:fulltext?', require('./search/hot')); router.get('/super_index/:id/:type?/:routeParams?', require('./super_index')); router.get('/timeline/:uid/:feature?/:routeParams?', require('./timeline')); router.get('/user/:uid/:routeParams?', require('./user')); diff --git a/lib/v2/weibo/search/hot.js b/lib/v2/weibo/search/hot.js index 0f0f46cb0..1ffb743a0 100644 --- a/lib/v2/weibo/search/hot.js +++ b/lib/v2/weibo/search/hot.js @@ -1,7 +1,17 @@ const got = require('@/utils/got'); +const config = require('@/config').value; +const { art } = require('@/utils/render'); +const cheerio = require('cheerio'); +const path = require('path'); // const weiboUtils = require('../utils'); +// Default hide all picture +let wpic = 'false'; +let fullpic = 'false'; + module.exports = async (ctx) => { + wpic = ctx.query.pic ?? 'false'; + fullpic = ctx.query.fullpic ?? 'false'; const { data: { data }, } = await got({ @@ -15,21 +25,122 @@ module.exports = async (ctx) => { }, }); - ctx.state.data = { - title: '微博热搜榜', - link: 'https://s.weibo.com/top/summary?cate=realtimehot', - description: '实时热点,每分钟更新一次', - item: data.cards[0].card_group.map((item) => { + let resultItems = null; + if (ctx.params.fulltext === 'fulltext') { + const cardslist = data.cards[0].card_group; + // Topic List + const tlist = cardslist.map((item) => { + const title = item.desc; + const link = `https://m.weibo.cn/search?containerid=100103type%3D1%26q%3D${encodeURIComponent(item.desc)}`; + const plink = `https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D${encodeURIComponent(item.desc)}`; + return { + title, + link, + plink, + }; + }); + + resultItems = await Promise.all( + tlist.map((i) => + ctx.cache.tryGet(i.plink, async () => { + const pInfo = await fetchContent(i.plink); + i.description = pInfo.content; + return i; + }) + ) + ); + } else { + resultItems = data.cards[0].card_group.map((item) => { const title = item.desc; const link = `https://m.weibo.cn/search?containerid=100103type%3D1%26q%3D${encodeURIComponent(item.desc)}`; const description = item.desc; - return { title, description, link, }; - }), + }); + } + + // Update ctx + ctx.state.data = { + title: '微博热搜榜', + link: 'https://s.weibo.com/top/summary?cate=realtimehot', + description: '实时热点,每分钟更新一次', + item: resultItems, }; // ctx.state.data = weiboUtils.sinaimgTvax(ctx.state.data); // no image in the route }; + +async function fetchContent(url) { + // Fetch the subpageinof + const cookieString = config.weibo.cookies ? config.weibo.cookies : ''; + const subres = await got(url, { + headers: { + Cookie: cookieString, + }, + }); + let demostr = ''; + try { + const rdata = subres.data; + const cards = rdata.data.cards; + // Need to find one cards with 'type ==9' + demostr = seekContent(cards); + } catch (e) { + // console.log(e); + // console.log(url); + } + const ret = demostr; + return { + content: ret, + }; +} + +function seekContent(clist) { + const $ = cheerio.load('
'); + const stub = $('#wbcontent'); + + // To for..of per reviewers comment + // Need to find one clist with 'type ==9' + for (const curitem of clist) { + if (curitem.card_type === 9) { + const tbpic = curitem.mblog.thumbnail_pic ?? ''; + const index = tbpic.lastIndexOf('/'); + const thumbfolder = tbpic.substring(0, index + 1); + + const curcontent = cheerio.load(curitem.mblog.text); + if (wpic === 'true') { + curcontent('img').attr('width', '1em').attr('height', '1em'); + } else { + curcontent('img').remove(); + } + const section = art(path.join(__dirname, 'template/digest.art'), { + author: { + link: curitem.mblog.user.profile_url, + name: curitem.mblog.user.screen_name, + }, + msg: curcontent.html(), + link: curitem.scheme, + postinfo: curitem.mblog.created_at, + picnum: wpic === 'true' ? curitem.mblog.pic_num : 0, + pics: + wpic === 'true' && curitem.mblog.pic_num > 0 + ? curitem.mblog.pics.map((item) => { + // Get thumbnail_pic instead of orginal ones + const pid = item.pid; + if (fullpic === 'false') { + return { url: thumbfolder + pid + '.jpg', rurl: item.url }; + } else { + return { url: item.url, rurl: item.url }; + } + }) + : [], + }); + stub.append(section); + } + if (curitem.card_type === 11) { + stub.append(seekContent(curitem.card_group)); + } + } + return stub.html(); +} diff --git a/lib/v2/weibo/search/template/digest.art b/lib/v2/weibo/search/template/digest.art new file mode 100644 index 000000000..065bd12f6 --- /dev/null +++ b/lib/v2/weibo/search/template/digest.art @@ -0,0 +1,17 @@ + +