index.js 7.1 KB

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