diff --git a/12306login/.idea/workspace.xml b/12306login/.idea/workspace.xml
index b4c587a..e2cfab9 100644
--- a/12306login/.idea/workspace.xml
+++ b/12306login/.idea/workspace.xml
@@ -35,11 +35,11 @@
-
-
+
+
-
-
+
+
@@ -47,14 +47,12 @@
-
-
+
+
-
-
-
-
-
+
+
+
@@ -69,11 +67,11 @@
-
+
-
+
@@ -119,8 +117,8 @@
-
+
@@ -152,6 +150,7 @@
+
@@ -164,20 +163,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -194,7 +179,6 @@
-
@@ -213,17 +197,18 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -583,9 +569,9 @@
-
+
-
+
@@ -637,7 +623,7 @@
-
+
@@ -663,10 +649,6 @@
-
-
-
-
@@ -682,7 +664,7 @@
-
+
@@ -708,10 +690,6 @@
-
-
-
-
@@ -727,7 +705,7 @@
-
+
@@ -753,10 +731,6 @@
-
-
-
-
@@ -764,10 +738,6 @@
-
-
-
-
@@ -777,10 +747,6 @@
-
-
-
-
@@ -816,10 +782,6 @@
-
-
-
-
@@ -850,7 +812,6 @@
-
@@ -866,30 +827,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -904,7 +841,25 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/12306login/haha.py b/12306login/haha.py
index 5fbda01..cf0f551 100644
--- a/12306login/haha.py
+++ b/12306login/haha.py
@@ -14,4 +14,19 @@ submitParams = [
('query_to_station_name', 1) # 到站名称,汉字
]
-print urllib.unquote()
\ No newline at end of file
+print urllib.unquote()
+
+
+
+
+class a:
+ def __init__(self, factory):
+ pass
+ def b(self):
+ pass
+
+class c:
+ def __init__(self):
+ pass
+ def d(self):
+ return a().b()
\ No newline at end of file
diff --git a/12306login/init/select_ticket_info.py b/12306login/init/select_ticket_info.py
index 48b6d75..3df0de4 100644
--- a/12306login/init/select_ticket_info.py
+++ b/12306login/init/select_ticket_info.py
@@ -12,8 +12,27 @@ from myUrllib import myurllib2
class select:
def __init__(self, from_station, to_station):
- self.from_station = from_station
- self.to_station = to_station
+ self.from_station, self.to_station = self.station_table(from_station, to_station)
+ self.order_request_params = {} # 订单提交时的参数
+ self.ticketInfoForPassengerForm = {} # 初始化当前页面参数
+ self.current_seats = {} # 席别信息
+ self.token = ''
+ self.set_type = ''
+
+ def get_order_request_params(self):
+ return self.order_request_params
+
+ def get_ticketInfoForPassengerForm(self):
+ return self.ticketInfoForPassengerForm
+
+ def get_current_seats(self):
+ return self.current_seats
+
+ def get_token(self):
+ return self.token
+
+ def get_set_type(self):
+ return self.set_type
def station_seat(self, index):
"""
@@ -32,7 +51,7 @@ class select:
}
return seat[index]
- def station_table(self):
+ def station_table(self, from_station, to_station):
"""
读取车站信息
:param station:
@@ -46,8 +65,8 @@ class select:
# print info[i]
n_info = info[i].split('|')
station_name[n_info[1]] = n_info[2]
- from_station = station_name[self.from_station]
- to_station = station_name[self.to_station]
+ from_station = station_name[from_station]
+ to_station = station_name[to_station]
return from_station, to_station
def time(self):
@@ -62,11 +81,23 @@ class select:
"""
initdc_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'
initdc_result = myurllib2.get(initdc_url)
- name = r"var globalRepeatSubmitToken = '(\S+)'"
- token = re.search(name, initdc_result).group(1)
- return token
+ token_name = re.compile(r"var globalRepeatSubmitToken = '(\S+)'")
+ ticketInfoForPassengerForm_name = re.compile(r'var ticketInfoForPassengerForm=(\{.+\})?')
+ order_request_params_name = re.compile(r'var orderRequestDTO=(\{.+\})?')
+ # if token_name and ticketInfoForPassengerForm_name and order_request_params_name:
+ self.token = re.search(token_name, initdc_result).group(1)
+ re_tfpf = re.findall(ticketInfoForPassengerForm_name, initdc_result)
+ re_orp = re.findall(order_request_params_name, initdc_result)
+ if re_tfpf:
+ self.ticketInfoForPassengerForm = json.loads(re_tfpf[0].replace("'", '"'))
+ else:
+ print('车次获取信息为空')
+ if re_orp:
+ self.order_request_params = json.loads(re_orp[0].replace("'", '"'))
+ else:
+ print('订单获取信息为空')
- def getPassengerDTOs(self, token):
+ def getPassengerDTOs(self):
"""
获取乘客信息
:return:
@@ -74,7 +105,7 @@ class select:
get_passengerDTOs = 'https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs'
get_data = {
'_json_att': None,
- 'REPEAT_SUBMIT_TOKEN': token
+ 'REPEAT_SUBMIT_TOKEN': self.token
}
jsonData = json.loads(myurllib2.Post(get_passengerDTOs, get_data))
if 'data' in jsonData and jsonData['data'] and 'normal_passengers' in jsonData['data'] and jsonData['data'][
@@ -89,29 +120,33 @@ class select:
print("未查找到常用联系人")
def submitOrderRequest(self):
- from_station, to_station = self.station_table()
+ """
+ 提交车次信息
+ :return: 车次信息,座位号
+ """
+
select_url = 'https://kyfw.12306.cn/otn/leftTicket/query?' \
'leftTicketDTO.train_date={}&leftTicketDTO.from_station={}' \
- '&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(self.time(), from_station, to_station)
+ '&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(self.time(), self.from_station, self.to_station)
check_user_url = 'https://kyfw.12306.cn/otn/login/checkUser'
submit_station_url = 'https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'
station_ticket = json.loads(myurllib2.get(select_url), encoding='utf-8')
value = station_ticket['data']
if value.__len__() is 0:
- print '当前车次查询为空...'
+ print ('当前车次查询为空...')
else:
for i in value['result']:
ticket_info = i.split('|')
for j in range(20, 33):
- if ticket_info[j] != '' and ticket_info[j] != '无':
- print '车次: ' + ticket_info[3] + ' 始发车站: ' + value['map']['AOH'] + ' 终点站: ' + \
- value['map']['CSQ'] + ' ' + self.station_seat(j) + ': ' + ticket_info[j]
- print '正在尝试提交订票...'
+ if ticket_info[j] != '' and ticket_info[j] != '无': # 过滤有效目标车次
+ print ('车次: ' + ticket_info[3] + ' 始发车站: ' + value['map']['AOH'] + ' 终点站: ' + \
+ value['map']['CSQ'] + ' ' + self.station_seat(j) + ': ' + ticket_info[j])
+ print ('正在尝试提交订票...')
data = dict(_json_att=None)
check_user = json.loads(myurllib2.Post(check_user_url, data), encoding='utf-8')
check_user_flag = check_user['data']['flag']
if check_user_flag is True:
- print '尝试提交订单...'
+ print ('尝试提交订单...')
# 预定的请求参数,注意参数顺序
# 注意这里为了防止secretStr被urllib.parse过度编码,在这里进行一次解码
# 否则调用HttpTester类的post方法将会将secretStr编码成为无效码,造成提交预定请求失败
@@ -124,19 +159,23 @@ class select:
('query_to_station_name', self.to_station), # 终点车站
]
submitResult = json.loads(myurllib2.Post(submit_station_url, data), encoding='utf-8')
- submit_data = submitResult['data']
- if submit_data == 'N':
- print '出票成功'
- else:
- print '出票失败'
+ if 'data' in submitResult and submitResult['data']:
+ if submitResult['data'] == 'N':
+ print ('出票成功')
+ return self.station_seat(j) # 车次信息,座位号
+ else:
+ print ('出票失败')
+ elif 'messages' in submitResult and submitResult['messages']:
+ print(submitResult['messages'])
else:
- if check_user['massage']:
- print '用户检查失败:%s' % check_user['massage']
+ if check_user['messages']:
+ print ('用户检查失败:%s' % check_user['messages'])
else:
- print '用户检查失败: %s' %check_user
- return submitResult
+ print ('用户检查失败: %s' % check_user)
+ else:
+ print ('未查询到有效车次,重新查询中')
- def getPassengerTicketStr(self, str):
+ def getPassengerTicketStr(self, set_type):
"""
获取getPassengerTicketStr 提交对应的代号码
:param str: 坐席
@@ -152,25 +191,80 @@ class select:
'软卧': 4,
'硬卧': 3,
}
- return passengerTicketStr[str]
+ self.set_type = str(passengerTicketStr[set_type.replace(' ', '')])
- def checkOrderInfo(self, token):
+ def ticket_type(self):
+ """订单票的类型,目前只考虑成人票,此方法暂时搁置,做备案"""
+ ticket_type = {'adult': "1", 'child': "2", 'student': "3", 'disability': "4"}
+ return ticket_type
+
+ def checkOrderInfo(self, user_info):
"""
检查支付订单,需要提交REPEAT_SUBMIT_TOKEN
+ passengerTicketStr : 座位编号,0,票类型,乘客名,证件类型,证件号,手机号码,保存常用联系人(Y或N)
+ oldPassengersStr: 乘客名,证件类型,证件号,乘客类型
:return:
"""
+ passengerTicketStr = []
+ oldPassengerStr = []
+ passengerTicketStr.append(user_info[0]['passenger_id_type_code'])
+ passengerTicketStr.append(user_info[0]['passenger_name'])
+ passengerTicketStr.append(user_info[0]['passenger_type'])
+ passengerTicketStr.append(user_info[0]['passenger_id_no'])
+ passengerTicketStr.append(user_info[0]['mobile_no'])
+ oldPassengerStr.append(user_info[0]['passenger_name'])
+ oldPassengerStr.append(user_info[0]['passenger_type'])
+ oldPassengerStr.append(user_info[0]['passenger_id_no'])
+ oldPassengerStr.append(user_info[0]['passenger_type'])
+
checkOrderInfoUrl = 'https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo'
data = {
'cancel_flag': 2,
'bed_level_order_num': 000000000000000000000000000000,
-
+ 'passengerTicketStr': self.set_type+',0,'+str(passengerTicketStr)+',N',
+ 'oldPassengerStr': str(oldPassengerStr)+'_',
+ 'tour_flag': 'dc',
+ 'REPEAT_SUBMIT_TOKEN': self.token,
}
+ checkOrderInfo = json.loads(myurllib2.Post(checkOrderInfoUrl, data))
+ print (checkOrderInfo)
+ if 'data' in checkOrderInfo and checkOrderInfo['data']['submitStatus'] is True:
+ print ('车票提交通过,正在尝试排队')
+ elif 'messages' in checkOrderInfo and checkOrderInfo['messages']:
+ print (checkOrderInfo['messages'])
+
+ def getQueueCount(self):
+ """
+ # 模拟查询当前的列车排队人数的方法
+ # 返回信息组成的提示字符串
+ :param token:
+ :return:
+ """
+ getQueueCountUrl = 'https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount'
+ data = {
+ # 'train_date': 'Sun May 07 2017 00:00:00 GMT+0800',
+ 'train_date': self.ticketInfoForPassengerForm['queryLeftTicketRequestDTO']['train_date'],
+ 'train_no': self.ticketInfoForPassengerForm['queryLeftTicketRequestDTO']['train_no'],
+ 'stationTrainCode': self.ticketInfoForPassengerForm['queryLeftTicketRequestDTO']['station_train_code'],
+ 'seatType': self.set_type,
+ 'fromStationTelecode': self.ticketInfoForPassengerForm['queryLeftTicketRequestDTO']['from_station'],
+ 'toStationTelecode': self.ticketInfoForPassengerForm['queryLeftTicketRequestDTO']['to_station'],
+ 'leftTicket': self.ticketInfoForPassengerForm['leftTicketStr'],
+ 'purpose_codes': self.ticketInfoForPassengerForm['purpose_codes'],
+ 'train_location': self.ticketInfoForPassengerForm['train_location'],
+ 'REPEAT_SUBMIT_TOKEN': self.token,
+ }
+ print(data)
+ getQueueCountResult = json.loads(myurllib2.Post(getQueueCountUrl, data))
+ print(getQueueCountResult)
def main(self):
- token = self.getRepeatSubmitToken()
- self.submitOrderRequest()
- self.getPassengerDTOs(token)
- self.checkOrderInfo(token)
+ set_type = self.submitOrderRequest()
+ self.getPassengerTicketStr(set_type)
+ self.getRepeatSubmitToken()
+ user_info = self.getPassengerDTOs()
+ self.checkOrderInfo(user_info)
+ self.getQueueCount()
if __name__ == '__main__':
a = select('上海', '北京')
diff --git a/12306login/init/select_ticket_info.pyc b/12306login/init/select_ticket_info.pyc
deleted file mode 100644
index e51c7d5..0000000
Binary files a/12306login/init/select_ticket_info.pyc and /dev/null differ