Давайте одразу до суті, тут я головним чином хочу поговорити про інтерфейси та формати даних поточних функцій 12306. Вона в основному поділена на п'ять модулів: вхід, отримання контактів, перевірка квитків, бронювання та запит до незавершених замовлень, а деякі інші інтерфейси, які не є важливими, можна безпосередньо ігнорувати їх, наприклад, визначити правильність коду верифікації, запитати залишкову кількість заявок тощо — ця стаття вже написана, і ви можете вивчити її самостійно, якщо потрібно. 1. Увійти Вхід головним чином призначений для отримання сесії та підтримки зв'язку з сервером. Існує два основні кроки для входу Спочатку отримайте код підтвердження входу Метод: GET Інтерфейс: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=login&rand=sjrand& Параметри: копія, ті ж Назад: потік двійкового зображення Другий вхід Метод: POST Інтерфейс: https://kyfw.12306.cn/otn/login/loginAysnSuggest Параметри: 1. loginUserDTO.user_name Ім'я користувача 2. код перевірки randCode 3. пароль userDTO.password Повертає: json рядок, який може визначати, чи успішно вхід 2. Отримати контактні лінзи Метод: GET Інтерфейс: https://kyfw.12306.cn/otn/passengers/init Параметри: Немає Return: html-файл, у ньому можна знайти змінну, яка знаходиться у форматі json і може бути оброблена в об'єкт користувача 3. Перевірка квитків Метод: GET Інтерфейс: https://kyfw.12306.cn/otn/leftTicket/query? Параметри: leftTicketDTO.train_date: Дата перевірки квитків leftTicketDTO.from_station: Стартова станція (алфавітний код) leftTicketDTO.to_station: Станція призначення (алфавітний код) purpose_codes: ДОРОСЛИЙ Повернення: повертається до формату JSON і безпосередньо розбирає 4. Бронювання Призначення поділене на 6 етапів, один за одним, взаємопов'язаних По-перше: Передподача Метод: POST Інтерфейс: https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest Параметр: secretStr: отримується при перевірці квитків (по одному для кожного поїзда, і кожного разу різний, потрібно аналізувати в реальному часі) train_date: Дата бронювання back_train_date: Дата повернення tour_flag: DC purpose_codes: ДОРОСЛИЙ query_from_station_name: Станція відправлення query_to_station_name: Пункт призначення Невизначено: порожній рядок Повернення: Повертає формат JSON, щоб визначити, чи успішна подача По-друге: Отримати відповідні параметри Метод: POST Інтерфейс: https://kyfw.12306.cn/otn/confirmPassenger/initDc Параметри: _json_att: Порожня нитка Return: html-файл, корисний для розбору globalRepeatSubmitToken у перших рядках і отримання значення змінної ticketInfoForPassengerForm знизу, знаходиться у форматі json, звідки purpose_codes, key_check_isChange, leftTicketStr, train_locatio{filter} n для підготовки до наступних комітів Третє: отримайте код підтвердження подання Метод: GET Інтерфейс: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp& Параметри: Немає Return: Повертає бінарний потік зображення, як і код перевірки входу Четверте: перевірте, чи можна підтвердити подання Метод: POST Інтерфейс: https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo Параметри: cancel_flag:2 bed_level_order_num:00000000000000000000000000000 пасажирTicketStr: тип місця, 0, тип квитка, ім'я, ідентифікація, телефон, N (якщо їх кілька, розділених комою) oldPassengerStr: ім'я, тип посвідчення, ідентифікаційний номер, тип користувача randCode: Код запланованої верифікації tour_flag:DC _json_att: Порожня нитка REPEAT_SUBMIT_TOKEN: Отримайте це з попереднього кроку Return: формат json для визначення, чи можна його зафіксувати. П'яте: Підтвердити здачу Метод: POST Інтерфейс: https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue Параметри:
пасажирTicketStr: тип місця, 0, тип квитка, ім'я, ідентифікація, телефон, N (якщо їх кілька, розділених комою) oldPassengerStr: ім'я, тип посвідчення, ідентифікаційний номер, тип користувача randCode: Код запланованої верифікації purpose_codes: Крок 3, щоб отримати key_check_isChange: Там само. leftTicketStr; Там же train_locatio{filter}n; Там же REPEAT_SUBMIT_TOKEN: Там само. _json_att: Порожня нитка Return: форматувати json, визначити, чи успішно подання, повернути час очікування і викликати крок 6 кожен певний період для повернення результату обробки Шосте: опитування для отримання результатів подачі Метод: GET Інтерфейс: https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime? Параметри:
випадкові: випадкові числа турПрапор: dc REPEAT_SUBMIT_TOKEN: Потрібно отримати третю частину _json_att: Порожня нитка Return: формат json, поверніть час очікування, якщо waitTime менше 0 — отримати інформацію про замовлення orderId, якщо більше 0 — продовжити опитування 5. Запитайте про незавершені замовлення Метод: POST Інтерфейс: https://kyfw.12306.cn/otn/queryOrder/queryMyOrderNoComplete Параметри: _json_att: Порожня нитка Повернення: у форматі JSON, містить інформацію про замовлення та аналізує безпосередньо
До речі, п'ять функцій фактично введені, але тепер вони опубліковані лише для того, щоб навчитися користуватися, і не будуть піддаватися зловмисним атакам, крім того, інтерфейс сайту 12306 дуже часто змінюється, і інтерфейс, який зараз опубліковано, може бути змінений завтра, тому важливо навчитися отримувати релевантні інтерфейси та дані, аналізувати їх для отримання відповідних параметрів і результатів. Тут я переважно використовую firebug — інструмент аналізу мережі, що йде в комплекті з браузером Chrom, а також інструменти Fiddler і Wireshark, а також інструкції щодо використання пов'язаних інструментів — просто шукайте їх в Інтернеті. Нарешті, давайте поскаржимося, сайт 12306 використовує технологію статичного кешування CDN, що призведе до вибору відповідних серверів відповідно до балансування навантаження в різних регіонах, пропускної здатності та навантаження, тобто по всій країні багато серверів 12306. Кожен користувач може отримати доступ до можливих серверів, але лише статичних сторінок, js, css і зображень тощо, але кожен сервер безпосередньо зберігатиме спільну сесію, тобто якщо ви увійдете на один із серверів на інших серверах. Вищезазначене також еквівалентне приземленням. Тому найкраще мати можливість обирати сервер динамічно, щоб час кешу був актуальним, мінімальним навантаженням, а дані більш актуальними. У моїй реалізації, якщо не зробити запит один раз, IP-адреса сервера змінюється один раз. Щодо відповідної технології, я розкрию її пізніше. Але зміст цієї статті достатній для навчання. Ви можете побачити конкретну IP-адресу у http://tool.chinaz.com/dns. |