From 4b6649b462903e0e85f8f8b2ce6f68894045f2a2 Mon Sep 17 00:00:00 2001 From: Chenyang Shi Date: Tue, 12 Nov 2019 17:46:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20add=20kaggle=20=E6=96=B0=E6=AF=94?= =?UTF-8?q?=E8=B5=9B=20(#3416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/programming.md | 11 +++++++ lib/router.js | 1 + lib/routes/kaggle/competitions.js | 51 +++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 lib/routes/kaggle/competitions.js diff --git a/docs/programming.md b/docs/programming.md index 32d703efd..5565c8a06 100644 --- a/docs/programming.md +++ b/docs/programming.md @@ -165,6 +165,17 @@ GitHub 官方也提供了一些 RSS: | Hotness | Recent Comments | Recently Posted | Most Votes | Most Comments | + +### Competitions + + + +| 空 | featured | research | recruitment | gettingStarted | masters | playground | analytics | +| -------------- | -------- | -------- | ----------- | --------------- | ------- | ---------- | --------- | +| All Categories | Featured | Research | Recruitment | Getting started | Masters | Playground | Analytics | + + + ## LeetCode ### 文章 diff --git a/lib/router.js b/lib/router.js index c10c0546d..e7da804bc 100644 --- a/lib/router.js +++ b/lib/router.js @@ -1890,6 +1890,7 @@ router.get('/hatena/anonymous_diary/archive', require('./routes/hatena/anonymous // kaggle router.get('/kaggle/discussion/:forumId/:sort?', require('./routes/kaggle/discussion')); +router.get('/kaggle/competitions/:category?', require('./routes/kaggle/competitions')); // nature router.get('/nature/natmachintell/research', require('./routes/nature/natmachintell/research')); diff --git a/lib/routes/kaggle/competitions.js b/lib/routes/kaggle/competitions.js new file mode 100644 index 000000000..f9009e202 --- /dev/null +++ b/lib/routes/kaggle/competitions.js @@ -0,0 +1,51 @@ +const got = require('@/utils/got'); +const url = require('url'); + +const rootUrl = 'https://www.kaggle.com/'; + +const categoryCodes = { + '': 'All Categories', + featured: 'Featured', + research: 'Research', + recruitment: 'Recruitment', + gettingStarted: 'Getting started', + masters: 'Masters', + playground: 'Playground', + analytics: 'Analytics', +}; + +module.exports = async (ctx) => { + const category = ctx.params.category || ''; + const categoryText = categoryCodes[category]; + + const response = await got({ + method: 'get', + url: `https://www.kaggle.com/competitions.json?sortBy=grouped&group=general&page=1&pageSize=20&category=${category}`, + headers: { + Referer: rootUrl, + }, + }); + + const competitions = response.data.fullCompetitionGroups[1].competitions; + const out = competitions.map((item) => { + const title = item.competitionTitle; + const description = item.competitionDescription; + const author = item.organizationName; + const itemUrl = url.resolve(rootUrl, item.competitionUrl); + + const single = { + link: itemUrl, + title: title, + author: author, + description: description, + }; + + return single; + }); + + ctx.state.data = { + title: `new competition-${categoryText}`, + link: 'https://www.kaggle.com/competitions', + item: out, + }; +};