From 8d06ceddb733a897851e0068074ee298ebbef1cc Mon Sep 17 00:00:00 2001 From: AaronLiu Date: Wed, 15 May 2019 15:12:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=BB=E5=A4=A9=E5=A0=82eShop=20(#21?= =?UTF-8?q?36)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/game.md | 7 ++++++ lib/router.js | 5 ++++ lib/routes/nintendo/eshop_hk.js | 26 +++++++++++++++++++++ lib/routes/nintendo/eshop_jp.js | 20 ++++++++++++++++ lib/routes/nintendo/eshop_us.js | 41 +++++++++++++++++++++++++++++++++ lib/routes/nintendo/utils.js | 28 ++++++++++++++++++++++ 6 files changed, 127 insertions(+) create mode 100644 lib/routes/nintendo/eshop_hk.js create mode 100644 lib/routes/nintendo/eshop_jp.js create mode 100644 lib/routes/nintendo/eshop_us.js create mode 100644 lib/routes/nintendo/utils.js diff --git a/docs/game.md b/docs/game.md index c4856da6b6..9d3cc93063 100644 --- a/docs/game.md +++ b/docs/game.md @@ -38,6 +38,12 @@ pageClass: routes +## Nintendo + +### eShop 新发售游戏 + + + ## PlayStation Store ### 游戏列表 @@ -53,6 +59,7 @@ pageClass: routes ### 首页-白金攻略/游戏开箱 + ### 新闻-游戏资讯 diff --git a/lib/router.js b/lib/router.js index 768d3f92ce..bf12d8b5c9 100644 --- a/lib/router.js +++ b/lib/router.js @@ -1307,6 +1307,11 @@ router.get('/mlhang', require('./routes/mlhang/latest')); // PlayStation Store router.get('/ps/list/:gridName', require('./routes/ps/list')); +// Nintendo +router.get('/nintendo/eshop/jp', require('./routes/nintendo/eshop_jp')); +router.get('/nintendo/eshop/hk', require('./routes/nintendo/eshop_hk')); +router.get('/nintendo/eshop/us', require('./routes/nintendo/eshop_us')); + // 世界卫生组织 router.get('/who/news-room/:type', require('./routes/who/news-room')); diff --git a/lib/routes/nintendo/eshop_hk.js b/lib/routes/nintendo/eshop_hk.js new file mode 100644 index 0000000000..7c5e030d1a --- /dev/null +++ b/lib/routes/nintendo/eshop_hk.js @@ -0,0 +1,26 @@ +const axios = require('../../utils/axios'); +const util = require('./utils'); + +module.exports = async (ctx) => { + const response = await axios({ + method: 'get', + url: `https://www.nintendo.com.hk/data/json/switch_software.json`, + }); + const data = response.data.slice(0, 9); + + // 获取游戏描述 + const result = await util.ProcessItem(data, ctx.cache); + + ctx.state.data = { + title: `Nintendo eShop (港服) 新游戏`, + link: `https://www.nintendo.com.hk/software/switch/index.html`, + description: `Nintendo eShop (港服) 新上架的游戏`, + item: result.map((item) => ({ + title: item.title, + description: `
发售日期:${item.release_date}
价格:${ + item.price + }港币
支持中文:${item.lang === 'CN' ? '是' : '否'}
发行商:${item.maker_publisher}
${item.content}`, + link: item.link, + })), + }; +}; diff --git a/lib/routes/nintendo/eshop_jp.js b/lib/routes/nintendo/eshop_jp.js new file mode 100644 index 0000000000..d0a223ee89 --- /dev/null +++ b/lib/routes/nintendo/eshop_jp.js @@ -0,0 +1,20 @@ +const axios = require('../../utils/axios'); + +module.exports = async (ctx) => { + const response = await axios({ + method: 'get', + url: `https://search.nintendo.jp/nintendo_soft/search.json?opt_sshow=1&fq=ssitu_s%3Aonsale%20OR%20ssitu_s%3Apreorder%20OR%20memo_bg%3Aforced&limit=24&page=1&c=50310840317994813&opt_osale=1&opt_hard=1_HAC&sort=sodate%20desc%2Cscore`, + }); + const data = response.data.result.items.slice(0, 9); + + ctx.state.data = { + title: `Nintendo eShop (日服) 新游戏`, + link: `https://www.nintendo.co.jp/software/switch/index.html`, + description: `Nintendo eShop (日服) 新上架的游戏`, + item: data.map((item) => ({ + title: item.title, + description: `
发售日期:${item.pdate}
价格:${item.dprice}円`, + link: `https://ec.nintendo.com/JP/ja/titles/${item.id}`, + })), + }; +}; diff --git a/lib/routes/nintendo/eshop_us.js b/lib/routes/nintendo/eshop_us.js new file mode 100644 index 0000000000..90118517e6 --- /dev/null +++ b/lib/routes/nintendo/eshop_us.js @@ -0,0 +1,41 @@ +const axios = require('../../utils/axios'); + +module.exports = async (ctx) => { + const response = await axios({ + method: 'post', + url: `https://u3b6gr4ua3-dsn.algolia.net/1/indexes/*/queries?x-algolia-agent=Algolia%20for%20vanilla%20JavaScript%20(lite)%203.22.1%3BJS%20Helper%202.20.1&x-algolia-application-id=U3B6GR4UA3&x-algolia-api-key=9a20c93440cf63cf1a7008d75f7438bf`, + data: { + requests: [ + { + indexName: 'noa_aem_game_en_us_release_des', + params: + 'query=&hitsPerPage=42&maxValuesPerFacet=30&page=0&facets=%5B%22generalFilters%22%2C%22platform%22%2C%22availability%22%2C%22categories%22%2C%22filterShops%22%2C%22virtualConsole%22%2C%22characters%22%2C%22priceRange%22%2C%22esrb%22%2C%22filterPlayers%22%5D&tagFilters=&facetFilters=%5B%5B%22availability%3ANew%20releases%22%5D%2C%5B%22platform%3ANintendo%20Switch%22%5D%5D', + }, + { + indexName: 'noa_aem_game_en_us_release_des', + params: + 'query=&hitsPerPage=1&maxValuesPerFacet=30&page=0&attributesToRetrieve=%5B%5D&attributesToHighlight=%5B%5D&attributesToSnippet=%5B%5D&tagFilters=&facets=availability&facetFilters=%5B%5B%22platform%3ANintendo%20Switch%22%5D%5D', + }, + { + indexName: 'noa_aem_game_en_us_release_des', + params: + 'query=&hitsPerPage=1&maxValuesPerFacet=30&page=0&attributesToRetrieve=%5B%5D&attributesToHighlight=%5B%5D&attributesToSnippet=%5B%5D&tagFilters=&facets=platform&facetFilters=%5B%5B%22availability%3ANew%20releases%22%5D%5D', + }, + ], + }, + }); + const data = response.data.results[0].hits.slice(0, 9); + + ctx.state.data = { + title: `Nintendo eShop (美服) 新游戏`, + link: `https://www.nintendo.com/games/`, + description: `Nintendo eShop (美服) 新上架的游戏`, + item: data.map((item) => ({ + title: item.title, + description: `
发售日期:${new Date(item.releaseDateMask).toLocaleString()}
价格:$${ + item.msrp + }

${item.description}`, + link: `https://www.nintendo.com${item.url}`, + })), + }; +}; diff --git a/lib/routes/nintendo/utils.js b/lib/routes/nintendo/utils.js new file mode 100644 index 0000000000..c9f85fd30e --- /dev/null +++ b/lib/routes/nintendo/utils.js @@ -0,0 +1,28 @@ +const axios = require('../../utils/axios'); +const cheerio = require('cheerio'); + +async function load(link) { + const response = await axios({ + method: 'get', + url: link, + }); + + const data = response.data; + + const $ = cheerio.load(data); // 使用 cheerio 加载返回的 HTML + const description = $('.description').html(); + + return { content: description }; +} + +const ProcessItem = async (list, caches) => + await Promise.all( + list.map(async (item) => { + const other = await caches.tryGet(item.link, async () => await load(item.link)); + return Promise.resolve(Object.assign({}, item, other)); + }) + ); + +module.exports = { + ProcessItem, +};