diff --git a/configs/example.json b/configs/example.json
index 5e03d07..95a6d41 100644
--- a/configs/example.json
+++ b/configs/example.json
@@ -1,9 +1,9 @@
{
- "token":"",
- "client_type":"",
- "device_name":"",
- "device_model":"",
- "device_id":"",
- "sys_version":"",
- "channel":""
-}
\ No newline at end of file
+ "token": "",
+ "client_type": "",
+ "device_name": "",
+ "device_model": "",
+ "device_id": "",
+ "sys_version": "",
+ "channel": ""
+}
diff --git a/global.json b/global.json
index 8716f28..7841334 100644
--- a/global.json
+++ b/global.json
@@ -3,11 +3,11 @@
"maxDelay": 5000,
"sendMail": false,
"mailConfig": {
- "user":"",
- "pass":"",
- "mailto":"",
- "smtpServer":"",
- "smtpPort":"",
- "smtpSecure":true
+ "user": "",
+ "pass": "",
+ "mailto": "",
+ "smtpServer": "",
+ "smtpPort": "",
+ "smtpSecure": true
}
-}
\ No newline at end of file
+}
diff --git a/src/config.js b/src/config.js
index 68a602d..46f702c 100644
--- a/src/config.js
+++ b/src/config.js
@@ -1,140 +1,166 @@
-const { exit } = require("process")
-const fs = require("fs")
-const { default: axios } = require("axios")
-const { log } = require("./util")
+const { exit } = require("process");
+const fs = require("fs");
+const { default: axios } = require("axios");
+const { log } = require("./util");
-exports.ListNotificationURL = 'https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/listNotifications?is_sort=true&source=NotificationSourceUnknown&status=NotificationStatusUnread&type=NotificationTypePopup'
-exports.AckNotificationURL = 'https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/ackNotification'
-exports.WalletURL = 'https://api-cloudgame.mihoyo.com/hk4e_cg_cn/wallet/wallet/get?cost_method=COST_METHOD_UNSPECIFIED'
-exports.AnnouncementURL = 'https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/getAnnouncementInfo'
+exports.ListNotificationURL =
+ "https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/listNotifications?is_sort=true&source=NotificationSourceUnknown&status=NotificationStatusUnread&type=NotificationTypePopup";
+exports.AckNotificationURL =
+ "https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/ackNotification";
+exports.WalletURL =
+ "https://api-cloudgame.mihoyo.com/hk4e_cg_cn/wallet/wallet/get?cost_method=COST_METHOD_UNSPECIFIED";
+exports.AnnouncementURL =
+ "https://api-cloudgame.mihoyo.com/hk4e_cg_cn/gamer/api/getAnnouncementInfo";
// Here must be an earlier version so that the response won't be null
-exports.AppVersionURL = 'https://api-takumi.mihoyo.com/ptolemaios/api/getLatestRelease?app_id=1953443910&app_version=3.8.0&channel=mihoyo'
+exports.AppVersionURL =
+ "https://api-takumi.mihoyo.com/ptolemaios/api/getLatestRelease?app_id=1953443910&app_version=3.8.0&channel=mihoyo";
-exports.ListNotification = async function(header) {
- let tmp = (await axios(exports.ListNotificationURL,{
- headers:header
- })).data;
+exports.ListNotification = async function (header) {
+ let tmp = (
+ await axios(exports.ListNotificationURL, {
+ headers: header,
+ })
+ ).data;
tmp.StringVersion = JSON.stringify(tmp);
return tmp;
-}
-exports.AckNotification = async function(header, id) {
+};
+exports.AckNotification = async function (header, id) {
let data = `{"id":"${id}"}`;
- await axios.post(exports.AckNotificationURL, data,{
- headers:header
+ await axios.post(exports.AckNotificationURL, data, {
+ headers: header,
});
-}
-exports.Wallet = async function(header) {
- let tmp = (await axios(exports.WalletURL,{
- headers:header
- })).data;
+};
+exports.Wallet = async function (header) {
+ let tmp = (
+ await axios(exports.WalletURL, {
+ headers: header,
+ })
+ ).data;
tmp.StringVersion = JSON.stringify(tmp);
return tmp;
-}
-exports.Announcement = async function(header) {
- let tmp = (await axios(exports.AnnouncementURL,{
- headers:header
- })).data;
+};
+exports.Announcement = async function (header) {
+ let tmp = (
+ await axios(exports.AnnouncementURL, {
+ headers: header,
+ })
+ ).data;
tmp.StringVersion = JSON.stringify(tmp);
return tmp;
-}
-exports.AppVersion = async function() {
+};
+exports.AppVersion = async function () {
let tmp = (await axios(exports.AppVersionURL)).data;
tmp.StringVersion = JSON.stringify(tmp);
return tmp;
-}
+};
var configKeys = [
"token",
"client_type",
"device_name",
"device_model",
"sys_version",
- "channel"
-]
+ "channel",
+];
-exports.getGlobalConfig = function() {
+exports.getGlobalConfig = function () {
try {
- var globalConfig = fs.readFileSync("global.json")
- } catch(e) {
- if(e.toString().includes("Error: ENOENT: no such file or directory")) {
- log.error(`读取配置失败!找不到全局配置文件`)
+ var globalConfig = fs.readFileSync("global.json");
+ } catch (e) {
+ if (e.toString().includes("Error: ENOENT: no such file or directory")) {
+ log.error(`读取配置失败!找不到全局配置文件`);
} else {
log.error(`读取配置失败!错误信息:${e}`);
}
- exit()
+ exit();
}
return JSON.parse(globalConfig);
-}
+};
-exports.getConfigs = function(){
+exports.getConfigs = function () {
try {
- var configsList = fs.readdirSync("configs")
- } catch(e) {
- if(e == "Error: ENOENT: no such file or directory, scandir 'configs'") {
- log.error(`读取配置失败!找不到configs文件夹`)
+ var configsList = fs.readdirSync("configs");
+ } catch (e) {
+ if (
+ e == "Error: ENOENT: no such file or directory, scandir 'configs'"
+ ) {
+ log.error(`读取配置失败!找不到configs文件夹`);
} else {
log.error(`读取配置失败!错误信息:${e}`);
}
- exit()
+ exit();
}
- log.info(`检测到${configsList.length}个配置文件:`)
- configsList.forEach(file => {
- log.info(`${file}`)
- })
- var configs = {}
- configsList.forEach(file => {
- configs[file] = JSON.parse(fs.readFileSync(`configs/${file}`))
- })
- return configs
-}
-exports.checkConfigs = function(configs){
- for(file in configs) {
+ log.info(`检测到${configsList.length}个配置文件:`);
+ configsList.forEach((file) => {
+ log.info(`${file}`);
+ });
+ var configs = {};
+ configsList.forEach((file) => {
+ configs[file] = JSON.parse(fs.readFileSync(`configs/${file}`));
+ });
+ return configs;
+};
+exports.checkConfigs = function (configs) {
+ for (file in configs) {
var configThis = configs[file];
- for(key in configKeys) {
- if(configThis[configKeys[key]] == "" || configThis[configKeys[key]] == undefined || configThis[configKeys[key]] == null || configThis[configKeys[key]] == NaN) {
+ for (key in configKeys) {
+ if (
+ configThis[configKeys[key]] == "" ||
+ configThis[configKeys[key]] == undefined ||
+ configThis[configKeys[key]] == null ||
+ configThis[configKeys[key]] == NaN
+ ) {
log.error(`配置文件 ${file} 异常:`);
log.error(` —— ${configKeys[key]}字段缺失`);
-
}
}
-
}
-}
+};
-exports.makeHeader = function(data,appversion){
+exports.makeHeader = function (data, appversion) {
return {
"x-rpc-combo_token": data.token,
- "x-rpc-client_type": data.client_type,
- "x-rpc-app_version": appversion,
- "x-rpc-sys_version": data.sys_version,
- "x-rpc-channel": data.channel,
- "x-rpc-device_id": data.device_id,
- "x-rpc-device_name": data.device_name,
- "x-rpc-device_model": data.device_model,
- "x-rpc-app_id": 1953439974,
- "x-rpc-cg_game_biz": "hk4e_cn",
- "x-rpc-preview": 0,
- "x-rpc-op_biz": "clgm_cn",
- "x-rpc-language": "zh-cn",
- "x-rpc-vendor_id": 2,
- Referer: "https://app.mihoyo.com",
- Host: "api-cloudgame.mihoyo.com",
- Connection: "Keep-Alive",
- "Accept-Encoding": "gzip, deflate",
- Accept: "*/*",
- }
-}
+ "x-rpc-client_type": data.client_type,
+ "x-rpc-app_version": appversion,
+ "x-rpc-sys_version": data.sys_version,
+ "x-rpc-channel": data.channel,
+ "x-rpc-device_id": data.device_id,
+ "x-rpc-device_name": data.device_name,
+ "x-rpc-device_model": data.device_model,
+ "x-rpc-app_id": 1953439974,
+ "x-rpc-cg_game_biz": "hk4e_cn",
+ "x-rpc-preview": 0,
+ "x-rpc-op_biz": "clgm_cn",
+ "x-rpc-language": "zh-cn",
+ "x-rpc-vendor_id": 2,
+ Referer: "https://app.mihoyo.com",
+ Host: "api-cloudgame.mihoyo.com",
+ Connection: "Keep-Alive",
+ "Accept-Encoding": "gzip, deflate",
+ Accept: "*/*",
+ };
+};
-exports.SendLog = function(transporter,mailfrom,mailto,successNum,totalNum,content) {
- transporter.sendMail({
- from: `"Genshin Cloud Game Helper" <${mailfrom}>`, //邮件来源
- to: mailto, //邮件发送到哪里,多个邮箱使用逗号隔开
- subject: `今日已签到${successNum}/${totalNum}名用户`, // 邮件主题
- text: '', // 存文本类型的邮件正文
- html: `${content}` // html类型的邮件正文
- }, (error) => {
- if (error) {
- return console.log(error);
+exports.SendLog = function (
+ transporter,
+ mailfrom,
+ mailto,
+ successNum,
+ totalNum,
+ content
+) {
+ transporter.sendMail(
+ {
+ from: `"Genshin Cloud Game Helper" <${mailfrom}>`, //邮件来源
+ to: mailto, //邮件发送到哪里,多个邮箱使用逗号隔开
+ subject: `今日已签到${successNum}/${totalNum}名用户`, // 邮件主题
+ text: "", // 存文本类型的邮件正文
+ html: `${content}`, // html类型的邮件正文
+ },
+ (error) => {
+ if (error) {
+ return console.log(error);
+ }
+ log.info("日志已丢出!");
}
- log.info("日志已丢出!")
- });
-}
+ );
+};
diff --git a/src/index.js b/src/index.js
index 7d98f5f..9c14434 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,67 +1,93 @@
-const { getConfigs, checkConfigs, makeHeader, ListNotification, AckNotification, Wallet, SendLog, AppVersion, getGlobalConfig } = require("./config")
+const {
+ getConfigs,
+ checkConfigs,
+ makeHeader,
+ ListNotification,
+ AckNotification,
+ Wallet,
+ SendLog,
+ AppVersion,
+ getGlobalConfig,
+} = require("./config");
const { log, addLogContent, getLogs, sleep } = require("./util");
const nodemailer = require("nodemailer");
(async () => {
- log.info("开始获取全局配置")
+ log.info("开始获取全局配置");
var globalConfig = getGlobalConfig();
- log.info("获取成功")
+ log.info("获取成功");
if (globalConfig.sendMail == true) {
- log.info("组装邮件发射器")
+ log.info("组装邮件发射器");
var transporter = nodemailer.createTransport({
host: globalConfig.mailConfig.smtpServer,
port: globalConfig.mailConfig.smtpPort,
secure: globalConfig.mailConfig.smtpSecure,
auth: {
- user: globalConfig.mailConfig.user,
- pass: globalConfig.mailConfig.pass
- }
+ user: globalConfig.mailConfig.user,
+ pass: globalConfig.mailConfig.pass,
+ },
});
}
- var minDelay = globalConfig.minDelay
- var maxDelay = globalConfig.maxDelay
+ var minDelay = globalConfig.minDelay;
+ var maxDelay = globalConfig.maxDelay;
var configs = getConfigs();
- log.info(`正在检测配置有效性`)
- checkConfigs(configs)
- log.info("检测完毕!")
- log.info("正在获取版本号")
+ log.info(`正在检测配置有效性`);
+ checkConfigs(configs);
+ log.info("检测完毕!");
+ log.info("正在获取版本号");
var appversion = await AppVersion();
- appversion = appversion.data.package_version
- log.info(`获取成功!当前版本号:${appversion}`)
- var successNum = 0,totalNum = 0;
+ appversion = appversion.data.package_version;
+ log.info(`获取成功!当前版本号:${appversion}`);
+ var successNum = 0,
+ totalNum = 0;
for (key in configs) {
- totalNum ++;
- log.info(`正在执行配置 ${key}`)
- log.info("尝试签到……")
+ totalNum++;
+ log.info(`正在执行配置 ${key}`);
+ log.info("尝试签到……");
var header = makeHeader(configs[key], appversion);
var WalletRespond = await Wallet(header);
- addLogContent(`${key} Wallet返回体
${JSON.stringify(WalletRespond)}
`);
- if(WalletRespond.data != null) {
+ addLogContent(
+ `${key} Wallet返回体
${JSON.stringify(
+ WalletRespond
+ )}
`
+ );
+ if (WalletRespond.data != null) {
var NotificationRespond = await ListNotification(header);
- addLogContent(`${key} Notification返回体
${JSON.stringify(NotificationRespond)}
`);
- successNum ++;
- log.info(`签到完毕! 获得时长:${WalletRespond.data.free_time.send_freetime}分钟,总时长:${WalletRespond.data.free_time.free_time}分钟`);
- let NotificationLength = NotificationRespond.data.list.length
+ addLogContent(
+ `${key} Notification返回体
${JSON.stringify(
+ NotificationRespond
+ )}
`
+ );
+ successNum++;
+ log.info(
+ `签到完毕! 获得时长:${WalletRespond.data.free_time.send_freetime}分钟,总时长:${WalletRespond.data.free_time.free_time}分钟`
+ );
+ let NotificationLength = NotificationRespond.data.list.length;
let postHeader = header;
- Object.assign(postHeader, {
- "Content-Length": 28,
- "Content-Type": "application/json",
- });
- for (var i = 0; i < NotificationLength; i++) {
- AckNotification(postHeader, NotificationRespond.data.list[i].id);
- }
+ Object.assign(postHeader, {
+ "Content-Length": 28,
+ "Content-Type": "application/json",
+ });
+ for (var i = 0; i < NotificationLength; i++) {
+ AckNotification(
+ postHeader,
+ NotificationRespond.data.list[i].id
+ );
+ }
} else {
- log.error("签到失败")
+ log.error("签到失败");
}
- var delay = Math.round(Math.random() * (maxDelay - minDelay) + minDelay)
- log.info(`暂停:${delay}毫秒`)
+ var delay = Math.round(
+ Math.random() * (maxDelay - minDelay) + minDelay
+ );
+ log.info(`暂停:${delay}毫秒`);
await sleep(delay);
}
-
+
if (globalConfig.sendMail == true) {
- log.info(`运行完毕!丢出日志`)
+ log.info(`运行完毕!丢出日志`);
SendLog(
transporter,
globalConfig.mailConfig.user,
@@ -69,6 +95,6 @@ const nodemailer = require("nodemailer");
successNum,
totalNum,
getLogs()
- )
+ );
}
-})()
\ No newline at end of file
+})();
diff --git a/src/util.js b/src/util.js
index 044bb2b..87c721f 100644
--- a/src/util.js
+++ b/src/util.js
@@ -1,26 +1,26 @@
-const reggol = require("reggol")
-const baseLogger = new reggol("GenshinCloudGameHelper")
-let logContent = ``
-exports.addLogContent = function(content) {
- logContent += content
-}
-exports.getLogs = function() {
- return logContent
-}
+const reggol = require("reggol");
+const baseLogger = new reggol("GenshinCloudGameHelper");
+let logContent = ``;
+exports.addLogContent = function (content) {
+ logContent += content;
+};
+exports.getLogs = function () {
+ return logContent;
+};
exports.log = {
info(content) {
- logContent += `[info] ${content}
`
- baseLogger.info(content)
+ logContent += `[info] ${content}
`;
+ baseLogger.info(content);
},
error(content) {
- logContent += `[error] ${content}
`
- baseLogger.error(content)
- }
-}
+ logContent += `[error] ${content}
`;
+ baseLogger.error(content);
+ },
+};
exports.sleep = function (delay) {
return new Promise((resolve) => {
- setTimeout(resolve, delay)
- })
- }
\ No newline at end of file
+ setTimeout(resolve, delay);
+ });
+};