def searchProduct(self, keywords): url = 'http://s.1688.com/selloffer/offer_search.htm' postdata = {'keywords': keywords.encode('gbk')} product = CompanyFromProduct(url, postdata) page, maxpage = product.getFirstPageData() pages = [] pages.append(page) # for debug, in release please remove counter counter = 3 finished = 1 self.runStatus[self.taskName] = (finished / maxpage) * 50 while page and counter > 0: page = product.getNextPageData(page) pages.append(page) counter -= 1 finished += 1 self.runStatus[self.taskName] = (finished / maxpage) * 50 with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: futures = {executor.submit(GetCompanies, product, page): page for page in pages} maxnumer = len(futures) + maxpage for future in concurrent.futures.as_completed(futures): try: ents = future.result() except Exception as exc: debug.error(str(exc)) else: finished += 1 pc = (finished / maxnumer) * 100 self.runStatus[self.taskName] = pc for ent in ents: ent.save()
def __init__(self, confFile): self.conf_file = confFile if os.path.exists(confFile): self.cf = configparser.ConfigParser() self.cf.read(confFile, encoding='utf8') else: debug.error('%s not found' % confFile)
def _storeToDefault(self, task): try: taskfile = self.appContext.getDefaultTaskFile() with open(taskfile, 'wb') as f: pickle.dump(task, f) except Exception as e: debug.error('Error write %s %s' % (taskfile, str(e)))
def get_verification_code_pic(self): try: getData = {} getData['key'] = self.get_tag_value("input", {'id': 'captchaKey'}) getData['format'] = self.get_tag_value("input", {'id': "captchaFormat"}) timeStamp = str(time.time()).replace('.', '') getData['t'] = timeStamp if not self.geniusbarUrl: self.geniusbarUrl = self.get_geniusbar_url() url = "%s/captcha?&%s" % (self.geniusbarUrl, urllib.urlencode(getData)) if not self.pageHeader: self.pageHeader = GeniusbarPage.headers headers = self.pageHeader headers['Accept'] = 'image/png,image/*;q=0.8,*/*;q=0.5' headers['Accept-Encoding'] = 'gzip, deflate' request = urllib2.Request(url, headers=headers) try: data = urllib2.urlopen(request).read() except: debug.debug('read pic err') return (data, timeStamp) except Exception as e: debug.error(str(e)) return (None, None)
def accept(self): confhelper = ConfHelper() appleid = str(self.ui.lEAccount.text()) accounts = confhelper.getAccounts(self.accountfile) account = {} account['id'] = str(len(accounts)+1) account['appleid'] = appleid account['passwd'] = str(self.ui.lEPasswd.text()) account['governmentid'] = str(self.ui.lEGovId.text()) account['phonenumber'] = str(self.ui.lEPhoneNumber.text()) accounts[account['id']] = account isOk = True for key, val in account.items(): if not val: isOk = False debug.debug('Please type %s' % key) QtGui.QMessageBox.warning(self, "Info", "Please input %s" % key, QtGui.QMessageBox.Yes) break if isOk: confhelper.addAccounts(self.accountfile, accounts) super(AddAccountDLG, self).accept() else: debug.error('empty field')
def accept(self): confhelper = ConfHelper() appleid = str(self.ui.lEAccount.text()) accounts = confhelper.getAccounts(self.accountfile) account = {} account['id'] = str(len(accounts) + 1) account['appleid'] = appleid account['passwd'] = str(self.ui.lEPasswd.text()) account['governmentid'] = str(self.ui.lEGovId.text()) account['phonenumber'] = str(self.ui.lEPhoneNumber.text()) accounts[account['id']] = account isOk = True for key, val in account.items(): if not val: isOk = False debug.debug('Please type %s' % key) QtGui.QMessageBox.warning(self, "Info", "Please input %s" % key, QtGui.QMessageBox.Yes) break if isOk: confhelper.addAccounts(self.accountfile, accounts) super(AddAccountDLG, self).accept() else: debug.error('empty field')
def getDetails(self, ent): try: pageParser = CompanyPageParser(ent.company_website) certifUrl = pageParser.getCertifyInfoUrl() pageParser = CertifiactePageParser(certifUrl) pageParser.parserInfo() ent.company_contacts = pageParser.contactPerson ent.company_mobile_phone = pageParser.mobilePhone ent.company_phone_number = pageParser.phoneNumber yellowpageUrl = pageParser.getYellowPageUrl() pageParser = YellowPageParser(yellowpageUrl) contactUrl = pageParser.getContactInfoUrl() pageParser = ContactInfoPageParser(contactUrl) contactinfo = pageParser.getContactInfo() if not ent.company_mobile_phone: ent.company_mobile_phone = contactinfo.mobilePhone if not ent.company_phone_number: ent.company_phone_number = contactinfo.phoneNumber ent.company_fax = contactinfo.faxNumber ent.company_postcode = contactinfo.postcode ent.company_addr = contactinfo.address except AttributeError as e: debug.error('AttributeError %s' % str(e)) return ent
def submit(self): taskStatus = self._getCurrentTaskStatus() if taskStatus: captcha = self.lECaptchaAnswer.text() taskStatus['captchaAnswer'] = str(captcha) phoneNumber = self.lEPhoneNumber.text() taskStatus['phoneNumber'] = str(phoneNumber) taskStatus['smsCode'] = str(self.lESmsCode.text()) taskStatus['clientTimezone'] = 'Asia/Shanghai' taskStatus['countryISDCode'] = '86' taskStatus['cmdStatus'] = None taskStatus['taskCmd'] = 'submit' timer = 30 while not taskStatus['cmdStatus'] and timer > 0: time.sleep(1) #debug.debug('check cmdStatus') timer -= 1 print('end check cmdStatus') if taskStatus['cmdStatus'] == 'NOK': debug.info('submit error') debug.info(taskStatus['prompInfo']) self.refresh() elif taskStatus['cmdStatus'] == 'OK': result = taskStatus['timeSlots'] self.fillTableWidget(result[0], result[1]) self.showTimeSlots(1) else: debug.error('submit task error') else: debug.error('submit error')
def fillResultView(self, appleId): currentTaskName = self.appContext.getCurrentTaskName() results = self.reserverResult.getData(currentTaskName) if not results: debug.info('Can not find %s' % currentTaskName) return findResult = None for result in results: if appleId in result.values(): findResult = result if not findResult: debug.error('can not found verifyData %s,%s' % (appleId, currentTaskName)) return verifyData = findResult['verifyCodeData'] if verifyData: self.fillVerifyCodePic(verifyData) else: debug.debug('can not get verfiy pic') smsMsg = findResult['smsMsg'] if smsMsg: self.pTSmsChallengeTip.setPlainText(smsMsg) else: debug.error('Can not found smsMsg %s %s' % (appleId, currentTaskName))
def display_json(filename, display_indent=4): json_val = jsonToDict(filename) if json_val: message.success(filename + ' loaded successfully') printy(json_val, indentation=display_indent) else: message.error('JSON couldn\'t be loaded') debug.error('JSON to Dict Failed')
def get_tag_text(self, taglabel, attrs): soup = self.get_soup() try: tag = soup.find(taglabel, attrs=attrs) return tag.text except AttributeError as e: debug.error('cannot find %s %s %s' % (taglabel, str(attrs), str(e))) return None
def select(self, sql): try: cursor = self.db.cursor() cursor.execute(sql) debug.debug(sql) return cursor.fetchall() except sqlite3.OperationalError as e: debug.error(str(e)) return []
def dictToJson(inputDict, filename, indents=2): try: with open(filename, 'w') as fh2: fh2.write(json.dumps(inputDict, indent=indents, sort_keys=True)) message.success('Keys stored successfully') return True except Exception as e: message.error('Couldn\'t write to JSON') debug.error(str(e)) return False
def keygen(): try: #generating the key and storing them in a file key = Fernet.generate_key() message.success("Encryption key generated successfully") except Exception as e: message.error('Couldn\'t generate encryption key') debug.error(str(e)) return False return key.decode('utf-8')
def Jump_login_page(self, supporturl, taskStatus=None): self.initUrls() self.taskStatus = taskStatus self.update_progress(10) supportPage = self.get_techsupport_page(supporturl) self.update_progress(20) # get selected store self.post_reserv_page(supportPage) # ### self.update_progress(30) getGeniusbarPage = self.get_geniusbar_page(supportPage) self.update_progress(40) postGeniusPage = self.post_geniusbar_page(getGeniusbarPage) self.update_progress(50) # # auth authPage = self.post_anth_page(postGeniusPage) self.update_progress(60) # ## send governmentId governmentUrl = self.govUrlFormat % GeniusbarPage.storeNumber govPage = self.post_governmenid(governmentUrl, authPage) self.update_progress(70) smschallengePage = self.post_smschallenge(govPage) # Writefile('tmp/smschallengepage.html', smschallengePage.get_data()) self.update_progress(80) text = smschallengePage.get_smschalleng_steps() if not text: msg = 'Reserved failed %s' % self.taskStatus['appleId'] debug.error(msg) self.taskStatus['prompInfo'] = msg self.update_progress(100) # self.waitingCmd(smschallengePage, taskStatus) return None self.taskStatus['prompInfo'] = text self.update_progress(85) attrs = {'class': "ValidatedField SmsCode"} if not smschallengePage.check('div', attrs): # get validcode picture self.update_progress(86) verifyData, tSt = smschallengePage.get_verification_code_pic() self.update_progress(87) if verifyData: self.taskStatus['verifyCodeData'] = verifyData # WriteVerifyPic('tmp/%s.jpg' % tSt, verifyData) self.update_progress(100) self.waitingCmd(smschallengePage, taskStatus) # get the smschallenge info phone number else: debug.error('verfyData error') self.update_progress(100) return verifyData self.update_progress(100) return None
def saveTask(self, tasks): for task in tasks: fileName = self.mkTaskListName(task.taskName) debug.debug('save task %s' % fileName) taskdir = self.appContext.getTaskStoreDir() taskfile = os.path.join(taskdir, fileName) try: with open(taskfile, 'wb') as f: pickle.dump(task, f) except Exception as e: debug.error('Error write %s %s' % (taskfile, str(e)))
def _deleteTaskList(self, taskName): del self.tasks[taskName] self.updateTaskTableWidget() #del taskfile filedir = self.appContext.getTaskStoreDir() filedir = os.path.join(filedir, self.mkTaskListName(taskName)) try: debug.debug('delete %s' % filedir) os.remove(filedir) except Exception as e: debug.error('Can not del %s %s' % (filedir, str(e)))
def get_value(soup,idname, tagname='input', attrs=None): tmpattrs = None if attrs: tmpattrs = attrs else: tmpattrs = {'id': idname} try: result = soup.find(tagname, attrs=tmpattrs) return result.get('value') except AttributeError as e: debug.error('tagname %s %s' % (tagname, str(e)))
def getTasksFromdisk(self, taskfiles): debug.debug('read taskfiles %s' % taskfiles) tasks = {} for taskfile in taskfiles: try: with open(taskfile, 'rb') as f: task = pickle.load(f) tasks[task.taskName] = task except Exception as e: debug.error('can not found %s %s' % (taskfile, str(e))) return tasks
def get_value(soup, idname, tagname='input', attrs=None): tmpattrs = None if attrs: tmpattrs = attrs else: tmpattrs = {'id': idname} try: result = soup.find(tagname, attrs=tmpattrs) return result.get('value') except AttributeError as e: debug.error('tagname %s %s' % (tagname, str(e)))
def getDefaultTask(self): if self.defultTask: return self.defultTask # read from dump file taskfile = self.appContext.getDefaultTaskFile() try: with open(taskfile, 'rb') as f: self.defultTask = pickle.load(f) return self.defultTask except Exception as e: debug.error('can not found %s %s' % (taskfile, str(e))) return None
def _getSoup(self): counter = 3 while counter > 0: try: response = request.urlopen(self.pageUrl) html = response.read() data = html.decode('gbk', 'ignore').replace(' ', '') data = data.encode('utf-8') self.data = data self.soup = BeautifulSoup(markup=data) return self.soup except Exception as e: debug.error('%s %s will retry again' % (self.pageUrl, str(e))) counter -= 1
def getData(self): if self.data: return self.data counter = 3 while counter > 0: try: response = request.urlopen(self.pageUrl) html = response.read() data = html.decode('gbk', 'ignore').replace(' ', '') data = data.encode('utf-8') return data except Exception as e: debug.error('%s %s will retry again' % (self.pageUrl, str(e))) counter -= 1
def getTaskResult(self, appleId): currentTaskName = self.appContext.getCurrentTaskName() results = self.reserverResult.getData(currentTaskName) if not results: debug.info('Can not find %s' % currentTaskName) return findResult = None for result in results: if appleId in result.values(): findResult = result if not findResult: debug.error('can not found verifyData %s,%s' % (appleId, currentTaskName)) return return findResult
def decryption(key, filename): try: with open(filename,'rb') as f: data = f.read() q = Fernet(key) decrypted_message = q.decrypt(data) with open(filename,'wb') as f: f.write(decrypted_message) message.success(filename + ' successfully decrypted') except Exception as e: message.error(filename + ' couldn\'t be decrypted') debug.error(filename + ' couldn\'t be decrypted') print(e) return False return True
def getNextPage(self, page): if not page: return None attrs = {'class': 'page-next'} item = page.find('a', attrs=attrs) if item: nexpage = item.get('href') counter = 3 while counter > 0: try: page = PageParser(nexpage).getSoup() return page except Exception as e: debug.error('%s will retry' % str(e)) counter -= 1
def getFirstPage(self): postdata = parse.urlencode(self.keyWords) postdata = postdata.encode(encoding='utf-8') req = request.Request(url=self.url, data=postdata) counter = 3 while counter > 0: try: result = request.urlopen(req).read() result = result.decode('gbk', 'ignore').encode('utf-8') page = BeautifulSoup(result) numberOfPage = self.getNumberOfPages(page) debug.output('first page max number %s' % numberOfPage) return (page, numberOfPage) except Exception as e: debug.error('%s will retry' % str(e)) counter -= 1
def storeKey(key, filename = STORE_KEY_F): storeTo = os.path.join (STORAGE_DIR, filename) + "_keys.key" if init_default_key_storage(): try: #creating the key file in which the key'll be stored file = open(storeTo,'w') file.write(key) file.close() message.success("Key was stored to " + storeTo + " successfully") except Exception as e: message.error("Key couldn't be stored to " + storeTo) debug.error("Key couldn't be stored to " + storeTo) return False return True else: return False
def get_smschalleng_steps(self, data=None): soup = self.get_soup(data) tag = soup.find('div', {'class': "info"}) if not tag: return None try: text = tag.getText().replace(' ', '') pos = text.find(u'第1步') pose = text.find(u'第2步') text = text[pos:pose] text = text[text.find(':'):] text = text.replace(':', '\n').replace(':', '\n') return text except Exception as e: debug.error('get_challeng_steps function: %s' % str(e)) return None
def encryption(key, filename): try: with open(filename, 'rb') as f: data = f.read() #encrypting the data from the given file name fernet = Fernet(key) encrypted=fernet.encrypt(data) with open(filename,'wb') as f: f.write(encrypted) message.success(filename + ' successfully encrypted') except Exception as e: message.error(filename + ' couldn\'t be encrypted') debug.error(filename + ' couldn\'t be encrypted') print (e) return False return True
def get_smschalleng_steps(self, data=None): soup = self.get_soup(data) tag = soup.find('div', {'class': "info"}) if not tag: return None try: text = tag.getText().replace(' ', '') pos = text.find(u'第1步') pose = text.find(u'第2步') text = text[pos: pose] text = text[text.find(':'):] text = text.replace(':', '\n').replace(':', '\n') return text except Exception as e: debug.error('get_challeng_steps function: %s' % str(e)) return None
def getKey(filename = STORE_KEY_F): getFrom = os.path.join (STORAGE_DIR, filename) + "_keys.key" if init_default_key_storage(): try: # retriving key file file = open (getFrom, 'r') key = file.read () file.close () message.success ('Loaded encryption key successfully') return key except: message.error ('Couldn\'t load encryption key') debug.error ('Couldn\'t load encryption key') return False else: message.error ('Couldn\'t load encryption key') debug.error ('Couldn\'t load encryption key') return False
def _read_page(self): self.init_cookie() if self.post_data: debug.debug('post %s' % self.url) else: debug.debug('read %s' % self.url) req = urllib2.Request(self.url, data=self.post_data, headers=self.headers) counter = 3 while counter > 0: try: res = urllib2.urlopen(req, data=None, timeout=self.timeout) data = res.read() return data except Exception as e: debug.info(str(e)) counter -= 1 debug.error('Read failed') return None
def selectTimeSlot(self, timeSlotId): '''post the timeslot data''' taskStatus = self._getCurrentTaskStatus() if taskStatus: taskStatus['id'] = timeSlotId taskStatus['taskCmd'] = 'timeslot' taskStatus['clientTimezone'] = 'Asia/Shanghai' taskStatus['cmdStatus'] = None timer = 30 while not taskStatus['cmdStatus'] and timer > 0: time.sleep(1) timer -= 1 if taskStatus['cmdStatus'] == 'OK': # result = self.getTaskResult(taskStatus['appleId']) self.addReservResult(taskStatus['appleId'], taskStatus['prompInfo']) elif taskStatus['cmdStatus'] == 'NOK': debug.error('selected time error') else: debug.error('selectTimeSlot failed')
def parserInfo(self): if not self.soup: self.soup = self.getSoup() if not self.soup: return None keywords = {'class': 'module-content gray-b-bg'} contactItems = self.soup.find('div', attrs=keywords) if not contactItems: debug.error('Can not found div tag %s' % self.pageUrl) return dditems = contactItems.find_all('dd') for dditem in dditems: tmplist = dditem.text.expandtabs(1) tmplist = tmplist.replace(';', '').strip().split(':') if len(tmplist) == 2: if '联系人' in tmplist[0]: self.contactPerson = tmplist[1] elif '固定电话' in tmplist[0]: self.phoneNumber = tmplist[1] elif '联系电话' in tmplist[0]: self.mobilePhone = tmplist[1] else: debug.error('%s %s' % (tmplist, self.pageUrl))
def submit(self): taskStatus = self._getCurrentTaskStatus() if taskStatus: captcha = self.lECaptchaAnswer.text() taskStatus['captchaAnswer'] = str(captcha) phoneNumber = self.lEPhoneNumber.text() taskStatus['phoneNumber'] = str(phoneNumber) taskStatus['smsCode'] = str(self.lESmsCode.text()) taskStatus['clientTimezone'] = 'Asia/Shanghai' taskStatus['countryISDCode'] = '86' taskStatus['taskCmd'] = 'submit' while not taskStatus['cmdStatus']: time.sleep(1) if taskStatus['cmdStatus'] == 'NOK': debug.info('submit error') self.refresh() if taskStatus['cmdStatus'] == 'Ok': result = taskStatus['cmdResult'] self.fillTableWidget(result[0], result[1]) self.viewDetail(1) else: debug.error('submit error')
def contextMenuEvent(self, event): curItem = None indexTab = self.ui.tbwg_menubar.currentIndex() # finished tasks if 2 == indexTab: curItem = self.ui.lw_finished_tasks.currentItem() if not curItem: debug.error('There is no select items %s' % curItem) return popMenu = QtWidgets.QMenu() popMenu.addAction(self.actionExportToExcel) action = popMenu.exec(self.cursor().pos()) if not action: return if action == self.actionExportToExcel: self.onExportToExcel(curItem.text()) else: debug.info('action error') if 1 == indexTab: pass
def getDBHelper(): try: return DBHelper.getInstance() except Exception as e: debug.error(str(e)) pass
def startTask(self, task): self.taskManager.resetDb('tasks.db') task.save() self.taskManager.addTask(task) debug.error('new Task id %s' % task.id)
def waitingCmd(self, page, taskStatus): ''' waiting the input ''' runtime = 300 # waiting time storeUrl = taskStatus['storeUrl'] debug.debug(storeUrl) while runtime > 0: taskCmd = taskStatus['taskCmd'] if taskCmd == 'refresh': debug.debug('refresh cmd %s' % taskStatus['appleId']) verifycodedata, tSt = page.get_verification_code_pic() taskStatus['verifyCodeData'] = verifycodedata taskStatus['taskCmd'] = None time.sleep(1) continue if taskCmd == 'submit': debug.debug('get submit cmd %s' % taskStatus['appleId']) postData = page.build_submit_post_data() postData['captchaAnswer'] = taskStatus['captchaAnswer'] postData['phoneNumber'] = taskStatus['phoneNumber'] postData['smsCode'] = taskStatus['smsCode'] postData['clientTimezone'] = taskStatus['clientTimezone'] # 'Asia/Shanghai' submitUrl = self.challengeUrlFormat % GeniusbarPage.storeNumber headers = page.headers headers['Referer'] = submitUrl headers.pop('Accept-Encoding') submitpage = GeniusbarPage(submitUrl, data=urllib.urlencode(postData), headers=headers) data = submitpage.get_data() resultfile = 'tmp/%s.htm' % taskStatus['appleId'] Writefile(resultfile, data) attrs = { "class": "error-message on", "id": "error_message_generalError" } errorMsg = submitpage.get_tag_text('label', attrs=attrs) if errorMsg: taskStatus['cmdStatus'] = 'NOK' taskStatus['taskCmd'] = None taskStatus['prompInfo'] = errorMsg page = submitpage debug.error(errorMsg) Writefile('tmp/submiterr.html', page.get_data()) continue else: # success for submit # get the time slots ret, maxrow = self.buildTimeSlotsTable(submitpage) taskStatus['cmdStatus'] = 'OK' taskStatus['timeSlots'] = (ret, maxrow) taskStatus['taskCmd'] = None page = submitpage continue if taskCmd == 'timeslot': # post timeslots debug.debug('get timeslot cmd %s' % taskStatus['appleId']) postData = self.buildPostTimeSlotsData(page) postData['clientTimezone'] = taskStatus['clientTimezone'] postData['id'] = taskStatus['id'] tlsUrl = self.timeslotFormat % GeniusbarPage.storeNumber debug.debug('tls ulr %s' % tlsUrl) headers = {} headers[ 'Accept-Language'] = 'zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3' headers[ 'User-Agent'] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0" headers[ 'Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' headers["Connection"] = 'keep-alive' headers["Host"] = 'concierge.apple.com' tlspage = GeniusbarPage(tlsUrl, data=urllib.urlencode(postData), headers=headers) data = tlspage.get_data() Writefile('tmp/posttimeslotsresult.html', data) text = self.getConfirmMsg(tlspage) taskStatus['prompInfo'] = text.replace(' ', '') Writefile('tmp/reserv-%s' % taskStatus['appleId'], taskStatus['prompInfo']) taskStatus['taskCmd'] = None taskStatus['cmdStatus'] = 'OK' break if taskCmd == 'end': taskStatus['taskCmd'] = None break #debug.debug('waiting cmd') time.sleep(1) runtime -= 1 debug.info('End task %s' % taskStatus['appleId'])
def waitingCmd(self, page, taskStatus): ''' waiting the input ''' runtime = 300 # waiting time storeUrl = taskStatus['storeUrl'] debug.debug(storeUrl) while runtime > 0: taskCmd = taskStatus['taskCmd'] if taskCmd == 'refresh': debug.debug('refresh cmd %s' % taskStatus['appleId']) verifycodedata, tSt = page.get_verification_code_pic() taskStatus['verifyCodeData'] = verifycodedata taskStatus['taskCmd'] = None time.sleep(1) continue if taskCmd == 'submit': debug.debug('get submit cmd %s' % taskStatus['appleId']) postData = page.build_submit_post_data() postData['captchaAnswer'] = taskStatus['captchaAnswer'] postData['phoneNumber'] = taskStatus['phoneNumber'] postData['smsCode'] = taskStatus['smsCode'] postData['clientTimezone'] = taskStatus['clientTimezone'] # 'Asia/Shanghai' submitUrl = self.challengeUrlFormat % GeniusbarPage.storeNumber headers = page.headers headers['Referer'] = submitUrl headers.pop('Accept-Encoding') submitpage = GeniusbarPage(submitUrl, data=urllib.urlencode(postData), headers=headers) data = submitpage.get_data() resultfile = 'tmp/%s.htm' % taskStatus['appleId'] Writefile(resultfile, data) attrs = {"class": "error-message on", "id": "error_message_generalError"} errorMsg = submitpage.get_tag_text('label', attrs=attrs) if errorMsg: taskStatus['cmdStatus'] = 'NOK' taskStatus['taskCmd'] = None taskStatus['prompInfo'] = errorMsg page = submitpage debug.error(errorMsg) Writefile('tmp/submiterr.html', page.get_data()) continue else: # success for submit # get the time slots ret, maxrow = self.buildTimeSlotsTable(submitpage) taskStatus['cmdStatus'] = 'OK' taskStatus['timeSlots'] = (ret, maxrow) taskStatus['taskCmd'] = None page = submitpage continue if taskCmd == 'timeslot': # post timeslots debug.debug('get timeslot cmd %s' % taskStatus['appleId']) postData = self.buildPostTimeSlotsData(page) postData['clientTimezone'] = taskStatus['clientTimezone'] postData['id'] = taskStatus['id'] tlsUrl = self.timeslotFormat % GeniusbarPage.storeNumber debug.debug('tls ulr %s' % tlsUrl) headers = {} headers['Accept-Language'] = 'zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3' headers['User-Agent'] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0" headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' headers["Connection"] = 'keep-alive' headers["Host"] = 'concierge.apple.com' tlspage = GeniusbarPage(tlsUrl, data=urllib.urlencode(postData), headers=headers) data = tlspage.get_data() Writefile('tmp/posttimeslotsresult.html', data) text = self.getConfirmMsg(tlspage) taskStatus['prompInfo'] = text.replace(' ', '') Writefile('tmp/reserv-%s' % taskStatus['appleId'], taskStatus['prompInfo']) taskStatus['taskCmd'] = None taskStatus['cmdStatus'] = 'OK' break if taskCmd == 'end': taskStatus['taskCmd'] = None break #debug.debug('waiting cmd') time.sleep(1) runtime -= 1 debug.info('End task %s' % taskStatus['appleId'])