├── README.md ├── huluwa-notify.js ├── huluwa.js └── imaotai.py /README.md: -------------------------------------------------------------------------------- 1 | # Notice 2 | 3 | ``` 4 | 2023/06/20 5 | 这个项目是从2023年6月开始的,感谢期间捐赠过我的所有人。 6 | 我对于作弊本身并无兴趣,只是对逆向工程和破解稍有兴趣,喜欢自己写点小玩意。 7 | 项目之所以免费放出,是因为我讨厌那些靠卖盈利的人。 8 | 9 | 综上,由于个人精力有限,项目目前功能不多。 10 | 11 | Thanks to everyone who supported me before, this repository is currently suspended. 12 | ``` 13 | 14 | ## 项目介绍 15 | 16 | 本项目由nodejs开发,系统会每日进行预约葫芦娃,i茅台 17 | 18 | 葫芦娃中奖通知暂时没做,有查询接口的可以在issues中 提供下方便后期对接 19 | 20 | ~~在线预约平台正在开发新版本中,原有平台已废弃,请大家敬请期待~~ 21 | 22 | ~~推荐一个在线预约平台:[https://github.com/bxgh01/maotai.git](https://github.com/bxgh01/maotai.git)(支持葫芦娃+i茅台在线预约)~~ 23 | 24 | ## 拉库指令 25 | 26 | 青龙拉库指令 `ql repo https://github.com/yize8888/maotai.git` 27 | 28 | ## 环境变量 29 | 30 | - 抓包工具(4.30更新): [点击进入](https://github.com/yize8888/maotai/releases) (PS:需安装指定微信版本) 31 | 32 | | 平台名称 | 环境变量 | Token | 33 | |--------|-------------|-------------| 34 | | 新联惠购 | XLTH_COOKIE | 这里填写Token | 35 | | 贵旅优品 | GLYP_COOKIE | 这里填写Token | 36 | | 空港乐购 | KGLG_COOKIE | 这里填写Token | 37 | | 航旅黔购 | HLQG_COOKIE | 这里填写Token | 38 | | 遵航出山 | ZHCS_COOKIE | 这里填写Token | 39 | | 贵盐黔品 | GYQP_COOKIE | 这里填写Token | 40 | | 乐旅商城 | LLSC_COOKIE | 这里填写Token | 41 | | 驿路黔寻 | YLQX_COOKIE | 这里填写Token | 42 | 43 | ## 关注&交流 44 | 45 | 私信不解决项目问题,如有问题请提交 issues! 46 | 47 | 欢迎各位老哥进群**技术交流**(只交流技术,不谈茅台!) 48 | 49 | [![点击加入TG群](https://img.shields.io/badge/Telegram-Group-blue)](https://t.me/baxianguohai1) [![点击加入QQ群1](https://img.shields.io/badge/QQ群1(已满)-Group-blue)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=BrlRQjmdywsSx4ND3Q2G8qb86I-W_hc-&authKey=M4kTEft46WcUOqqyUns2aZ5L22A28050fUNIgGAqZgAWMcOGZRQRLTaD0KSj4G9F&noverify=0&group_code=675608101) [![点击加入QQ群2](https://img.shields.io/badge/QQ群2-Group-blue)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=PngOHp0TYVK2oMCEg_X5fPsjaUw9_W-T&authKey=MVdzvz%2BeRHgEqOVs6mbcwbxma8KwJU4dm%2FGs5Of74MzS1s%2Fh3URSutaPhAV2asHQ&noverify=0&group_code=813212751) [![GitHub stars](https://img.shields.io/github/stars/yize8888/maotai.svg?style=social&label=Stars)](https://github.com/yize8888/maotai.git) 50 | 51 | ## 贡献代码 52 | 53 | 2024-02-19葫芦娃青龙脚本已开源 54 | 55 | 若您有好的想法,发现一些 **BUG** 并修复了,欢迎提交 **Pull Request** 参与开源贡献 56 | 57 | 发起 pull request 请求,提交到 master 分支,等待作者合并 58 | 59 | ## star 趋势图 60 | 61 | ![Stargazers over time](https://starchart.cc/yize8888/maotai.svg) 62 | 63 | ## 友情链接 64 | 65 | Campus-imaotai:[https://github.com/oddfar/campus-imaotai](https://github.com/oddfar/campus-imaotai)(支持i茅台+开源) 66 | 67 | ## 声明 68 | 本项目仅做个人学习用途,我不会对因为滥用该项目导致的任何问题负责。 69 | -------------------------------------------------------------------------------- /huluwa-notify.js: -------------------------------------------------------------------------------- 1 | /** 2 | 葫芦娃中签查询 v1.0.0 3 | 4 | cron: 30 8 * * * 5 | const $ = new Env("葫芦娃中签查询"); 6 | 7 | 自行抓包把token(一般在请求头里)填到变量中, 多账号用换行隔开(可自定义) 8 | 9 | 环境变量 XLTH_COOKIE 新联惠购 10 | 环境变量 GLYP_COOKIE 贵旅优品 11 | 环境变量 KGLG_COOKIE 空港乐购 12 | 环境变量 HLQG_COOKIE 航旅黔购 13 | 环境变量 ZHCS_COOKIE 遵行出山 14 | 环境变量 GYQP_COOKIE 贵盐黔品 15 | 环境变量 LLSC_COOKIE 乐旅商城 16 | 环境变量 YLQX_COOKIE 驿路黔寻 17 | */ 18 | 19 | const SPLIT = "\n"; // 分割符(可自定义) 20 | 21 | const axios = require('axios'); 22 | const crypto = require('crypto'); 23 | const moment = require('moment'); 24 | const notify = require('./sendNotify'); 25 | 26 | const XLTH_APPID = 'wxded2e7e6d60ac09d'; // 新联惠购 27 | const GLYP_APPID = 'wx61549642d715f361'; // 贵旅优品 28 | const KGLG_APPID = 'wx613ba8ea6a002aa8'; // 空港乐购 29 | const HLQG_APPID = 'wx936aa5357931e226'; // 航旅黔购 30 | const ZHCS_APPID = 'wx624149b74233c99a'; // 遵航出山 31 | const GYQP_APPID = 'wx5508e31ffe9366b8'; // 贵盐黔品 32 | const LLSC_APPID = 'wx821fb4d8604ed4d6'; // 乐旅商城 33 | const YLQX_APPID = 'wxee0ce83ab4b26f9c'; // 驿路黔寻 34 | 35 | const HOST = 'https://gw.huiqunchina.com'; 36 | const AK = '00670fb03584fbf44dd6b136e534f495'; 37 | const SK = '0d65f24dbe2bc1ede3c3ceeb96ef71bb'; 38 | 39 | let sendMessage = []; 40 | 41 | function delay (time) { 42 | return new Promise(resolve => setTimeout(resolve, time)); 43 | } 44 | 45 | function calculateDigest (body, sk) { 46 | const hmac = crypto.createHmac('sha256', sk); 47 | hmac.update(body); 48 | const signature = hmac.digest('base64'); 49 | return signature; 50 | } 51 | 52 | function calculateSignature (method, url, ak, sk, date) { 53 | const strToSign = `${method.toUpperCase()}\n${url}\n\n${ak}\n${date}\n`; 54 | const hmac = crypto.createHmac('sha256', sk); 55 | hmac.update(strToSign); 56 | const signature = hmac.digest('base64'); 57 | return signature; 58 | } 59 | 60 | function buildHeader (method, url, body) { 61 | const date = moment().utc().format('ddd, DD MMM YYYY HH:mm:ss [GMT]'); 62 | const signature = calculateSignature(method, url, AK, SK, date); 63 | const digest = calculateDigest(body, SK); 64 | const headers = { 65 | 'Content-Type': 'application/json', 66 | 'X-HMAC-SIGNATURE': signature, 67 | 'X-HMAC-ACCESS-KEY': AK, 68 | 'X-HMAC-ALGORITHM': 'hmac-sha256', 69 | 'X-HMAC-DIGEST': digest, 70 | 'X-HMAC-Date': date, 71 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/6945' 72 | }; 73 | return headers; 74 | } 75 | 76 | async function getUserInfo (appId, token) { 77 | const url = '/front-manager/api/customer/queryById/token'; 78 | const method = 'post'; 79 | const data = { appId }; 80 | const headers = buildHeader(method, url, JSON.stringify(data)); 81 | headers['X-access-token'] = token; 82 | 83 | let resData; 84 | await axios(HOST + url, { method: method, data: data, headers: headers }) 85 | .then(res => { 86 | resData = res.data; 87 | }) 88 | .catch(err => { 89 | resData = err.response.data; 90 | }); 91 | return resData; 92 | } 93 | 94 | async function getChannelActivity (id, token) { 95 | const url = '/front-manager/api/customer/promotion/channelActivity'; 96 | const method = 'post'; 97 | const data = { id }; 98 | const headers = buildHeader(method, url, JSON.stringify(data)); 99 | headers['X-access-token'] = token; 100 | 101 | let resData; 102 | await axios(HOST + url, { method: method, data: data, headers: headers }) 103 | .then(res => { 104 | resData = res.data; 105 | }) 106 | .catch(err => { 107 | resData = err.response.data; 108 | }); 109 | return resData; 110 | } 111 | 112 | 113 | /** 查询 */ 114 | async function getWinningCustomers (activityId, token) { 115 | const url = '/front-manager/api/customer/promotion/getWinningCustomers'; 116 | const method = 'post'; 117 | const data = { activityId }; 118 | const headers = buildHeader(method, url, JSON.stringify(data)); 119 | headers['X-access-token'] = token; 120 | 121 | let resData; 122 | await axios(HOST + url, { method: method, data: data, headers: headers }) 123 | .then(res => { 124 | resData = res.data; 125 | }) 126 | .catch(err => { 127 | resData = err.response.data; 128 | }); 129 | return resData; 130 | } 131 | 132 | async function autoSubmit (appId, token) { 133 | let channelId = ''; 134 | let channelName = ''; 135 | if (appId === XLTH_APPID) { 136 | channelId = '8'; 137 | channelName = '新联惠购'; 138 | } 139 | if (appId === GLYP_APPID) { 140 | channelId = '7'; 141 | channelName = '贵旅优品'; 142 | } 143 | if (appId === KGLG_APPID) { 144 | channelId = '2'; 145 | channelName = '空港乐购'; 146 | } 147 | if (appId === HLQG_APPID) { 148 | channelId = '6'; 149 | channelName = '航旅黔购'; 150 | } 151 | if (appId === ZHCS_APPID) { 152 | channelId = '5'; 153 | channelName = '遵行出山'; 154 | } 155 | if (appId === GYQP_APPID) { 156 | channelId = '3'; 157 | channelName = '贵盐黔品'; 158 | } 159 | if (appId === LLSC_APPID) { 160 | channelId = '1'; 161 | channelName = '乐旅商城'; 162 | } 163 | if (appId === YLQX_APPID) { 164 | channelId = '9'; 165 | channelName = '驿路黔寻'; 166 | } 167 | 168 | try { 169 | const res1 = await getUserInfo(appId, token); 170 | if (res1.code != '10000') { 171 | console.log(res1.message); 172 | sendMessage.push(res1.message); 173 | return; 174 | } 175 | const realName = res1.data.realName; 176 | const phone = res1.data.phone; 177 | console.log(`当前用户[${phone}]`); 178 | sendMessage.push(`当前用户[${phone}]`); 179 | 180 | const res2 = await getChannelActivity(channelId, token); 181 | if (res2.code != '10000') { 182 | console.log(res2.message); 183 | sendMessage.push(res2.message); 184 | return; 185 | } 186 | const activityId = res2.data.id; 187 | const activityName = res2.data.name; 188 | console.log(`活动名称[${activityName}]`); 189 | sendMessage.push(`活动名称[${activityName}]`); 190 | 191 | const res5 = await getWinningCustomers(activityId, token) 192 | if (res5.code != '10000') { 193 | console.log(res5.message); 194 | sendMessage.push(res5.message); 195 | return; 196 | } 197 | console.log(`小程序:${channelName},活动名称「${activityName}」,中签结果:${res5.message ?? '--'}`); 198 | sendMessage.push(`小程序:${channelName},活动名称「${activityName}」,中签结果:${res5.message ?? '--'}`); 199 | 200 | // 发送飞书机器人 201 | 202 | } catch (err) { 203 | console.log(`运行异常[${err.message}]`); 204 | sendMessage.push(`运行异常[${err.message}]`); 205 | } 206 | } 207 | 208 | async function main () { 209 | const XLTH_COOKIE_ARR = process.env.XLTH_COOKIE; // 新联惠购 210 | const GLYP_COOKIE_ARR = process.env.GLYP_COOKIE; // 贵旅优品 211 | const KGLG_COOKIE_ARR = process.env.KGLG_COOKIE; // 空港乐购 212 | const HLQG_COOKIE_ARR = process.env.HLQG_COOKIE; // 航旅黔购 213 | const ZHCS_COOKIE_ARR = process.env.ZHCS_COOKIE; // 遵行出山 214 | const GYQP_COOKIE_ARR = process.env.GYQP_COOKIE; // 贵盐黔品 215 | const LLSC_COOKIE_ARR = process.env.LLSC_COOKIE; // 乐旅商城 216 | const YLQX_COOKIE_ARR = process.env.YLQX_COOKIE; // 驿路黔寻 217 | 218 | if (XLTH_COOKIE_ARR) { 219 | console.log('新联惠购查询开始'); 220 | sendMessage.push('新联惠购查询开始'); 221 | for (let [index, item] of XLTH_COOKIE_ARR.split(SPLIT).entries()) { 222 | console.log(`----第${index + 1}个号----`); 223 | sendMessage.push(`----第${index + 1}个号----`); 224 | await autoSubmit(XLTH_APPID, item); 225 | await delay(1000); 226 | } 227 | console.log('新联惠购查询结束\n'); 228 | sendMessage.push('新联惠购查询结束\n'); 229 | } 230 | 231 | if (GLYP_COOKIE_ARR) { 232 | console.log('贵旅优品查询开始'); 233 | sendMessage.push('贵旅优品查询开始'); 234 | for (let [index, item] of GLYP_COOKIE_ARR.split(SPLIT).entries()) { 235 | console.log(`----第${index + 1}个号----`); 236 | sendMessage.push(`----第${index + 1}个号----`); 237 | await autoSubmit(GLYP_APPID, item); 238 | await delay(1000); 239 | } 240 | console.log('贵旅优品查询结束\n'); 241 | sendMessage.push('贵旅优品查询结束\n'); 242 | } 243 | 244 | if (KGLG_COOKIE_ARR) { 245 | console.log('空港乐购查询开始'); 246 | sendMessage.push('新联惠购查询开始'); 247 | for (let [index, item] of KGLG_COOKIE_ARR.split(SPLIT).entries()) { 248 | console.log(`----第${index + 1}个号----`); 249 | sendMessage.push(`----第${index + 1}个号----`); 250 | await autoSubmit(KGLG_APPID, item); 251 | await delay(1000); 252 | } 253 | console.log('空港乐购查询结束\n'); 254 | sendMessage.push('空港乐购查询结束\n'); 255 | } 256 | 257 | if (HLQG_COOKIE_ARR) { 258 | console.log('航旅黔购查询开始'); 259 | sendMessage.push('新联惠购查询开始'); 260 | for (let [index, item] of HLQG_COOKIE_ARR.split(SPLIT).entries()) { 261 | console.log(`----第${index + 1}个号----`); 262 | sendMessage.push(`----第${index + 1}个号----`); 263 | await autoSubmit(HLQG_APPID, item); 264 | await delay(1000); 265 | } 266 | console.log('航旅黔购查询结束\n'); 267 | sendMessage.push('航旅黔购查询结束\n'); 268 | } 269 | 270 | if (ZHCS_COOKIE_ARR) { 271 | console.log('遵行出山查询开始'); 272 | sendMessage.push('新联惠购查询开始'); 273 | for (let [index, item] of ZHCS_COOKIE_ARR.split(SPLIT).entries()) { 274 | console.log(`----第${index + 1}个号----`); 275 | sendMessage.push(`----第${index + 1}个号----`); 276 | await autoSubmit(ZHCS_APPID, item); 277 | await delay(1000); 278 | } 279 | console.log('遵行出山查询结束\n'); 280 | sendMessage.push('遵行出山查询结束\n'); 281 | } 282 | 283 | if (GYQP_COOKIE_ARR) { 284 | console.log('贵盐黔品查询开始'); 285 | sendMessage.push('贵盐黔品查询开始'); 286 | for (let [index, item] of GYQP_COOKIE_ARR.split(SPLIT).entries()) { 287 | console.log(`----第${index + 1}个号----`); 288 | sendMessage.push(`----第${index + 1}个号----`); 289 | await autoSubmit(GYQP_APPID, item); 290 | await delay(1000); 291 | } 292 | console.log('贵盐黔品查询结束\n'); 293 | sendMessage.push('贵盐黔品查询结束\n'); 294 | } 295 | 296 | if (LLSC_COOKIE_ARR) { 297 | console.log('乐旅商城查询开始'); 298 | sendMessage.push('乐旅商城查询开始'); 299 | for (let [index, item] of LLSC_COOKIE_ARR.split(SPLIT).entries()) { 300 | console.log(`----第${index + 1}个号----`); 301 | sendMessage.push(`----第${index + 1}个号----`); 302 | await autoSubmit(LLSC_APPID, item); 303 | await delay(1000); 304 | } 305 | console.log('乐旅商城查询结束\n'); 306 | sendMessage.push('乐旅商城查询结束\n'); 307 | } 308 | 309 | if (YLQX_COOKIE_ARR) { 310 | console.log('驿路黔寻查询开始'); 311 | sendMessage.push('驿路黔寻查询开始'); 312 | for (let [index, item] of YLQX_COOKIE_ARR.split(SPLIT).entries()) { 313 | console.log(`----第${index + 1}个号----`); 314 | sendMessage.push(`----第${index + 1}个号----`); 315 | await autoSubmit(YLQX_APPID, item); 316 | await delay(1000); 317 | } 318 | console.log('驿路黔寻查询结束\n'); 319 | sendMessage.push('驿路黔寻查询结束\n'); 320 | } 321 | 322 | await notify.sendNotify(`葫芦娃中签查询`, sendMessage.join('\n'), {},); 323 | } 324 | 325 | main(); 326 | -------------------------------------------------------------------------------- /huluwa.js: -------------------------------------------------------------------------------- 1 | /** 2 | 葫芦娃预约 v1.06 3 | 4 | cron: 30 8 * * * 5 | const $ = new Env("葫芦娃预约"); 6 | 7 | 自行抓包把token(一般在请求头里)填到变量中, 多账号用换行隔开(可自定义) 8 | 9 | 环境变量 XLTH_COOKIE 新联惠购 10 | 环境变量 GLYP_COOKIE 贵旅优品 11 | 环境变量 KGLG_COOKIE 空港乐购 12 | 环境变量 HLQG_COOKIE 航旅黔购 13 | 环境变量 ZHCS_COOKIE 遵行出山 14 | 环境变量 GYQP_COOKIE 贵盐黔品 15 | 环境变量 LLSC_COOKIE 乐旅商城 16 | 环境变量 YLQX_COOKIE 驿路黔寻 17 | */ 18 | 19 | const SPLIT = "\n"; // 分割符(可自定义) 20 | 21 | const axios = require('axios'); 22 | const crypto = require('crypto'); 23 | const moment = require('moment'); 24 | const notify = require('./sendNotify'); 25 | 26 | const XLTH_APPID = 'wxded2e7e6d60ac09d'; // 新联惠购 27 | const GLYP_APPID = 'wx61549642d715f361'; // 贵旅优品 28 | const KGLG_APPID = 'wx613ba8ea6a002aa8'; // 空港乐购 29 | const HLQG_APPID = 'wx936aa5357931e226'; // 航旅黔购 30 | const ZHCS_APPID = 'wx624149b74233c99a'; // 遵航出山 31 | const GYQP_APPID = 'wx5508e31ffe9366b8'; // 贵盐黔品 32 | const LLSC_APPID = 'wx821fb4d8604ed4d6'; // 乐旅商城 33 | const YLQX_APPID = 'wxee0ce83ab4b26f9c'; // 驿路黔寻 34 | 35 | const HOST = 'https://gw.huiqunchina.com'; 36 | const AK = '00670fb03584fbf44dd6b136e534f495'; 37 | const SK = '0d65f24dbe2bc1ede3c3ceeb96ef71bb'; 38 | 39 | let sendMessage = []; 40 | 41 | function delay(time) { 42 | return new Promise(resolve => setTimeout(resolve, time)); 43 | } 44 | 45 | function calculateDigest(body, sk) { 46 | const hmac = crypto.createHmac('sha256', sk); 47 | hmac.update(body); 48 | const signature = hmac.digest('base64'); 49 | return signature; 50 | } 51 | 52 | function calculateSignature(method, url, ak, sk, date) { 53 | const strToSign = `${method.toUpperCase()}\n${url}\n\n${ak}\n${date}\n`; 54 | const hmac = crypto.createHmac('sha256', sk); 55 | hmac.update(strToSign); 56 | const signature = hmac.digest('base64'); 57 | return signature; 58 | } 59 | 60 | function buildHeader(method, url, body) { 61 | const date = moment().utc().format('ddd, DD MMM YYYY HH:mm:ss [GMT]'); 62 | const signature = calculateSignature(method, url, AK, SK, date); 63 | const digest = calculateDigest(body, SK); 64 | const headers = { 65 | 'Content-Type': 'application/json', 66 | 'X-HMAC-SIGNATURE': signature, 67 | 'X-HMAC-ACCESS-KEY': AK, 68 | 'X-HMAC-ALGORITHM': 'hmac-sha256', 69 | 'X-HMAC-DIGEST': digest, 70 | 'X-HMAC-Date': date, 71 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/6945' 72 | }; 73 | return headers; 74 | } 75 | 76 | async function getUserInfo(appId, token) { 77 | const url = '/front-manager/api/customer/queryById/token'; 78 | const method = 'post'; 79 | const data = {appId}; 80 | const headers = buildHeader(method, url, JSON.stringify(data)); 81 | headers['X-access-token'] = token; 82 | 83 | let resData; 84 | await axios(HOST + url, {method: method, data: data, headers: headers}) 85 | .then(res => { 86 | resData = res.data; 87 | }) 88 | .catch(err => { 89 | resData = err.response.data; 90 | }); 91 | return resData; 92 | } 93 | 94 | async function getChannelActivity(id, token) { 95 | const url = '/front-manager/api/customer/promotion/channelActivity'; 96 | const method = 'post'; 97 | const data = {id}; 98 | const headers = buildHeader(method, url, JSON.stringify(data)); 99 | headers['X-access-token'] = token; 100 | 101 | let resData; 102 | await axios(HOST + url, {method: method, data: data, headers: headers}) 103 | .then(res => { 104 | resData = res.data; 105 | }) 106 | .catch(err => { 107 | resData = err.response.data; 108 | }); 109 | return resData; 110 | } 111 | 112 | async function getChannelInfoId(appId) { 113 | const url = '/front-manager/api/get/getChannelInfoId'; 114 | const method = 'post'; 115 | const data = {appId}; 116 | const headers = buildHeader(method, url, JSON.stringify(data)); 117 | headers['X-access-token'] = token; 118 | 119 | let resData; 120 | await axios(HOST + url, {method: method, data: data, headers: headers}) 121 | .then(res => { 122 | resData = res.data; 123 | }) 124 | .catch(err => { 125 | resData = err.response.data; 126 | }); 127 | return resData; 128 | } 129 | 130 | async function appoint(activityId, channelId, token) { 131 | const url = '/front-manager/api/customer/promotion/appoint'; 132 | const method = 'post'; 133 | const data = {activityId, channelId}; 134 | const headers = buildHeader(method, url, JSON.stringify(data)); 135 | headers['X-access-token'] = token; 136 | 137 | let resData; 138 | await axios(HOST + url, {method: method, data: data, headers: headers}) 139 | .then(res => { 140 | resData = res.data; 141 | }) 142 | .catch(err => { 143 | resData = err.response.data; 144 | }); 145 | return resData; 146 | } 147 | 148 | async function checkCustomerInQianggou(activityId, channelId, token) { 149 | const url = '/front-manager/api/customer/promotion/checkCustomerInQianggou'; 150 | const method = 'post'; 151 | const data = {activityId, channelId}; 152 | const headers = buildHeader(method, url, JSON.stringify(data)); 153 | headers['X-access-token'] = token; 154 | 155 | let resData; 156 | await axios(HOST + url, {method: method, data: data, headers: headers}) 157 | .then(res => { 158 | resData = res.data; 159 | }) 160 | .catch(err => { 161 | resData = err.response.data; 162 | }); 163 | return resData; 164 | } 165 | 166 | async function autoSubmit(appId, token) { 167 | let channelId = ''; 168 | let channelName = ''; 169 | if (appId === XLTH_APPID) { 170 | channelId = '8'; 171 | channelName = '新联惠购'; 172 | } 173 | if (appId === GLYP_APPID) { 174 | channelId = '7'; 175 | channelName = '贵旅优品'; 176 | } 177 | if (appId === KGLG_APPID) { 178 | channelId = '2'; 179 | channelName = '空港乐购'; 180 | } 181 | if (appId === HLQG_APPID) { 182 | channelId = '6'; 183 | channelName = '航旅黔购'; 184 | } 185 | if (appId === ZHCS_APPID) { 186 | channelId = '5'; 187 | channelName = '遵行出山'; 188 | } 189 | if (appId === GYQP_APPID) { 190 | channelId = '3'; 191 | channelName = '贵盐黔品'; 192 | } 193 | if (appId === LLSC_APPID) { 194 | channelId = '1'; 195 | channelName = '乐旅商城'; 196 | } 197 | if (appId === YLQX_APPID) { 198 | channelId = '9'; 199 | channelName = '驿路黔寻'; 200 | } 201 | 202 | try { 203 | const res1 = await getUserInfo(appId, token); 204 | if (res1.code != '10000') { 205 | console.log(res1.message); 206 | sendMessage.push(res1.message); 207 | return; 208 | } 209 | const realName = res1.data.realName; 210 | const phone = res1.data.phone; 211 | console.log(`当前用户[${phone}]`); 212 | sendMessage.push(`当前用户[${phone}]`); 213 | 214 | const res2 = await getChannelActivity(channelId, token); 215 | if (res2.code != '10000') { 216 | console.log(res2.message); 217 | sendMessage.push(res2.message); 218 | return; 219 | } 220 | const activityId = res2.data.id; 221 | const activityName = res2.data.name; 222 | console.log(`活动名称[${activityName}]`); 223 | sendMessage.push(`活动名称[${activityName}]`); 224 | 225 | const res3 = await checkCustomerInQianggou(activityId, channelId, token); 226 | if (res3.code != '10000') { 227 | console.log(res3.message); 228 | sendMessage.push(res3.message); 229 | return; 230 | } 231 | const data = res3.data; 232 | 233 | let message = '用户已经预约成功'; 234 | if (data == false) { 235 | const res4 = await appoint(activityId, channelId, token); 236 | this.sendMessage = res4.message; 237 | } 238 | console.log(`预约结果[${message}]`); 239 | sendMessage.push(`预约结果[${message}]`); 240 | } catch (err) { 241 | console.log(`运行异常[${err.message}]`); 242 | sendMessage.push(`运行异常[${err.message}]`); 243 | } 244 | } 245 | 246 | async function main() { 247 | const XLTH_COOKIE_ARR = process.env.XLTH_COOKIE; // 新联惠购 248 | const GLYP_COOKIE_ARR = process.env.GLYP_COOKIE; // 贵旅优品 249 | const KGLG_COOKIE_ARR = process.env.KGLG_COOKIE; // 空港乐购 250 | const HLQG_COOKIE_ARR = process.env.HLQG_COOKIE; // 航旅黔购 251 | const ZHCS_COOKIE_ARR = process.env.ZHCS_COOKIE; // 遵行出山 252 | const GYQP_COOKIE_ARR = process.env.GYQP_COOKIE; // 贵盐黔品 253 | const LLSC_COOKIE_ARR = process.env.LLSC_COOKIE; // 乐旅商城 254 | const YLQX_COOKIE_ARR = process.env.YLQX_COOKIE; // 驿路黔寻 255 | 256 | if (XLTH_COOKIE_ARR) { 257 | console.log('新联惠购预约开始'); 258 | sendMessage.push('新联惠购预约开始'); 259 | for (let [index, item] of XLTH_COOKIE_ARR.split(SPLIT).entries()) { 260 | console.log(`----第${index + 1}个号----`); 261 | sendMessage.push(`----第${index + 1}个号----`); 262 | await autoSubmit(XLTH_APPID, item); 263 | await delay(1000); 264 | } 265 | console.log('新联惠购预约结束\n'); 266 | sendMessage.push('新联惠购预约结束\n'); 267 | } 268 | 269 | if (GLYP_COOKIE_ARR) { 270 | console.log('贵旅优品预约开始'); 271 | sendMessage.push('贵旅优品预约开始'); 272 | for (let [index, item] of GLYP_COOKIE_ARR.split(SPLIT).entries()) { 273 | console.log(`----第${index + 1}个号----`); 274 | sendMessage.push(`----第${index + 1}个号----`); 275 | await autoSubmit(GLYP_APPID, item); 276 | await delay(1000); 277 | } 278 | console.log('贵旅优品预约结束\n'); 279 | sendMessage.push('贵旅优品预约结束\n'); 280 | } 281 | 282 | if (KGLG_COOKIE_ARR) { 283 | console.log('空港乐购预约开始'); 284 | sendMessage.push('新联惠购预约开始'); 285 | for (let [index, item] of KGLG_COOKIE_ARR.split(SPLIT).entries()) { 286 | console.log(`----第${index + 1}个号----`); 287 | sendMessage.push(`----第${index + 1}个号----`); 288 | await autoSubmit(KGLG_APPID, item); 289 | await delay(1000); 290 | } 291 | console.log('空港乐购预约结束\n'); 292 | sendMessage.push('空港乐购预约结束\n'); 293 | } 294 | 295 | if (HLQG_COOKIE_ARR) { 296 | console.log('航旅黔购预约开始'); 297 | sendMessage.push('新联惠购预约开始'); 298 | for (let [index, item] of HLQG_COOKIE_ARR.split(SPLIT).entries()) { 299 | console.log(`----第${index + 1}个号----`); 300 | sendMessage.push(`----第${index + 1}个号----`); 301 | await autoSubmit(HLQG_APPID, item); 302 | await delay(1000); 303 | } 304 | console.log('航旅黔购预约结束\n'); 305 | sendMessage.push('航旅黔购预约结束\n'); 306 | } 307 | 308 | if (ZHCS_COOKIE_ARR) { 309 | console.log('遵行出山预约开始'); 310 | sendMessage.push('新联惠购预约开始'); 311 | for (let [index, item] of ZHCS_COOKIE_ARR.split(SPLIT).entries()) { 312 | console.log(`----第${index + 1}个号----`); 313 | sendMessage.push(`----第${index + 1}个号----`); 314 | await autoSubmit(ZHCS_APPID, item); 315 | await delay(1000); 316 | } 317 | console.log('遵行出山预约结束\n'); 318 | sendMessage.push('遵行出山预约结束\n'); 319 | } 320 | 321 | if (GYQP_COOKIE_ARR) { 322 | console.log('贵盐黔品预约开始'); 323 | sendMessage.push('贵盐黔品预约开始'); 324 | for (let [index, item] of GYQP_COOKIE_ARR.split(SPLIT).entries()) { 325 | console.log(`----第${index + 1}个号----`); 326 | sendMessage.push(`----第${index + 1}个号----`); 327 | await autoSubmit(GYQP_APPID, item); 328 | await delay(1000); 329 | } 330 | console.log('贵盐黔品预约结束\n'); 331 | sendMessage.push('贵盐黔品预约结束\n'); 332 | } 333 | 334 | if (LLSC_COOKIE_ARR) { 335 | console.log('乐旅商城预约开始'); 336 | sendMessage.push('乐旅商城预约开始'); 337 | for (let [index, item] of LLSC_COOKIE_ARR.split(SPLIT).entries()) { 338 | console.log(`----第${index + 1}个号----`); 339 | sendMessage.push(`----第${index + 1}个号----`); 340 | await autoSubmit(LLSC_APPID, item); 341 | await delay(1000); 342 | } 343 | console.log('乐旅商城预约结束\n'); 344 | sendMessage.push('乐旅商城预约结束\n'); 345 | } 346 | 347 | if (YLQX_COOKIE_ARR) { 348 | console.log('驿路黔寻预约开始'); 349 | sendMessage.push('驿路黔寻预约开始'); 350 | for (let [index, item] of YLQX_COOKIE_ARR.split(SPLIT).entries()) { 351 | console.log(`----第${index + 1}个号----`); 352 | sendMessage.push(`----第${index + 1}个号----`); 353 | await autoSubmit(YLQX_APPID, item); 354 | await delay(1000); 355 | } 356 | console.log('驿路黔寻预约结束\n'); 357 | sendMessage.push('驿路黔寻预约结束\n'); 358 | } 359 | 360 | await notify.sendNotify(`葫芦娃预约`, sendMessage.join('\n'), {}, '\n\n本通知 By:一泽'); 361 | } 362 | 363 | main(); 364 | -------------------------------------------------------------------------------- /imaotai.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import os 3 | import random 4 | import time 5 | 6 | import requests 7 | import base64 8 | import json 9 | from Crypto.Cipher import AES 10 | from Crypto.Util.Padding import pad 11 | ''' 12 | cron: 5 9 * * * 13 | new Env("i茅台预约") 14 | ''' 15 | 16 | from notify import send 17 | 18 | # 青龙面板加入环境变量Mt_Version和MTTokenD 19 | # MTTokenD是茅台预约参数,多个请换行,格式'省份,城市,经度,维度,设备id,token,MT-Token-Wap(抓包小茅运)' 20 | # Mt_Version是app版本号如 1.3.6 必填(填最新版本,目前好像没法获取) 21 | # MT-Token-Wap参数是小茅运的领奖励,不需要的话MTTokenD格式改成 省份,城市,经度,维度,设备id,token,'' 22 | # 依赖pycryptodome 23 | p_c_map = {} 24 | mt_r = 'clips_OlU6TmFRag5rCXwbNAQ/Tz1SKlN8THcecBp/' 25 | # 下面定义的是申请哪几个,可通过iMT_Products环境变量来设置,比如{"10941": "贵州茅台酒(甲辰龙年)", "2478": "贵州茅台酒(珍品)", "10942": "贵州茅台酒(甲辰龙年)x2"} 26 | #res_map = json.loads(os.getenv('iMT_Products', '')) 27 | #if not res_map: 28 | # res_map = {"10941": "贵州茅台酒(甲辰龙年)", "10942": "贵州茅台酒(甲辰龙年)x2"} 29 | res_map = {"10941": "贵州茅台酒(甲辰龙年)", "10942": "贵州茅台酒(甲辰龙年)x2"} 30 | print('拟预约商品:') 31 | print(res_map) 32 | #加密 33 | def aes_cbc_encrypt(data, key, iv): 34 | cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8')) 35 | padded_data = pad(data.encode('utf-8'), AES.block_size) 36 | encrypted_data = cipher.encrypt(padded_data) 37 | return base64.b64encode(encrypted_data).decode('utf-8') 38 | 39 | def mt_add(itemId, shopId, sessionId, userId, token, Device_ID): 40 | MT_K = f'{int(time.time() * 1000)}' 41 | headers = {'User-Agent': 'iPhone 14', 42 | 'MT-Token': token, 43 | 'MT-Network-Type': 'WIFI', 'MT-User-Tag': '0', 44 | 'MT-R': mt_r, 'MT-K': MT_K, 45 | 'MT-Info': '028e7f96f6369cafe1d105579c5b9377', 'MT-APP-Version': mt_version, 46 | 'MT-Request-ID': f'{int(time.time() * 1000)}', 'Accept-Language': 'zh-Hans-CN;q=1', 47 | 'MT-Device-ID': Device_ID, 48 | 'MT-Bundle-ID': 'com.moutai.mall', 49 | 'mt-lng': lng, 50 | 'mt-lat': lat} 51 | d = {"itemInfoList": [{"count": 1, "itemId": str(itemId)}], "sessionId": sessionId, "userId": str(userId), 52 | "shopId": str(shopId)} 53 | r = aes_cbc_encrypt(json.dumps(d),'qbhajinldepmucsonaaaccgypwuvcjaa','2018534749963515') 54 | d['actParam'] = r 55 | json_data = d 56 | response = requests.post('https://app.moutai519.com.cn/xhr/front/mall/reservation/add', headers=headers, 57 | json=json_data) 58 | code = response.json().get('code', 0) 59 | if code == 2000: 60 | return response.json().get('data', {}).get('successDesc', "未知") 61 | return '申购失败:' + response.json().get('message', "未知原因") 62 | 63 | 64 | def tongzhi(ss): 65 | user_list = os.getenv('mtec_user', '').split(',') 66 | for user in user_list: 67 | url = 'http://wxpusher.zjiecode.com/api/send/message/?appToken=&content={}&uid={}'.format( 68 | ss, user) 69 | r = requests.get(url) 70 | print(r.text) 71 | 72 | 73 | def get_session_id(device_id, token): 74 | headers = { 75 | 'mt-device-id': device_id, 76 | 'mt-user-tag': '0', 77 | 'accept': '*/*', 78 | 'mt-network-type': 'WIFI', 79 | 'mt-token': token, 80 | 'mt-bundle-id': 'com.moutai.mall', 81 | 'accept-language': 'zh-Hans-CN;q=1', 82 | 'mt-request-id': f'{int(time.time() * 1000)}', 83 | 'mt-app-version': mt_version, 84 | 'user-agent': 'iPhone 14', 85 | 'mt-r': mt_r, 86 | 'mt-lng': lng, 87 | 'mt-lat': lat 88 | } 89 | 90 | response = requests.get('https://static.moutai519.com.cn/mt-backend/xhr/front/mall/index/session/get/' + time_keys, 91 | headers=headers) 92 | sessionId = response.json().get('data', {}).get('sessionId') 93 | itemList = response.json().get('data', {}).get('itemList', []) 94 | itemCodes = [item.get('itemCode') for item in itemList] 95 | return sessionId, itemCodes 96 | 97 | # 打印所有商品列表 98 | def get_shop_items(sessionId, device_id, token, province, city): 99 | headers = { 100 | 'mt-device-id': device_id, 101 | 'mt-user-tag': '0', 102 | 'mt-lat': '', 103 | 'accept': '*/*', 104 | 'mt-network-type': 'WIFI', 105 | 'mt-token': token, 106 | 'mt-bundle-id': 'com.moutai.mall', 107 | 'accept-language': 'zh-Hans-CN;q=1', 108 | 'mt-request-id': f'{int(time.time() * 1000)}', 109 | 'mt-r': mt_r, 110 | 'mt-app-version': mt_version, 111 | 'user-agent': 'iPhone 14', 112 | 'mt-lng': lng, 113 | 'mt-lat': lat 114 | } 115 | 116 | response = requests.get( 117 | 'https://static.moutai519.com.cn/mt-backend/xhr/front/mall/index/session/get/' + time_keys, headers=headers) 118 | item_list = response.json().get('data', {}).get("itemList", []) 119 | # 创建一个空字典,用于存储 itemCode 和 title 的映射关系 120 | item_code_title_map = {} 121 | # 遍历 itemList,提取 itemCode 和 title,并将它们添加到字典中 122 | for item in item_list: 123 | item_code_title_map[item.get("itemCode")] = item.get("title") 124 | print('可预约商品列表:') 125 | print(item_code_title_map) 126 | return item_code_title_map 127 | 128 | def get_shop_item(sessionId, itemId, device_id, token, province, city): 129 | headers = { 130 | 'mt-device-id': device_id, 131 | 'mt-user-tag': '0', 132 | 'mt-lat': '', 133 | 'accept': '*/*', 134 | 'mt-network-type': 'WIFI', 135 | 'mt-token': token, 136 | 'mt-bundle-id': 'com.moutai.mall', 137 | 'accept-language': 'zh-Hans-CN;q=1', 138 | 'mt-request-id': f'{int(time.time() * 1000)}', 139 | 'mt-r': mt_r, 140 | 'mt-app-version': mt_version, 141 | 'user-agent': 'iPhone 14', 142 | 'mt-lng': lng, 143 | 'mt-lat': lat 144 | } 145 | 146 | response = requests.get( 147 | 'https://static.moutai519.com.cn/mt-backend/xhr/front/mall/shop/list/slim/v3/' + str( 148 | sessionId) + '/' + province + '/' + str(itemId) + '/' + time_keys, 149 | headers=headers) 150 | data = response.json().get('data', {}) 151 | shops = data.get('shops', []) 152 | shop_id_ = p_c_map[province][city] 153 | for shop in shops: 154 | if not shop.get('shopId') in shop_id_: 155 | continue 156 | if itemId in str(shop): 157 | return shop.get('shopId') 158 | 159 | 160 | def get_user_id(token, Device_ID): 161 | headers = { 162 | 'MT-User-Tag': '0', 163 | 'Accept': '*/*', 164 | 'MT-Network-Type': 'WIFI', 165 | 'MT-Token': token, 166 | 'MT-Bundle-ID': 'com.moutai.mall', 167 | 'Accept-Language': 'zh-Hans-CN;q=1, en-CN;q=0.9', 168 | 'MT-Request-ID': f'{int(time.time() * 1000)}', 169 | 'MT-APP-Version': mt_version, 170 | 'User-Agent': 'iOS;16.0.1;Apple;iPhone 14 ProMax', 171 | 'MT-R': mt_r, 172 | 'MT-Device-ID': Device_ID, 173 | 'mt-lng': lng, 174 | 'mt-lat': lat 175 | } 176 | 177 | response = requests.get( 178 | 'https://app.moutai519.com.cn/xhr/front/user/info', headers=headers) 179 | userName = response.json().get('data', {}).get('userName') 180 | userId = response.json().get('data', {}).get('userId') 181 | mobile = response.json().get('data', {}).get('mobile') 182 | return userName, userId, mobile 183 | 184 | 185 | def getUserEnergyAward(device_id, ck): 186 | """ 187 | 领取耐力 188 | :return: 189 | """ 190 | 191 | cookies = { 192 | 'MT-Device-ID-Wap': device_id, 193 | 'MT-Token-Wap': ck, 194 | 'YX_SUPPORT_WEBP': '1', 195 | } 196 | 197 | headers = { 198 | 'X-Requested-With': 'XMLHttpRequest', 199 | 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_2_1 like Mac OS X)', 200 | 'Referer': 'https://h5.moutai519.com.cn/gux/game/main?appConfig=2_1_2', 201 | 'Client-User-Agent': 'iOS;15.0.1;Apple;iPhone 12 ProMax', 202 | 'MT-R': mt_r, 203 | 'Origin': 'https://h5.moutai519.com.cn', 204 | 'MT-APP-Version': mt_version, 205 | 'MT-Request-ID': f'{int(time.time() * 1000)}', 206 | 'Accept-Language': 'zh-CN,zh-Hans;q=0.9', 207 | 'MT-Device-ID': device_id, 208 | 'Accept': 'application/json, text/javascript, */*; q=0.01', 209 | 'mt-lng': lng, 210 | 'mt-lat': lat 211 | } 212 | response = requests.post('https://h5.moutai519.com.cn/game/isolationPage/getUserEnergyAward', cookies=cookies, 213 | headers=headers, json={}) 214 | return response.json().get('message') if '无法领取奖励' in response.text else "领取奖励成功" 215 | 216 | 217 | def get_map(): 218 | global p_c_map 219 | url = 'https://static.moutai519.com.cn/mt-backend/xhr/front/mall/resource/get' 220 | headers = { 221 | 'X-Requested-With': 'XMLHttpRequest', 222 | 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_1 like Mac OS X)', 223 | 'Referer': 'https://h5.moutai519.com.cn/gux/game/main?appConfig=2_1_2', 224 | 'Client-User-Agent': 'iOS;16.0.1;Apple;iPhone 14 ProMax', 225 | 'MT-R': mt_r, 226 | 'Origin': 'https://h5.moutai519.com.cn', 227 | 'MT-APP-Version': mt_version, 228 | 'MT-Request-ID': f'{int(time.time() * 1000)}{random.randint(1111111, 999999999)}{int(time.time() * 1000)}', 229 | 'Accept-Language': 'zh-CN,zh-Hans;q=1', 230 | 'MT-Device-ID': f'{int(time.time() * 1000)}{random.randint(1111111, 999999999)}{int(time.time() * 1000)}', 231 | 'Accept': 'application/json, text/javascript, */*; q=0.01', 232 | 'mt-lng': lng, 233 | 'mt-lat': lat 234 | } 235 | res = requests.get(url, headers=headers, ) 236 | mtshops = res.json().get('data', {}).get('mtshops_pc', {}) 237 | urls = mtshops.get('url') 238 | r = requests.get(urls) 239 | for k, v in dict(r.json()).items(): 240 | provinceName = v.get('provinceName') 241 | cityName = v.get('cityName') 242 | if not p_c_map.get(provinceName): 243 | p_c_map[provinceName] = {} 244 | if not p_c_map[provinceName].get(cityName, None): 245 | p_c_map[provinceName][cityName] = [k] 246 | else: 247 | p_c_map[provinceName][cityName].append(k) 248 | return p_c_map 249 | 250 | 251 | def login(phone, vCode, Device_ID): 252 | """ 253 | 254 | :param phone: 手机号 255 | :param vCode: 验证码 256 | :param Device_ID: 设备id 257 | :return: 258 | """ 259 | MT_K = f'{int(time.time() * 1000)}' 260 | r = requests.get( 261 | f'http://82.157.10.108:8086/get_mtv?DeviceID={Device_ID}&MTk={MT_K}&version={mt_version}&key=yaohuo') 262 | headers = { 263 | 'MT-Device-ID': Device_ID, 264 | 'MT-User-Tag': '0', 265 | 'Accept': '*/*', 266 | 'MT-Network-Type': 'WIFI', 267 | 'MT-Token': '', 268 | 'MT-K': MT_K, 269 | 'MT-Bundle-ID': 'com.moutai.mall', 270 | 'MT-V': r.text, 271 | 'User-Agent': 'iOS;16.0.1;Apple;iPhone 14 ProMax', 272 | 'Accept-Language': 'zh-Hans-CN;q=1', 273 | 'MT-Request-ID': f'{int(time.time() * 1000)}18342', 274 | 'MT-R': mt_r, 275 | 'MT-APP-Version': mt_version, 276 | } 277 | 278 | json_data = { 279 | 'ydToken': '', 280 | 'mobile': f'{phone}', 281 | 'vCode': f'{vCode}', 282 | 'ydLogId': '', 283 | } 284 | 285 | response = requests.post('https://app.moutai519.com.cn/xhr/front/user/register/login', headers=headers, 286 | json=json_data) 287 | data = response.json().get('data', {}) 288 | token = data.get('token') 289 | cookie = data.get('cookie') # MT-Token-Wap 290 | print(Device_ID, token, cookie) 291 | return Device_ID, token, cookie 292 | 293 | 294 | if __name__ == '__main__': 295 | mt_tokens = os.getenv("MTTokenD") 296 | mt_version = os.getenv("Mt_Version") 297 | if not mt_tokens: 298 | print('MTToken is null') 299 | exit() 300 | if not mt_version: 301 | print('版本号为空 is null') 302 | exit() 303 | mt_token_list = mt_tokens.split('&') 304 | s = "-------------------总共" + \ 305 | str(int(len(mt_token_list))) + \ 306 | "个用户-------------------"+'\n' 307 | userCount = 0 308 | if len(mt_token_list) > 0: 309 | for mt_token in mt_token_list: 310 | userCount += 1 311 | try: 312 | province, city, lng, lat, device_id, token, ck = mt_token.split(',') 313 | province, city, lng, lat, device_id, token, ck = province.strip(), city.strip(), lng.strip(), lat.strip(), device_id.strip(), token.strip(), ck.strip() 314 | except Exception as e: 315 | s = "MTTokenD未正确配置,格式'省份,城市,经度,维度,设备id,token,MT-Token-Wap(抓包小茅运)'" 316 | send("i茅台申购+小茅运", s) 317 | exit() 318 | time_keys = str( 319 | int(time.mktime(datetime.date.today().timetuple())) * 1000) 320 | get_map() 321 | 322 | try: 323 | sessionId, itemCodes = get_session_id(device_id, token) 324 | userName, user_id, mobile = get_user_id(token, device_id) 325 | if not user_id: 326 | s += "第"+str(userCount)+"个用户token失效,请重新登录"+'\n' 327 | continue 328 | s += "第"+str(userCount)+"个用户----------------"+userName + '_' + \ 329 | mobile + "开始任务" + "----------------"+'\n' 330 | items = get_shop_items(sessionId, device_id, token, province, city) 331 | for itemCode in itemCodes: 332 | name = res_map.get(str(itemCode)) 333 | if name: 334 | shop_id = get_shop_item( 335 | sessionId, itemCode, device_id, token, province, city) 336 | res = mt_add(itemCode, str(shop_id), sessionId, 337 | user_id, token, device_id) 338 | s += itemCode + \ 339 | '_' + name + '---------------' + res + '\n' 340 | if ck: 341 | if ck == "\'\'" : 342 | s += userName + '_' + mobile + '---------------' + \ 343 | "未设置MT-Token-Wap,小茅运领取奖励跳过" + '\n' 344 | else : 345 | r = getUserEnergyAward(device_id, ck) 346 | s += userName + '_' + mobile + '---------------' + \ 347 | "小茅运:" + r + '\n' 348 | s += userName + '_' + mobile + "正常结束任务"+'\n \n' 349 | except Exception as e: 350 | s += userName + '_' + mobile + "异常信息"+e 351 | send("i茅台申购+小茅运", s) 352 | --------------------------------------------------------------------------------