mirror of https://github.com/testerSunshine/12306
改为自动候补+下单
parent
d31171ea29
commit
28c3b37cbe
|
@ -1,17 +1,18 @@
|
|||
# 刷票模式:1=刷票 2=候补
|
||||
# 关于软件使用配置说明,一定要看!!!
|
||||
# ps: 如果是候补车票,需要通过人证一致性核验的用户及激活的“铁路畅行”会员可以提交候补需求,请您按照操作说明在铁路12306app.上完成人证核验
|
||||
TICKET_TYPE = 2
|
||||
|
||||
# 候补最晚兑现日期,如果是候补订单,这个值一定要填
|
||||
# 格式为日期+小时+分
|
||||
# ps: 这个日期一定要填小于最长订票时间(30天)
|
||||
# 举例: 比如今天才可以买10.1号的票,比如你那个发车是10.1号上午两点,你兑现时间写到10.1晚上22点?
|
||||
# 这个日期一定要填小于最长订票时间(30天)
|
||||
# t("#fromDate").val() + "#" + t("#dafaultTime").html().replace("时", "") + "#" + t("#dafaultMinutes").html().replace("分", ""),
|
||||
# 关于候补了之后是否还能继续捡漏的问题在此说明: 软件为全自动候补加捡漏,如果软件候补成功则会停止抢票,发出邮件通知,但是不会影响你继续捡漏,
|
||||
# 如果这个时候捡漏捡到的话,也是可以付款成功的,也就是说,捡漏+候补,可以最大程度提升抢票成功率
|
||||
|
||||
# 候补最晚兑现日期,目前软件为捡漏加自动候补,所以这个值一定要填
|
||||
# 格式为日期+小时+分
|
||||
# 举例: 比如今天才可以买10.1号的票,比如你那个发车是10.1号上午两点,你兑现时间写到10.1晚上22点?
|
||||
J_Z_PARAM = "2019-09-28#22#59"
|
||||
|
||||
# 出发日期(list) "2018-01-06", "2018-01-07"
|
||||
STATION_DATES = [
|
||||
"2019-10-01"
|
||||
"2019-09-27"
|
||||
]
|
||||
|
||||
# 填入需要购买的车次(list),"G1353"
|
||||
|
@ -26,17 +27,18 @@ FROM_STATION = "深圳北"
|
|||
TO_STATION = "隆回"
|
||||
|
||||
# 座位(list) 多个座位ex:
|
||||
# - "商务座"
|
||||
# - "一等座"
|
||||
# - "二等座"
|
||||
# - "特等座"
|
||||
# - "软卧"
|
||||
# - "硬卧"
|
||||
# - "硬座"
|
||||
# - "无座"
|
||||
# - "动卧"
|
||||
# "商务座",
|
||||
# "一等座",
|
||||
# "二等座",
|
||||
# "特等座",
|
||||
# "软卧",
|
||||
# "硬卧",
|
||||
# "硬座",
|
||||
# "无座",
|
||||
# "动卧",
|
||||
SET_TYPE = [
|
||||
"商务座"
|
||||
"商务座",
|
||||
"一等座"
|
||||
]
|
||||
|
||||
# 当余票小于乘车人,如果选择优先提交,则删减联系人和余票数一致在提交
|
||||
|
@ -47,12 +49,12 @@ IS_MORE_TICKET = False
|
|||
# - "张三"
|
||||
# - "李四"
|
||||
TICKET_PEOPLES = [
|
||||
"文贤平",
|
||||
"",
|
||||
]
|
||||
|
||||
# 12306登录账号
|
||||
USER = "931128603@qq.com"
|
||||
PWD = "QWERTY"
|
||||
USER = ""
|
||||
PWD = ""
|
||||
|
||||
# 加入小黑屋时间默认为5分钟,此功能为了防止僵尸票导致一直下单不成功错过正常的票
|
||||
TICKET_BLACK_LIST_TIME = 5
|
||||
|
@ -74,12 +76,12 @@ IS_AUTO_CODE = True
|
|||
# password: "授权码"
|
||||
# host: "smtp.qq.com"
|
||||
EMAIL_CONF = {
|
||||
"IS_MAIL": True,
|
||||
"email": "931128603@qq.com",
|
||||
"notice_email_list": "931128603@qq.com",
|
||||
"username": "931128603@qq.com",
|
||||
"IS_MAIL": False,
|
||||
"email": "",
|
||||
"notice_email_list": "",
|
||||
"username": "",
|
||||
"password": "",
|
||||
"host": "smtp.qq.com",
|
||||
"host": "",
|
||||
}
|
||||
|
||||
# 是否开启 pushbear 微信提醒, 使用前需要前往 http://pushbear.ftqq.com 扫码绑定获取 send_key 并关注获得抢票结果通知的公众号
|
||||
|
|
|
@ -163,3 +163,8 @@
|
|||
- 增加候补订单功能
|
||||
- 新增TICKET_TYPE字段,1=刷票 2=候补
|
||||
- 目前候补只支持单车次,多乘车人候补,由于目前不是很懂候补的需求,所以暂时这样做
|
||||
|
||||
- 2019.09.02更新
|
||||
- 剔除新增TICKET_TYPE字段,发现此字段冗余,目前改为全天自动候补+捡漏
|
||||
- 增加候补订单功能
|
||||
- 优先级:下单再候补
|
||||
|
|
|
@ -187,6 +187,7 @@ class select:
|
|||
train_date = queryResult.get("train_date", "")
|
||||
stationTrainCode = queryResult.get("stationTrainCode", "")
|
||||
secretStr = queryResult.get("secretStr", "")
|
||||
secretList = queryResult.get("secretList", "")
|
||||
seat = queryResult.get("seat", "")
|
||||
leftTicket = queryResult.get("leftTicket", "")
|
||||
query_from_station_name = queryResult.get("query_from_station_name", "")
|
||||
|
@ -200,7 +201,7 @@ class select:
|
|||
set_type="" if isinstance(seat, list) else seat_conf_2[seat],
|
||||
# 候补订单需要设置多个坐席
|
||||
is_more_ticket_num=is_more_ticket_num)
|
||||
getPassengerDTOsResult = s.getPassengerTicketStrListAndOldPassengerStr()
|
||||
getPassengerDTOsResult = s.getPassengerTicketStrListAndOldPassengerStr(secretStr, secretList)
|
||||
if getPassengerDTOsResult.get("status", False):
|
||||
self.passengerTicketStrList = getPassengerDTOsResult.get("passengerTicketStrList", "")
|
||||
self.passengerTicketStrByAfterLate = getPassengerDTOsResult.get(
|
||||
|
@ -209,7 +210,7 @@ class select:
|
|||
self.set_type = getPassengerDTOsResult.get("set_type", "")
|
||||
# 提交订单
|
||||
# 订单分为两种,一种为抢单,一种为候补订单
|
||||
if TickerConfig.TICKET_TYPE == 1:
|
||||
if secretStr: # 正常下单
|
||||
if TickerConfig.ORDER_TYPE == 1: # 快速下单
|
||||
a = autoSubmitOrderRequest(session=self,
|
||||
secretStr=secretStr,
|
||||
|
@ -230,8 +231,8 @@ class select:
|
|||
self.passengerTicketStrList, self.oldPassengerStr, train_date,
|
||||
TickerConfig.TICKET_PEOPLES)
|
||||
sor.sendSubmitOrderRequest()
|
||||
elif TickerConfig.TICKET_TYPE == 2:
|
||||
c = chechFace(self, secretStr)
|
||||
elif secretList: # 候补订单
|
||||
c = chechFace(self, secretList)
|
||||
c.sendChechFace()
|
||||
else:
|
||||
random_time = round(random.uniform(sleep_time_s, sleep_time_t), 2)
|
||||
|
|
|
@ -62,7 +62,7 @@ class getPassengerDTOs:
|
|||
}
|
||||
return str(passengerTicketStr[set_type.replace(' ', '')])
|
||||
|
||||
def getPassengerTicketStrListAndOldPassengerStr(self):
|
||||
def getPassengerTicketStrListAndOldPassengerStr(self, secretStr, secretList):
|
||||
"""
|
||||
获取提交车次人内容格式
|
||||
passengerTicketStr O,0,1,文贤平,1,43052419950223XXXX,15618715583,N_O,0,1,梁敏,1,43052719920118XXXX,,N
|
||||
|
@ -84,7 +84,7 @@ class getPassengerDTOs:
|
|||
raise PassengerUserException(ticket.DTO_NOT_IN_LIST)
|
||||
if len(user_info) < self.is_more_ticket_num: # 如果乘车人填错了导致没有这个乘车人的话,可能乘车人数会小于自动乘车人
|
||||
self.is_more_ticket_num = len(user_info)
|
||||
if TickerConfig.TICKET_TYPE is 1:
|
||||
if secretStr:
|
||||
set_type = self.getPassengerTicketStr(self.set_type)
|
||||
if self.is_more_ticket_num is 1:
|
||||
passengerTicketStrList.append(
|
||||
|
@ -104,7 +104,7 @@ class getPassengerDTOs:
|
|||
oldPassengerStr.append(
|
||||
user_info[i]['passenger_name'] + "," + user_info[i]['passenger_id_type_code'] + "," +
|
||||
user_info[i]['passenger_id_no'] + "," + user_info[i]['passenger_type'] + '_')
|
||||
elif TickerConfig.TICKET_TYPE is 2:
|
||||
elif secretList:
|
||||
"""
|
||||
候补订单有多少个联系人,就候补多少个联系人了,没有优先提交之说
|
||||
1#XXXX#1#***************77X#bf6ae40d3655ae7eff005ee21d95876b38ab97a8031b464bc2f74a067e3ec957;
|
||||
|
|
|
@ -77,19 +77,24 @@ class query:
|
|||
if result:
|
||||
for i in value['result']:
|
||||
ticket_info = i.split('|')
|
||||
if TickerConfig.TICKET_TYPE is 2 and self.check_is_need_train(ticket_info):
|
||||
# 如果最后一位为1,则是可以候补的,不知道这些正确嘛?
|
||||
if ticket_info[-2] == "1":
|
||||
print("当前订单可以候补,尝试提交候补订单")
|
||||
return {
|
||||
"secretStr": ticket_info[0],
|
||||
"seat": TickerConfig.SET_TYPE,
|
||||
"status": True,
|
||||
}
|
||||
elif TickerConfig.TICKET_TYPE is 1:
|
||||
if ticket_info[11] == "Y" and ticket_info[1] == "预订": # 筛选未在开始时间内的车次
|
||||
for j in self._station_seat:
|
||||
is_ticket_pass = ticket_info[j]
|
||||
# if TickerConfig.TICKET_TYPE is 2 and self.check_is_need_train(ticket_info):
|
||||
# # 如果最后一位为1,则是可以候补的,不知道这些正确嘛?
|
||||
# if ticket_info[-2] == "1":
|
||||
# nate = list(ticket_info[-1])
|
||||
# for set_type in TickerConfig.SET_TYPE:
|
||||
# if TickerConfig.PASSENGER_TICKER_STR(set_type) not in nate:
|
||||
# continue
|
||||
# print("当前订单可以候补,尝试提交候补订单")
|
||||
# return {
|
||||
# "secretStr": ticket_info[0],
|
||||
# "seat": TickerConfig.SET_TYPE,
|
||||
# "status": True,
|
||||
# }
|
||||
# elif TickerConfig.TICKET_TYPE is 1:
|
||||
if ticket_info[1] == "预订": # 筛选未在开始时间内的车次
|
||||
for j in self._station_seat:
|
||||
is_ticket_pass = ticket_info[j]
|
||||
if ticket_info[11] == "Y":
|
||||
if is_ticket_pass != '' and is_ticket_pass != '无' and is_ticket_pass != '*' and self.check_is_need_train(
|
||||
ticket_info): # 过滤有效目标车次
|
||||
secretStr = ticket_info[0]
|
||||
|
@ -144,6 +149,22 @@ class query:
|
|||
"cdn": self.httpClint.cdn,
|
||||
"status": True,
|
||||
}
|
||||
elif is_ticket_pass == '无' and ticket_info[-2] == "1":
|
||||
"""
|
||||
is_ticket_pass如果有别的显示,但是可以候补,可以提issues提出来,附上query log,我将添加上
|
||||
判断车次是否可以候补
|
||||
目前的候补机制是只要一有候补位置,立马提交候补
|
||||
"""
|
||||
# 如果最后一位为1,则是可以候补的,不知道这些正确嘛?
|
||||
nate = list(ticket_info[-1])
|
||||
for set_type in TickerConfig.SET_TYPE:
|
||||
if TickerConfig.PASSENGER_TICKER_STR[set_type] not in nate:
|
||||
print(f"当前订单可以候补,候补位置为: {set_type}, 尝试提交候补订单")
|
||||
return {
|
||||
"secretList": ticket_info[0],
|
||||
"seat": [set_type],
|
||||
"status": True,
|
||||
}
|
||||
else:
|
||||
print(u"车次配置信息有误,或者返回数据异常,请检查 {}".format(station_ticket))
|
||||
return {"code": ticket.FAIL_CODE, "status": False, "cdn": self.httpClint.cdn, }
|
||||
|
|
Loading…
Reference in New Issue