mirror of
https://github.com/DIYgod/RSSHub.git
synced 2025-12-05 04:11:26 +08:00
feat(route): add Luogu user blog (#11527)
* feat(route): add Luogu user blog * used html as description instead * Do not set pubDate if there isn't any. * used Luogu API
This commit is contained in:
@@ -1013,6 +1013,10 @@ GitHub 官方也提供了一些 RSS:
|
|||||||
|
|
||||||
<Route author="solstice23" example="/luogu/user/feed/1" path="/luogu/user/feed/:uid" :paramsDesc="['用户 UID']" radar="1" rssbud="1"/>
|
<Route author="solstice23" example="/luogu/user/feed/1" path="/luogu/user/feed/:uid" :paramsDesc="['用户 UID']" radar="1" rssbud="1"/>
|
||||||
|
|
||||||
|
### 用户博客
|
||||||
|
|
||||||
|
<Route author="ftiasch" example="/luogu/user/blog/ftiasch" path="/luogu/user/blog/:username" :paramsDesc="['用户名']" radar="1" rssbud="1"/>
|
||||||
|
|
||||||
## 码农俱乐部
|
## 码农俱乐部
|
||||||
|
|
||||||
### 话题
|
### 话题
|
||||||
|
|||||||
@@ -2,4 +2,5 @@ module.exports = {
|
|||||||
'/contest': ['prnake'],
|
'/contest': ['prnake'],
|
||||||
'/daily/:id?': ['LogicJake ', 'prnake ', 'nczitzk'],
|
'/daily/:id?': ['LogicJake ', 'prnake ', 'nczitzk'],
|
||||||
'/user/feed/:uid': ['solstice23'],
|
'/user/feed/:uid': ['solstice23'],
|
||||||
|
'/user/blog/:username': ['ftiasch'],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -20,6 +20,12 @@ module.exports = {
|
|||||||
source: ['/user/:uid'],
|
source: ['/user/:uid'],
|
||||||
target: '/luogu/user/feed/:uid',
|
target: '/luogu/user/feed/:uid',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: '用户博客',
|
||||||
|
docs: 'https://docs.rsshub.app/programming.html#luo-gu',
|
||||||
|
source: ['/blog/:username'],
|
||||||
|
target: '/luogu/user/blog/:username',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,4 +2,5 @@ module.exports = (router) => {
|
|||||||
router.get('/contest', require('./contest'));
|
router.get('/contest', require('./contest'));
|
||||||
router.get('/daily/:id?', require('./daily'));
|
router.get('/daily/:id?', require('./daily'));
|
||||||
router.get('/user/feed/:uid', require('./userFeed'));
|
router.get('/user/feed/:uid', require('./userFeed'));
|
||||||
|
router.get('/user/blog/:username', require('./userBlog'));
|
||||||
};
|
};
|
||||||
|
|||||||
54
lib/v2/luogu/userBlog.js
Normal file
54
lib/v2/luogu/userBlog.js
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
const got = require('@/utils/got');
|
||||||
|
const cheerio = require('cheerio');
|
||||||
|
|
||||||
|
module.exports = async (ctx) => {
|
||||||
|
const username = ctx.params.username;
|
||||||
|
|
||||||
|
// Convert from `username` to `uid`
|
||||||
|
const userApiUrl = `https://www.luogu.com.cn/api/user/search?keyword=${username}`;
|
||||||
|
const uid = await ctx.cache.tryGet(userApiUrl, async () => {
|
||||||
|
const rsp = await got(userApiUrl).json();
|
||||||
|
return rsp.users[0].uid;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get the title and link from the sitemap
|
||||||
|
const sitemapUrl = `https://www.luogu.com.cn/blog/${username}/_sitemap`;
|
||||||
|
const { title: blogTitle, link: blogBaseUrl } = await ctx.cache.tryGet(sitemapUrl, async () => {
|
||||||
|
const rsp = await got(sitemapUrl);
|
||||||
|
const $ = cheerio.load(rsp.data);
|
||||||
|
const title = $('title').text();
|
||||||
|
const link = $('.am-alert > a').attr('href');
|
||||||
|
return {
|
||||||
|
title,
|
||||||
|
link,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const posts = (await got(`https://www.luogu.com.cn/api/blog/lists?uid=${uid}`).json()).data.result.map((r) => ({
|
||||||
|
title: r.title,
|
||||||
|
link: `${blogBaseUrl}${r.identifier}`,
|
||||||
|
pubDate: new Date(r.postTime * 1000),
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Get the full text
|
||||||
|
const item = await Promise.all(
|
||||||
|
posts.map((post) =>
|
||||||
|
ctx.cache.tryGet(post.link, async () => {
|
||||||
|
const rsp = await got.get(post.link);
|
||||||
|
const $ = cheerio.load(rsp.data);
|
||||||
|
return {
|
||||||
|
title: post.title,
|
||||||
|
link: post.link,
|
||||||
|
pubDate: post.pubDate,
|
||||||
|
description: $('#article-content').html(),
|
||||||
|
};
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
ctx.state.data = {
|
||||||
|
title: blogTitle,
|
||||||
|
link: blogBaseUrl,
|
||||||
|
item,
|
||||||
|
};
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user