fix(route): hoyolab (#14242)
This commit is contained in:
parent
4ee41944b8
commit
6780b96b23
|
|
@ -7,7 +7,6 @@ const POST_FULL = '/community/post/wapi/getPostFull';
|
|||
// 公告和资讯接口
|
||||
const NEW_LIST = '/community/post/wapi/getNewsList';
|
||||
|
||||
const ICON = 'https://img-os-static.hoyolab.com/favicon.ico';
|
||||
// 源网站链接
|
||||
const LINK = 'https://www.hoyolab.com';
|
||||
|
||||
|
|
@ -16,32 +15,23 @@ const PRIVATE_IMG = '<img src="https://hoyolab-upload-private.hoyolab.com/upload
|
|||
// 使用以下域名可以替换
|
||||
const PUBLIC_IMG = '<img src="https://upload-os-bbs.hoyolab.com/upload';
|
||||
|
||||
// 游戏id
|
||||
const GIDS_MAP = {
|
||||
1: 'Honkai Impact 3rd',
|
||||
2: '原神',
|
||||
4: '未定事件簿',
|
||||
5: 'HoYoLAB',
|
||||
6: '崩坏:星穹铁道',
|
||||
8: '绝区零',
|
||||
};
|
||||
|
||||
// 公告类型
|
||||
const TYPE_MAP = {
|
||||
1: '公告',
|
||||
2: '活动',
|
||||
3: '资讯',
|
||||
const OFFICIAL_PAGE_TYPE = {
|
||||
2: 27,
|
||||
6: 39,
|
||||
8: 47,
|
||||
1: 31,
|
||||
4: 35,
|
||||
5: 43,
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
PRIVATE_IMG,
|
||||
PUBLIC_IMG,
|
||||
LINK,
|
||||
ICON,
|
||||
POST_FULL,
|
||||
HOST,
|
||||
EVENT_LIST,
|
||||
NEW_LIST,
|
||||
GIDS_MAP,
|
||||
TYPE_MAP,
|
||||
OFFICIAL_PAGE_TYPE,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,7 +1,10 @@
|
|||
const got = require('@/utils/got');
|
||||
const logger = require('@/utils/logger');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
const { HOST, NEW_LIST, TYPE_MAP, POST_FULL, GIDS_MAP, LINK, ICON, PUBLIC_IMG, PRIVATE_IMG } = require('./constant');
|
||||
const { art } = require('@/utils/render');
|
||||
const { join } = require('path');
|
||||
const { HOST, NEW_LIST, OFFICIAL_PAGE_TYPE, POST_FULL, LINK, PUBLIC_IMG, PRIVATE_IMG } = require('./constant');
|
||||
const { getI18nGameInfo, getI18nType } = require('./utils');
|
||||
|
||||
const getEventList = async ({ type, gids, size, language }) => {
|
||||
const query = new URLSearchParams({
|
||||
|
|
@ -23,7 +26,7 @@ const getEventList = async ({ type, gids, size, language }) => {
|
|||
|
||||
const replaceImgDomain = (content) => content.replaceAll(PRIVATE_IMG, PUBLIC_IMG);
|
||||
|
||||
const getPostContent = (ctx, list, { type, language }) =>
|
||||
const getPostContent = (ctx, list, { language }) =>
|
||||
Promise.all(
|
||||
list.map(async (row) => {
|
||||
const post = row.post;
|
||||
|
|
@ -46,7 +49,11 @@ const getPostContent = (ctx, list, { type, language }) =>
|
|||
if (content === language || !content) {
|
||||
content = post.content;
|
||||
}
|
||||
const description = replaceImgDomain(content);
|
||||
const description = art(join(__dirname, 'templates/post.art'), {
|
||||
hasCover: post.has_cover,
|
||||
coverList: row.cover_list,
|
||||
content: replaceImgDomain(content),
|
||||
});
|
||||
return {
|
||||
// 文章标题
|
||||
title: post.subject,
|
||||
|
|
@ -56,8 +63,6 @@ const getPostContent = (ctx, list, { type, language }) =>
|
|||
description,
|
||||
// 文章发布日期
|
||||
pubDate: parseDate(post.created_at * 1000),
|
||||
// 如果有的话,文章分类
|
||||
category: `${GIDS_MAP[post.game_id]}-${TYPE_MAP[type]}`,
|
||||
author,
|
||||
};
|
||||
});
|
||||
|
|
@ -73,15 +78,17 @@ module.exports = async (ctx) => {
|
|||
language,
|
||||
size: parseInt(ctx.query?.limit) || 15,
|
||||
};
|
||||
const gameInfo = await getI18nGameInfo(gids, language, ctx.cache.tryGet);
|
||||
const typeInfo = await getI18nType(language, ctx.cache.tryGet);
|
||||
const list = await getEventList(params);
|
||||
const items = await getPostContent(ctx, list, params);
|
||||
ctx.state.data = {
|
||||
title: `HoYoLAB-${GIDS_MAP[gids]}-${TYPE_MAP[type]}`,
|
||||
link: LINK,
|
||||
title: `HoYoLAB-${gameInfo.name}-${typeInfo[type].title}`,
|
||||
link: `${LINK}/circles/${gids}/${OFFICIAL_PAGE_TYPE[gids]}/official?page_type=${OFFICIAL_PAGE_TYPE[gids]}&page_sort=${typeInfo[type].sort}`,
|
||||
item: items,
|
||||
image: ICON,
|
||||
icon: ICON,
|
||||
logo: ICON,
|
||||
image: gameInfo.icon,
|
||||
icon: gameInfo.icon,
|
||||
logo: gameInfo.icon,
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error(error);
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ module.exports = {
|
|||
'.': [
|
||||
{
|
||||
title: '活动公告资讯',
|
||||
docs: 'https://docs.rsshub.app/routes/game#hoyolab-news',
|
||||
docs: 'https://docs.rsshub.app/routes/game#hoyolab',
|
||||
source: ['/', '/circles/:gid/:unknow/official'],
|
||||
target: (params, url) => {
|
||||
const typeMap = {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
{{ if hasCover }}
|
||||
{{ each coverList c }}
|
||||
<img src="{{ c.url }}"><br>
|
||||
{{ /each }}
|
||||
{{ /if }}
|
||||
|
||||
{{@ content }}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
const got = require('@/utils/got');
|
||||
|
||||
const getGameInfoList = (tryGet) =>
|
||||
tryGet('hoyolab:gameNameList', async () => {
|
||||
const { data } = await got('https://bbs-api-os-static.hoyolab.com/community/apihub/static/api/getAppConfig');
|
||||
return JSON.parse(data.data.config.hoyolab_game_info_list);
|
||||
});
|
||||
|
||||
const getI18nGameInfo = async (gid, language, tryGet) => {
|
||||
const gameNameList = await getGameInfoList(tryGet);
|
||||
const game = gameNameList.find((item) => item.game_id === parseInt(gid, 10));
|
||||
return {
|
||||
name: game?.game_name_list.find((item) => item.locale === language)?.raw_name ?? game?.game_name_list.find((item) => item.locale === 'en-us')?.raw_name,
|
||||
icon: game?.game_icon,
|
||||
};
|
||||
};
|
||||
|
||||
const getI18nType = (language, tryGet) =>
|
||||
tryGet(`hoyolab:type:${language}`, async () => {
|
||||
const { data } = await got(`https://webstatic.hoyoverse.com/admin/mi18n/bbs_oversea/m07281525151831/m07281525151831-${language}.json`);
|
||||
|
||||
return {
|
||||
1: { title: data.official_notify, sort: 'notices' },
|
||||
2: { title: data.official_activity, sort: 'events' },
|
||||
3: { title: data.official_info, sort: 'news' },
|
||||
};
|
||||
});
|
||||
|
||||
module.exports = {
|
||||
getI18nGameInfo,
|
||||
getI18nType,
|
||||
};
|
||||
|
|
@ -236,11 +236,9 @@
|
|||
|
||||
## HoYoLAB {#hoyolab}
|
||||
|
||||
### 公告 {#hoyolab-gong-gao}
|
||||
|
||||
<Route author="ZenoTian" example="/hoyolab/news/zh-cn/2/2" path="/hoyolab/news/:language/:gids/:type" paramsDesc={['语言', '游戏', '公告类型']} radar="1">
|
||||
语言 language
|
||||
### Official Announcement {#hoyolab-official-announcement}
|
||||
|
||||
<Route author="ZenoTian" example="/hoyolab/news/zh-cn/2/2" path="/hoyolab/news/:language/:gids/:type" paramsDesc={['Language', 'Game ID', 'Announcement type']} radar="1">
|
||||
| Language | Code |
|
||||
| ---------------- | ----- |
|
||||
| 简体中文 | zh-cn |
|
||||
|
|
@ -258,17 +256,13 @@
|
|||
| Tiếng Việt | vi-vn |
|
||||
| ภาษาไทย | th-th |
|
||||
|
||||
游戏 gids
|
||||
| Honkai Impact 3rd | Genshin Impact | Tears of Themis | HoYoLAB | Honkai: Star Rail | Zenless Zone Zero |
|
||||
| ----------------- | -------------- | --------------- | ------- | ----------------- | ----------------- |
|
||||
| 1 | 2 | 4 | 5 | 6 | 8 |
|
||||
|
||||
| 崩坏三 | 原神 | 未定事件簿 | HoYoLAB | 崩坏:星穹铁道 | 绝区零 |
|
||||
| ------ | ---- | ---------- | ------- | -------------- | ------ |
|
||||
| 1 | 2 | 4 | 5 | 6 | 8 |
|
||||
|
||||
公告类型 type
|
||||
|
||||
| 公告 | 活动 | 资讯 |
|
||||
| ---- | ---- | ---- |
|
||||
| 1 | 2 | 3 |
|
||||
| Notices | Events | Info |
|
||||
| ------- | ------ | ---- |
|
||||
| 1 | 2 | 3 |
|
||||
</Route>
|
||||
|
||||
## Indienova {#indienova}
|
||||
|
|
|
|||
Loading…
Reference in New Issue