def jd_buy(self): # self.method: # 0:自动全选购物车 # 1:用户自主选择要购买的商品 # 2:用户输入宝贝链接 self.logger.info("开始抢购商品,抢购模式为:" + str(self.method) + ",设定时间为:" + self.set_time) # 自动全选购物车 if self.method == 0: # 打开京东购物车 self.browser.get("https://cart.jd.com/cart_index/") # 等待打开购物车 time.sleep(2) while True: try: # 找到全选按钮并点击 if self.browser.find_element_by_class_name("cart-checkbox"): self.browser.find_element_by_class_name("cart-checkbox").click() break except: pass # print("[{}] 未找到全选按钮".format(time_func.get_time())) # time.sleep(0.1) self.auto_pay() # 用户自主选择要购买的商品 elif self.method == 1: # 打开京东购物车 self.browser.get("https://cart.jd.com/cart_index/") # 等待打开购物车(找到购物车中独有”全选“元素,判定为打开) time.sleep(2) # 此处无法判断用户何时选择完毕,选择等待10s为用户选择完毕时间 print("[{}] 请手动勾选需购买的物品".format(time_func.get_time())) time.sleep(10) self.auto_pay() # 用户输入宝贝链接 elif self.method == 2: # 检查给入商品链接是否为合法淘宝链接 if "jd" in self.goods_url: try: # 打开指定商品链接 self.browser.get(self.goods_url) time.sleep(2) # 等待勾选抢购的商品型号 print("[{}] 请尽快勾选所需物品型号".format(time_func.get_time())) time.sleep(5) # 京东要先加入购物车 if self.browser.find_element_by_link_text("加入购物车"): self.browser.find_element_by_link_text("加入购物车").click() time.sleep(0.5) self.auto_pay() except: print("[{}] 无法打开指定链接".format(time_func.get_time())) self.logger.info("无法打开指定链接,抢购失败") else: print("[{}] 链接非法,请输入合法淘宝网商品链接".format(time_func.get_time())) self.logger.info("给入链接非法,抢购失败")
def login(self): """打开浏览器并登录""" self.browser.get(self.url) if self.browser.find_element_by_link_text("亲,请登录"): self.browser.find_element_by_link_text("亲,请登录").click() print("[{}] 请扫码登录".format(time_func.get_time())) # 淘宝登录后”亲,请登录“元素依然在,但会增加用户名元素,通过检查用户名元素来判断是否成功登录 while True: try: if self.browser.find_element_by_link_text(self.tb_id): print("[{}] 登录成功".format(time_func.get_time())) break time.sleep(0.3) except: pass
def login(self): """打开浏览器并登录""" self.browser.get(self.url) if self.browser.find_element_by_link_text("你好,请登录"): self.browser.find_element_by_link_text("你好,请登录").click() print("[{}] 请扫码登录".format(time_func.get_time())) # 京东登录后”你好,请登录“元素会消失,也会增加用户名元素,通过检查用户名元素来判断是否成功登录 while True: try: if self.browser.find_element_by_class_name("nickname"): print("[{}] 登录成功".format(time_func.get_time())) break time.sleep(0.3) except: pass
def tb_buy(self): # self.method: # 0:自动全选购物车 # 1:用户自主选择要购买的商品 # 2:用户输入宝贝链接 self.logger.info("开始抢购商品,抢购模式为:" + str(self.method) + ",设定时间为:" + self.set_time) # 自动全选购物车 if self.method == 0: # 打开淘宝购物车 self.browser.get("https://cart.taobao.com/cart.htm") # 等待打开购物车 time.sleep(2) while True: try: # 找到全选按钮并点击 if self.browser.find_element_by_id("J_SelectAll1"): self.browser.find_element_by_id("J_SelectAll1").click() time.sleep(0.5) break except: pass # print("[{}] 未找到全选按钮".format(time_func.get_time())) # time.sleep(0.1) self.auto_pay() # 用户自主选择要购买的商品 elif self.method == 1: # 打开淘宝购物车 self.browser.get("https://cart.taobao.com/cart.htm") # 等待打开购物车(找到购物车中独有”全选“元素,判定为打开) time.sleep(2) # 此处无法判断用户何时选择完毕,选择等待10s为用户选择完毕时间 print("[{}] 请手动勾选需购买的物品".format(time_func.get_time())) time.sleep(10) self.auto_pay() # 用户输入宝贝链接 elif self.method == 2: # 检查给入商品链接是否为合法淘宝链接 if "taobao" in self.goods_url or "tmall" in self.goods_url: try: # 打开指定商品链接 self.browser.get(self.goods_url) time.sleep(2) # 等待勾选抢购的商品型号 print("[{}] 请尽快勾选所需物品型号".format(time_func.get_time())) time.sleep(5) # 不停检查当前时间是否已达到抢购开始时间,若达到,则开始抢购 while True: # now_time为datetime获取到的本地时间,精确到毫秒 now_time = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S.%f") # server_time为利用request从淘宝服务器返回的包头获取到的服务器时间,精确到秒 server_time = time_func.get_tb_server_time() # 如果结算超时,则判定为抢购失败 if time_func.time_out(set_time=self.set_time, now_time=now_time): print( "[{}][{}] <---------------结算超时,抢购失败--------------->" .format(now_time, server_time)) # 将超时记录记入日志 self.logger.info(now_time + "商品结算超时,抢购失败") if self.email: SendMail.SendEmail( self.email, SendMail.platform_list["taobao"], SendMail.fail_text) return if (now_time > self.set_time) or (server_time > self.set_time): while True: try: # 时间到了便尝试点击立即购买 if self.browser.find_element_by_link_text( "立即购买"): self.browser.find_element_by_link_text( "立即购买").click() # 若立即购买点击后用户还没有选择好商品型号,则无法进入提交订单页面 # 通过检查此时页面中有无提交订单,来判断是否选好型号 # 若检查到提交订单,则点击,并在各处反馈成功信息 if self.browser.find_element_by_link_text( "提交订单"): self.browser.find_element_by_link_text( "提交订单").click() print( "[{}] <---------------抢购成功,请尽快付款--------------->" .format(time_func.get_datetime())) # 将成功记录记入日志 self.logger.info( time_func.get_datetime() + "<---抢购成功!--->商品链接:" + self.goods_url) # 发邮件提示成功 if self.email: SendMail.SendEmail( self.email, SendMail. platform_list["taobao"], SendMail.success_text) break except: pass # 防止上方提交订单失败 while True: if self.browser.find_element_by_link_text( "提交订单"): try: self.browser.find_element_by_link_text( "提交订单").click() print( "[{}] <---------------抢购成功,请尽快付款--------------->" .format(time_func.get_datetime())) self.logger.info( time_func.get_datetime() + "<---抢购成功!--->商品链接:" + self.goods_url) return except: print("[{}] 再次尝试提交订单".format( time_func.get_time())) else: return except: print("[{}] 无法打开指定链接".format(time_func.get_time())) else: print("[{}] 链接非法,请输入合法淘宝网商品链接".format(time_func.get_time()))
def __init__(self, parent=None): self.email = "" # 用户收件邮箱 self.platform = "" # 抢购平台 self.method = -1 # 抢购模式,默认为0,自动全选购物车 self.id = "tb189084993" # 平台用户名 self.goods_url = "" # 手动输入商品链接模式下,输入的商品链接 super(UiMainWindow, self).__init__(parent) self.resize(1000, 700) # 主界面大小 # 反馈邮箱输入框 self.lineEdit_email = QLineEdit(self) self.lineEdit_email.setObjectName("lineEdit") self.lineEdit_email.setGeometry(QRect(200, 330, 600, 50)) self.lineEdit_email.setFont(QFont("幼圆", 11)) self.lineEdit_email.setPlaceholderText("请输入接收邮箱(非必填,用于接收抢购结果通知)") self.lineEdit_email.setStyleSheet( "background-color: rgb(255, 255, 255);" "border-radius:4px;") self.lineEdit_email.textChanged.connect(self.lineEditEmailChange) # 购物平台用户名输入框 self.lineEdit_id = QLineEdit(self) self.lineEdit_id.setObjectName("lineEdit") self.lineEdit_id.setGeometry(QRect(200, 385, 200, 50)) self.lineEdit_id.setFont(QFont("幼圆", 11)) self.lineEdit_id.setPlaceholderText("请输入购物网站用户名") self.lineEdit_id.setStyleSheet("background-color: rgb(255, 255, 255);" "border-radius:4px;") self.lineEdit_id.textChanged.connect(self.lineEditIdChange) # 购物平台选择框 self.comboBox_platform = QComboBox(self) self.comboBox_platform.setGeometry(QRect(200, 445, 200, 50)) self.comboBox_platform.setObjectName("comboBox") self.comboBox_platform.setPlaceholderText("请选择购物平台") self.comboBox_platform.addItem("淘宝") self.comboBox_platform.addItem("天猫") self.comboBox_platform.addItem("京东") # 优化ComboBox样式 self.comboBox_platform.setStyleSheet( "QComboBox{" "border-color: rgb(158,158,158);" "background: white;" # combobox背景色 "border: 1px solid gray;" # 边框宽度、颜色 "border-radius: 3px;}" "QComboBox::drop-down{" "border: none;}" "QComboBox::down-arrow{" "image: url(./images/down_arrow.png);}" "QComboBox QAbstractItemView::item{" "height: 100px;" "background-color: rgb(0,0,0);}" "QComboBox QAbstractItemView{" "selection-background-color: rgb(64, 156, 255);" # 选中项背景色 "selection-color: rgb(255, 255, 255);" # 选中项文字颜色" "background: rgb(255,255,255);" # 下拉框背景色 "border: 1px solid rgb(158,158,158);" # 下拉框边框宽度及颜色 "border-radius: 0px 0px 5px 5px;" "outline: 0px;}") # 去选中项虚线 self.comboBox_platform.setFont(QFont("幼圆", 12)) self.comboBox_platform.setAttribute(Qt.WA_TranslucentBackground) self.comboBox_platform.setWindowFlags(Qt.FramelessWindowHint | Qt.NoDropShadowWindowHint) self.comboBox_platform.currentIndexChanged.connect(self.platformchange) # 购物模式选择框 self.comboBox_mod = QComboBox(self) self.comboBox_mod.setGeometry(QRect(450, 445, 350, 50)) self.comboBox_mod.setStyleSheet( "QComboBox{" "border-color: rgb(158,158,158);" "background: white;" # combobox背景色 "border: 1px solid gray;" # 边框宽度、颜色 "border-radius: 3px;}" "QComboBox::drop-down{" "border: none;}" "QComboBox::down-arrow{" "image: url(./images/down_arrow.png);}" "QComboBox QAbstractItemView::item{" "height: 100px;" "background-color: rgb(0,0,0);}" "QComboBox QAbstractItemView{" "selection-background-color: rgb(64, 156, 255);" # 选中项背景色 "selection-color: rgb(255, 255, 255);" # 选中项文字颜色" "background: rgb(255,255,255);" # 下拉框背景色 "border: 1px solid rgb(158,158,158);" # 下拉框边框宽度及颜色 "border-radius: 0px 0px 5px 5px;" "outline: 0px;}") # 去选中项虚线 self.comboBox_mod.setObjectName("comboBox") self.comboBox_mod.setPlaceholderText("请选择秒杀模式") self.comboBox_mod.addItem("自动全选购物车") self.comboBox_mod.addItem("手动选择购物车内商品") self.comboBox_mod.addItem("手动输入商品链接") self.comboBox_mod.setFont(QFont("幼圆", 12)) self.comboBox_mod.currentIndexChanged.connect(self.methodchange) # 模式为2时手动输入商品链接框 self.lineEdit = QLineEdit(self) self.lineEdit.setObjectName("lineEdit") self.lineEdit.setGeometry(QRect(405, 385, 395, 50)) self.lineEdit.setFont(QFont("幼圆", 11)) self.lineEdit.setPlaceholderText("请输入商品链接") self.lineEdit.setStyleSheet("background-color: rgb(255, 255, 255);" "border-radius:4px;") # 默认method为0,所以 self.lineEdit.setHidden(True) self.lineEdit.textChanged.connect(self.lineEditUrlChange) # 秒杀时间选择框 self.dateTimeEdit = QDateTimeEdit(self) self.dateTimeEdit.setGeometry(QRect(200, 510, 600, 50)) self.dateTimeEdit.setObjectName("dateTimeEdit") self.dateTimeEdit.setAccelerated(True) self.dateTimeEdit.setDisplayFormat("yyyy-MM-dd HH:mm:ss") self.dateTimeEdit.setStyleSheet( "QDateTimeEdit{" "border-color: rgb(158,158,158);" "background: white;" "border: 1px solid gray;" # 边框宽度、颜色 "border-radius: 3px;}" "QDateTimeEdit::up-button{" "image: url(./images/datetime_add.png);}" "QDateTimeEdit::down-button{" "image: url(./images/datetime_reduce.png);}") self.dateTimeEdit.setFont(QFont("幼圆", 14)) # 设置最小日期时间为当前时间 l_t = time_func.get_time() # 默认时间为距离当前时间最近的10min的倍数 t = [ int(l_t[0:4]), int(l_t[5:7]), int(l_t[8:10]), int(l_t[11:13]), int(l_t[14:16]), int(l_t[17:19]) ] if t[4] // 10 == 5: if t[3] == 23: t[3] = 0 t[4] = 0 else: t[3] += 1 t[4] = 0 else: t[4] = (t[4] // 10 + 1) * 10 self.dateTimeEdit.setDateTime( QDateTime(QDate(t[0], t[1], t[2]), QTime(t[3], t[4], 0))) self.set_time = self.dateTimeEdit.text() self.dateTimeEdit.setCurrentSection(QDateTimeEdit.MinuteSection) self.dateTimeEdit.dateTimeChanged.connect(self.datetimechange) # self.dateTimeEdit.setCalendarPopup(True) # 弹出日历选择日期,时间无法使用键头调整 # 按钮 self.pushButton = QPushButton(self) self.pushButton.setGeometry(QRect(200, 580, 600, 60)) self.pushButton.setStyleSheet("background-color: rgb(65, 205, 82);\n" "color: rgb(255, 255, 255);" "border-radius:10px;") self.pushButton.setFont(QFont("华文中宋", 16)) self.pushButton.setText("开 始 秒 杀") self.pushButton.setObjectName("pushButton") self.pushButton.clicked.connect(self.miaosha)