mirror of
https://github.com/daydreamer-json/ak-endfield-api-archive.git
synced 2026-03-22 15:22:28 +01:00
Add auth test
This commit is contained in:
163
src/cmds/authTest.ts
Normal file
163
src/cmds/authTest.ts
Normal file
@@ -0,0 +1,163 @@
|
||||
import chalk from 'chalk';
|
||||
import CliTable3 from 'cli-table3';
|
||||
import { HTTPError } from 'ky';
|
||||
import prompts from 'prompts';
|
||||
import apiUtils from '../utils/api.js';
|
||||
import argvUtils from '../utils/argv.js';
|
||||
import appConfig from '../utils/config.js';
|
||||
import exitUtils from '../utils/exit.js';
|
||||
import logger from '../utils/logger.js';
|
||||
import termPrettyUtils from '../utils/termPretty.js';
|
||||
|
||||
async function mainCmdHandler() {
|
||||
const cfg = appConfig.network.api.akEndfield;
|
||||
// const channelStr = String(cfg.channel.osWinRel);
|
||||
|
||||
let needRetrieveToken = false;
|
||||
let oauth2TokenPreRsp = null;
|
||||
if (!('token' in argvUtils.getArgv()) || !argvUtils.getArgv()['token']) {
|
||||
const tokenUserRsp: string = await (async () => {
|
||||
logger.warn('Gryphline account service token has not been specified. Requesting ...');
|
||||
const onCancelFn = () => {
|
||||
logger.error('Aborted');
|
||||
exitUtils.exit(1, null, false);
|
||||
};
|
||||
return (
|
||||
await prompts(
|
||||
{ name: 'value', type: 'password', message: 'Enter Gryphline account service token' },
|
||||
{ onCancel: onCancelFn },
|
||||
)
|
||||
).value;
|
||||
})();
|
||||
if (tokenUserRsp === '') {
|
||||
needRetrieveToken = true;
|
||||
} else {
|
||||
argvUtils.setArgv({ ...argvUtils.getArgv(), token: tokenUserRsp });
|
||||
}
|
||||
}
|
||||
if (needRetrieveToken === false) {
|
||||
try {
|
||||
oauth2TokenPreRsp = await apiUtils.apiAkEndfield.accountService.user.oauth2.v2.grant(
|
||||
cfg.appCode.accountService.osWinRel,
|
||||
argvUtils.getArgv()['token'],
|
||||
);
|
||||
} catch (err) {
|
||||
if (err instanceof HTTPError) {
|
||||
if ((await err.response.json()).status === 3) needRetrieveToken = true;
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (needRetrieveToken) {
|
||||
await (async () => {
|
||||
const onCancelFn = () => {
|
||||
logger.error('Aborted');
|
||||
exitUtils.exit(1, null, false);
|
||||
};
|
||||
if (!('email' in argvUtils.getArgv())) {
|
||||
logger.warn('Gryphline account email has not been specified. Requesting ...');
|
||||
const emailRsp: number = (
|
||||
await prompts(
|
||||
{
|
||||
...{ name: 'value', type: 'text', message: 'Enter Gryphline account email' },
|
||||
validate: (value) => (Boolean(value) ? true : 'Invalid value'),
|
||||
},
|
||||
{ onCancel: onCancelFn },
|
||||
)
|
||||
).value;
|
||||
argvUtils.setArgv({ ...argvUtils.getArgv(), email: emailRsp });
|
||||
}
|
||||
if (!('password' in argvUtils.getArgv())) {
|
||||
// logger.warn('Gryphline account password has not been specified. Requesting ...');
|
||||
const pwdRsp: number = (
|
||||
await prompts(
|
||||
{
|
||||
...{ name: 'value', type: 'password', message: 'Enter Gryphline account password' },
|
||||
validate: (value) => (Boolean(value) ? true : 'Invalid value'),
|
||||
},
|
||||
{ onCancel: onCancelFn },
|
||||
)
|
||||
).value;
|
||||
argvUtils.setArgv({ ...argvUtils.getArgv(), password: pwdRsp });
|
||||
}
|
||||
})();
|
||||
logger.info('Retrieving account service token ...');
|
||||
const accSrvTokenRsp = await apiUtils.apiAkEndfield.accountService.user.auth.v1.tokenByEmailPassword(
|
||||
argvUtils.getArgv()['email'],
|
||||
argvUtils.getArgv()['password'],
|
||||
);
|
||||
argvUtils.setArgv({ ...argvUtils.getArgv(), token: accSrvTokenRsp.data.token });
|
||||
}
|
||||
|
||||
logger.info('Retrieving account service OAuth 2.0 token ...');
|
||||
const oauth2TokenRsp = await apiUtils.apiAkEndfield.accountService.user.oauth2.v2.grant(
|
||||
cfg.appCode.accountService.osWinRel,
|
||||
argvUtils.getArgv()['token'],
|
||||
);
|
||||
logger.info('Retrieving u8 access token ...');
|
||||
const u8TokenRsp = await apiUtils.apiAkEndfield.u8.user.auth.v2.tokenByChToken(
|
||||
cfg.appCode.u8.osWinRel,
|
||||
cfg.channel.osWinRel,
|
||||
oauth2TokenRsp.data.code,
|
||||
);
|
||||
logger.info('Authentication successful!');
|
||||
|
||||
logger.info('Retrieving user account data ...');
|
||||
const userAccData = await apiUtils.apiAkEndfield.accountService.user.info.v1.basic(
|
||||
cfg.appCode.accountService.osWinRel,
|
||||
argvUtils.getArgv()['token'],
|
||||
);
|
||||
logger.info('Retrieving user game server data ...');
|
||||
const userGameData = await apiUtils.apiAkEndfield.u8.game.server.v1.serverList(u8TokenRsp.data.token);
|
||||
|
||||
logger.info('Data retrieval completed!');
|
||||
|
||||
(() => {
|
||||
const table = new CliTable3(termPrettyUtils.cliTableConfig.rounded);
|
||||
table.push(
|
||||
...[
|
||||
['Account ID', userAccData.data.hgId],
|
||||
['Email', userAccData.data.realEmail],
|
||||
['Nickname', userAccData.data.nickName === '' ? chalk.dim('(none)') : userAccData.data.nickName],
|
||||
['Age Region', userAccData.data.ageGate.regionInfo['en-us']],
|
||||
].map((e) => [chalk.dim(e[0]), e[1]]),
|
||||
);
|
||||
console.log(table.toString());
|
||||
})();
|
||||
|
||||
(() => {
|
||||
const table = new CliTable3(termPrettyUtils.cliTableConfig.rounded);
|
||||
table.push(
|
||||
...[
|
||||
['ID', 'Time', 'Name', 'Domain', 'Port'].map((e) => chalk.dim(e)),
|
||||
...userGameData.data.serverList.map((e) => [
|
||||
e.serverId,
|
||||
'UTC' + (JSON.parse(e.extension).offsetSeconds < 0 ? '' : '+') + JSON.parse(e.extension).offsetSeconds / 3600,
|
||||
e.serverName,
|
||||
JSON.parse(e.serverDomain)[0].host,
|
||||
JSON.parse(e.serverDomain)[0].port,
|
||||
]),
|
||||
],
|
||||
);
|
||||
console.log(table.toString());
|
||||
})();
|
||||
|
||||
(() => {
|
||||
const table = new CliTable3(termPrettyUtils.cliTableConfig.rounded);
|
||||
table.push(
|
||||
...[
|
||||
['ID', 'UID', 'Level', 'Default'].map((e) => chalk.dim(e)),
|
||||
...userGameData.data.serverList.map((e) => [
|
||||
e.serverId,
|
||||
e.roleId,
|
||||
{ hAlign: 'right' as const, content: e.level },
|
||||
e.defaultChoose,
|
||||
]),
|
||||
],
|
||||
);
|
||||
console.log(table.toString());
|
||||
})();
|
||||
}
|
||||
|
||||
export default mainCmdHandler;
|
||||
@@ -81,8 +81,8 @@ async function mainCmdHandler() {
|
||||
await (async () => {
|
||||
logger.debug('Fetching latestGame ...');
|
||||
const rsp = await apiUtils.apiAkEndfield.launcher.latestGame(
|
||||
cfg.appCode.osWinRel,
|
||||
cfg.launcherAppCode.osWinRel,
|
||||
cfg.appCode.game.osWinRel,
|
||||
cfg.appCode.launcher.osWinRel,
|
||||
cfg.channel.osWinRel,
|
||||
cfg.channel.osWinRel,
|
||||
cfg.channel.osWinRel,
|
||||
@@ -103,8 +103,8 @@ async function mainCmdHandler() {
|
||||
);
|
||||
const prettyRsp = {
|
||||
req: {
|
||||
appCode: cfg.appCode.osWinRel,
|
||||
launcherAppCode: cfg.launcherAppCode.osWinRel,
|
||||
appCode: cfg.appCode.game.osWinRel,
|
||||
launcherAppCode: cfg.appCode.launcher.osWinRel,
|
||||
channel: cfg.channel.osWinRel,
|
||||
subChannel: cfg.channel.osWinRel,
|
||||
launcherSubChannel: cfg.channel.osWinRel,
|
||||
@@ -147,7 +147,7 @@ async function mainCmdHandler() {
|
||||
for (const versionInfoEntry of versionInfoList) {
|
||||
if (!versionInfoEntry.randStr) throw new Error('version rand_str not found');
|
||||
const rsp = await apiUtils.apiAkEndfield.launcher.latestGameResources(
|
||||
cfg.appCode.osWinRel,
|
||||
cfg.appCode.game.osWinRel,
|
||||
versionInfoEntry.versionMinor,
|
||||
versionInfoEntry.version,
|
||||
versionInfoEntry.randStr,
|
||||
@@ -155,7 +155,7 @@ async function mainCmdHandler() {
|
||||
logger.info(`Fetched latestGameRes: v${versionInfoEntry.version}, ${rsp.res_version}`);
|
||||
const prettyRsp = {
|
||||
req: {
|
||||
appCode: cfg.appCode.osWinRel,
|
||||
appCode: cfg.appCode.game.osWinRel,
|
||||
gameVersion: versionInfoEntry.versionMinor,
|
||||
version: versionInfoEntry.version,
|
||||
randStr: versionInfoEntry.randStr,
|
||||
@@ -178,7 +178,7 @@ async function mainCmdHandler() {
|
||||
const launcherTargetAppList = ['EndField', 'official'] as const;
|
||||
for (const launcherTargetAppEntry of launcherTargetAppList) {
|
||||
const rsp = await apiUtils.apiAkEndfield.launcher.latestLauncher(
|
||||
cfg.launcherAppCode.osWinRel,
|
||||
cfg.appCode.launcher.osWinRel,
|
||||
cfg.channel.osWinRel,
|
||||
cfg.channel.osWinRel,
|
||||
null,
|
||||
@@ -187,7 +187,7 @@ async function mainCmdHandler() {
|
||||
logger.info(`Fetched latestLauncher: v${rsp.version}, ${launcherTargetAppEntry}`);
|
||||
const prettyRsp = {
|
||||
req: {
|
||||
appCode: cfg.launcherAppCode.osWinRel,
|
||||
appCode: cfg.appCode.launcher.osWinRel,
|
||||
channel: cfg.channel.osWinRel,
|
||||
subChannel: cfg.channel.osWinRel,
|
||||
targetApp: launcherTargetAppEntry === 'official' ? null : launcherTargetAppEntry,
|
||||
|
||||
Reference in New Issue
Block a user