From 89ee2f92e00f9297e92e723eaae526befa240e2d Mon Sep 17 00:00:00 2001 From: Ethan Shen <42264778+nczitzk@users.noreply.github.com> Date: Wed, 21 Sep 2022 00:52:05 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(route):=20=E7=AB=99=E9=85=B7=E5=8F=91?= =?UTF-8?q?=E7=8E=B0=20(#10839)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(route): 站酷发现 * fix(route): zcool top & user --- assets/radar-rules.js | 26 +++--- lib/radar-rules.js | 106 ++++++++++++------------- lib/router.js | 10 +-- lib/routes/zcool/top.js | 75 ----------------- lib/routes/zcool/user.js | 58 -------------- lib/{routes => v2}/zcool/discover.js | 46 +++++++---- lib/{routes => v2}/zcool/locations.js | 0 lib/v2/zcool/maintainer.js | 7 ++ lib/v2/zcool/radar.js | 55 +++++++++++++ lib/v2/zcool/router.js | 5 ++ lib/v2/zcool/templates/description.art | 8 ++ lib/v2/zcool/templates/work.art | 11 +++ lib/v2/zcool/top.js | 51 ++++++++++++ lib/v2/zcool/user.js | 48 +++++++++++ lib/v2/zcool/utils.js | 14 ++++ 15 files changed, 299 insertions(+), 221 deletions(-) delete mode 100644 lib/routes/zcool/top.js delete mode 100644 lib/routes/zcool/user.js rename lib/{routes => v2}/zcool/discover.js (77%) rename lib/{routes => v2}/zcool/locations.js (100%) create mode 100644 lib/v2/zcool/maintainer.js create mode 100644 lib/v2/zcool/radar.js create mode 100644 lib/v2/zcool/router.js create mode 100644 lib/v2/zcool/templates/description.art create mode 100644 lib/v2/zcool/templates/work.art create mode 100644 lib/v2/zcool/top.js create mode 100644 lib/v2/zcool/user.js create mode 100644 lib/v2/zcool/utils.js diff --git a/assets/radar-rules.js b/assets/radar-rules.js index a7fdcff135e9a..4aac6e97ab8f7 100644 --- a/assets/radar-rules.js +++ b/assets/radar-rules.js @@ -384,19 +384,19 @@ { title: '党建活动', docs: 'http://docs.rsshub.app/university.html#hu-bei-gong-ye-da-xue', source: '/djhd/djhd.htm', target: '/hbut/cs/djhd' }, ], }, - 'zcool.com.cn': { - _name: '站酷', - www: [ - { title: '发现', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/discover' }, - { title: '发现 - 精选 - 全部推荐', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/discover/all' }, - { title: '发现 - 精选 - 首页推荐', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/discover/home' }, - { title: '发现 - 精选 - 编辑精选', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/discover/home' }, - { title: '发现 - 精选 - 文章 - 编辑精选', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/discover/article' }, - { title: '作品榜单', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/top/design' }, - { title: '文章榜单', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/top/article' }, - { title: '用户作品', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: ['/u/:id'], target: '/zcool/user/:id' }, - ], - }, + // 'zcool.com.cn': { + // _name: '站酷', + // www: [ + // { title: '发现', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/discover' }, + // { title: '发现 - 精选 - 全部推荐', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/discover/all' }, + // { title: '发现 - 精选 - 首页推荐', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/discover/home' }, + // { title: '发现 - 精选 - 编辑精选', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/discover/home' }, + // { title: '发现 - 精选 - 文章 - 编辑精选', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/discover/article' }, + // { title: '作品榜单', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/top/design' }, + // { title: '文章榜单', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: '', target: '/zcool/top/article' }, + // { title: '用户作品', docs: 'https://docs.rsshub.app/design.html#zhan-ku', source: ['/u/:id'], target: '/zcool/user/:id' }, + // ], + // }, 't.me': { _name: 'Telegram', '.': [ diff --git a/lib/radar-rules.js b/lib/radar-rules.js index 2399fe6b29ffd..770e01b0ef03f 100644 --- a/lib/radar-rules.js +++ b/lib/radar-rules.js @@ -1021,59 +1021,59 @@ module.exports = { }, ], }, - 'zcool.com.cn': { - _name: '站酷', - www: [ - { - title: '发现', - docs: 'https://docs.rsshub.app/design.html#zhan-ku', - source: '', - target: '/zcool/discover', - }, - { - title: '发现 - 精选 - 全部推荐', - docs: 'https://docs.rsshub.app/design.html#zhan-ku', - source: '', - target: '/zcool/discover/all', - }, - { - title: '发现 - 精选 - 首页推荐', - docs: 'https://docs.rsshub.app/design.html#zhan-ku', - source: '', - target: '/zcool/discover/home', - }, - { - title: '发现 - 精选 - 编辑精选', - docs: 'https://docs.rsshub.app/design.html#zhan-ku', - source: '', - target: '/zcool/discover/home', - }, - { - title: '发现 - 精选 - 文章 - 编辑精选', - docs: 'https://docs.rsshub.app/design.html#zhan-ku', - source: '', - target: '/zcool/discover/article', - }, - { - title: '作品榜单', - docs: 'https://docs.rsshub.app/design.html#zhan-ku', - source: '', - target: '/zcool/top/design', - }, - { - title: '文章榜单', - docs: 'https://docs.rsshub.app/design.html#zhan-ku', - source: '', - target: '/zcool/top/article', - }, - { - title: '用户作品', - docs: 'https://docs.rsshub.app/design.html#zhan-ku', - source: ['/u/:id'], - target: `/zcool/user/:id`, - }, - ], - }, + // 'zcool.com.cn': { + // _name: '站酷', + // www: [ + // { + // title: '发现', + // docs: 'https://docs.rsshub.app/design.html#zhan-ku', + // source: '', + // target: '/zcool/discover', + // }, + // { + // title: '发现 - 精选 - 全部推荐', + // docs: 'https://docs.rsshub.app/design.html#zhan-ku', + // source: '', + // target: '/zcool/discover/all', + // }, + // { + // title: '发现 - 精选 - 首页推荐', + // docs: 'https://docs.rsshub.app/design.html#zhan-ku', + // source: '', + // target: '/zcool/discover/home', + // }, + // { + // title: '发现 - 精选 - 编辑精选', + // docs: 'https://docs.rsshub.app/design.html#zhan-ku', + // source: '', + // target: '/zcool/discover/home', + // }, + // { + // title: '发现 - 精选 - 文章 - 编辑精选', + // docs: 'https://docs.rsshub.app/design.html#zhan-ku', + // source: '', + // target: '/zcool/discover/article', + // }, + // { + // title: '作品榜单', + // docs: 'https://docs.rsshub.app/design.html#zhan-ku', + // source: '', + // target: '/zcool/top/design', + // }, + // { + // title: '文章榜单', + // docs: 'https://docs.rsshub.app/design.html#zhan-ku', + // source: '', + // target: '/zcool/top/article', + // }, + // { + // title: '用户作品', + // docs: 'https://docs.rsshub.app/design.html#zhan-ku', + // source: ['/u/:id'], + // target: `/zcool/user/:id`, + // }, + // ], + // }, 'zhuixinfan.com': { _name: '追新番日剧站', '.': [ diff --git a/lib/router.js b/lib/router.js index d2506df65487d..01f436725fdb6 100644 --- a/lib/router.js +++ b/lib/router.js @@ -1866,11 +1866,11 @@ router.get('/getitfree/search/:keyword?', lazyloadRouteHandler('./routes/getitfr router.get('/10000link/news/:category?', lazyloadRouteHandler('./routes/10000link/news')); // 站酷 -router.get('/zcool/discover/:query?/:subCate?/:hasVideo?/:city?/:collage?/:recommendLevel?/:sort?', lazyloadRouteHandler('./routes/zcool/discover')); -router.get('/zcool/recommend/:query?/:subCate?/:hasVideo?/:city?/:collage?/:recommendLevel?/:sort?', lazyloadRouteHandler('./routes/zcool/discover')); // 兼容老版本 -router.get('/zcool/top/:type', lazyloadRouteHandler('./routes/zcool/top')); -router.get('/zcool/top', lazyloadRouteHandler('./routes/zcool/top')); // 兼容老版本 -router.get('/zcool/user/:uid', lazyloadRouteHandler('./routes/zcool/user')); +// router.get('/zcool/discover/:query?/:subCate?/:hasVideo?/:city?/:collage?/:recommendLevel?/:sort?', lazyloadRouteHandler('./routes/zcool/discover')); +// router.get('/zcool/recommend/:query?/:subCate?/:hasVideo?/:city?/:collage?/:recommendLevel?/:sort?', lazyloadRouteHandler('./routes/zcool/discover')); // 兼容老版本 +// router.get('/zcool/top/:type', lazyloadRouteHandler('./routes/zcool/top')); +// router.get('/zcool/top', lazyloadRouteHandler('./routes/zcool/top')); // 兼容老版本 +// router.get('/zcool/user/:uid', lazyloadRouteHandler('./routes/zcool/user')); // 第一财经 // router.get('/yicai/brief', lazyloadRouteHandler('./routes/yicai/brief.js')); diff --git a/lib/routes/zcool/top.js b/lib/routes/zcool/top.js deleted file mode 100644 index e1631692d4713..0000000000000 --- a/lib/routes/zcool/top.js +++ /dev/null @@ -1,75 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const type = ctx.params.type; - const url = 'https://www.zcool.com.cn/top/index.do'; - - const topResponse = await got({ - method: 'get', - url, - headers: { - Referer: 'https://www.zcool.com.cn', - }, - }); - - let $ = cheerio.load(topResponse.data); - const rankId = $('div.list-cycle>p>span').text(); - - if (type === 'article') { - const articleResponse = await got({ - method: 'get', - url: 'https://www.zcool.com.cn/top/article.do?rankType=8&rankId=' + rankId, - headers: { - Referer: url, - }, - }); - $ = cheerio.load(articleResponse.data); - } - - const list = $('div.author') - .map((i, e) => { - const element = $(e); - - const title = element.find('div.title').find('a').text(); - const link = element.find('div.title').find('a').attr('href'); - const author = element.find('div.nick').find('a').text(); - - return { - title, - description: '', - link, - author, - }; - }) - .get(); - - const result = await Promise.all( - list.map(async (item) => { - const link = item.link; - - const cache = await ctx.cache.get(link); - if (cache) { - return Promise.resolve(JSON.parse(cache)); - } - - const itemResponse = await got({ - method: 'get', - url: link, - headers: { - Referer: url, - }, - }); - const itemElement = cheerio.load(itemResponse.data); - item.description = type !== 'article' ? itemElement('div.work-content-wrap').html() : itemElement('div.article-content-wraper').html(); - ctx.cache.set(link, JSON.stringify(item)); - return item; - }) - ); - - ctx.state.data = { - title: '站酷 - 第' + rankId + '期' + (type !== 'article' ? '作品总榜' : '文章总榜'), - link: url, - item: result, - }; -}; diff --git a/lib/routes/zcool/user.js b/lib/routes/zcool/user.js deleted file mode 100644 index aa46130abff66..0000000000000 --- a/lib/routes/zcool/user.js +++ /dev/null @@ -1,58 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - let uid = ctx.params.uid; - - if (isNaN(uid)) { - const user_response = await got.get(`https://${uid}.zcool.com.cn/`); - const $ = cheerio.load(user_response.data); - uid = $('[data-id]').attr('data-id'); - } - - const url = `https://api.zcool.com.cn/v2/api/u/${uid}`; - - const response = await got.get(url); - const data = response.data.data; - - const user = data.content[0].creatorObj; - const list = data.content; - - const out = await Promise.all( - list.map(async (item) => { - const link = item.pageUrl; - - const cache = await ctx.cache.get(link); - if (cache) { - return Promise.resolve(JSON.parse(cache)); - } - - const rssitem = { - title: item.title, - link, - author: item.creatorObj.username, - pubDate: new Date(item.createTime * 1), - }; - - try { - const item_response = await got.get(link); - const item_element = cheerio.load(item_response.data); - const item_content_wrap = item_element('.work-content-wrap'); - const item_content = item_content_wrap.length !== 0 ? item_content_wrap : item_element('.work-show-box'); - rssitem.description = item_content.html(); - } catch (err) { - return Promise.resolve(''); - } - - ctx.cache.set(link, JSON.stringify(rssitem)); - return Promise.resolve(rssitem); - }) - ); - - ctx.state.data = { - title: '站酷 - ' + user.username, - image: user.avatar, - link: user.pageUrl, - item: out.filter((item) => item !== ''), - }; -}; diff --git a/lib/routes/zcool/discover.js b/lib/v2/zcool/discover.js similarity index 77% rename from lib/routes/zcool/discover.js rename to lib/v2/zcool/discover.js index e24e190ebce0d..4b8ac6fb79b7c 100644 --- a/lib/routes/zcool/discover.js +++ b/lib/v2/zcool/discover.js @@ -1,5 +1,8 @@ const got = require('@/utils/got'); const cheerio = require('cheerio'); +const { parseDate } = require('@/utils/parse-date'); +const { art } = require('@/utils/render'); +const path = require('path'); const locations = require('./locations'); module.exports = async (ctx) => { @@ -41,21 +44,22 @@ module.exports = async (ctx) => { const queries = { cate: '0', - subCate: ctx.params.subCate || '0', - city: ctx.params.city || '0', - college: ctx.params.college || '0', - recommendLevel: ctx.params.recommendLevel || '2', - sort: ctx.params.sort || '9', + subCate: ctx.params.subCate ?? '0', + city: ctx.params.city ?? '0', + college: ctx.params.college ?? '0', + recommendLevel: ctx.params.recommendLevel ?? '2', + sort: ctx.params.sort ?? '9', + limit: ctx.query.limit ?? '25', }; - let query = ctx.params.query || ''; + let query = ctx.params.query ?? ''; if (query.indexOf('=') > -1) { for (const q of query.split('&')) { const kv = q.split('='); queries[kv[0]] = kv[1]; } - queries.limit = '20'; + queries.limit = '25'; queries.page = '1'; } else { switch (query) { @@ -73,7 +77,7 @@ module.exports = async (ctx) => { queries.recommendLevel = '2'; break; default: - queries.cate = ctx.params.query || '0'; + queries.cate = ctx.params.query ?? '0'; } } @@ -89,18 +93,19 @@ module.exports = async (ctx) => { query = query.substr(0, query.length - 1); const rootUrl = 'https://www.zcool.com.cn'; - const currentUrl = `${rootUrl}/discover.json?${query}`; + const currentUrl = `${rootUrl}/p1/discover/list?${query}`; const response = await got({ method: 'get', url: currentUrl, }); - const list = response.data.data.data.map((item) => ({ - title: item.object.title, - link: item.object.pageUrl, - pubDate: new Date(item.object.publishTime), - author: item.object.creatorObj.username, + const list = response.data.datas.map((item) => ({ + title: item.content.title, + link: item.content.pageUrl, + pubDate: parseDate(item.content.publishTime), + author: item.content.creatorObj.username, + category: item.content.tags, })); const items = await Promise.all( @@ -121,11 +126,18 @@ module.exports = async (ctx) => { if (i >= videos.length) { return; } - content(this).append(`