From 6d162fd3c052d6b296d10378163e847845dcf976 Mon Sep 17 00:00:00 2001 From: Ethan Shen Date: Fri, 4 Dec 2020 23:50:40 +0800 Subject: [PATCH] feat: add blizzard news (#6311) --- docs/en/game.md | 46 ++++++++++++++++++++++++++++++++ docs/game.md | 45 ++++++++++++++++++++++++++++++++ lib/router.js | 3 +++ lib/routes/blizzard/news.js | 52 +++++++++++++++++++++++++++++++++++++ 4 files changed, 146 insertions(+) create mode 100644 lib/routes/blizzard/news.js diff --git a/docs/en/game.md b/docs/en/game.md index 221bcf00e..8620371b0 100755 --- a/docs/en/game.md +++ b/docs/en/game.md @@ -4,6 +4,52 @@ pageClass: routes # Gaming +## Blizzard + +### News + + + +Categories + +| Category | Slug | +| ---------------------- | ------------------- | +| All News | | +| Diablo III | diablo3 | +| Diablo IV | diablo4 | +| Diablo: Immortal | diablo-immortal | +| Hearthstone | hearthstone | +| Heroes of the Storm | heroes-of-the-storm | +| Overwatch | overwatch | +| StarCraft: Remastered | starcraft | +| StarCraft II | starcraft2 | +| World of Warcraft | world-of-warcraft | +| Warcraft III: Reforged | warcraft3 | +| BlizzCon | blizzcon | +| Inside Blizzard | blizzard | + +Language codes + +| Language | Code | +| -------------- | ----- | +| Deutsch | de-de | +| English (US) | en-us | +| English (EU) | en-gb | +| Español (EU) | es-es | +| Español (AL) | es-mx | +| Français | fr-fr | +| Italiano | it-it | +| Português (AL) | pt-br | +| Polski | pl-pl | +| Русский | ru-ru | +| 한국어 | ko-kr | +| ภาษาไทย | th-th | +| 日本語 | ja-jp | +| 繁體中文 | zh-tw | +| 简体中文 | zh-cn | + + + ## dekudeals ### Category diff --git a/docs/game.md b/docs/game.md index 71b208924..8b911d06b 100644 --- a/docs/game.md +++ b/docs/game.md @@ -40,6 +40,51 @@ pageClass: routes +## Blizzard + +### News + + + +分类 + +| 分类 | 分类名 | +| -------------------- | ------------------- | +| 所有新闻 | | +| 暗黑破坏神 III | diablo3 | +| 暗黑破坏神:不朽 | diablo-immortal | +| 炉石传说 | hearthstone | +| 风暴英雄 | heroes-of-the-storm | +| 守望先锋 | overwatch | +| 星际争霸:重制版 | starcraft | +| 星际争霸 II | starcraft2 | +| 魔兽世界 | world-of-warcraft | +| 魔兽争霸 III:重制版 | warcraft3 | +| 暴雪嘉年华 | blizzcon | +| 走进暴雪 | blizzard | + +语言代码 + +| 语言 | 语言代码 | +| -------------- | -------- | +| Deutsch | de-de | +| English (US) | en-us | +| English (EU) | en-gb | +| Español (EU) | es-es | +| Español (AL) | es-mx | +| Français | fr-fr | +| Italiano | it-it | +| Português (AL) | pt-br | +| Polski | pl-pl | +| Русский | ru-ru | +| 한국어 | ko-kr | +| ภาษาไทย | th-th | +| 日本語 | ja-jp | +| 繁體中文 | zh-tw | +| 简体中文 | zh-cn | + + + ## dekudeals ### 分类 diff --git a/lib/router.js b/lib/router.js index 5eaeef162..6eea40593 100644 --- a/lib/router.js +++ b/lib/router.js @@ -3517,6 +3517,9 @@ router.get('/uisdc/news', require('./routes/uisdc/news')); router.get('/uisdc/zt/:title?', require('./routes/uisdc/zt')); router.get('/uisdc/topic/:title?/:sort?', require('./routes/uisdc/topic')); +// Blizzard +router.get('/blizzard/news/:language?/:category?', require('./routes/blizzard/news')); + // DeepMind router.get('/deepmind/blog/:category?', require('./routes/deepmind/blog')); diff --git a/lib/routes/blizzard/news.js b/lib/routes/blizzard/news.js new file mode 100644 index 000000000..b4e19061b --- /dev/null +++ b/lib/routes/blizzard/news.js @@ -0,0 +1,52 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +module.exports = async (ctx) => { + const category = ctx.params.category || ''; + const language = ctx.params.language || 'en-us'; + + const rootUrl = `https://${language === 'zh-cn' ? 'cn.' : ''}news.blizzard.com`; + const currentUrl = `${rootUrl}/${language}/${category}`; + const response = await got({ + method: 'get', + url: currentUrl, + }); + + const $ = cheerio.load(response.data); + + const list = $('.FeaturedArticle-text a, .ArticleListItem article a') + .slice(0, 10) + .map((_, item) => { + item = $(item); + return { + title: item.text(), + link: `${rootUrl}${item.attr('href')}`, + }; + }) + .get(); + + const items = await Promise.all( + list.map( + async (item) => + await ctx.cache.tryGet(item.link, async () => { + const detailResponse = await got({ + method: 'get', + url: item.link, + }); + const content = cheerio.load(detailResponse.data); + + item.author = content('.ArticleDetail-bylineAuthor').text(); + item.description = content('.ArticleDetail-content').html(); + item.pubDate = content('.ArticleDetail-subHeadingLeft time').attr('timestamp'); + + return item; + }) + ) + ); + + ctx.state.data = { + title: $('title').text(), + link: currentUrl, + item: items, + }; +};