api.js 6.9 KB

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