新增:蓝桥云课课程更新/技术问答/作者发布课程 (#8639)

This commit is contained in:
HΛИG 2022-01-23 03:01:41 +08:00 committed by GitHub
parent fcee9cd197
commit 109eed5555
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 222 additions and 0 deletions

View File

@ -653,6 +653,20 @@ GitHub 官方也提供了一些 RSS:
<Route author="hoilc" example="/lagou/jobs/JavaScript/上海" path="/lagou/jobs/:position/:city" :paramsDesc="['职位名,可以参考[拉勾网首页](https://www.lagou.com)的职位列表', '城市名,请参考[拉勾网支持的全部城市](https://www.lagou.com/jobs/allCity.html)']" anticrawler="1"/>
## 蓝桥云课
### 最新发布的课程
<Route author="huhuhang" example="/lanqiao/courses/全部" path="/lanqiao/courses/:tag" :paramsDesc="['课程标签 tag 可在该页面找到https://www.lanqiao.cn/courses/']" radar="1" rssbud="1"/>
### 作者发布的课程
<Route author="huhuhang" example="/lanqiao/author/1701267" path="/lanqiao/author/:uid" :paramsDesc="['作者 uid 可在作者主页 URL 中找到']" radar="1" rssbud="1"/>
### 社区最新技术问答
<Route author="huhuhang" example="/questions/2" path="/lanqiao/questions/:id" :paramsDesc="['topic_id 主题 id 可在社区板块 URL 中找到']" radar="1" rssbud="1"/>
## 洛谷
### 日报

63
lib/v2/lanqiao/author.js Normal file
View File

@ -0,0 +1,63 @@
const got = require('@/utils/got');
const utils = require('./utils');
const dateParser = require('@/utils/dateParser');
const MarkdownIt = require('markdown-it');
async function getUserName(uid) {
// 获取用户信息
const response = await got({
method: 'get',
url: `https://www.lanqiao.cn/api/v2/users/${uid}/`,
headers: {
Referer: `https://www.lanqiao.cn/users/${uid}/`,
},
});
return response.data.name;
}
module.exports = async (ctx) => {
const uid = ctx.params.uid;
const userName = await getUserName(uid);
// 发起 HTTP GET 请求
const response = await got({
method: 'get',
url: `https://www.lanqiao.cn/api/v2/users/${uid}/courses/?type=published`,
headers: {
Referer: `https://www.lanqiao.cn/users/${uid}/`,
},
});
const data = response.data.results; // response.data 为 HTTP GET 请求返回的数据对象
const md = new MarkdownIt();
const items = await Promise.all(
data.map((item) =>
ctx.cache.tryGet(`https://www.lanqiao.cn/api/v2/courses/${item.id}/`, async () => {
const courseResponse = await got({
method: 'get',
url: `https://www.lanqiao.cn/api/v2/courses/${item.id}/`,
});
const course = courseResponse.data;
item.title = course.name;
item.description = utils.courseDesc(course.picture_url, md.render(course.long_description));
item.author = course.teacher.name;
item.pubDate = dateParser(course.end_time);
item.link = `https://www.lanqiao.cn/courses/${course.id}/`;
return item;
})
)
);
ctx.state.data = {
// 源标题
title: `${userName} 发布的课程`,
// 源链接
link: `https://www.lanqiao.cn/users/${uid}`,
// 源说明
description: `${userName} 发布的课程`,
// 遍历此前获取的数据
item: items,
};
};

45
lib/v2/lanqiao/courses.js Normal file
View File

@ -0,0 +1,45 @@
const got = require('@/utils/got');
const utils = require('./utils');
const dateParser = require('@/utils/dateParser');
const MarkdownIt = require('markdown-it');
module.exports = async (ctx) => {
const tag = ctx.params.tag;
// 发起 HTTP GET 请求
const response = await got({
method: 'get',
url: `https://www.lanqiao.cn/api/v2/courses/?sort=latest&tag=${tag}&include=name,description,picture_url,id`,
});
const data = response.data.results; // response.data 为 HTTP GET 请求返回的数据对象
const md = new MarkdownIt();
const items = await Promise.all(
data.map((item) =>
ctx.cache.tryGet(`https://www.lanqiao.cn/api/v2/courses/${item.id}/`, async () => {
const courseResponse = await got({
method: 'get',
url: `https://www.lanqiao.cn/api/v2/courses/${item.id}/`,
});
const course = courseResponse.data;
item.title = course.name;
item.description = utils.courseDesc(course.picture_url, md.render(course.long_description));
item.author = course.teacher.name;
item.pubDate = dateParser(course.end_time);
item.link = `https://www.lanqiao.cn/courses/${course.id}/`;
return item;
})
)
);
ctx.state.data = {
// 源标题
title: `蓝桥云课最新发布的课程(${tag})`,
// 源链接
link: `https://www.lanqiao.cn/courses/?tag=${tag}`,
// 源说明
description: `蓝桥云课 ${tag} 标签下最新发布的课程`,
// 遍历此前获取的数据
item: items,
};
};

View File

@ -0,0 +1,5 @@
module.exports = {
'/author/:uid': ['huhuhang'],
'/courses/:tag': ['huhuhang'],
'/questions/:id': ['huhuhang'],
};

View File

@ -0,0 +1,52 @@
const got = require('@/utils/got');
const dateParser = require('@/utils/dateParser');
const MarkdownIt = require('markdown-it');
module.exports = async (ctx) => {
const id = ctx.params.id;
// 发起 HTTP GET 请求
const response = await got({
method: 'get',
url: `https://www.lanqiao.cn/api/v2/questions/?sort=created_time&topic_id=${id}`,
headers: {
Referer: `https://www.lanqiao.cn/questions/topic_id=${id}`,
},
});
const data = response.data.results; // response.data 为 HTTP GET 请求返回的数据对象
function filterToped(arr) {
// 过滤置顶的帖子
return arr.is_toped === false;
}
// 将 markdown 转换为 HTML
const md = new MarkdownIt();
const items = await Promise.all(
data.filter(filterToped).map((item) =>
ctx.cache.tryGet(`https://www.lanqiao.cn/api/v2/questions/${item.id}/`, async () => {
const questionResponse = await got({
method: 'get',
url: `https://www.lanqiao.cn/api/v2/questions/${item.id}/`,
});
const question = questionResponse.data;
item.title = question.title;
item.description = md.render(question.content);
item.author = question.author.name;
item.pubDate = dateParser(question.created_at);
item.link = `https://www.lanqiao.cn/questions/${question.id}/`;
return item;
})
)
);
ctx.state.data = {
// 源标题
title: '蓝桥云课社区技术',
// 源链接
link: `https://www.lanqiao.cn/questions/topics/${id}/`,
// 源说明
description: '蓝桥云课技术社区主题帖',
// 遍历此前获取的数据
item: items,
};
};

25
lib/v2/lanqiao/radar.js Normal file
View File

@ -0,0 +1,25 @@
module.exports = {
'lanqiao.cn': {
_name: '蓝桥云课',
'.': [
{
title: '作者发布的课程',
docs: 'https://docs.rsshub.app/programming.html#lan-qiao-yun-ke-zuo-zhe-fa-bu-de-ke-cheng',
source: ['/users/:uid'],
target: '/lanqiao/author/:uid',
},
{
title: '最新发布的课程',
docs: 'https://docs.rsshub.app/programming.html#lan-qiao-yun-ke-zuo-zhe-fa-bu-de-ke-cheng',
source: ['/courses/'],
target: '/lanqiao/courses/all',
},
{
title: '最新发布的课程',
docs: 'https://docs.rsshub.app/programming.html#lan-qiao-yun-ke-she-qu-zui-xin-ji-shu-wen-da',
source: ['/questions/', '/questions/topics/:id'],
target: '/lanqiao/questions/:id',
},
],
},
};

5
lib/v2/lanqiao/router.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = function (router) {
router.get('/author/:uid', require('./author'));
router.get('/courses/:tag', require('./courses'));
router.get('/questions/:id', require('./questions'));
};

View File

@ -0,0 +1 @@
<img src="{{ picurl }}"><br>{{ desc }}

12
lib/v2/lanqiao/utils.js Normal file
View File

@ -0,0 +1,12 @@
const { art } = require('@/utils/render');
const path = require('path');
const courseDesc = (picurl, desc) =>
art(path.join(__dirname, 'templates/courseDesc.art'), {
picurl,
desc,
});
module.exports = {
courseDesc,
};