index.js 8.2 KB

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