Przejdźmy od razu do sedna, tutaj głównie chcę opowiedzieć o interfejsach i formatach danych obecnych funkcji 12306. Jest głównie podzielony na pięć modułów: logowanie, zdobywanie kontaktów, sprawdzanie zgłoszeń, rezerwacja i wysyłanie zapytań o niedokończone zamówienia, a w przypadku innych interfejsów, które nie są istotne, można je bezpośrednio zignorować, np. wykrywanie poprawności kodu weryfikacyjnego, żądanie pozostałej liczby zgłoszeń itp. Ten artykuł jest napisany i możesz go samodzielnie przeanalizować, jeśli potrzebujesz. 1. Zaloguj się Logowanie służy głównie do odebrania sesji i utrzymania komunikacji z serwerem. Są dwa główne kroki logowania Najpierw zdobądź kod weryfikacyjny logowania Metoda: GET Interfejs: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=login&rand=sjrand& Parametry: kopiuję, to samo Tył: Strumień obrazów binarnych Drugie logowanie Metoda: POST Interfejs: https://kyfw.12306.cn/otn/login/loginAysnSuggest Parametry: 1. loginUserDTO.user_name Nazwa użytkownika 2. Kod weryfikacyjny randCode 3. hasło userDTO.password Zwraca: ciąg json, który może określić, czy logowanie jest skuteczne 2. Zdobądź kontakty kontaktowe Metoda: GET Interfejs: https://kyfw.12306.cn/otn/passengers/init Parametry: brak Return: plik html, możesz znaleźć zmienną w formacie json, którą można parsować do obiektu użytkownika 3. Sprawdzanie biletów Metoda: GET Interfejs: https://kyfw.12306.cn/otn/leftTicket/query? Parametry: leftTicketDTO.train_date: Data sprawdzenia biletu leftTicketDTO.from_station: Stacja startowa (kod alfabetyczny) leftTicketDTO.to_station: Stacja docelowa (kod alfabetowy) purpose_codes: DOROSŁY Powrót: Powraca do formatu JSON i analizuje bezpośrednio 4. Rezerwacja Termin jest podzielony na 6 etapów, jeden po drugim, powiązanych ze sobą Po pierwsze: Wstępne zgłoszenie Metoda: POST Interfejs: https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest Parametr: secretStr: uzyskany z sprawdzania biletów (jeden dla każdego pociągu, za każdym razem inny, musi być analizowany w czasie rzeczywistym) train_date: Data rezerwacji back_train_date: Data zwrotu tour_flag: DC purpose_codes: DOROSŁY query_from_station_name: Stacja odlotu query_to_station_name: Stacja docelowa niezdefiniowany: pusty ciąg znaków Return: Przywraca format JSON, aby sprawdzić, czy zgłoszenie jest pomyślne Po drugie: Uzyskaj odpowiednie parametry Metoda: POST Interfejs: https://kyfw.12306.cn/otn/confirmPassenger/initDc Parametry: _json_att: Pusty ciąg Return: plik html, przydatny przy parsowaniu globalRepeatSubmitToken w pierwszych linijkach i uzyskaniu wartości zmiennej ticketInfoForPassengerForm od poniżej, jest w formacie json, z którego purpose_codes, key_check_isChange, leftTicketStr, train_locatio{filter} n przygotowując się do następujących commitów Po trzecie: Pobierz kod weryfikacyjny zgłoszenia Metoda: GET Interfejs: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp& Parametry: Brak Return: Zwraca binarny strumień obrazu, podobnie jak kod weryfikacyjny logowania Po czwarte: Sprawdź, czy zgłoszenie można potwierdzić Metoda: POST Interfejs: https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo Parametry: cancel_flag:2 bed_level_order_num:00000000000000000000000000000000000000 passengerTicketStr: Typ miejsca, 0, typ biletu, imię i nazwisko, tożsamość, telefon, N (jeśli jest ich więcej, oddzielone przecinkem) oldPassengerStr: Imię, typ ID, Numer ID, Typ użytkownika randCode: Kod zaplanowanej weryfikacji tour_flag:dc _json_att: Pusty ciąg REPEAT_SUBMIT_TOKEN: Zrób to z poprzedniego kroku Return: json format, aby określić, czy można go zatwierdzać Po piąte: Potwierdź zgłoszenie Metoda: POST Interfejs: https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue Parametry:
passengerTicketStr: Typ miejsca, 0, typ biletu, imię i nazwisko, tożsamość, telefon, N (jeśli jest ich więcej, oddzielone przecinkem) oldPassengerStr: Imię, typ ID, Numer ID, Typ użytkownika randCode: Kod zaplanowanej weryfikacji purpose_codes: Krok 3, aby to zdobyć key_check_isChange: Ibid leftTicketStr; Ibid train_locatio{filter}n; Ibid REPEAT_SUBMIT_TOKEN: Ibid _json_att: Pusty ciąg Wróć: json format, sprawdź, czy zgłoszenie jest pomyślne, zwróć czas oczekiwania i wywołaj krok 6 co określony okres, aby zwrócić wynik przetwarzania Szóste: Ankieta, aby uzyskać wyniki zgłoszeń Metoda: GET Interfejs: https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime? Parametry:
losowe: Liczby losowe tourFlag:dc REPEAT_SUBMIT_TOKEN: Jest trzecia część do zdobycia _json_att: Pusty ciąg Wróć: json format, zwróć czas oczekiwania, jeśli waitTime jest mniejszy niż 0, pobierz order information orderId, jeśli jest większy niż 0, kontynuuj ankietowanie 5. Pytaj o niedokończone zamówienia Metoda: POST Interfejs: https://kyfw.12306.cn/otn/queryOrder/queryMyOrderNoComplete Parametry: _json_att: Pusty ciąg Zwraca się: format JSON, zawiera informacje o kolejności i analizuje bezpośrednio
A propos, 5 funkcji zostało zasadniczo wprowadzonych, ale teraz jest publikowane tylko po to, by nauczyć się ich używać i nie będzie złośliwie atakowane, ponadto interfejs strony 12306 zmienia się bardzo często, a interfejs opublikowany teraz może zostać zmieniony jutro, więc ważne jest, aby nauczyć się pobierać odpowiednie interfejsy i dane oraz analizować dane, aby uzyskać odpowiednie parametry i wyniki. Tutaj głównie korzystam z Firebug, narzędzia do analizy sieciowej dołączonego do przeglądarki Chrome, a także narzędzi Fiddler i Wireshark oraz instrukcji obsługi powiązanych narzędzi, wystarczy poszukać ich w Internecie. Na koniec narzekamy, strona 12306 korzysta z technologii statycznej pamięci podręcznej CDN, co prowadzi do wyboru odpowiadających serwerów zgodnie z równowagą obciążenia w różnych regionach, przepustowości i obciążenia, czyli jest wiele serwerów 12306 w całym kraju. Każdy użytkownik może uzyskać dostęp do różnych serwerów, ale tylko statyczne strony, js, css, obrazy itd., ale każdy serwer bezpośrednio utrzymuje sesję współdzieloną, czyli jeśli zalogujesz się na jeden z serwerów, na innych serwerach Powyższe jest również równoważne z lądowaniem. Dlatego najlepiej jest móc wybierać serwer dynamicznie, aby czasy pamięci podręcznej były aktualne, stres minimalny, a dane bardziej w czasie rzeczywistym. W mojej implementacji, jeśli nie wykonasz zapytania raz, zmienisz adres IP serwera raz. Jeśli chodzi o odpowiednią technologię, ujawnię ją później. Ale treść tego artykułu wystarcza do nauki. Konkretny adres IP możesz zobaczyć w http://tool.chinaz.com/dns. |