Нека минем направо към същината, тук основно искам да говоря за интерфейсите и форматите на данните на текущите функции 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 string, който може да определи дали входът е успешен 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:000000000000000000000000000 ПътникБилетStr: Тип място, 0, тип билет, име, идентичност, телефон, N (ако има повече от един, разделен със запетая) oldPassengerStr: Име, ID тип, ID номер, потребителски тип randCode: Планиран код за верификация tour_flag:DC _json_att: Празна струна REPEAT_SUBMIT_TOKEN: Вземи го от предишната стъпка Return: json формат, за да се определи дали може да бъде комитиран Пето: Потвърдете предаването Метод: POST Интерфейс: https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue Параметри:
ПътникБилетStr: Тип място, 0, тип билет, име, идентичност, телефон, N (ако има повече от един, разделен със запетая) oldPassengerStr: Име, ID тип, ID номер, потребителски тип 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? Параметри:
случайни: Случайни числа tourFlag: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. |