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,
+};