feat(radar): leetcode radar

This commit is contained in:
Tony
2022-08-05 12:49:21 +00:00
parent 9ee9dc608b
commit 03ff28996d
6 changed files with 136 additions and 81 deletions

View File

@@ -0,0 +1,80 @@
const got = require('@/utils/got');
const cheerio = require('cheerio');
const { parseDate } = require('@/utils/parse-date');
const showdown = require('showdown');
const host = 'https://leetcode.com';
const gqlEndpoint = `${host}/graphql`;
module.exports = async (ctx) => {
const link = new URL('/articles/', host).href;
const response = await got(link);
const $ = cheerio.load(response.data);
const list = $('a.list-group-item')
.filter((i, e) => $(e).find('h4.media-heading i').length === 0)
.map(function () {
const info = {
title: $(this).find('h4.media-heading').text().trim(),
author: $(this).find('.text-500').text(),
link: new URL($(this).attr('href'), host).href,
pubDate: $(this).find('p.pull-right.media-date strong').text().trim(),
};
return info;
})
.get();
const out = await Promise.all(
list.map((info) =>
ctx.cache.tryGet(info.link, async () => {
const titleSlug = info.link.split('/')[4];
const questionData = await got
.post(gqlEndpoint, {
json: {
operationName: 'questionData',
variables: { titleSlug },
query: `query questionData($titleSlug: String!) {
question(titleSlug: $titleSlug) {
content
}
}`,
},
})
.json();
const questionNote = await got
.post(gqlEndpoint, {
json: {
operationName: 'QuestionNote',
variables: { titleSlug },
query: `query QuestionNote($titleSlug: String!) {
question(titleSlug: $titleSlug) {
solution {
content
}
}
}`,
},
})
.json();
const converter = new showdown.Converter();
const solution = converter.makeHtml(questionNote.data.question.solution.content);
info.description = questionData.data.question.content.trim() + solution;
info.pubDate = parseDate(info.pubDate);
return info;
})
)
);
ctx.state.data = {
title: $('head title').text(),
description: $('meta[property="og:description"]').attr('content'),
image: 'https://assets.leetcode.com/static_assets/public/icons/favicon-192x192.png',
link,
item: out,
};
};

View File

@@ -1,4 +1,5 @@
module.exports = {
'/dailyquestion/en': ['NavePnow'],
'/dailyquestion/cn': ['NavePnow'],
'/articles': ['LogicJake'],
'/dailyquestion/:lang': ['NavePnow'],
'/submission/:country/:user': ['NathanDai'],
};

50
lib/v2/leetcode/radar.js Normal file
View File

@@ -0,0 +1,50 @@
module.exports = {
'leetcode.com': {
_name: 'LeetCode',
'.': [
{
title: '文章',
docs: 'https://docs.rsshub.app/programming.html#leetcode',
source: ['/articles'],
target: '/leetcode/articles',
},
{
title: '打卡',
docs: 'https://docs.rsshub.app/programming.html#leetcode',
source: ['/:user'],
target: (params) => {
if (params.user !== 'articles') {
return `/leetcode/submission/us/:user`;
}
},
},
{
title: '每日一题',
docs: 'https://docs.rsshub.app/programming.html#leetcode',
source: ['/'],
target: '/leetcode/dailyquestion/en',
},
],
},
'leetcode.cn': {
_name: 'LeetCode',
'.': [
{
title: '打卡',
docs: 'https://docs.rsshub.app/programming.html#leetcode',
source: ['/:user'],
target: (params) => {
if (params.user !== 'articles') {
return `/leetcode/submission/cn/:user`;
}
},
},
{
title: '每日一题',
docs: 'https://docs.rsshub.app/programming.html#leetcode',
source: ['/'],
target: '/leetcode/dailyquestion/cn',
},
],
},
};

View File

@@ -1,4 +1,5 @@
module.exports = function (router) {
router.get('/dailyquestion/en', require('./dailyquestion-en'));
router.get('/articles', require('./articles'));
router.get('/dailyquestion/cn', require('./dailyquestion-cn'));
router.get('/dailyquestion/en', require('./dailyquestion-en'));
};