浏览代码

update: indexAction 调用 index.js 中的init()

ggball 2 年之前
父节点
当前提交
1ea1dc56b4
共有 4 个文件被更改,包括 536 次插入304 次删除
  1. 299 0
      api.js
  2. 3 301
      index.js
  3. 3 2
      indexAction.js
  4. 231 1
      package-lock.json

+ 299 - 0
api.js

@@ -0,0 +1,299 @@
+const { default: axios } = require('axios')
+const dayjs = require('dayjs')
+const duration = require('dayjs/plugin/duration')
+const { baseURL, cookie, deviceId, bark } = require('./config')
+require('./console')
+
+dayjs.extend(duration)
+
+let cookies = typeof cookie === 'object' ? cookie : [cookie]
+let currentCookie = ''
+
+const xmTravelAxios = axios.create()
+const barkAxios = axios.create()
+
+const TRAVEL_BASE_URL = baseURL + 'xmTravel/'
+
+xmTravelAxios.interceptors.request.use(req => {
+  req.headers['X-Requested-With'] = 'XMLHttpRequest'
+  req.headers['Accept-Language'] = 'zh-cn'
+  req.headers['MT-Request-ID'] = getGUID()
+  req.headers[
+    'User-Agent'
+  ] = `Mozilla/5.0 (iPhone; CPU iPhone OS 14_8 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 moutaiapp/1.2.1 device-id/${deviceId}`
+  req.headers['Referer'] =
+    'https://h5.moutai519.com.cn/gux/game/main?appConfig=2_1_2'
+  req.headers['Cookie'] = currentCookie
+  req.headers['Accept'] = 'application/json, text/javascript, */*; q=0.01'
+  req.headers['Content-Type'] = 'application/json'
+  req.headers['MT-APP-Version'] = '1.0.0'
+  req.headers['Origin'] = 'https://h5.moutai519.com.cn'
+  return req
+})
+
+function getGUID(key = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx') {
+  return key.replace(/[xy]/g, function (c) {
+    var r = (Math.random() * 16) | 0
+    var v = c == 'x' ? r : (r & 0x3) | 0x8
+
+    return v.toString(16)
+  })
+}
+
+function log(...msg) {
+  console.log(`账号${cookies.indexOf(currentCookie) + 1}`, ...msg)
+}
+
+function sendBarkMsg(msg) {
+  log(msg)
+  if (!bark) return false
+  return barkAxios({
+    method: 'get',
+    url: `${bark}/${encodeURIComponent('xmtravel')}/${encodeURIComponent(
+      msg
+    )}?group=${encodeURIComponent('xmtravel')}`
+  })
+}
+
+async function httpRequest(url, method = 'get', _data) {
+  let params = ''
+  let data = {}
+  if (method === 'get') {
+    params = _data
+  } else {
+    data = _data
+  }
+  return await xmTravelAxios({
+    url,
+    method,
+    data,
+    params
+  })
+    .then(d => d.data)
+    .catch(async d => {
+      if (d.response.status === 500 && d.response.data) {
+        return Promise.resolve(d.response.data)
+      }
+      if (d.response.status === 401 && d.response.data) {
+        await sendBarkMsg(`登录失效, 请更新 cookie 配置`)
+        return Promise.reject('登录失效')
+      }
+      log(d)
+    })
+}
+
+function getUserIsolationPageData() {
+  console.log()
+  log('查询小茅运信息:')
+  return httpRequest(
+    baseURL + 'isolationPage/getUserIsolationPageData',
+    'get',
+    {
+      __timestamp: +new Date()
+    }
+  ).then(async d => {
+    // energy: 耐力值
+    // xmy: 小茅运值
+    let { energy, energyReward, xmy, xmTravel } = d.data
+    // status: 1. 未开始 2. 进行中 3. 已完成
+    // remainChance: 今日剩余旅行次数
+    // travelEndTime: 旅行结束时间
+    let { status, remainChance, travelEndTime } = xmTravel
+    let { value } = energyReward // 可领取申购耐力值奖励
+    let endTime = travelEndTime * 1000
+    log('当前小茅运值:', xmy)
+
+    if (value) {
+      await getUserEnergyAward()
+      energy += value
+    }
+
+    let { currentPeriodCanConvertXmyNum } = await getExchangeRateInfo()
+    log('本月剩余旅行奖励:', currentPeriodCanConvertXmyNum)
+
+    if (currentPeriodCanConvertXmyNum <= 0) {
+      // 当月无可领取奖励
+      return Promise.reject()
+    }
+
+    // 未开始
+    if (status === 1) {
+      if (energy < 100) {
+        log('耐力不足, 当前耐力值:', energy)
+        return Promise.reject()
+      }
+    }
+
+    // 进行中
+    if (status === 2) {
+      log('旅行暂未结束')
+      log('本次旅行结束时间: ', dayjs(endTime).format('YYYY-MM-DD HH:mm:ss'))
+      log(
+        '本次旅行剩余时间: ',
+        dayjs.duration(endTime - +new Date()).format('HH 小时 mm 分钟 ss 秒')
+      )
+      return Promise.reject()
+    }
+
+    return {
+      remainChance, // 剩余次数
+      finish: status === 3
+    }
+  })
+}
+
+// 获取本月剩余奖励耐力值
+function getExchangeRateInfo() {
+  return httpRequest(baseURL + 'synthesize/exchangeRateInfo', 'get', {
+    __timestamp: +new Date()
+  }).then(d => {
+    let { currentPeriodCanConvertXmyNum } = d.data
+
+    return { currentPeriodCanConvertXmyNum }
+  })
+}
+
+function getXmTravelInfo() {
+  console.log()
+  log('获取旅行信息: ')
+  return httpRequest(TRAVEL_BASE_URL + 'getXmTravelInfo', 'get', {
+    __timestamp: +new Date()
+  }).then(d => {
+    let { lastStartTravelTs, travelTotalTime, remainTravelCnt, travelStatus } =
+      d.data
+
+    let startTime = dayjs(lastStartTravelTs)
+    let endTime = startTime.add(3, 'h')
+    let firstTravel = !dayjs().isSame(startTime, 'day')
+
+    if (firstTravel) {
+      log('今日暂未开始旅行')
+    }
+
+    let finish = travelStatus === 3
+    if (!finish) {
+      log('旅行暂未结束')
+      log(
+        '本次旅行开始时间: ',
+        dayjs(lastStartTravelTs).format('YYYY-MM-DD HH:mm:ss')
+      )
+      log(
+        '本次旅行结束时间: ',
+        startTime.add(3, 'h').format('YYYY-MM-DD HH:mm:ss')
+      )
+      log(
+        '本次旅行剩余时间: ',
+        dayjs.duration(endTime - +new Date()).format('HH 小时 mm 分钟 ss 秒')
+      )
+      return Promise.reject()
+    }
+    if (!remainTravelCnt) log('当日旅行次数已耗尽')
+    else log('剩余旅行次数: ', remainTravelCnt)
+    return {
+      remainTravelCnt,
+      finish: finish && !firstTravel // 今日已首次旅行过且当前已完成
+    }
+  })
+}
+
+function getUserEnergyAward() {
+  console.log()
+  log('获取申购耐力值: ')
+  return httpRequest(
+    baseURL + 'isolationPage/getUserEnergyAward',
+    'post',
+    {}
+  ).then(d => {
+    if (d.code === 200) {
+      log('耐力值领取成功')
+    } else {
+      log('耐力值领取失败', d.message || '')
+      return Promise.reject()
+    }
+  })
+}
+
+function getXmTravelReward() {
+  console.log()
+  log('查询旅行奖励: ')
+  return httpRequest(TRAVEL_BASE_URL + 'getXmTravelReward', 'get', {
+    __timestamp: +new Date()
+  }).then(d => {
+    if (d.code === 2000 && d.data.travelRewardXmy) {
+      log('可获取小茅运: ', d.data.travelRewardXmy)
+      return d.data.travelRewardXmy
+    } else {
+      log('旅行暂未完成', d.message || '')
+      return Promise.reject()
+    }
+  })
+}
+
+function receiveReward(travelRewardXmy) {
+  console.log()
+  log('领取旅行奖励: ')
+  return httpRequest(TRAVEL_BASE_URL + 'receiveReward', 'post', {}).then(d => {
+    if (d.code === 2000) {
+      sendBarkMsg('成功领取旅行奖励小茅运' + travelRewardXmy)
+    } else {
+      log('领取失败', d.message || '')
+      return Promise.reject()
+    }
+  })
+}
+
+function startTravel() {
+  console.log()
+  log('开始旅行: ')
+  return httpRequest(TRAVEL_BASE_URL + 'startTravel', 'post', {}).then(d => {
+    if (d.code === 2000) {
+      log('开始旅行成功')
+    } else {
+      log('开始旅行失败', d.message || '')
+      return Promise.reject()
+    }
+  })
+}
+
+function shareReward() {
+  console.log()
+  log('每日首次分享可领取耐力:')
+  return httpRequest(TRAVEL_BASE_URL + 'shareReward', 'post', {}).then(d => {
+    if (d.code === 2000) {
+      log('分享成功')
+    } else {
+      log('分享失败', d.message || '')
+      return Promise.reject()
+    }
+  })
+}
+
+async function init() {
+  console.log('开始执行')
+  let time = +dayjs().format('HH')
+  if (time >= 9 && time < 20) {
+    for await (i of cookies) {
+      currentCookie = i
+      try {
+        let { remainChance, finish } = await getUserIsolationPageData()
+        // let { remainTravelCnt, finish } = await getXmTravelInfo()
+        if (finish) {
+          let travelRewardXmy = await getXmTravelReward()
+          await receiveReward(travelRewardXmy)
+          await shareReward()
+        }
+        if (remainChance) await startTravel()
+      } catch (e) {}
+    }
+  } else {
+    console.log()
+    console.log('活动未开始')
+  }
+
+  console.log()
+  console.log('脚本执行完毕')
+  console.log()
+}
+
+
+exports.init = init

+ 3 - 301
index.js

@@ -1,302 +1,4 @@
-const { default: axios } = require('axios')
-const dayjs = require('dayjs')
-const duration = require('dayjs/plugin/duration')
 const schedule = require('node-schedule')
-const { baseURL, cookie, deviceId, bark } = require('./config')
-require('./console')
-
-dayjs.extend(duration)
-
-let cookies = typeof cookie === 'object' ? cookie : [cookie]
-let currentCookie = ''
-
-const xmTravelAxios = axios.create()
-const barkAxios = axios.create()
-
-const TRAVEL_BASE_URL = baseURL + 'xmTravel/'
-
-xmTravelAxios.interceptors.request.use(req => {
-  req.headers['X-Requested-With'] = 'XMLHttpRequest'
-  req.headers['Accept-Language'] = 'zh-cn'
-  req.headers['MT-Request-ID'] = getGUID()
-  req.headers[
-    'User-Agent'
-  ] = `Mozilla/5.0 (iPhone; CPU iPhone OS 14_8 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 moutaiapp/1.2.1 device-id/${deviceId}`
-  req.headers['Referer'] =
-    'https://h5.moutai519.com.cn/gux/game/main?appConfig=2_1_2'
-  req.headers['Cookie'] = currentCookie
-  req.headers['Accept'] = 'application/json, text/javascript, */*; q=0.01'
-  req.headers['Content-Type'] = 'application/json'
-  req.headers['MT-APP-Version'] = '1.0.0'
-  req.headers['Origin'] = 'https://h5.moutai519.com.cn'
-  return req
-})
-
-function getGUID(key = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx') {
-  return key.replace(/[xy]/g, function (c) {
-    var r = (Math.random() * 16) | 0
-    var v = c == 'x' ? r : (r & 0x3) | 0x8
-
-    return v.toString(16)
-  })
-}
-
-function log(...msg) {
-  console.log(`账号${cookies.indexOf(currentCookie) + 1}`, ...msg)
-}
-
-function sendBarkMsg(msg) {
-  log(msg)
-  if (!bark) return false
-  return barkAxios({
-    method: 'get',
-    url: `${bark}/${encodeURIComponent('xmtravel')}/${encodeURIComponent(
-      msg
-    )}?group=${encodeURIComponent('xmtravel')}`
-  })
-}
-
-async function httpRequest(url, method = 'get', _data) {
-  let params = ''
-  let data = {}
-  if (method === 'get') {
-    params = _data
-  } else {
-    data = _data
-  }
-  return await xmTravelAxios({
-    url,
-    method,
-    data,
-    params
-  })
-    .then(d => d.data)
-    .catch(async d => {
-      if (d.response.status === 500 && d.response.data) {
-        return Promise.resolve(d.response.data)
-      }
-      if (d.response.status === 401 && d.response.data) {
-        await sendBarkMsg(`登录失效, 请更新 cookie 配置`)
-        return Promise.reject('登录失效')
-      }
-      log(d)
-    })
-}
-
-function getUserIsolationPageData() {
-  console.log()
-  log('查询小茅运信息:')
-  return httpRequest(
-    baseURL + 'isolationPage/getUserIsolationPageData',
-    'get',
-    {
-      __timestamp: +new Date()
-    }
-  ).then(async d => {
-    // energy: 耐力值
-    // xmy: 小茅运值
-    let { energy, energyReward, xmy, xmTravel } = d.data
-    // status: 1. 未开始 2. 进行中 3. 已完成
-    // remainChance: 今日剩余旅行次数
-    // travelEndTime: 旅行结束时间
-    let { status, remainChance, travelEndTime } = xmTravel
-    let { value } = energyReward // 可领取申购耐力值奖励
-    let endTime = travelEndTime * 1000
-    log('当前小茅运值:', xmy)
-
-    if (value) {
-      await getUserEnergyAward()
-      energy += value
-    }
-
-    let { currentPeriodCanConvertXmyNum } = await getExchangeRateInfo()
-    log('本月剩余旅行奖励:', currentPeriodCanConvertXmyNum)
-
-    if (currentPeriodCanConvertXmyNum <= 0) {
-      // 当月无可领取奖励
-      return Promise.reject()
-    }
-
-    // 未开始
-    if (status === 1) {
-      if (energy < 100) {
-        log('耐力不足, 当前耐力值:', energy)
-        return Promise.reject()
-      }
-    }
-
-    // 进行中
-    if (status === 2) {
-      log('旅行暂未结束')
-      log('本次旅行结束时间: ', dayjs(endTime).format('YYYY-MM-DD HH:mm:ss'))
-      log(
-        '本次旅行剩余时间: ',
-        dayjs.duration(endTime - +new Date()).format('HH 小时 mm 分钟 ss 秒')
-      )
-      return Promise.reject()
-    }
-
-    return {
-      remainChance, // 剩余次数
-      finish: status === 3
-    }
-  })
-}
-
-// 获取本月剩余奖励耐力值
-function getExchangeRateInfo() {
-  return httpRequest(baseURL + 'synthesize/exchangeRateInfo', 'get', {
-    __timestamp: +new Date()
-  }).then(d => {
-    let { currentPeriodCanConvertXmyNum } = d.data
-
-    return { currentPeriodCanConvertXmyNum }
-  })
-}
-
-function getXmTravelInfo() {
-  console.log()
-  log('获取旅行信息: ')
-  return httpRequest(TRAVEL_BASE_URL + 'getXmTravelInfo', 'get', {
-    __timestamp: +new Date()
-  }).then(d => {
-    let { lastStartTravelTs, travelTotalTime, remainTravelCnt, travelStatus } =
-      d.data
-
-    let startTime = dayjs(lastStartTravelTs)
-    let endTime = startTime.add(3, 'h')
-    let firstTravel = !dayjs().isSame(startTime, 'day')
-
-    if (firstTravel) {
-      log('今日暂未开始旅行')
-    }
-
-    let finish = travelStatus === 3
-    if (!finish) {
-      log('旅行暂未结束')
-      log(
-        '本次旅行开始时间: ',
-        dayjs(lastStartTravelTs).format('YYYY-MM-DD HH:mm:ss')
-      )
-      log(
-        '本次旅行结束时间: ',
-        startTime.add(3, 'h').format('YYYY-MM-DD HH:mm:ss')
-      )
-      log(
-        '本次旅行剩余时间: ',
-        dayjs.duration(endTime - +new Date()).format('HH 小时 mm 分钟 ss 秒')
-      )
-      return Promise.reject()
-    }
-    if (!remainTravelCnt) log('当日旅行次数已耗尽')
-    else log('剩余旅行次数: ', remainTravelCnt)
-    return {
-      remainTravelCnt,
-      finish: finish && !firstTravel // 今日已首次旅行过且当前已完成
-    }
-  })
-}
-
-function getUserEnergyAward() {
-  console.log()
-  log('获取申购耐力值: ')
-  return httpRequest(
-    baseURL + 'isolationPage/getUserEnergyAward',
-    'post',
-    {}
-  ).then(d => {
-    if (d.code === 200) {
-      log('耐力值领取成功')
-    } else {
-      log('耐力值领取失败', d.message || '')
-      return Promise.reject()
-    }
-  })
-}
-
-function getXmTravelReward() {
-  console.log()
-  log('查询旅行奖励: ')
-  return httpRequest(TRAVEL_BASE_URL + 'getXmTravelReward', 'get', {
-    __timestamp: +new Date()
-  }).then(d => {
-    if (d.code === 2000 && d.data.travelRewardXmy) {
-      log('可获取小茅运: ', d.data.travelRewardXmy)
-      return d.data.travelRewardXmy
-    } else {
-      log('旅行暂未完成', d.message || '')
-      return Promise.reject()
-    }
-  })
-}
-
-function receiveReward(travelRewardXmy) {
-  console.log()
-  log('领取旅行奖励: ')
-  return httpRequest(TRAVEL_BASE_URL + 'receiveReward', 'post', {}).then(d => {
-    if (d.code === 2000) {
-      sendBarkMsg('成功领取旅行奖励小茅运' + travelRewardXmy)
-    } else {
-      log('领取失败', d.message || '')
-      return Promise.reject()
-    }
-  })
-}
-
-function startTravel() {
-  console.log()
-  log('开始旅行: ')
-  return httpRequest(TRAVEL_BASE_URL + 'startTravel', 'post', {}).then(d => {
-    if (d.code === 2000) {
-      log('开始旅行成功')
-    } else {
-      log('开始旅行失败', d.message || '')
-      return Promise.reject()
-    }
-  })
-}
-
-function shareReward() {
-  console.log()
-  log('每日首次分享可领取耐力:')
-  return httpRequest(TRAVEL_BASE_URL + 'shareReward', 'post', {}).then(d => {
-    if (d.code === 2000) {
-      log('分享成功')
-    } else {
-      log('分享失败', d.message || '')
-      return Promise.reject()
-    }
-  })
-}
-
-async function init() {
-  console.log('开始执行')
-  let time = +dayjs().format('HH')
-  if (time >= 9 && time < 20) {
-    for await (i of cookies) {
-      currentCookie = i
-      try {
-        let { remainChance, finish } = await getUserIsolationPageData()
-        // let { remainTravelCnt, finish } = await getXmTravelInfo()
-        if (finish) {
-          let travelRewardXmy = await getXmTravelReward()
-          await receiveReward(travelRewardXmy)
-          await shareReward()
-        }
-        if (remainChance) await startTravel()
-      } catch (e) {}
-    }
-  } else {
-    console.log()
-    console.log('活动未开始')
-  }
-
-  console.log()
-  console.log('脚本执行完毕')
-  console.log()
-}
-
-init()
-schedule.scheduleJob('00 */30 * * * *', init) // 每半小时
-
-exports.init = init
+const api = require('./api')
+api.init()
+schedule.scheduleJob('00 */30 * * * *', api.init) // 每半小时

+ 3 - 2
indexAction.js

@@ -1,2 +1,3 @@
-const index = require('./index')
-index.init()
+const api = require('./api')
+// console.log(index)
+api.init()

+ 231 - 1
package-lock.json

@@ -1,8 +1,238 @@
 {
   "name": "xmtravel",
   "version": "1.0.1",
-  "lockfileVersion": 1,
+  "lockfileVersion": 2,
   "requires": true,
+  "packages": {
+    "": {
+      "name": "xmtravel",
+      "version": "1.0.1",
+      "license": "ISC",
+      "dependencies": {
+        "axios": "^0.27.2",
+        "colors": "^1.4.0",
+        "dayjs": "^1.11.2",
+        "node-schedule": "^2.1.0"
+      }
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
+    "node_modules/axios": {
+      "version": "0.27.2",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz",
+      "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+      "dependencies": {
+        "follow-redirects": "^1.14.9",
+        "form-data": "^4.0.0"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
+    "node_modules/colors": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/colors/-/colors-1.4.0.tgz",
+      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+      "engines": {
+        "node": ">=0.1.90"
+      }
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/cron-parser": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmmirror.com/cron-parser/-/cron-parser-3.5.0.tgz",
+      "integrity": "sha512-wyVZtbRs6qDfFd8ap457w3XVntdvqcwBGxBoTvJQH9KGVKL/fB+h2k3C8AqiVxvUQKN1Ps/Ns46CNViOpVDhfQ==",
+      "dependencies": {
+        "is-nan": "^1.3.2",
+        "luxon": "^1.26.0"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.2",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.2.tgz",
+      "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw=="
+    },
+    "node_modules/define-properties": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz",
+      "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+      "dependencies": {
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.1",
+      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.1.tgz",
+      "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "node_modules/has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dependencies": {
+        "function-bind": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+      "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+      "dependencies": {
+        "get-intrinsic": "^1.1.1"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-nan": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmmirror.com/is-nan/-/is-nan-1.3.2.tgz",
+      "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
+      "dependencies": {
+        "call-bind": "^1.0.0",
+        "define-properties": "^1.1.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/long-timeout": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/long-timeout/-/long-timeout-0.1.1.tgz",
+      "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w=="
+    },
+    "node_modules/luxon": {
+      "version": "1.28.0",
+      "resolved": "https://registry.npmmirror.com/luxon/-/luxon-1.28.0.tgz",
+      "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/node-schedule": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/node-schedule/-/node-schedule-2.1.0.tgz",
+      "integrity": "sha512-nl4JTiZ7ZQDc97MmpTq9BQjYhq7gOtoh7SiPH069gBFBj0PzD8HI7zyFs6rzqL8Y5tTiEEYLxgtbx034YPrbyQ==",
+      "dependencies": {
+        "cron-parser": "^3.5.0",
+        "long-timeout": "0.1.1",
+        "sorted-array-functions": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/sorted-array-functions": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz",
+      "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA=="
+    }
+  },
   "dependencies": {
     "asynckit": {
       "version": "0.4.0",