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.

128 lines
4.3 KiB

import os
import time
import pickle # 实现读取cookie
from selenium import webdriver
# 大麦网首页
damai_url = 'https://www.damai.cn/'
# 登录
login_url = 'https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F'
# 抢票页面
target_url = 'https://detail.damai.cn/item.htm?id=779820312992'
class Concert:
# 初始化加载
def __init__(self):
self.status = 0 # 状态,表示当前操作执行到那一步了
self.login_method = 1 # {0: 模拟登录, 1cookie登录}
self.driver = webdriver.Edge() # 初始化浏览器
# cookies 登录网站的时候出现的,记录用户信息
def set_cookies(self):
self.driver.get(login_url) # 帮助我们打开一个网页
print("###请扫码登录###")
time.sleep(20)
print("###登录成功###")
# cookie.pkl
pickle.dump(self.driver.get_cookies(), open('cookies.pkl', 'wb'))
print("###cookie保存成功###")
# 抢票
self.driver.get(target_url)
# 如果当前我已经有了cookie.pkl
def get_cookies(self):
cookies = pickle.load(open('cookies.pkl', 'rb'))
for cookie in cookies:
cookie_dict = {
'domain': '.damai.cn',
'name': cookie.get('name'),
'value': cookie.get('value')
}
self.driver.add_cookie(cookie_dict)
print("###载入cookie成功###")
# 登录
def login(self):
# 如果为0 模拟登陆一下
if self.login_method == 0:
self.driver.get(login_url)
elif self.login_method == 1:
# 如果当前目录下 没有这个cookie.pkl这个文件
if not os.path.exists('cookies.pkl'):
# 登录一下 登录信息记录
self.set_cookies()
else:
self.driver.get(target_url)
# 登录一下 通过selenium传入一些用户信息
self.get_cookies()
# 打开浏览器
def enter_concert(self):
print("###打开浏览器,进入大麦网###")
# 调用login
self.login()
self.driver.refresh()
self.status = 2
print("###登录成功###")
# 二、抢票且下单
# 选票操作
def choose_ticket(self):
if self.status == 2:
print('=' * 30)
print('###请开始日期选择以及票价选择###')
print(self.driver.title.find("确认订单") == 1)
while self.driver.title.find("确认订单") == -1:
# 下单按钮
buybutton = self.driver.find_element_by_class_name("buybtn").text
if buybutton == '提交缺货登记':
self.driver.refresh()
elif buybutton == '立即购买':
self.driver.find_element_by_class_name("buybtn").click()
self.status = 5
elif buybutton == '选座购买':
self.driver.find_element_by_class_name("buybtn").click()
self.status = 4
else:
self.status = 100
title = self.driver.title
if title == '选座购买':
# 执行选座操作
self.status = 10
elif title == '确认订单':
# 实现下单的逻辑
while True:
print('###正在加载###')
self.check_order()
break
# 下单操作
def check_order(self):
if self.status in [4, 5]:
print("###开始确认订单###")
try:
self.driver.find_element_by_xpath('//*[@id="container"]/div/div[2]/div[2]/div[1]/div/label').click()
except Exception as e:
print("###购票人信息选中失败,自行查看元素位置###")
print(e)
time.sleep(0.5)
self.driver.find_element_by_xpath('//*[@id="container"]/div/div[9]/button').click()
if '__main__' == __name__:
con = Concert()
con.enter_concert()
time.sleep(1)
con.choose_ticket()