コード例 #1
0
ファイル: ireserve_ctrl.py プロジェクト: singlag/iReserve
    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")
コード例 #2
0
    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
コード例 #3
0
    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
コード例 #4
0
    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)
コード例 #5
0
    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