diff --git a/docs/new-media.md b/docs/new-media.md index 6430d5b514..f2fb7d06f9 100644 --- a/docs/new-media.md +++ b/docs/new-media.md @@ -773,11 +773,11 @@ IPFS 网关有可能失效,那时候换成其他网关。 ### 文章 - + -| 新品 | DeFi | NFT | 存储 | 波卡 | 行情 | 活动 | -| ---- | ---- | --- | ---- | ---- | ---- | ---- | -| 333 | 331 | 334 | 332 | 330 | 297 | 296 | +| 最新 | 新品 | DeFi | NFT | 存储 | 波卡 | 行情 | 活动 | +| ---- | ---- | ---- | --- | ---- | ---- | ---- | ---- | +| 280 | 333 | 331 | 334 | 332 | 330 | 297 | 296 | diff --git a/lib/router.js b/lib/router.js index e4de33388d..db6fbcef22 100644 --- a/lib/router.js +++ b/lib/router.js @@ -4230,10 +4230,10 @@ router.get('/questmobile/report/:category?/:label?', lazyloadRouteHandler('./rou router.get('/rss3/blog', lazyloadRouteHandler('./routes/rss3/blog')); // 星球日报 -router.get('/odaily/activity', lazyloadRouteHandler('./routes/odaily/activity')); -router.get('/odaily/newsflash', lazyloadRouteHandler('./routes/odaily/newsflash')); -router.get('/odaily/user/:id', lazyloadRouteHandler('./routes/odaily/user')); -router.get('/odaily/:id?', lazyloadRouteHandler('./routes/odaily/post')); +// router.get('/odaily/activity', lazyloadRouteHandler('./routes/odaily/activity')); +// router.get('/odaily/newsflash', lazyloadRouteHandler('./routes/odaily/newsflash')); +// router.get('/odaily/user/:id', lazyloadRouteHandler('./routes/odaily/user')); +// router.get('/odaily/:id?', lazyloadRouteHandler('./routes/odaily/post')); // Fashion Network router.get('/fashionnetwork/news/:sectors?/:categories?/:language?', lazyloadRouteHandler('./routes/fashionnetwork/news.js')); diff --git a/lib/routes/odaily/activity.js b/lib/v2/odaily/activity.js similarity index 79% rename from lib/routes/odaily/activity.js rename to lib/v2/odaily/activity.js index 7d344a7538..c7128381bf 100644 --- a/lib/routes/odaily/activity.js +++ b/lib/v2/odaily/activity.js @@ -1,24 +1,25 @@ const got = require('@/utils/got'); const cheerio = require('cheerio'); const timezone = require('@/utils/timezone'); +const { parseDate } = require('@/utils/parse-date'); +const { rootUrl } = require('./utils'); module.exports = async (ctx) => { - const rootUrl = 'https://www.odaily.com'; - const currentUrl = `${rootUrl}/service/scheme/group/8?page=1&per_page=10`; + const currentUrl = `${rootUrl}/service/scheme/group/8?page=1&per_page=${ctx.query.limit ?? 25}`; const response = await got({ method: 'get', url: currentUrl, }); - const list = response.data.data.items.data.map((item) => ({ + let items = response.data.data.items.data.map((item) => ({ title: item.title, link: `${rootUrl}/activity/${item.id}`, - pubDate: timezone(new Date(item.published_at), +8), + pubDate: timezone(parseDate(item.published_at), +8), })); - const items = await Promise.all( - list.map( + items = await Promise.all( + items.map( async (item) => await ctx.cache.tryGet(item.link, async () => { const detailResponse = await got({ diff --git a/lib/v2/odaily/maintainer.js b/lib/v2/odaily/maintainer.js new file mode 100644 index 0000000000..2e79926bf9 --- /dev/null +++ b/lib/v2/odaily/maintainer.js @@ -0,0 +1,6 @@ +module.exports = { + '/activity': ['nczitzk'], + '/newsflash': ['nczitzk'], + '/user/:id': ['nczitzk'], + '/:id?': ['nczitzk'], +}; diff --git a/lib/routes/odaily/newsflash.js b/lib/v2/odaily/newsflash.js similarity index 72% rename from lib/routes/odaily/newsflash.js rename to lib/v2/odaily/newsflash.js index 7bd5555479..302f909db5 100644 --- a/lib/routes/odaily/newsflash.js +++ b/lib/v2/odaily/newsflash.js @@ -1,9 +1,10 @@ const got = require('@/utils/got'); const timezone = require('@/utils/timezone'); +const { parseDate } = require('@/utils/parse-date'); +const { rootUrl } = require('./utils'); module.exports = async (ctx) => { - const rootUrl = 'https://www.odaily.com'; - const currentUrl = `${rootUrl}/api/pp/api/info-flow/newsflash_columns/newsflashes?b_id=&per_page=30`; + const currentUrl = `${rootUrl}/api/pp/api/info-flow/newsflash_columns/newsflashes?b_id=&per_page=${ctx.query.limit ?? 100}`; const response = await got({ method: 'get', @@ -13,7 +14,7 @@ module.exports = async (ctx) => { const items = response.data.data.items.map((item) => ({ title: item.title, link: item.news_url, - pubDate: timezone(new Date(item.published_at), +8), + pubDate: timezone(parseDate(item.published_at), +8), description: `

${item.description}

`, })); diff --git a/lib/routes/odaily/post.js b/lib/v2/odaily/post.js similarity index 63% rename from lib/routes/odaily/post.js rename to lib/v2/odaily/post.js index 3ee0acd919..5e99aad128 100644 --- a/lib/routes/odaily/post.js +++ b/lib/v2/odaily/post.js @@ -1,8 +1,11 @@ const got = require('@/utils/got'); const cheerio = require('cheerio'); const timezone = require('@/utils/timezone'); +const { parseDate } = require('@/utils/parse-date'); +const { rootUrl } = require('./utils'); const titles = { + 280: '最新', 333: '新品', 331: 'DeFi', 334: 'NFT', @@ -13,24 +16,26 @@ const titles = { }; module.exports = async (ctx) => { - const id = ctx.params.id || '333'; + const id = ctx.params.id ?? '280'; - const rootUrl = 'https://www.odaily.com'; - const currentUrl = `${rootUrl}/api/pp/api/app-front/feed-stream?feed_id=${id}&b_id=&per_page=10`; + const currentUrl = `${rootUrl}/api/pp/api/app-front/feed-stream?feed_id=${id}&b_id=&per_page=${ctx.query.limit ?? 25}`; const response = await got({ method: 'get', url: currentUrl, }); - const list = response.data.data.items.map((item) => ({ + let items = response.data.data.items.map((item) => ({ title: item.title, - link: `${rootUrl}/post/${item.entity_id}`, - pubDate: timezone(new Date(item.published_at), +8), + author: item.user.name, + type: item.entity_type, + description: `

${item.summary}

`, + link: `${rootUrl}/${item.entity_type}/${item.entity_id}`, + pubDate: timezone(parseDate(item.published_at), +8), })); - const items = await Promise.all( - list.map( + items = await Promise.all( + items.map( async (item) => await ctx.cache.tryGet(item.link, async () => { const detailResponse = await got({ @@ -38,14 +43,15 @@ module.exports = async (ctx) => { url: item.link, }); - const content = cheerio.load(detailResponse.data.match(/"content":"(.*)","extraction_tags":/)[1]); + const content = cheerio.load(detailResponse.data.match(item.type === 'post' ? /"content":"(.*)","extraction_tags":/ : /"description":"(.*?)","cover":/)[1]); content('img').each(function () { content(this).attr('src', content(this).attr('src').replace(/\\"/g, '')); }); item.description = content.html(); - item.author = detailResponse.data.match(/"name":"(.*)","avatar_url"/)[1]; + + delete item.type; return item; }) diff --git a/lib/v2/odaily/radar.js b/lib/v2/odaily/radar.js new file mode 100644 index 0000000000..aaec22636a --- /dev/null +++ b/lib/v2/odaily/radar.js @@ -0,0 +1,60 @@ +module.exports = { + 'odaily.news': { + _name: 'Odaily 星球日报', + '.': [ + { + title: '快讯', + docs: 'https://docs.rsshub.app/new-media.html#odaily-xing-qiu-ri-bao-kuai-xun', + source: ['/newsflash', '/'], + target: '/odaily/newsflash', + }, + { + title: '文章', + docs: 'https://docs.rsshub.app/new-media.html#odaily-xing-qiu-ri-bao-wen-zhang', + source: ['/'], + target: '/odaily/:id?', + }, + { + title: '用户文章', + docs: 'https://docs.rsshub.app/new-media.html#odaily-xing-qiu-ri-bao-yong-hu-wen-zhang', + source: ['/user/:id', '/'], + target: '/odaily/user/:id', + }, + { + title: '活动', + docs: 'https://docs.rsshub.app/new-media.html#odaily-xing-qiu-ri-bao-huo-dong', + source: ['/activityPage', '/'], + target: '/odaily/activity', + }, + ], + }, + '0daily.com': { + _name: 'Odaily 星球日报', + '.': [ + { + title: '快讯', + docs: 'https://docs.rsshub.app/new-media.html#odaily-xing-qiu-ri-bao-kuai-xun', + source: ['/newsflash', '/'], + target: '/odaily/newsflash', + }, + { + title: '文章', + docs: 'https://docs.rsshub.app/new-media.html#odaily-xing-qiu-ri-bao-wen-zhang', + source: ['/'], + target: '/odaily/:id?', + }, + { + title: '用户文章', + docs: 'https://docs.rsshub.app/new-media.html#odaily-xing-qiu-ri-bao-yong-hu-wen-zhang', + source: ['/user/:id', '/'], + target: '/odaily/user/:id', + }, + { + title: '活动', + docs: 'https://docs.rsshub.app/new-media.html#odaily-xing-qiu-ri-bao-huo-dong', + source: ['/activityPage', '/'], + target: '/odaily/activity', + }, + ], + }, +}; diff --git a/lib/v2/odaily/router.js b/lib/v2/odaily/router.js new file mode 100644 index 0000000000..84da30c1c1 --- /dev/null +++ b/lib/v2/odaily/router.js @@ -0,0 +1,6 @@ +module.exports = function (router) { + router.get('/activity', require('./activity')); + router.get('/newsflash', require('./newsflash')); + router.get('/user/:id', require('./user')); + router.get('/:id?', require('./post')); +}; diff --git a/lib/routes/odaily/user.js b/lib/v2/odaily/user.js similarity index 79% rename from lib/routes/odaily/user.js rename to lib/v2/odaily/user.js index 0acfe50d8b..04117cced8 100644 --- a/lib/routes/odaily/user.js +++ b/lib/v2/odaily/user.js @@ -1,12 +1,13 @@ const got = require('@/utils/got'); const cheerio = require('cheerio'); const timezone = require('@/utils/timezone'); +const { parseDate } = require('@/utils/parse-date'); +const { rootUrl } = require('./utils'); module.exports = async (ctx) => { const id = ctx.params.id; - const rootUrl = 'https://www.odaily.com'; - const currentUrl = `${rootUrl}/service/feed_stream/user/${id}?b_id=10&per_page=10`; + const currentUrl = `${rootUrl}/service/feed_stream/user/${id}?b_id=10&per_page=${ctx.query.limit ?? 25}`; let author = ''; @@ -15,15 +16,15 @@ module.exports = async (ctx) => { url: currentUrl, }); - const list = response.data.data.items.data.map((item) => ({ + let items = response.data.data.items.data.map((item) => ({ title: item.title, summary: item.summary, link: `${rootUrl}/post/${item.entity_id}`, - pubDate: timezone(new Date(item.published_at), +8), + pubDate: timezone(parseDate(item.published_at), +8), })); - const items = await Promise.all( - list.map( + items = await Promise.all( + items.map( async (item) => await ctx.cache.tryGet(item.link, async () => { const detailResponse = await got({ @@ -38,7 +39,7 @@ module.exports = async (ctx) => { }); item.description = content.html(); - item.author = author = detailResponse.data.match(/"name":"(.*)","avatar_url"/)[1]; + item.author = author = detailResponse.data.match(/"name":"(.*)","role_id/)[1]; return item; }) diff --git a/lib/v2/odaily/utils.js b/lib/v2/odaily/utils.js new file mode 100644 index 0000000000..3ff06174a0 --- /dev/null +++ b/lib/v2/odaily/utils.js @@ -0,0 +1,3 @@ +module.exports = { + rootUrl: 'https://www.odaily.news', +};