index.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. const { default: axios } = require('axios')
  2. const dayjs = require('dayjs')
  3. const duration = require('dayjs/plugin/duration')
  4. const schedule = require('node-schedule')
  5. const { baseURL, cookie, deviceId } = require('./config')
  6. require('./console')
  7. dayjs.extend(duration)
  8. let cookies = typeof cookie === 'object' ? cookie : [cookie]
  9. let currentCookie = ''
  10. const TRAVEL_BASE_URL = baseURL + 'xmTravel/'
  11. // axios.defaults.baseURL = baseURL
  12. axios.interceptors.request.use(req => {
  13. req.headers['X-Requested-With'] = 'XMLHttpRequest'
  14. req.headers['Accept-Language'] = 'zh-cn'
  15. req.headers['MT-Request-ID'] = getGUID()
  16. req.headers[
  17. 'User-Agent'
  18. ] = `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}`
  19. req.headers['Referer'] =
  20. 'https://h5.moutai519.com.cn/gux/game/main?appConfig=2_1_2'
  21. req.headers['Cookie'] = currentCookie
  22. req.headers['Accept'] = 'application/json, text/javascript, */*; q=0.01'
  23. req.headers['Content-Type'] = 'application/json'
  24. req.headers['MT-APP-Version'] = '1.0.0'
  25. req.headers['Origin'] = 'https://h5.moutai519.com.cn'
  26. return req
  27. })
  28. function getGUID(key = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx') {
  29. return key.replace(/[xy]/g, function (c) {
  30. var r = (Math.random() * 16) | 0
  31. var v = c == 'x' ? r : (r & 0x3) | 0x8
  32. return v.toString(16)
  33. })
  34. }
  35. async function httpRequest(url, method = 'get', _data) {
  36. let params = ''
  37. let data = {}
  38. if (method === 'get') {
  39. params = _data
  40. } else {
  41. data = _data
  42. }
  43. return await axios({
  44. url,
  45. method,
  46. data,
  47. params
  48. })
  49. .then(d => d.data)
  50. .catch(d => {
  51. if (d.response.status === 500 && d.response.data) {
  52. return Promise.resolve(d.response.data)
  53. }
  54. console.log(d)
  55. })
  56. }
  57. function getUserIsolationPageData() {
  58. console.log()
  59. console.log('查询小茅运信息:')
  60. return httpRequest(
  61. baseURL + 'isolationPage/getUserIsolationPageData',
  62. 'get',
  63. {
  64. __timestamp: +new Date()
  65. }
  66. ).then(async d => {
  67. // energy: 耐力值
  68. // xmy: 小茅运值
  69. let { energy, energyReward, xmy, xmTravel } = d.data
  70. // status: 1. 未开始 2. 进行中 3. 已完成
  71. // remainChance: 今日剩余旅行次数
  72. // travelEndTime: 旅行结束时间
  73. let { status, remainChance, travelEndTime } = xmTravel
  74. let { value } = energyReward // 可领取申购耐力值奖励
  75. let endTime = travelEndTime * 1000
  76. console.log('当前小茅运值:', xmy)
  77. if (value) {
  78. await getUserEnergyAward()
  79. energy += value
  80. }
  81. let { currentPeriodCanConvertXmyNum } = await getExchangeRateInfo()
  82. console.log('本月剩余旅行奖励:', currentPeriodCanConvertXmyNum)
  83. if (currentPeriodCanConvertXmyNum <= 0) {
  84. // 当月无可领取奖励
  85. return Promise.reject()
  86. }
  87. // 未开始
  88. if (status === 1) {
  89. if (energy < 100) {
  90. console.log('耐力不足, 当前耐力值:', energy)
  91. return Promise.reject()
  92. }
  93. }
  94. // 进行中
  95. if (status === 2) {
  96. console.log('旅行暂未结束')
  97. console.log(
  98. '本次旅行结束时间: ',
  99. dayjs(endTime).format('YYYY-MM-DD HH:mm:ss')
  100. )
  101. console.log(
  102. '本次旅行剩余时间: ',
  103. dayjs.duration(endTime - +new Date()).format('HH 小时 mm 分钟 ss 秒')
  104. )
  105. return Promise.reject()
  106. }
  107. return {
  108. remainChance, // 剩余次数
  109. finish: status === 3
  110. }
  111. })
  112. }
  113. // 获取本月剩余奖励耐力值
  114. function getExchangeRateInfo() {
  115. return httpRequest(baseURL + 'synthesize/exchangeRateInfo', 'get', {
  116. __timestamp: +new Date()
  117. }).then(d => {
  118. let { currentPeriodCanConvertXmyNum } = d.data
  119. return { currentPeriodCanConvertXmyNum }
  120. })
  121. }
  122. function getXmTravelInfo() {
  123. console.log()
  124. console.log('获取旅行信息: ')
  125. return httpRequest(TRAVEL_BASE_URL + 'getXmTravelInfo', 'get', {
  126. __timestamp: +new Date()
  127. }).then(d => {
  128. let { lastStartTravelTs, travelTotalTime, remainTravelCnt, travelStatus } =
  129. d.data
  130. let startTime = dayjs(lastStartTravelTs)
  131. let endTime = startTime.add(3, 'h')
  132. let firstTravel = !dayjs().isSame(startTime, 'day')
  133. if (firstTravel) {
  134. console.log('今日暂未开始旅行')
  135. }
  136. let finish = travelStatus === 3
  137. if (!finish) {
  138. console.log('旅行暂未结束')
  139. console.log(
  140. '本次旅行开始时间: ',
  141. dayjs(lastStartTravelTs).format('YYYY-MM-DD HH:mm:ss')
  142. )
  143. console.log(
  144. '本次旅行结束时间: ',
  145. startTime.add(3, 'h').format('YYYY-MM-DD HH:mm:ss')
  146. )
  147. console.log(
  148. '本次旅行剩余时间: ',
  149. dayjs.duration(endTime - +new Date()).format('HH 小时 mm 分钟 ss 秒')
  150. )
  151. return Promise.reject()
  152. }
  153. if (!remainTravelCnt) console.log('当日旅行次数已耗尽')
  154. else console.log('剩余旅行次数: ', remainTravelCnt)
  155. return {
  156. remainTravelCnt,
  157. finish: finish && !firstTravel // 今日已首次旅行过且当前已完成
  158. }
  159. })
  160. }
  161. function getUserEnergyAward() {
  162. console.log()
  163. console.log('获取申购耐力值: ')
  164. return httpRequest(
  165. baseURL + 'isolationPage/getUserEnergyAward',
  166. 'post',
  167. {}
  168. ).then(d => {
  169. if (d.code === 200) {
  170. console.log('耐力值领取成功')
  171. } else {
  172. console.log('耐力值领取失败', d.message || '')
  173. return Promise.reject()
  174. }
  175. })
  176. }
  177. function getXmTravelReward() {
  178. console.log()
  179. console.log('查询旅行奖励: ')
  180. return httpRequest(TRAVEL_BASE_URL + 'getXmTravelReward', 'get', {
  181. __timestamp: +new Date()
  182. }).then(d => {
  183. if (d.code === 2000 && d.data.travelRewardXmy) {
  184. console.log('可获取小茅运: ', d.data.travelRewardXmy)
  185. } else {
  186. console.log('旅行暂未完成', d.message || '')
  187. return Promise.reject()
  188. }
  189. })
  190. }
  191. function receiveReward() {
  192. console.log()
  193. console.log('领取旅行奖励: ')
  194. return httpRequest(TRAVEL_BASE_URL + 'receiveReward', 'post', {}).then(d => {
  195. if (d.code === 2000) {
  196. console.log('领取成功')
  197. } else {
  198. console.log('领取失败', d.message || '')
  199. return Promise.reject()
  200. }
  201. })
  202. }
  203. function startTravel() {
  204. console.log()
  205. console.log('开始旅行: ')
  206. return httpRequest(TRAVEL_BASE_URL + 'startTravel', 'post', {}).then(d => {
  207. if (d.code === 2000) {
  208. console.log('开始旅行成功')
  209. } else {
  210. console.log('开始旅行失败', d.message || '')
  211. return Promise.reject()
  212. }
  213. })
  214. }
  215. function shareReward() {
  216. console.log()
  217. console.log('每日首次分享可领取耐力:')
  218. return httpRequest(TRAVEL_BASE_URL + 'shareReward', 'post', {}).then(d => {
  219. if (d.code === 2000) {
  220. console.log('分享成功')
  221. } else {
  222. console.log('分享失败', d.message || '')
  223. return Promise.reject()
  224. }
  225. })
  226. }
  227. async function init() {
  228. console.log('开始执行')
  229. let time = +dayjs().format('HH')
  230. if (time >= 9 && time < 20) {
  231. for await (i of cookies) {
  232. currentCookie = i
  233. try {
  234. let { remainChance, finish } = await getUserIsolationPageData()
  235. // let { remainTravelCnt, finish } = await getXmTravelInfo()
  236. if (finish) {
  237. await getXmTravelReward()
  238. await receiveReward()
  239. await shareReward()
  240. }
  241. if (remainChance) await startTravel()
  242. } catch (e) {}
  243. }
  244. } else {
  245. console.log()
  246. console.log('活动未开始')
  247. }
  248. console.log()
  249. console.log('脚本执行完毕')
  250. console.log()
  251. }
  252. init()
  253. schedule.scheduleJob('00 */30 * * * *', init) // 每半小时