From aae3fc2ba28c073ae6cae0909a532bef30851abe Mon Sep 17 00:00:00 2001 From: Hermes Date: Fri, 22 May 2026 21:00:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=E3=80=8Cjs=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/茅台.js | 1043 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1043 insertions(+) create mode 100644 js/茅台.js diff --git a/js/茅台.js b/js/茅台.js new file mode 100644 index 0000000..772b1b7 --- /dev/null +++ b/js/茅台.js @@ -0,0 +1,1043 @@ +// [author: funyhook] +// [create_at: 2023-10-08 17:59:18] +// [version: 11] +// [title: 茅台] +// [description: 插件失效了 我也不知道怎麽更新了,會的大佬自己研究吧 茅台版本号:1.5.5
i茅台自动预约申购;使用指令:手动申购指令:mt,茅台;账号管理指令:茅台管理;
依赖"hook.js,请先前往插件市场安装 hook.js] +// [public: true] +// [service: funyhook] +// [price: 3] +// [icon: https://bbs.autman.cn/assets/files/2023-11-30/1701333649-286935-5bc8824b-8cbe-4263-b5a7-b48877b32170.png] +//======================================================= +// [rule: ^茅台$] +// [rule: mt] +// [rule: ^茅台管理$] +// [rule: ^茅台超级管理$] +// [rule: mtt] +// [rule: mtfk] +// [admin: false ] +// [disable: false] +// [cron: 1,5 9,18 * * *]每日9点运行 +// [priority: 99999999999] +//======================================================= +//[param: {"required":false,"key":"otto.vhook_imt_delay_time","bool":false,"placeholder":"账号申购间隔时间(单位秒)示例一分钟:60","name":"账号申购间隔时间","desc":"账号申购间隔时间(单位秒)示例一分钟:60,填写数字"}] +//======================= +//脚本及其中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。 您必须在下载后的24小时内从计算机或手机中完全删除此脚本 + + + + +const app_name = "【i茅台】" +const plugin_key_pre = "imt_" +const plugin_name = `【${getTitle()}】` +const plugin_title = getTitle() +const title = getTitle() +const version = getVersion() +const imType = ImType() === "cron" ? "fake" : ImType(); +const userId = GetUserID(); +const chatId = GetChatID(); +const msg = GetContent(); +const aut_ver = call("version")()["sn"]//获取当前系统版本 +const mt_r = 'clips_OlU6TmFRag5rCXwbNAQ/Tz1SKlN8THcecBp/HGhHdw==' +let mt_v= '1.5.6' +const res_list = [ + {"itemCode": "10941", "itemName": "500ml贵州茅台酒(甲辰龙年)"}, + {"itemCode": "2478", "itemName": "贵州茅台酒(珍品)"}, + {"itemCode": "10056", "itemName": "茅台1935"}, + {"itemCode": "10942", "itemName": "375ml×2贵州茅台酒(甲辰龙年)"}, +] +let res_map = {} +let choose_items = ""; +res_list.forEach(o => { + res_map[o.itemCode] = o.itemName + choose_items += `\n【${o.itemCode}】、${o.itemName}` +}) +const today = timeFmt('yyyy-MM-dd') +const dateTime = timeFmt() +const time = new Date(today.split(" ") + " 00:00:00").getTime() +const reserveStartTime = new Date(today.split(" ") + " 09:00:00").getTime() +let pc_map = {} +let api_url = {} +let delay_time = get("vhook_imt_delay_time")?get("vhook_imt_delay_time"):10 + +//记录账号 +function recordAccount() { + try { + let conntent = `${plugin_name} 请按照下面抓包教程准备数据:` + conntent += `\n1、抓包app.moutai519.com.cn下请求头部Cookie中的 MT-Token ` + conntent += `\n2、点击小茅运,抓包h5.moutai519.com.cn下请求头部的Cookie中的MT-Token-Wap` + conntent += `\n3、设备id (点击小茅运,抓包h5.moutai519.com.cn下请求头部的中的MT-Device-ID` + conntent += `\n4、所在省份:河南省 ;!!!注意: 一定要加上”省“` + conntent += `\n5、所在城市:洛阳市 ;!!!注意: 一定要加上”市“` + conntent += `\n5、所在县区:宜阳县 ;!!!注意: 一定要加上”县“或"区"` + conntent += `\n6、当前位置的经度http://jingweidu.757dy.com)` + conntent += `\n7、当前位置的纬度(http://jingweidu.757dy.com)` + sendText(conntent) + sleep(1000) + sendText(`${plugin_name}:请在【2分钟】内输入${app_name} MT-Token`); + let user_data = {}; + let mt_tokenn = input(120000); + if (!mt_tokenn || mt_tokenn === "q") { + return sendText(`${plugin_name}:输入有误,自动退出`); + } + user_data.mt_tokenn = mt_tokenn + + sendText(`${plugin_name}:请在【2分钟】内输入${app_name} MT-Token-Wap:`); + let mt_token_wap = input(120000) + if (!mt_token_wap || mt_token_wap === "q") { + return sendText(`${plugin_name}:输入有误,自动退出`); + } + user_data.mt_token_wap = mt_token_wap; + + sendText(`${plugin_name}:请在【2分钟】内输入${app_name} MT-Device-ID:`); + let mt_device_id = input(120000) + if (!mt_device_id || mt_device_id === "q") { + return sendText(`${plugin_name}:输入有误,自动退出`); + } + user_data.mt_device_id = mt_device_id; + + sendText(`${plugin_name}:请在【2分钟】内输入你所在的省份(例如 河南省):`); + let province = input(120000) + if (!province || province === "q") { + return sendText(`${plugin_name}:输入有误,自动退出`); + } + user_data.province = province; + + sendText(`${plugin_name}:请在【2分钟】内输入你要所在城市(例如 北京市):`); + let city = input(120000) + if (!city || city === "q") { + return sendText(`${plugin_name}:输入有误,自动退出`); + } + user_data.city = city; + + sendText(`${plugin_name}:请在【2分钟】内输入当前位置的所在县或者区(例如,宜阳县)\n\n多个县区,请使用英文逗号分隔(例如:朝阳区,海淀区)`); + let districtName = input(120000) + if (!districtName || districtName === "q") { + return sendText(`${plugin_name}:输入有误,自动退出`); + + } + user_data.districtName = districtName; + + sendText(`${plugin_name}:请在【2分钟】内输入当前位置的经度(http://jingweidu.757dy.com)`); + let lot = input(120000) + if (!lot || lot === "q") { + return sendText(`${plugin_name}:输入有误,自动退出`); + } + user_data.lot = lot; + + sendText(`${plugin_name}:请在【2分钟】内输入当前位置的纬度(http://jingweidu.757dy.com)`); + let lat = input(120000) + if (!lat || lat === "q") { + return sendText(`${plugin_name}:输入有误,自动退出`); + } + user_data.lat = lat; + + sendText(`${plugin_name}:请在【2分钟】内输入下方你要申购商品的编号【】中的数字(多个编号,请用英文逗号分隔)\n${choose_items}`); + let itemCodes = input(120000) + if (!itemCodes || itemCodes === "q") { + return sendText(`${plugin_name}:输入有误,自动退出`); + } + user_data.itemCodes = itemCodes.split(","); + mt_v = mt_ver + sendText('请稍等,正在校验数据是否正确......') + sleep(1000) + get_user_id(user_data) + bucketSet(plugin_key_pre + imType, JSON.stringify(user_data), userId) + } catch (e) { + console.error(`${plugin_name}:recordAccount异常:${e.message}`) + notifyMasters(`${plugin_name}:recordAccount异常:${e.message}`); + } + return sendText(`${plugin_name}:恭喜数据校验正确,手动申购请发送命令:茅台,自动申购:默认每日09:00自动运行`); +} + + +function get_mt_ver(){ + let res = request({ + url: "https://itunes.apple.com/cn/lookup?id=1600482450", + method: `get`, + dataType:"json" + }) + console.log(`茅台版本号:::${JSON.stringify(res)}`) + mt_v = res.results[0].version +} + +//获取sessionid 和商品code +function getsessionId(user_data) { + let header = { + 'mt-device-id': user_data.mt_device_id, + 'mt-user-tag': '0', + 'accept': '*/*', + 'mt-network-type': 'WIFI', + 'mt-token': user_data.mt_tokenn, + 'mt-bundle-id': 'com.moutai.mall', + 'accept-language': 'zh-Hans-CN;q=1', + 'mt-request-id': new Date().getTime(), + 'mt-app-version': mt_v, + 'User-Agent': `Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 moutaiapp/${mt_v} device-id/${user_data.mt_device_id}`, + 'mt-r': mt_r, + 'mt-lng': user_data.lot, + 'mt-lat': user_data.lat + } + request({ + url: `https://static.moutai519.com.cn/mt-backend/xhr/front/mall/index/session/get/${time}`, + method: "get", + dataType: "json", + headers: header, + }, function (error, response, header, body) { + let content = `${plugin_name}:账号【${user_data.mobile} 】获取商品信息:${JSON.stringify(response)}` + console.error(content) + if (!error && response.statusCode === 200 && body.code === 2000) { + user_data.sessionId = body.data.sessionId; + let itemCodes = [] + body.data.itemList.forEach(o => { + itemCodes.push(o.itemCode) + }) + if (!user_data.itemCodes) { + user_data.itemCodes = itemCodes; + } + } else { + sendText(content); + } + + }) +} + +//根据经纬度获取城市基础数据 +function get_map(user_data) { + console.log(`当前账号获取城市基础数据信息:${JSON.stringify(user_data)}`) + let header = { + 'X-Requested-With': 'XMLHttpRequest', + 'User-Agent': `Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 moutaiapp/${mt_v} device-id/${user_data.mt_device_id}`, + 'Referer': 'https://h5.moutai519.com.cn/gux/game/main?appConfig=2_1_2', + 'Client-User-Agent': 'iOS;16.0.1;Apple;iPhone 14 ProMax', + 'MT-R': mt_r, + 'Origin': 'https://h5.moutai519.com.cn', + 'mt-app-version': mt_v, + 'MT-Request-ID': call("uuid")(), + 'Accept-Language': 'zh-CN,zh-Hans;q=1', + 'MT-Device-ID': user_data.mt_device_id, + 'Accept': 'application/json, text/javascript, */*; q=0.01', + 'mt-lng': user_data.lot, + 'mt-lat': user_data.lat + } + console.log(`当前账号请求headers:${JSON.stringify(header)}`) + request({ + url: `https://static.moutai519.com.cn/mt-backend/xhr/front/mall/resource/get`, + method: "get", + headers: header, + dataType: "json" + }, function (error, response, header, body) { + let content = `${plugin_name}:获取城市数据字典:${JSON.stringify(response)}` + if (!error && response.statusCode === 200 && body.code === 2000) { + const shops_url = body.data.mtshops_pc.url; + let shop_res = JSON.parse(request({url: shops_url, method: "get"})) + for (const value in shop_res) { + if (!shop_res.hasOwnProperty(value)) { + continue; + } + let shop_info = shop_res[value]; + let provinceName = shop_info.provinceName; //省 + let cityName = shop_info.cityName; //市 + let districtName = shop_info.districtName; //区/县 + if (!pc_map[provinceName]) { + pc_map[provinceName] = {} + pc_map[provinceName][cityName] = {} + pc_map[provinceName][cityName][districtName] = [] + } + if (!pc_map[provinceName][cityName]) { + pc_map[provinceName][cityName] = {} + pc_map[provinceName][cityName][districtName] = [] + } + if (!pc_map[provinceName][cityName][districtName]) { + pc_map[provinceName][cityName][districtName] = [] + } + pc_map[provinceName][cityName][districtName].push(value) + + } + } else { + sendText(`${content}`); + } + + }) +} + +//获取用户信息 +function get_user_id(user_data) { + try { + let header = { + 'MT-User-Tag': '0', + 'Accept': '*/*', + 'MT-Network-Type': 'WIFI', + 'MT-Token': user_data.mt_tokenn, + 'MT-Bundle-ID': 'com.moutai.mall', + 'Accept-Language': 'zh-Hans-CN;q=1, en-CN;q=0.9', + 'MT-Request-ID': call("uuid")(), + 'mt-app-version': mt_v, + 'User-Agent': `Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 moutaiapp/${mt_v} device-id/${user_data.mt_device_id}`, + 'MT-R': mt_r, + 'MT-Device-ID': user_data.mt_device_id, + 'mt-lng': user_data.lot, + 'mt-lat': user_data.lat + } + request({ + url: `https://app.moutai519.com.cn/xhr/front/user/info`, + method: "get", + dataType: "json", + headers: header, + }, function (error, response, header, body) { + let content = `${plugin_name}:账号【${user_data.mobile} 】${header} 获取用户信息结果:${JSON.stringify(response)}` + console.log(content) + if (!error && response.statusCode === 200 && body.code === 2000) { + user_data.userName = body.data.userName; + user_data.userId = body.data.userId; + user_data.mobile = body.data.mobile + user_data.status = 200 + } else if (response.statusCode === 401) { + user_data.status = 401 + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, `${user_data.mobile},此账号过期,请发送:茅台登陆,重新登陆`) + } else { + user_data.status = response.statusCode + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, `${user_data.mobile},此账号过期,请发送:茅台登陆,重新登陆`) + } + + }) + } catch (e) { + console.error(`${plugin_name}:get_user_id 异常:${e.message}`) + notifyMasters(`${plugin_name}:get_user_id异常:${e.message}`); + } +} + +//获取商店信息 +function get_shop_item(user_data, itemCode, itemName) { + let header = { + 'mt-device-id': user_data.mt_device_id, + 'mt-user-tag': '0', + 'accept': '*/*', + 'mt-network-type': 'WIFI', + 'mt-token': user_data.mt_tokenn, + 'mt-bundle-id': 'com.moutai.mall', + 'accept-language': 'zh-Hans-CN;q=1', + 'mt-request-id': new Date().getTime(), + 'mt-r': mt_r, + 'mt-app-version': mt_v, + 'User-Agent': `Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 moutaiapp/${mt_v} device-id/${user_data.mt_device_id}`, + 'mt-lng': user_data.lot, + 'mt-lat': user_data.lat + } + let url = `https://static.moutai519.com.cn/mt-backend/xhr/front/mall/shop/list/slim/v3/${user_data.sessionId}/${user_data.province}/${itemCode}/${time}` + console.log(url) + request({ + url: `https://static.moutai519.com.cn/mt-backend/xhr/front/mall/shop/list/slim/v3/${user_data.sessionId}/${user_data.province}/${itemCode}/${time}`, + method: "get", + dataType: "json", + headers: header, + }, function (error, response, header, body) { + let content = `${plugin_name}:账号【${user_data.mobile}】 获取商店信息:${JSON.stringify(response)}` + if (!error && response.statusCode === 200 && body.code === 2000) { + let data_shops = body.data.shops + if (pc_map[user_data.province][user_data.city]) { + if (!user_data.districtName) { + let content = `${plugin_name}:` + content += `【账号】${user_data.mobile}` + content += `【提示】未配置县区,请发送茅台管理 配置当前账号的县区!` + return pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, content) + } + console.log((user_data.districtName_arr.length)) + for (const districtName of user_data.districtName_arr) { + user_data.districtName = districtName + let shopIds = pc_map[user_data.province][user_data.city][districtName] + console.log(`${plugin_name}:账号【${user_data.mobile}】:${user_data.province}:${user_data.city}:${districtName}:${shopIds}`) + if (!shopIds) { + let content = `${plugin_name}:发生错误` + content += `\n【账号】${user_data.mobile}` + content += `\n【❌】未找到对应${user_data.province - user_data.city - districtName}数据,无法预约!,请填写正确的省份例如:河北省,请填写正确的城市例如:邢台市,请填写正确的县区例如:宜阳县 或者 朝阳区;若配置多个县区,请用英文逗号分隔` + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, content) + continue; + } + let not_shop = true; + for (let shop of data_shops) { + if (shopIds.includes(shop.shopId) && shop.items.some(o => o.itemId === itemCode)) { + not_shop = false; + return mt_add(user_data, shop.shopId, itemCode, itemName) + } + } + if (not_shop) { + let content = `${plugin_name}:发生错误` + content += `\n【账号】${user_data.mobile}` + content += `\n【❌】申购失败!` + content += `\n【提示】打开app 进入申购,找到【${res_map[itemCode]}】,点击【预约申购】按钮,查看您设置的地区【${user_data.province}-${user_data.city}-${districtName}】,是否支持申购!!!` + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, content) + } + } + } else { + let content = `${plugin_name}:发生错误` + content += `\n【账号】${user_data.mobile}` + content += `\n【❌】申购失败:未找到对应省份城市数据,无法预约!,请填写正确的省份例如:河北省,请填写正确的城市例如:邢台市,请填写正确的县区:宜阳县` + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, content) + } + } else { + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, content + "\n" + url) + console.log(`${content}\n${url}`) + } + + }) +} + +//预约 +function mt_add(user_data, shopId, itemCode, itemName) { + const MT_K = new Date().getTime() * 1000; + let url = String.format(api_url.mtv_url, user_data.mt_device_id, MT_K, mt_v) + console.log(url) + let res = request({ + url: url, + method: `get` + }) + console.log(res) + + let header = { + 'User-Agent': `Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 moutaiapp/${mt_v} device-id/${user_data.mt_device_id}`, + 'MT-Token': user_data.mt_tokenn, + 'MT-Network-Type': 'WIFI', + 'MT-User-Tag': '0', + 'MT-R': mt_r, + 'MT-Lat': '', + 'MT-K': MT_K, + 'MT-Lng': '', + 'MT-Info': '028e7f96f6369cafe1d105579c5b9377', + 'mt-app-version': mt_v, + 'MT-Request-ID': call("uuid")(), + 'Accept-Language': 'zh-Hans-CN;q=1', + 'MT-Device-ID': user_data.mt_device_id, + 'MT-V': res.text, + 'MT-Bundle-ID': 'com.moutai.mall', + 'mt-lng': user_data.lot, + 'mt-lat': user_data.lat + } + let d = { + "itemInfoList": [{ + "count": 1, + "itemId": itemCode + }], + "sessionId": user_data.sessionId, + "userId": user_data.userId, + "shopId": shopId + } + url = String.format(api_url.param_url, Base64.encode(JSON.stringify(d))) + //console.log(url) + let res2 = request({ + url: url, + method: "get" + }) + //console.log(`预约sign:${JSON.stringify(res)}预约请求:${JSON.stringify(res2)}`) + request({ + url: api_url.add_url, + method: "post", + dataType: "json", + headers: header, + body: { + 'actParam': res2 + } + }, function (error, response, header, body) { + let content = `${plugin_name}:【预约账号】${user_data.mobile} 【预约商品】:${itemName}【预约省市县区】:${user_data.province}-${user_data.city}-${user_data.districtName}\n【预约结果】:${JSON.stringify(response)}` + if (body && body.code === 2000) { + content = `${plugin_name}申购通知\n【预约账号】${user_data.mobile}\n【预约商品】:${itemName}\n【预约省市县区】:${user_data.province}-${user_data.city}-${user_data.districtName}\n【预约结果】:${body.data.successDesc}\n【其他提醒】:${body.data.reservationDetail.desc}` + + } else { + content = `${plugin_name}申购通知\n【预约账号】${user_data.mobile} \n【预约商品】:${itemName}\n【预约省市县区】:${user_data.province}-${user_data.city}-${user_data.districtName}\n【预约结果】:${body.message},请发送:mtt 查看预约申购结果` + + } + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, content) + }) +} + +/* 定时签到 + * @param {Object} tokenArr + */ +function cronTask() { + + let platFormArr = platformArr(plugin_key_pre) + for (const p of platFormArr) { + + let user_data_arr = bucketKeys(p.platform) + console.log(`${plugin_name}:${p.platform}:${JSON.stringify(user_data_arr)}`) + if (user_data_arr) { + for (let i = 0; i < user_data_arr.length; i++) { + let slee = Math.random() * delay_time + sleep(slee) + try { + let user_data = JSON.parse(user_data_arr[i]) + user_data = removeSpecialChars(user_data) + user_data.push_user_id = bucketGet(p.platform, user_data_arr[i]); + user_data.push_user_imType = p.imType + user_data.mt_v = mt_v + if (!user_data.province || !user_data.city || !user_data.districtName || !user_data.lot || !user_data.lat) { + notifyMasters(`茅台用户数据未配置完成,已跳过申购,请联系该用户${user_data.push_user_imType}:${user_data.push_user_id}`) + continue + } + if (user_data.mt_source) { + if (user_data.expires && user_data.expires < getTimestamp()) { + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, "授权到期,请发送茅台登陆,续费!") + continue; + } + check_denpcy("茅台sms登陆.js") + user_data.mt_tokenn = Base64.decode(user_data.mt_tokenn) + user_data.mt_token_wap = Base64.decode(user_data.mt_token_wap) + } + user_data.districtName_arr = user_data.districtName.split(",") + get_map(user_data) + sleep(1000) + getsessionId(user_data) + sleep(1000) + get_user_id(user_data) + if (user_data.status!==200){ + continue + } + sleep(1000) + for (let itemCode of user_data.itemCodes) { + if (res_map[itemCode]) { + sleep(2000) + get_shop_item(user_data, itemCode, res_map[itemCode]); + } + } + + sleep(5000) + } catch (e) { + console.log(e.message) + } + } + } + } + + +} + +/* 申购结果查询 + * @param {Object} tokenArr + */ +function notifyMtResult() { + + let platFormArr = platformArr(plugin_key_pre) + for (const p of platFormArr) { + let user_data_arr = bucketKeys(p.platform) + if (user_data_arr) { + for (let i = 0; i < user_data_arr.length; i++) { + let user_data = JSON.parse(user_data_arr[i]) + user_data.push_user_id = bucketGet(p.platform, user_data_arr[i]); + user_data.push_user_imType = p.imType + user_data.push_user_imType = p.imType + if (user_data.mt_source) { + if (user_data.expires && user_data.expires < getTimestamp()) { + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, "授权到期,请发送茅台登陆,续费!") + continue; + } + check_denpcy("茅台sms登陆.js") + user_data.mt_tokenn = Base64.decode(user_data.mt_tokenn) + user_data.mt_token_wap = Base64.decode(user_data.mt_token_wap) + } + getReservationList(user_data) + sleep(3000) + } + } + } +} + +function getReservationList(user_data) { + let header = { + 'X-Requested-With': 'XMLHttpRequest', + 'User-Agent': `Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 moutaiapp/${mt_v} device-id/${user_data.mt_device_id}`, + 'Referer': 'https://h5.moutai519.com.cn/gux/game/main?appConfig=2_1_2', + 'Client-User-Agent': 'iOS;15.0.1;Apple;iPhone 12 ProMax', + 'MT-R': mt_r, + 'Origin': 'https://h5.moutai519.com.cn', + 'mt-app-version': mt_v, + 'MT-Request-ID': call("uuid")(), + 'MT-Token': user_data.mt_tokenn, + 'Accept-Language': 'zh-CN,zh-Hans;q=0.9', + 'MT-Device-ID': user_data.mt_device_id, + 'Accept': 'application/json, text/javascript, */*; q=0.01', + } + + request({ + url: `https://app.moutai519.com.cn/xhr/front/mall/reservation/list/pageOne/query`, + method: "get", + dataType: "json", + headers: header, + }, function (error, response, header, body) { + //sendText(JSON.stringify(body)) + if (!error && response.statusCode === 200 && body.code === 2000 && body.data && body.data.reservationItemVOS) { + let reservationItemVOS = body.data.reservationItemVOS.filter(o => { + console.log(`${reserveStartTime},${o.reserveStartTime}`) + return o.reserveStartTime === reserveStartTime + }) + console.log(JSON.stringify(reservationItemVOS)) + if (reservationItemVOS.length > 0) { + reservationItemVOS.forEach(o => { + user_data.reservationId = o.reservationId; + queryMtResult(user_data) + }) + } else { + let content = `${plugin_name}申购结果通知\n【任务账号】:${user_data.mobile}\n` + content += `今日无申购记录,待申购之后再来查询吧!` + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, content) + } + } else { + let content = `${plugin_name}申购结果通知\n【任务账号】:${user_data.mobile}\n` + content += `今日无申购记录,待申购之后再来查询吧!` + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, content) + } + }) +} + + +function queryMtResult(user_data) { + let header = { + 'X-Requested-With': 'XMLHttpRequest', + 'User-Agent': `Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 moutaiapp/${mt_v} device-id/${user_data.mt_device_id}`, + 'Referer': 'https://h5.moutai519.com.cn/gux/game/main?appConfig=2_1_2', + 'Client-User-Agent': 'iOS;15.4.1;Apple;iPhone 12 ProMax', + 'MT-R': mt_r, + 'Origin': 'https://h5.moutai519.com.cn', + 'mt-app-version': mt_v, + 'MT-Request-ID': call("uuid")(), + 'MT-Token-Wap': user_data.mt_token_wap, + 'MT-Token': user_data.mt_tokenn, + 'Accept-Language': 'zh-CN,zh-Hans;q=0.9', + 'MT-Device-ID': user_data.mt_device_id, + 'Accept': 'application/json, text/javascript, */*; q=0.01', + 'mt-lng': user_data.lot, + 'mt-lat': user_data.lat, + 'Cookie': `MT-Device-ID-Wap=${user_data.mt_device_id};MT-Token-Wap=${user_data.mt_token_wap};YX_SUPPORT_WEBP=1` + } + + request({ + url: `https://app.moutai519.com.cn/xhr/front/mall/reservation/detail/query?reservationId=${user_data.reservationId}`, + method: "get", + dataType: "json", + headers: header, + }, function (error, response, header, body) { + let content = `${plugin_name}申购结果通知 【任务账号】:${user_data.mobile} 【申购结果】:${JSON.stringify(response)}` + console.log(content) + if (!error && response.statusCode === 200 && body.code === 2000 && body.data) { + let shopVO = body.data.shopVO; + let itemVOList = body.data.itemVOList; + let shopContent = `【自提店铺】:${shopVO.name}\n【自提地址】:${shopVO.fullAddress}\n【销售单位】:${shopVO.ownerName}` + let item = `` + itemVOList.forEach(o => { + item += `\n【商品名称】:${o.title}\n【商品价格】:${o.price}\n【商品数量】:${o.count}\n` + }) + let statusVal = '' + switch (body.data.status) { + case 2: + statusVal = "【申购结果】:✅恭喜!!!,申购成功!"; + user_data.qq_masters = bucketGet("qq", 'masters') + user_data.wx_masters = bucketGet("wx", 'masters') + user_data.tg_masters = bucketGet("qq", 'masters') + request({url: `${server_url}/notify`, method: "post", json: true, body: JSON.stringify(user_data)}) + break; + case 1: + statusVal = "【申购结果】:❌哦哦......,申购失败了,明天继续努力!" + break; + case 0: + statusVal = "【申购结果】:稍安勿躁,申购结果当日18:00公布!" + } + content = `${plugin_name}申购结果通知\n【任务账号】:${user_data.mobile}\n${shopContent}${item}${statusVal}` + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, content) + + } + }) +} + + +//编辑用户信息 +function edit_user_mt(user_data) { + let content = `${app_name}请选择要编辑的属性序号(q:退出)` + content += `\n⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️` + content += `\n⚠️看三遍之后有问题再找我咨询⚠️️` + content += `\n⚠️输入序号,会提示你怎么填写⚠️` + content += `\n⚠️只需要修改"请填写"的,其他不用管⚠️` + content += `\n⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️` + if (!user_data.timestamp) { + user_data.timestamp = getTimestamp(); + } + if (!user_data.expires) { + user_data.expires = getNextMonthTimestamp(new Date()); + } + content += `\n1. 登陆时间:${getDateTime(new Date(user_data.timestamp))}` + content += `\n1. 授权到期:${getDateTime(new Date(user_data.expires))}` + content += `\n1. 登陆账号:${user_data.mobile}` + content += `\n2. 预约省份:${user_data.province ? user_data.province : "请填写"}` + content += `\n3. 预约城市:${user_data.city ? user_data.city : "请填写"}` + content += `\n4. 预约县区:${user_data.districtName ? user_data.districtName : "请填写"}` + content += `\n5. 经 度:${user_data.lot ? user_data.lot : "请填写"}` + content += `\n6. 纬 度:${user_data.lat ? user_data.lat : "请填写"}` + content += `\n7. 设备id:${user_data.mt_device_id}` + content += `\n8. token:******` + content += `\n9. 小茅运token:******` + content += `\n10. 商品编号:${user_data.itemCodes ? user_data.itemCodes : "请填写"}` + content += `\n11. app版本号:${mt_v}` + sendText(content) + const p = input(120000) + if (!p || p === "q") { + bucketSet(plugin_key_pre + imType, JSON.stringify(user_data), userId) + return sendText(`${app_name}:已退出`) + } + switch (p) { + case "1": + edit_user_mt(user_data) + break; + case "2": + sendText("请在【2分钟】内预约省份(例如 河南省):") + const province = input(120000); + if (province && province !== "q") { + user_data.province = province + } + edit_user_mt(user_data) + break; + case "3": + sendText("请在【2分钟】内预约省份(例如 洛阳市):") + const city = input(120000); + if (city && city !== "q") { + user_data.city = city + } + edit_user_mt(user_data) + break; + case "4": + sendText(`请在【2分钟】内输入当前位置的所在县或者区(例如,宜阳县)\n\n多个县区,请使用英文逗号分隔(例如:朝阳区,海淀区)`); + const districtName = input(120000); + if (districtName && districtName !== "q") { + user_data.districtName = districtName + } + edit_user_mt(user_data) + break; + case "5": + sendText("请在【2分钟】内输入所在地的经度:(打开网址http://jingweidu.757dy.com复制经度)") + const lot = input(120000); + if (lot && lot !== "q") { + user_data.lot = lot + } + edit_user_mt(user_data) + break; + case "6": + sendText("请在【2分钟】内输入所在地的纬度:(打开网址http://jingweidu.757dy.com,复制纬度)") + const lat = input(120000); + if (lat && lat !== "q") { + user_data.lat = lat + } + edit_user_mt(user_data) + break; + case "10": + sendText(`${plugin_name}:请在【2分钟】内输入你要申购商品的编号,【】中的数字(多个编号,请用英文逗号分隔)\n${choose_items}`); + const itemCodes = input(120000); + if (itemCodes && itemCodes !== "q") { + user_data.itemCodes = itemCodes.split(",") + } + edit_user_mt(user_data) + break; + // case "11": + // sendText(`${plugin_name}:请在【2分钟】内输入你设备上的【i茅台】app 版本号 查看路径打开app-我的-设置-关于APP (示例:1.3.7)`); + // const mt_ver = input(120000); + // if (mt_ver && mt_ver !== "q") { + // mt_v = mt_ver + // } + // edit_user_mt(user_data) + // break; + default: + bucketSet(plugin_key_pre + imType, JSON.stringify(user_data), userId) + breakIn("q") + break; + } + +} + + + +function check_denpcy(plugin){ + try { + if(aut_ver>"2.6.5" && get("env") !== "dev"){ + plugin = `funyhook:${plugin}` + } + importJs(plugin) + } catch (e) { + let content = `${getTitle()}请检查是否安装以下依赖插件:` + content += `\n【${plugin}】` + content += `\n请前往autman面板-市场管理-应用市场-【funyhook】-安装缺失插件` + console.log(content) + throw new Error(content) + } +} + + +function main() { + check_denpcy("hook.js") + console.log(update) + if (update){ + return + } + get_mt_ver() + let checkRes = check("imt_sms_") + if (checkRes === null || !checkRes.api) return; + console.log(checkRes) + api_url = checkRes.api + if (imType === "fake" || msg === "mtfk") { + console.log(dateTime.split(" ")[1].split(":")[0]) + if (dateTime.split(" ")[1].split(":")[0] === "18") { + console.log(`${plugin_name}: ${timeFmt()}:开始自动推送预约申购结果......`) + notifyMtResult() + } else { + console.log(`${plugin_name}: ${timeFmt()}:开始自动预约......`) + cronTask(); + } + } else { + if (msg === "茅台" || msg === "mt") { + let user_data_arr = bucketKeys(plugin_key_pre + imType, userId) + if (user_data_arr.length === 0) { + return sendText("请发送:茅台登陆/茅台登录") + } + // if (9 !== getHour()) { + // return sendText(`${plugin_name}:当前非申购时间(09:00-10:00)!`) + // } + sendText(`${plugin_name}:开始申购,请稍后......`) + try { + console.log(user_data_arr) + for (let i = 0; i < user_data_arr.length; i++) { + let slee = Math.random() * delay_time + sleep(slee) + let user_data = JSON.parse(user_data_arr[i]) + user_data = removeSpecialChars(user_data) + user_data.push_user_id = userId + user_data.push_user_imType = imType + user_data.mt_v=mt_v + if (!user_data.province || !user_data.city || !user_data.districtName || !user_data.lot || !user_data.lat) { + notifyMasters(`茅台用户数据未配置完成,已跳过申购,请联系该用户${user_data.push_user_imType}:${user_data.push_user_id}`) + continue + } + if (user_data.mt_source) { + if (user_data.expires && user_data.expires < getTimestamp()) { + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, "授权到期,请发送茅台登陆,续费!") + continue; + } + check_denpcy("茅台sms登陆.js") + user_data.mt_tokenn = Base64.decode(user_data.mt_tokenn) + user_data.mt_token_wap = Base64.decode(user_data.mt_token_wap) + } + get_map(user_data) + sleep(1000) + getsessionId(user_data) + sleep(1000) + get_user_id(user_data) + if (user_data.status!==200){ + continue + } + user_data.districtName_arr = user_data.districtName.split(",") + if (!user_data.itemCodes || user_data.itemCodes.length === 0) { + return sendText(`${plugin_name}:警告:不配置商品,申购个鸡毛?!`) + } + for (let itemCode of user_data.itemCodes) { + console.error("商品编码::::=>"+itemCode) + if (res_map[itemCode]) { + sleep(2000) + get_shop_item(user_data, itemCode, res_map[itemCode]); + } else { + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, "沙雕,茅台商品编号配置错了!!!,请发送:茅台管理,重新编辑你的申购商品编号!!!") + } + + } + sleep(Math.round(Math.random() * 5000)) + + } + } catch (e) { + console.log(`${plugin_name}:::发生错误:${e}`) + notifyMasters(`${plugin_name}:::发生错误:${e},请联系插件作者!!!`) + } + } + if (msg === "茅台管理") { + let user_data_arr = bucketKeys(plugin_key_pre + imType, userId) + console.log(user_data_arr) + let content = `${plugin_name}:请选择${app_name}账号查看详情:(-删除,0增加, q退出)` + for (let i = 0; i < user_data_arr.length; i++) { + let user_data = JSON.parse(user_data_arr[i]); + if (user_data.mobile) { + user_data.mobile = user_data.mobile.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2') + user_data.id = i + //return bucketSet(plugin_key_pre + imType, JSON.stringify(user_data), userId) + } + content += "\n" + (i + 1) + "." + user_data.mobile + } + sendText(content) + let q = input(120000) + if (!q || q === "q") { + return sendText(`${plugin_name}:已退出`) + } + if (q.substr(0, 1) === "-") { + bucketDel(plugin_key_pre + imType, user_data_arr[q["1"] - 1]) + user_data_arr = bucketKeys(plugin_key_pre + imType) + if (isAdmin()) { + user_data_arr = bucketKeys(plugin_key_pre + imType) + } + if (!user_data_arr || user_data_arr.length < 0) { + return sendText(`${plugin_name}:未设置${app_name}账户信息,请发送:茅台`) + } else { + breakIn("茅台管理") + } + } else if (q === "0") { + if (user_data_arr.length >= 10) { + return sendText(`${plugin_name}:警告:本插件防黑,自动限制每位用户添加10个账户,如有特殊需求,请联系插件作者!`) + } else { + return sendText("请发送:茅台登陆/茅台登录") + } + } else if (!isNaN(q)) { + if (q <= user_data_arr.length) { + let user_data = JSON.parse(user_data_arr[q - 1]) + if (!user_data.mobile) { + get_user_id(user_data) + } + bucketDel(plugin_key_pre + imType, JSON.stringify(user_data)) + edit_user_mt(user_data) + } else { + breakIn("茅台管理") + } + } + + } + if (msg === "mtt") { + if (getHour() > 0 && getHour() < 18) { + return sendText(`${plugin_name}:今日申购未开始/结束,请在当日18:00后查询!!`) + } + sendText(`${plugin_name}:申购结果查询中,请稍后......`) + let slee = Math.random() * delay_time + sleep(slee) + let user_data_arr = bucketKeys(plugin_key_pre + imType, userId) + for (let i = 0; i < user_data_arr.length; i++) { + let user_data = JSON.parse(user_data_arr[i]) + user_data.push_user_id = userId; + user_data.push_user_imType = imType + if (user_data.mt_source) { + if (user_data.expires && user_data.expires < getTimestamp()) { + pushMsg(user_data.push_user_id, user_data.push_user_imType, chatId, "授权到期,请发送茅台登陆,续费!") + continue; + } + check_denpcy("茅台sms登陆.js") + user_data.mt_tokenn = Base64.decode(user_data.mt_tokenn) + user_data.mt_token_wap = Base64.decode(user_data.mt_token_wap) + } + console.log(`${plugin_name}: 用户【${user_data.mobile}】信息${JSON.stringify(user_data)}`) + //getXiaoMaoYun(user_data) + getReservationList(user_data) + } + } + if (msg === "茅台超级管理" && isAdmin()) { + let user_data_arr = [] + let content = `i茅台上车用户,输入序号查看详情:(-删除;例如 -1 就是删除第一个)` + let index = 1 + for (const plat of platformArr(plugin_key_pre)) { + let arr = bucketKeys(plat.platform) + console.log(`${plat.platform}::${arr.length}`) + if (arr) { + for (let i = 0; i < arr.length; i++) { + let user_data = JSON.parse(arr[i]) + user_data.plat_id = bucketGet(plugin_key_pre + plat.imType, arr[i]) + user_data.index = i + user_data.plat = plat.imType + if (user_data.mobile) { + user_data.mobile = user_data.mobile.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2') + user_data.id = i + } + user_data.str = arr[i] + user_data.key = plat.platform + user_data_arr.push(user_data) + if (!user_data.expires) { + user_data.expires = getNextMonthTimestamp(new Date()) + } + content += `\n${index}.[${user_data.plat}]${user_data.mobile} 到期:${getDateTime(new Date(user_data.expires)).split(" ")[0]}` + index++ + } + + } + } + if (user_data_arr.length > 0) { + sendText(content) + } else { + sendText("暂无韭菜上车!") + } + // console.log(user_data_arr) + let no = input(12000) + if (no.startsWith("-")){ + let del = user_data_arr[no["1"]-1]; + if (del){ + bucketDel(del.key,del.str) + breakIn("茅台超级管理") + return + } + } + if (!no || no === "q") { + return sendText("已退出!") + } + if (isNaN(no)) { + return sendText("输入有误,已退出!") + } + if (no < 0 || no > user_data_arr.length) { + return breakIn("茅台超级管理") + } + let user_data = user_data_arr[no - 1] + if (!user_data.mobile) { + get_user_id(user_data) + if (user_data.status!==200){ + return + } + } + if (!user_data.timestamp) { + user_data.timestamp = getTimestamp(); + } + if (!user_data.expires) { + user_data.expires = getNextMonthTimestamp(new Date()); + } + user_data.mobile = user_data.mobile.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2') + content = `-----${app_name}用户详情:-----` + content += `\n绑定平台:${user_data.plat}` + content += `\n绑定账号:${user_data.plat_id}` + content += `\n登陆时间:${getDateTime(new Date(user_data.timestamp))}` + content += `\n授权到期:${getDateTime(new Date(user_data.expires))}` + content += `\n输入0,修改授权到期时间` + content += `\n----------------` + content += `\n1. 登陆账号:${user_data.mobile}` + content += `\n2. 预约省份:${user_data.province ? user_data.province : "请填写"}` + content += `\n3. 预约城市:${user_data.city ? user_data.city : "请填写"}` + content += `\n4. 预约县区:${user_data.districtName ? user_data.districtName : "请填写"}` + content += `\n5. 预约经度:${user_data.lot ? user_data.lot : "请填写"}` + content += `\n6. 预约纬度:${user_data.lat ? user_data.lat : "请填写"}` + content += `\n7. 预约商品:${user_data.itemCodes ? user_data.itemCodes : "请填写"}` + content += `\n8. app版本:${mt_v ? mt_v : "请填写"}` + content += `\n9. 设备id:******` + content += `\n10. mt-token:******` + content += `\n11. 小茅运token:******` + sendText(content) + let ze = input(12000) + if (!ze || ze === "q" ) { + return sendText("已退出!") + } + if (ze !== "0") { + return sendText("输入有误,已退出!") + } + sendText("请输入延期数字(单位:月)只需输入数字即可(q:退出)") + let month = input(12000) + if (!month || month === "q" ) { + return sendText("已退出!") + } + if (isNaN(month)) { + return sendText("格式错误,已退出!") + } + console.log(user_data.expires) + console.log(new Date(user_data.expires)) + for (let index = 0; index <= month; index++) { + user_data.expires = getNextMonthTimestamp(new Date(user_data.expires)) + } + sendText(`是否将用户的授权到期时间延迟至:${getDateTime(new Date(user_data.expires))},请输入y/n(q:退出)`) + let confirm = input(12000) + if (!confirm || confirm === "q" |confirm === "n") { + return sendText("未保存,已退出!") + } + + } + } +} + +main()