def storeCheck(self): # imp.reload(sys) availurl = configHelper.readURL("availURL") # response = urllib2.urlopen(availurl) # content = response.read() # avail_json = json.loads(content) headers = myutil.getHTMLHeaders() avail_json = requests.get(availurl, headers=headers).json() # Apple.com reservation is not available yet if len(avail_json) < 1: print(bcolors.FAIL + time.strftime('%d, %b %Y %H:%M:%S') + " - Data Unavailable.") return # 组织好area-model-clients数据结构 print("--------------- area-model-clients 数据结构 -----------------") print(bcolors.OKBLUE + myutil.format_dict(self.__maindict)) # 遍历area-model-clients数据结构 for areaId, areaDict in self.__maindict.items(): stores = self.__dao.getStoresByArea(areaId) # 对于每一个地区的所有店铺遍历 for item in stores: storeId = item[0] storeName = item[1] areaName = item[2] storeStr = storeName + ", " + areaName + ", " + storeId print(bcolors.OKGREEN + storeStr) # 过滤出当前店铺所有产品 allModels = avail_json.get(storeId) for modelId in allModels: # 如果当前产品id在顾客选择的产品范围之内,并且有库存的话 if modelId in areaDict and allModels[modelId] == "ALL": reserve_info = { "modelId": modelId, "storeId": storeId, "clientInfo": areaDict[modelId][0], "areaId": areaId, "storeStr": storeStr, } clientInfo = areaDict[modelId][0] applog_info = { "storeName": storeName, "areaName": areaName, "modelName": self.__models[modelId], "fengId": clientInfo["fengId"], "appleId": clientInfo["appleId"], } return reserve_info, applog_info print(bcolors.FAIL + "Nothing Available\n") print(bcolors.OKBLUE + "Updated: " + time.strftime('%d, %b %Y %H:%M:%S') + "\n")
def __stepSignin(self, url, clientDict): print("================ Step 2 : login submit =======================") redirectedLoginURL = url print(" ----------- Step 2.2 display iframe login widget -----------") r = self.__session.get(IReserveHTTP.signinWidgetURL, allow_redirects=True) print(" -------------- Step 2.3 OMG!!! LOGIN!!!!! --------------") # Refresh the headers self.__session.headers = self.__getJSONHeaders() self.__session.headers.update({ "X-Apple-App-Id": "942", "X-Apple-Locale": "CN-ZH", "X-Apple-Widget-Key": "40692a3a849499c31657eac1ec8123aa", }) payload = { "accountName": clientDict["appleId"], "password": clientDict["pwd"], "rememberMe": False } r = self.__session.post(IReserveHTTP.signinURL, json=payload) print(" ------LOGIN JSON RESULT-----" + r.text) error_str = self.__json_errmsg(r.text, "serviceErrors") print(error_str) if len(error_str) > 0: raise errors.IReserveLoginError(error_str) print(" -------------- Step 2.4 Submit main login form -------------") self.__session.headers = myutil.getHTMLHeaders() rs = urlparse.urlparse(redirectedLoginURL) q = urlparse.parse_qs(rs.query) data = { "rememberMe": False, "appIdKey": q["appIdKey"], "language": q["language"], "path": q["path"], "oAuthToken": "", "rv": q["rv"] } r = self.__session.post(IReserveHTTP.mainFormURL, data=data) print('main login form redirect ' + r.url, '\n') return r.url
def __stepModelSel(self, url): print("================= Step 1 : select your model =================") print("-------- Step 1.1 select your model and submit ---------"), '\n' # Modify request headers headers = myutil.getHTMLHeaders() self.__session.headers = headers r = self.__session.get(url, allow_redirects=True) print(r.url), '\n' return r.url
def __stepTimeSlot(self, url, govid, govidType, quantity): print("------------- Step 4.1 Select TimeSlots ---------------"), '\n' timeSlotURL = url + "&ajaxSource=true&_eventId=context&dims=" print("request URL: " + timeSlotURL) self.__session.headers = self.__getJSONHeaders() r = self.__session.get(timeSlotURL) print('--------[timeslots JSON RESULT]---' + r.text + '-------', '\n') error_str = self.__json_errmsg(r.text, "errors") if len(error_str) > 0: raise errors.IReserveSMSError(error_str) reserveDict = json.loads(r.text) # Finde the right time # get current hour timeslots = reserveDict["timeslots"] curHour = datetime.datetime.now().hour selectedId = "" selectedTime = "" # for timeslot in timeslots: for i, option in enumerate(timeslots): text = option['formattedTime'] curId = option['timeSlotId'] # Format : 下午 1:30 - 下午 2:00 arr = text.split(" ") hour = int(arr[1].split(":")[0]) # format hour to 24 hours if arr[0] == u"下午" and hour < 12: hour += 12 nightMode = configHelper.readMode("nightMode") if nightMode and curHour < 18: if hour >= 20: selectedId = curId selectedTime = text break else: if hour >= curHour + 2: selectedId = curId selectedTime = text break if i == len(timeslots) - 1: selectedId = curId selectedTime = text print(selectedId) print(selectedTime), '\n' # print (timeslots) print("-------------- Step 4.2 Submit Reserve ---------------"), '\n' data = { "selectedStoreNumber": reserveDict['selectedStoreNumber'], # "selectedPartNumber": partNumber, "selectedContractType": "UNLOCKED", "selectedQuantity": quantity, "selectedTimeSlotId": selectedId, "lastName": reserveDict["lastName"], "firstName": reserveDict["firstName"], "email": reserveDict["email"], "selectedGovtIdType": govidType, "govtId": govid, "p_ie": reserveDict["p_ie"], "_flowExecutionKey": reserveDict["_flowExecutionKey"], "_eventId": "next", "submit": "", } self.__session.headers = myutil.getHTMLHeaders() print(data), '\n' print("request URL: " + url), '\n' sleeptime = configHelper.readConfig('submitTimeSleep') print("current sleep time is : " + str(sleeptime)) time.sleep(sleeptime) r = self.__session.post(url, data=data) r = self.__session.get(r.url) url = r.url + "&ajaxSource=true&_eventId=context&dims=" print("request URL: " + url), '\n' self.__session.headers = self.__getJSONHeaders() r = self.__session.get(url) print('--------[Sumit Error JSON RESULT]---' + r.text + '-----', '\n') error_str = self.__json_errmsg(r.text, "errors") if len(error_str) > 0: if error_str == "availabilityError": raise errors.IReserveAvailError(error_str) else: raise errors.IReserveReserveError(error_str)
def __stepRCode(self, url, appleId): print("================= Step 3 : Registration Code ================") print('---------- step 3.1 Request SMS JSON ------------------') rCodeURL = url + "&ajaxSource=true&_eventId=context" print(rCodeURL, '\n') self.__session.headers = self.__getJSONHeaders() print("request URL: " + rCodeURL), '\n' r = self.__session.get(rCodeURL) print('--------[SMS JSON RESULT]---' + r.text + '---------------') if not r.text: raise errors.IReserveLoginFastError("登录太快了,请等几秒钟") print('---------- step 3.2 Send SMS & get RCode ------------'), '\n' rCode = "" # If smscode is already sended print(json.loads(r.text)), '\n' rcDict = json.loads(r.text) smsCode = rcDict['keyword'] print('SMS Code: ' + rcDict['keyword']) print(self.__test) p_ie = rcDict["p_ie"] flowExecutionKey = rcDict['_flowExecutionKey'] firstTime = rcDict['firstTime'] autosms = configHelper.readMode('autosms') if not self.__test or autosms: phoneNumber = configHelper.readPhoneNumber(False) else: phoneNumber = configHelper.readPhoneNumber(True) print("phone number: " + phoneNumber) if firstTime: if not self.__test or autosms: CMPhoneNumber = configHelper.readCMPhoneNumber(self.__test) # rCode = "new code" rCode = smsmode.getResrictionCode(CMPhoneNumber, smsCode) else: # Manually input rcode rCode = raw_input("please input registration code:") # configHelper.writeRCode(rCode, appleId) curTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.__dao.insertOrUpdateRCode(rCode, phoneNumber, appleId, curTime) else: # Last rCode is still available # rCode = configHelper.readRCode() rCode = self.__dao.getRCode(phoneNumber, appleId)[0][1] print('registration code: ' + rCode) self.__session.headers = myutil.getHTMLHeaders() data = { "phoneNumber": phoneNumber, "selectedCountryCode": 86, "registrationCode": rCode, "submit": "", "_flowExecutionKey": flowExecutionKey, "_eventId": "next", "p_ie": p_ie, "dims": "" } print("request URL: " + url), '\n' r = self.__session.post(url, data=data) print(r.url), '\n' return r.url