La oss gå rett på sak, her vil jeg hovedsakelig snakke om grensesnittene og dataformatene til de nåværende 12306-funksjonene. Den er hovedsakelig delt inn i fem moduler: innlogging, få kontakter, sjekke billetter, bestille og sende forespørsler om uferdige bestillinger. For noen andre grensesnitt som ikke er viktige, kan du ignorere dem direkte, som å oppdage om verifiseringskoden er korrekt, be om gjenværende antall saker, osv., denne artikkelen er skrevet, og du kan studere den selv hvis du trenger det. 1. Logg inn Innlogging er hovedsakelig for å få sesjonen og opprettholde kommunikasjon med serveren. Det er to hovedtrinn for å logge inn Først, få innloggingsverifiseringskoden Metode: GET Grensesnitt: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=login&rand=sjrand& Parametere: kopi, det samme Bak: Binær bildestrøm Andre innlogging Metode: POST Grensesnitt: https://kyfw.12306.cn/otn/login/loginAysnSuggest Parametere: 1. loginUserDTO.user_name Brukernavn 2. randCode-verifiseringskode 3. userDTO.password-passord Returnerer: json-streng, som kan avgjøre om innloggingen er vellykket 2. Få kontakter Metode: GET Grensesnitt: https://kyfw.12306.cn/otn/passengers/init Parametere: Ingen Return: html-fil, du kan finne en variabel i den, som er i json-format og kan parses inn i et brukerobjekt 3. Billettkontroll Metode: GET Grensesnitt: https://kyfw.12306.cn/otn/leftTicket/query? Parametere: leftTicketDTO.train_date: Billettsjekkdato leftTicketDTO.from_station: Startstasjon (alfabetisk kode) leftTicketDTO.to_station: Destinasjonsstasjon (alfabetkode) purpose_codes:VOKSEN Return: Går tilbake til JSON-format og parser direkte 4. Reservasjon Utnevnelsen er delt inn i 6 trinn, ett etter ett, som er sammenhengende Først: Forhåndsinnsending Metode: POST Grensesnitt: https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest Parameter: secretStr: hentes ved billettkontroll (én for hvert tog, og forskjellig hver gang, må analyseres i sanntid) train_date: Bestillingsdato back_train_date: Returdato tour_flag: DC purpose_codes:VOKSEN query_from_station_name: Avgangsstasjon query_to_station_name: Destinasjonsstasjon Udefinert: en tom streng Return: Returnerer JSON-formatet for å avgjøre om innsendingen er vellykket For det andre: Få de tilsvarende parameterne Metode: POST Grensesnitt: https://kyfw.12306.cn/otn/confirmPassenger/initDc Parametere: _json_att: Tom streng Return: html-fil, nyttig under parsing av globalRepeatSubmitToken i de første linjene, og for å hente verdien til ticketInfoForPassengerForm-variabelen nedenfra, er i json-format, hvorfra purpose_codes, key_check_isChange, leftTicketStr, train_locatio{filter} n for å forberede følgende commits For det tredje: Få verifiseringskoden for innsendingen Metode: GET Grensesnitt: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp& Parametere: Ingen Return: Returnerer bilde-binærstrømmen, akkurat som innloggingsverifiseringskoden For det fjerde: Sjekk om innsendingen kan bekreftes Metode: POST Grensesnitt: https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo Parametere: cancel_flag:2 bed_level_order_num:0000000000000000000000000000000 passasjerTicketStr: Setetype, 0, billetttype, navn, identitet, telefon, N (hvis det er flere, adskilt med komma) oldPassengerStr: Navn, ID-type, ID-nummer, brukertype randCode: Planlagt verifiseringskode tour_flag:DC _json_att: Tom streng REPEAT_SUBMIT_TOKEN: Hent det fra forrige steg Return: json-format for å avgjøre om den kan gjennomføres For det femte: Bekreft innsending Metode: POST Grensesnitt: https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue Parametere:
passasjerTicketStr: Setetype, 0, billetttype, navn, identitet, telefon, N (hvis det er flere, adskilt med komma) oldPassengerStr: Navn, ID-type, ID-nummer, brukertype randCode: Planlagt verifiseringskode purpose_codes: Trinn 3 for å få det key_check_isChange: Ibid leftTicketStr; Ibid train_locatio{filter}n; Ibid REPEAT_SUBMIT_TOKEN: Ibid _json_att: Tom streng Returner: json-format, avgjør om innsendingen er vellykket, returner ventetiden, og kaller trinn 6 hver viss periode for å returnere behandlingsresultatet For det sjette: Avstemning for å få resultatene av innsendingene Metode: GET Grensesnitt: https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime? Parametere:
tilfeldige: Tilfeldige tall tourFlag:dc REPEAT_SUBMIT_TOKEN: Det er en tredje del å skaffe _json_att: Tom streng Return: json-format, returner ventetiden, hvis ventetiden er mindre enn 0, hent ordreinformasjonen orderId, hvis den er større enn 0, fortsett pollingen 5. Spørre om uferdige ordre Metode: POST Grensesnitt: https://kyfw.12306.cn/otn/queryOrder/queryMyOrderNoComplete Parametere: _json_att: Tom streng Returnerer: JSON-format, inneholder ordreinformasjon og parser direkte
Når vi først snakker om det, er de 5 funksjonene i bunn og grunn introdusert, men nå er det bare lagt ut for å lære å bruke, og vil ikke bli ondsinnet angrepet, dessuten endres grensesnittet til 12306-nettstedet veldig ofte, og grensesnittet som legges ut nå kan endres i morgen, så det viktige er å lære å hente relevante grensesnitt og data, og analysere dataene for å få tilsvarende parametere og resultater. Her bruker jeg hovedsakelig Firebug, nettverksanalyseverktøyet som følger med Chrom-nettleseren, samt Fiddler- og Wireshark-verktøyene, og instruksjonene for bruk av relaterte verktøy, bare søk etter det på Internett. Til slutt, la oss klage: 12306-nettsiden bruker CDN-statisk caching-teknologi, noe som vil føre til valg av tilsvarende servere basert på lastbalansering i ulike regioner, båndbredde og belastning, det vil si at det finnes mange 12306-servere over hele landet. Hver bruker kan få tilgang til de mulige serverne, men bare statiske sider og js, css og bilder, osv., men hver server vil direkte dele sesjonen, det vil si hvis du logger inn på en av serverne, på andre servere Det ovennevnte tilsvarer også å ha landet. Derfor er det best å kunne velge server dynamisk slik at cache-tidene er oppdaterte, stresset minimalt, og dataene er mer sanntids. I min implementering, hvis du ikke spør én gang, vil du endre server-IP-en én gang. Når det gjelder relevant teknologi, vil jeg avsløre den senere. Men innholdet i denne artikkelen er nok til å lære. Du kan se den spesifikke IP-adressen i http://tool.chinaz.com/dns. |