diff --git a/py12306/helpers/api.py b/py12306/helpers/api.py index 37e75fa..4256d58 100644 --- a/py12306/helpers/api.py +++ b/py12306/helpers/api.py @@ -40,7 +40,8 @@ API_GET_QUEUE_COUNT = BASE_URL_OF_12306 + '/otn/confirmPassenger/getQueueCount' API_CONFIRM_SINGLE_FOR_QUEUE = BASE_URL_OF_12306 + '/otn/confirmPassenger/confirmSingleForQueue' API_QUERY_ORDER_WAIT_TIME = BASE_URL_OF_12306 + '/otn/confirmPassenger/queryOrderWaitTime?{}' # 排队查询 API_QUERY_INIT_PAGE = BASE_URL_OF_12306 + '/otn/leftTicket/init' -API_GET_BROWSER_DEVICE_ID = BASE_URL_OF_12306 + '/otn/HttpZF/logdevice' +# API_GET_BROWSER_DEVICE_ID = BASE_URL_OF_12306 + '/otn/HttpZF/logdevice' +API_GET_BROWSER_DEVICE_ID = 'https://12306-rail-id.pjialin.com/' API_NOTIFICATION_BY_VOICE_CODE = 'http://ali-voice.showapi.com/sendVoice?' diff --git a/py12306/user/job.py b/py12306/user/job.py index 669aa3c..9d7d95e 100644 --- a/py12306/user/job.py +++ b/py12306/user/job.py @@ -181,146 +181,18 @@ class UserJob: 获取加密后的浏览器特征 ID :return: """ - params = {"algID": self.request_alg_id(), "timestamp": int(time.time() * 1000)} - params = dict(params, **self._get_hash_code_params()) - headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"} - self.session.headers.update(headers) - response = self.session.get(API_GET_BROWSER_DEVICE_ID, params=params) - if response.text.find('callbackFunction') >= 0: - result = response.text[18:-2] + response = self.session.get(API_GET_BROWSER_DEVICE_ID) + if response.status_code == 200: try: - result = json.loads(result) - self.session.cookies.update({ - 'RAIL_EXPIRATION': result.get('exp'), - 'RAIL_DEVICEID': result.get('dfp'), - }) + result = json.loads(response.text) + self.session.cookies.update(result) + # self.session.cookies.update({ + # 'RAIL_EXPIRATION': '', + # 'RAIL_DEVICEID': '', + # }) except: return False - def request_alg_id(self): - response = self.session.get("https://kyfw.12306.cn/otn/HttpZF/GetJS") - result = re.search(r'algID\\x3d(.*?)\\x26', response.text) - try: - return result.group(1) - except (IndexError, AttributeError) as e: - pass - return "" - - def _get_hash_code_params(self): - from collections import OrderedDict - data = { - 'adblock': '0', - 'browserLanguage': 'en-US', - 'cookieEnabled': '1', - 'custID': '133', - 'doNotTrack': 'unknown', - 'flashVersion': '0', - 'javaEnabled': '0', - 'jsFonts': 'c227b88b01f5c513710d4b9f16a5ce52', - 'localCode': '3232236206', - 'mimeTypes': '52d67b2a5aa5e031084733d5006cc664', - 'os': 'MacIntel', - 'platform': 'WEB', - 'plugins': 'd22ca0b81584fbea62237b14bd04c866', - 'scrAvailSize': str(random.randint(500, 1000)) + 'x1920', - 'srcScreenSize': '24xx1080x1920', - 'storeDb': 'i1l1o1s1', - 'timeZone': '-8', - 'touchSupport': '99115dfb07133750ba677d055874de87', - 'userAgent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.' + str( - random.randint( - 5000, 7000)) + '.0 Safari/537.36', - 'webSmartID': 'f4e3b7b14cc647e30a6267028ad54c56', - } - data_trans = { - 'browserVersion': 'd435', - 'touchSupport': 'wNLf', - 'systemLanguage': 'e6OK', - 'scrWidth': 'ssI5', - 'openDatabase': 'V8vl', - 'scrAvailSize': 'TeRS', - 'hasLiedResolution': '3neK', - 'hasLiedOs': 'ci5c', - 'timeZone': 'q5aJ', - 'userAgent': '0aew', - 'userLanguage': 'hLzX', - 'jsFonts': 'EOQP', - 'scrAvailHeight': '88tV', - 'browserName': '-UVA', - 'cookieCode': 'VySQ', - 'online': '9vyE', - 'scrAvailWidth': 'E-lJ', - 'flashVersion': 'dzuS', - 'scrDeviceXDPI': '3jCe', - 'srcScreenSize': 'tOHY', - 'storeDb': 'Fvje', - 'doNotTrack': 'VEek', - 'mimeTypes': 'jp76', - 'sessionStorage': 'HVia', - 'cookieEnabled': 'VPIf', - 'os': 'hAqN', - 'hasLiedLanguages': 'j5po', - 'hasLiedBrowser': '2xC5', - 'webSmartID': 'E3gR', - 'appcodeName': 'qT7b', - 'javaEnabled': 'yD16', - 'plugins': 'ks0Q', - 'appMinorVersion': 'qBVW', - 'cpuClass': 'Md7A', - 'indexedDb': '3sw-', - 'adblock': 'FMQw', - 'localCode': 'lEnu', - 'browserLanguage': 'q4f3', - 'scrHeight': '5Jwy', - 'localStorage': 'XM7l', - 'historyList': 'kU5z', - 'scrColorDepth': "qmyu" - } - data = OrderedDict(data) - d = '' - params = {} - for key, item in data.items(): - d += key + item - key = data_trans[key] if key in data_trans else key - params[key] = item - d_len = len(d) - d_f = int(d_len / 3) if d_len % 3 == 0 else int(d_len / 3) + 1 - if d_len >= 3: - d = d[d_f:2 * d_f] + d[2 * d_f:d_len] + d[0: d_f] - d_len = len(d) - d_f = int(d_len / 3) if d_len % 3 == 0 else int(d_len / 3) + 1 - if d_len >= 3: - d = d[2 * d_f:d_len] + d[0: d_f] + d[1 * d_f: 2 * d_f] - - d = self._encode_data_str_v2(d) - d = self._encode_data_str_v2(d) - d = self._encode_data_str_v2(d) - data_str = self._encode_string(d) - params['hashCode'] = data_str - return params - - def _encode_data_str(self, data_str): - data_str_len = len(data_str) - data_str_len_tmp = int(data_str_len / 3) if data_str_len % 3 == 0 else int(data_str_len / 3) + 1 - if data_str_len >= 3: - data_str_e = data_str[0:data_str_len_tmp] - data_str_f = data_str[data_str_len_tmp:2 * data_str_len_tmp] - return data_str[2 * data_str_len_tmp:data_str_len] + data_str_e + data_str_f - return data_str - - def _encode_data_str_v2(self, d): - b = len(d) - if b % 2 == 0: - return d[b // 2: b] + d[0:b // 2] - else: - return d[b // 2 + 1:b] + d[b // 2] + d[0:b // 2] - - def _encode_string(self, str): - import hashlib - import base64 - result = base64.b64encode(hashlib.sha256(str.encode()).digest()).decode() - return result.replace('+', '-').replace('/', '_').replace('=', '') - def login_did_success(self): """ 用户登录成功