You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
13 KiB
159 lines
13 KiB
#!/usr/bin/python3 |
|
# -- coding: utf-8 -- |
|
# @Time : 2023/05/03 10:23 |
|
# ------------------------------- |
|
# cron "1,30 9 * * *" script-path=xxx.py,tag=匹配cron用 |
|
# const $ = new Env('小茅预约'); |
|
|
|
import datetime #line:1 |
|
import os #line:2 |
|
import random #line:3 |
|
import time #line:4 |
|
import re #line:5 |
|
import requests #line:6 |
|
import base64 #line:7 |
|
import json #line:8 |
|
|
|
#原创 微信公众号@爱上羊毛侠 |
|
|
|
# 青龙面板加入环境变量MTTokenD |
|
# MTTokenD是茅台预约参数,多个请换行,格式'省份,城市,经度,维度,设备id,token,MT-Token-Wap(抓包小茅运)' |
|
|
|
p_c_map ={}#line:1 |
|
mt_r ='clips_OlU6TmFRag5rCXwbNAQ/Tz1SKlN8THcecBp/'#line:2 |
|
res_map ={'10213':'贵州茅台酒(癸卯兔年)','2476':'贵州茅台酒(壬寅虎年)','10214':'贵州茅台酒(癸卯兔年)x2'}#line:7 |
|
def mt_add (OOOOO0O00O00O0000 ,OOO00OOO0O00OO00O ,OOOO00000O00OO0O0 ,O00000O0OO00OO00O ,OO0OO0000O000O0O0 ,O0OO000O00O0OO00O ):#line:10 |
|
O00OO000OOOOO0OO0 =f'{int(time.time() * 1000)}'#line:11 |
|
OOOO0OOO0OO0O000O =requests .get (f'http://82.157.10.108:8086/get_mtv?DeviceID={O0OO000O00O0OO00O}&MTk={O00OO000OOOOO0OO0}&version={mt_version}&key=yaohuo')#line:13 |
|
OO000O00O0000OO00 ={'User-Agent':'iPhone 14','MT-Token':OO0OO0000O000O0O0 ,'MT-Network-Type':'WIFI','MT-User-Tag':'0','MT-R':mt_r ,'MT-Lat':'','MT-K':O00OO000OOOOO0OO0 ,'MT-Lng':'','MT-Info':'028e7f96f6369cafe1d105579c5b9377','MT-APP-Version':mt_version ,'MT-Request-ID':f'{int(time.time() * 1000)}','Accept-Language':'zh-Hans-CN;q=1','MT-Device-ID':O0OO000O00O0OO00O ,'MT-V':OOOO0OOO0OO0O000O .text ,'MT-Bundle-ID':'com.moutai.mall','mt-lng':lng ,'mt-lat':lat }#line:23 |
|
OOOO0O0O0000000O0 ={"itemInfoList":[{"count":1 ,"itemId":str (OOOOO0O00O00O0000 )}],"sessionId":OOOO00000O00OO0O0 ,"userId":str (O00000O0OO00OO00O ),"shopId":str (OOO00OOO0O00OO00O )}#line:25 |
|
OOOO0OOO0OO0O000O =requests .get ('http://82.157.10.108:8086/get_actParam?key=yaohuo&actParam='+base64 .b64encode (json .dumps (OOOO0O0O0000000O0 ).replace (' ','').encode ('utf8')).decode ())#line:27 |
|
OOOO0O0O0000000O0 ['actParam']=OOOO0OOO0OO0O000O .text #line:28 |
|
O00OO0OOO00OOO0OO =OOOO0O0O0000000O0 #line:29 |
|
OOO0OO0OO00O00OO0 =requests .post ('https://app.moutai519.com.cn/xhr/front/mall/reservation/add',headers =OO000O00O0000OO00 ,json =O00OO0OOO00OOO0OO )#line:31 |
|
O0OOOO0OOO0OO0OOO =OOO0OO0OO00O00OO0 .json ().get ('code',0 )#line:32 |
|
if O0OOOO0OOO0OO0OOO ==2000 :#line:33 |
|
return OOO0OO0OO00O00OO0 .json ().get ('data',{}).get ('successDesc',"未知")#line:34 |
|
return '申购失败:'+OOO0OO0OO00O00OO0 .json ().get ('message',"未知原因")#line:35 |
|
def tongzhi (OOO0O0O0O0OOOO0OO ):#line:38 |
|
OOOOOOO0O0O000OO0 =os .getenv ('mtec_user','').split (',')#line:39 |
|
for OO0O0000OOO0O0000 in OOOOOOO0O0O000OO0 :#line:40 |
|
O0OOOOO0O000000OO ='http://wxpusher.zjiecode.com/api/send/message/?appToken=&content={}&uid={}'.format (OOO0O0O0O0OOOO0OO ,OO0O0000OOO0O0000 )#line:42 |
|
O000O0O0O0OOO0O00 =requests .get (O0OOOOO0O000000OO )#line:43 |
|
print (O000O0O0O0OOO0O00 .text )#line:44 |
|
def get_session_id (O0O0O00OO00OO0OOO ,O000O0OOO0OOOO0O0 ):#line:47 |
|
OO0OOOOOOO00O0000 ={'mt-device-id':O0O0O00OO00OO0OOO ,'mt-user-tag':'0','accept':'*/*','mt-network-type':'WIFI','mt-token':O000O0OOO0OOOO0O0 ,'mt-bundle-id':'com.moutai.mall','accept-language':'zh-Hans-CN;q=1','mt-request-id':f'{int(time.time() * 1000)}','mt-app-version':mt_version ,'user-agent':'iPhone 14','mt-r':mt_r ,'mt-lng':lng ,'mt-lat':lat }#line:62 |
|
O00OO00O0OOO000OO =requests .get ('https://static.moutai519.com.cn/mt-backend/xhr/front/mall/index/session/get/'+time_keys ,headers =OO0OOOOOOO00O0000 )#line:65 |
|
OOOO00O00OO00OOOO =O00OO00O0OOO000OO .json ().get ('data',{}).get ('sessionId')#line:66 |
|
O00OOO0OOOOOOO0OO =O00OO00O0OOO000OO .json ().get ('data',{}).get ('itemList',[])#line:67 |
|
O0O000O0O0O0O00OO =[OO0OOOO0OOO0000OO .get ('itemCode')for OO0OOOO0OOO0000OO in O00OOO0OOOOOOO0OO ]#line:68 |
|
return OOOO00O00OO00OOOO ,O0O000O0O0O0O00OO #line:69 |
|
def get_shop_item (OO000O0OOOOOO00OO ,OOO0O0O0O00OO0OOO ,O00000O000000000O ,O0OOO0O0O0O0O00OO ,OOO0O000OO0000000 ,OO0OOOO000OO00OOO ):#line:72 |
|
O000OO0000OOO00O0 ={'mt-device-id':O00000O000000000O ,'mt-user-tag':'0','mt-lat':'','accept':'*/*','mt-network-type':'WIFI','mt-token':O0OOO0O0O0O0O00OO ,'mt-bundle-id':'com.moutai.mall','accept-language':'zh-Hans-CN;q=1','mt-request-id':f'{int(time.time() * 1000)}','mt-r':mt_r ,'mt-app-version':mt_version ,'user-agent':'iPhone 14','mt-lng':lng ,'mt-lat':lat }#line:88 |
|
OO00OOOO00OOOO0OO =requests .get ('https://static.moutai519.com.cn/mt-backend/xhr/front/mall/shop/list/slim/v3/'+str (OO000O0OOOOOO00OO )+'/'+OOO0O000OO0000000 +'/'+str (OOO0O0O0O00OO0OOO )+'/'+time_keys ,headers =O000OO0000OOO00O0 )#line:93 |
|
O00OO0OO00O0OOO00 =OO00OOOO00OOOO0OO .json ().get ('data',{})#line:94 |
|
OO0O0OO00OOOO000O =O00OO0OO00O0OOO00 .get ('shops',[])#line:95 |
|
OO000OOO00OO0OO00 =p_c_map [OOO0O000OO0000000 ][OO0OOOO000OO00OOO ]#line:96 |
|
for O0O0O0O00OO0O0OO0 in OO0O0OO00OOOO000O :#line:97 |
|
if not O0O0O0O00OO0O0OO0 .get ('shopId')in OO000OOO00OO0OO00 :#line:98 |
|
continue #line:99 |
|
if OOO0O0O0O00OO0OOO in str (O0O0O0O00OO0O0OO0 ):#line:100 |
|
return O0O0O0O00OO0O0OO0 .get ('shopId')#line:101 |
|
def get_user_id (O0O00O0O0OOOO0OO0 ,O0OOOO0OO0000O000 ):#line:104 |
|
OOOO0OO0O0OOOOOO0 ={'MT-User-Tag':'0','Accept':'*/*','MT-Network-Type':'WIFI','MT-Token':O0O00O0O0OOOO0OO0 ,'MT-Bundle-ID':'com.moutai.mall','Accept-Language':'zh-Hans-CN;q=1, en-CN;q=0.9','MT-Request-ID':f'{int(time.time() * 1000)}','MT-APP-Version':mt_version ,'User-Agent':'iOS;16.0.1;Apple;iPhone 14 ProMax','MT-R':mt_r ,'MT-Device-ID':O0OOOO0OO0000O000 ,'mt-lng':lng ,'mt-lat':lat }#line:119 |
|
OOOOO0O0OOO00000O =requests .get ('https://app.moutai519.com.cn/xhr/front/user/info',headers =OOOO0OO0O0OOOOOO0 )#line:122 |
|
O00O000000OOO000O =OOOOO0O0OOO00000O .json ().get ('data',{}).get ('userName')#line:123 |
|
O00OOO0O0OOO00O0O =OOOOO0O0OOO00000O .json ().get ('data',{}).get ('userId')#line:124 |
|
OO0O00OOO0OOOOOO0 =OOOOO0O0OOO00000O .json ().get ('data',{}).get ('mobile')#line:125 |
|
return O00O000000OOO000O ,O00OOO0O0OOO00O0O ,OO0O00OOO0OOOOOO0 #line:126 |
|
def getUserEnergyAward (O0OO0000O0000OOO0 ,OOO000O0OO0OO0000 ):#line:129 |
|
""" |
|
领取耐力 |
|
:return: |
|
"""#line:133 |
|
OO00OOOO0O0O0O000 ={'MT-Device-ID-Wap':O0OO0000O0000OOO0 ,'MT-Token-Wap':OOO000O0OO0OO0000 ,'YX_SUPPORT_WEBP':'1',}#line:139 |
|
O0OOO0OOO0O000OO0 ={'X-Requested-With':'XMLHttpRequest','User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 15_2_1 like Mac OS X)','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_version ,'MT-Request-ID':f'{int(time.time() * 1000)}','Accept-Language':'zh-CN,zh-Hans;q=0.9','MT-Device-ID':O0OO0000O0000OOO0 ,'Accept':'application/json, text/javascript, */*; q=0.01','mt-lng':lng ,'mt-lat':lat }#line:155 |
|
OO00OOO0000O0O000 =requests .post ('https://h5.moutai519.com.cn/game/isolationPage/getUserEnergyAward',cookies =OO00OOOO0O0O0O000 ,headers =O0OOO0OOO0O000OO0 ,json ={})#line:157 |
|
return OO00OOO0000O0O000 .json ().get ('message')if '无法领取奖励'in OO00OOO0000O0O000 .text else "领取奖励成功"#line:158 |
|
def get_map ():#line:161 |
|
global p_c_map #line:162 |
|
O0O0O00000O000OOO ='https://static.moutai519.com.cn/mt-backend/xhr/front/mall/resource/get'#line:163 |
|
O00O00000O0OO00O0 ={'X-Requested-With':'XMLHttpRequest','User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_1 like Mac OS X)','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_version ,'MT-Request-ID':f'{int(time.time() * 1000)}{random.randint(1111111, 999999999)}{int(time.time() * 1000)}','Accept-Language':'zh-CN,zh-Hans;q=1','MT-Device-ID':f'{int(time.time() * 1000)}{random.randint(1111111, 999999999)}{int(time.time() * 1000)}','Accept':'application/json, text/javascript, */*; q=0.01','mt-lng':lng ,'mt-lat':lat }#line:178 |
|
OOOOOOOOO000O0000 =requests .get (O0O0O00000O000OOO ,headers =O00O00000O0OO00O0 ,)#line:179 |
|
OO0OOO0O0O00000OO =OOOOOOOOO000O0000 .json ().get ('data',{}).get ('mtshops_pc',{})#line:180 |
|
O0OO00O0OOOOOOO00 =OO0OOO0O0O00000OO .get ('url')#line:181 |
|
OO0O0O0O00000OOOO =requests .get (O0OO00O0OOOOOOO00 )#line:182 |
|
for OO00000OO0O0O0O00 ,O0O0000OO0O000OO0 in dict (OO0O0O0O00000OOOO .json ()).items ():#line:183 |
|
O00O00O000OOOOO0O =O0O0000OO0O000OO0 .get ('provinceName')#line:184 |
|
O00000OO000OOOO0O =O0O0000OO0O000OO0 .get ('cityName')#line:185 |
|
if not p_c_map .get (O00O00O000OOOOO0O ):#line:186 |
|
p_c_map [O00O00O000OOOOO0O ]={}#line:187 |
|
if not p_c_map [O00O00O000OOOOO0O ].get (O00000OO000OOOO0O ,None ):#line:188 |
|
p_c_map [O00O00O000OOOOO0O ][O00000OO000OOOO0O ]=[OO00000OO0O0O0O00 ]#line:189 |
|
else :#line:190 |
|
p_c_map [O00O00O000OOOOO0O ][O00000OO000OOOO0O ].append (OO00000OO0O0O0O00 )#line:191 |
|
return p_c_map #line:192 |
|
def login (O0000OOOOOOO0O0O0 ,OOOO00O0OO0OO00OO ,O0O0O0OO0000OOOO0 ):#line:195 |
|
""" |
|
|
|
:param phone: 手机号 |
|
:param vCode: 验证码 |
|
:param Device_ID: 设备id |
|
:return: |
|
"""#line:202 |
|
O0O00OO00O0OO0O0O =f'{int(time.time() * 1000)}'#line:203 |
|
OOOOOO000O00OO0O0 =requests .get (f'http://82.157.10.108:8086/get_mtv?DeviceID={O0O0O0OO0000OOOO0}&MTk={O0O00OO00O0OO0O0O}&version={mt_version}&key=yaohuo')#line:205 |
|
O0OOO00OO00O0OOO0 ={'MT-Device-ID':O0O0O0OO0000OOOO0 ,'MT-User-Tag':'0','Accept':'*/*','MT-Network-Type':'WIFI','MT-Token':'','MT-K':O0O00OO00O0OO0O0O ,'MT-Bundle-ID':'com.moutai.mall','MT-V':OOOOOO000O00OO0O0 .text ,'User-Agent':'iOS;16.0.1;Apple;iPhone 14 ProMax','Accept-Language':'zh-Hans-CN;q=1','MT-Request-ID':f'{int(time.time() * 1000)}18342','MT-R':mt_r ,'MT-APP-Version':mt_version ,}#line:220 |
|
OO000O000OO0O0OO0 ={'ydToken':'','mobile':f'{O0000OOOOOOO0O0O0}','vCode':f'{OOOO00O0OO0OO00OO}','ydLogId':'',}#line:227 |
|
OOO00O00O00000O0O =requests .post ('https://app.moutai519.com.cn/xhr/front/user/register/login',headers =O0OOO00OO00O0OOO0 ,json =OO000O000OO0O0OO0 )#line:230 |
|
OO0O00O00OO0O000O =OOO00O00O00000O0O .json ().get ('data',{})#line:231 |
|
OOO00O000O0O00O00 =OO0O00O00OO0O000O .get ('token')#line:232 |
|
O000OOO0OO0O0O000 =OO0O00O00OO0O000O .get ('cookie')#line:233 |
|
print (O0O0O0OO0000OOOO0 ,OOO00O000O0O00O00 ,O000OOO0OO0O0O000 )#line:234 |
|
return O0O0O0OO0000OOOO0 ,OOO00O000O0O00O00 ,O000OOO0OO0O0O000 #line:235 |
|
|
|
def Push(contents): |
|
# plustoken推送 |
|
headers = {'Content-Type': 'application/json'} |
|
json = {"token": plustoken, 'title': '茅台预约推送', 'content': contents.replace('\n', '<br>'), "template": "json"} |
|
resp = requests.post(f'http://www.pushplus.plus/send', json=json, headers=headers).json() |
|
print('push+推送成功' if resp['code'] == 200 else 'push+推送失败') |
|
|
|
if __name__ =='__main__':#line:245 |
|
plustoken =os .getenv ("plustoken")#line:246 |
|
mt_tokens =os .getenv ("MTTokenD")#line:247 |
|
mt_version ="".join (re .findall ('new__latest__version">(.*?)</p>',requests .get ('https://apps.apple.com/cn/app/i%E8%8C%85%E5%8F%B0/id1600482450').text ,re .S )).replace ('版本 ','')#line:248 |
|
print ('当前最新版本为:'+mt_version )#line:249 |
|
if not mt_tokens :#line:250 |
|
print ('MTToken is null')#line:251 |
|
exit ()#line:252 |
|
mt_token_list =mt_tokens .split ('&')#line:253 |
|
s ="-------------------总共"+str (int (len (mt_token_list )))+"个用户-------------------"+'\n'#line:256 |
|
userCount =0 #line:257 |
|
if len (mt_token_list )>0 :#line:258 |
|
for mt_token in mt_token_list :#line:259 |
|
userCount +=1 #line:260 |
|
province ,city ,lng ,lat ,device_id ,token ,ck =mt_token .split (',')#line:262 |
|
time_keys =str (int (time .mktime (datetime .date .today ().timetuple ()))*1000 )#line:264 |
|
get_map ()#line:265 |
|
try :#line:267 |
|
sessionId ,itemCodes =get_session_id (device_id ,token )#line:268 |
|
userName ,user_id ,mobile =get_user_id (token ,device_id )#line:269 |
|
if not user_id :#line:270 |
|
s +="第"+str (userCount )+"个用户token失效,请重新登录"+'\n'#line:271 |
|
continue #line:272 |
|
s +="第"+str (userCount )+"个用户----------------"+userName +'_'+mobile +"开始任务"+"----------------"+'\n'#line:274 |
|
for itemCode in itemCodes :#line:275 |
|
name =res_map .get (str (itemCode ))#line:276 |
|
if name :#line:277 |
|
shop_id =get_shop_item (sessionId ,itemCode ,device_id ,token ,province ,city )#line:279 |
|
res =mt_add (itemCode ,str (shop_id ),sessionId ,user_id ,token ,device_id )#line:281 |
|
s +=itemCode +'_'+name +'---------------'+res +'\n'#line:283 |
|
if ck :#line:284 |
|
r =getUserEnergyAward (device_id ,ck )#line:285 |
|
s +=userName +'_'+mobile +'---------------'+"小茅运:"+r +'\n'#line:287 |
|
s +=userName +'_'+mobile +"正常结束任务"+'\n \n'#line:288 |
|
except Exception as e :#line:289 |
|
s +=userName +'_'+mobile +"异常信息"+e #line:290 |
|
print (s )#line:291 |
|
Push (contents =s )#line:292
|
|
|