Laten we meteen ter zake komen: hier wil ik het vooral hebben over de interfaces en dataformaten van de huidige 12306-functies. Het is voornamelijk verdeeld in vijf modules: inloggen, contacten verkrijgen, tickets controleren, boeken en onvoltooide bestellingen aanvragen; voor sommige andere interfaces die niet belangrijk zijn, kun je ze direct negeren, zoals het herkennen of de verificatiecode correct is, het aanvragen van het resterende aantal tickets, enzovoort. Dit artikel is geschreven en je kunt het zelf bestuderen als je het nodig hebt. 1. Inloggen Inloggen is vooral bedoeld om de sessie te krijgen en de communicatie met de server te onderhouden. Er zijn twee hoofdstappen om in te loggen Vraag eerst de inlogverificatiecode op Methode: GET Interface: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=login&rand=sjrand& Parameters: kopie, hetzelfde Achterkant: Binaire beeldstroom Tweede Login Methode: POST Interface: https://kyfw.12306.cn/otn/login/loginAysnSuggest Parameters: 1. loginUserDTO.user_name Gebruikersnaam 2. randCode verificatiecode 3. userDTO.password wachtwoord Retourneert: json-string, die kan bepalen of de login succesvol is 2. Contacten maken Methode: GET Interface: https://kyfw.12306.cn/otn/passengers/init Parameters: Geen Return: html-bestand, je kunt er een variabele in vinden, die in json-formaat is en kan worden geparsed in een gebruikersobject 3. Ticketcontrole Methode: GET Interface: https://kyfw.12306.cn/otn/leftTicket/query? Parameters: leftTicketDTO.train_date: Ticketcontroledatum leftTicketDTO.from_station: Startstation (alfabetische code) leftTicketDTO.to_station: Bestemmingsstation (alfabetcode) purpose_codes:VOLWASSEN Terugkeer: Keert terug naar het JSON-formaat en parseert direct 4. Reservering De afspraak is verdeeld in 6 stappen, één voor één, die met elkaar verbonden zijn Ten eerste: Pre-indiening Methode: POST Interface: https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest Parameter: secretStr: verkregen via ticketcontrole (één voor elke trein, en elke keer anders, moet in realtime worden geanalyseerd) train_date: Boekingsdatum back_train_date: Terugkeerdatum tour_flag: DC purpose_codes:VOLWASSEN query_from_station_name: Vertrekstation query_to_station_name: Bestemmingsstation Ongedefinieerd: een lege string Return: Geeft het JSON-formaat terug om te bepalen of de indiening succesvol is Ten tweede: Haal de bijbehorende parameters op Methode: POST Interface: https://kyfw.12306.cn/otn/confirmPassenger/initDc Parameters: _json_att: Lege string Return: html-bestand, nuttig door globalRepeatSubmitToken in de eerste paar regels te parsen en de waarde van de ticketInfoForPassengerForm-variabele van onderaf te krijgen, is in json-formaat, waarvan purpose_codes, key_check_isChange, leftTicketStr, train_locatio{filter} n om zich voor te bereiden op de volgende commits Ten derde: Haal de verificatiecode voor de indiening op Methode: GET Interface: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp& Parameters: Geen enkele Return: Geeft de beeldbinaire stroom terug, net als de loginverificatiecode Ten vierde: Controleer of de inzending bevestigd kan worden Methode: POST Interface: https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo Parameters: cancel_flag:2 bed_level_order_num:000000000000000000000000000000000 passagierTicketStr: Stoeltype, 0, tickettype, naam, identiteit, telefoon, N (als er meer dan één zijn, gescheiden door een komma) oldPassengerStr: Naam, ID-type, ID-nummer, gebruikerstype randCode: Geplande verificatiecode tour_flag:DC _json_att: Lege string REPEAT_SUBMIT_TOKEN: Haal het uit de vorige stap Return: json-formaat om te bepalen of het kan worden ingezet Vijfde: Bevestig de inzending Methode: POST Interface: https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue Parameters:
passagierTicketStr: Stoeltype, 0, tickettype, naam, identiteit, telefoon, N (als er meer dan één zijn, gescheiden door een komma) oldPassengerStr: Naam, ID-type, ID-nummer, gebruikerstype randCode: Geplande verificatiecode purpose_codes: Stap 3 om het te krijgen key_check_isChange: Ibid leftTicketStr; Ibid train_locatio{filter}n; Ibid REPEAT_SUBMIT_TOKEN: Ibid _json_att: Lege string Return: json-formaat, bepaal of de indiening succesvol is, geef de wachttijd terug en roep stap 6 elke bepaalde periode aan om het verwerkingsresultaat terug te geven Zesde: Peiling om de inzendresultaten te verkrijgen Methode: GET Interface: https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime? Parameters:
willekeurig: Willekeurige getallen tourFlag:dc REPEAT_SUBMIT_TOKEN: Er is een derde deel om te verkrijgen _json_att: Lege string Return: json-formaat, geef de wachttijd terug, als wachttijd kleiner is dan 0, haal dan de orderinformatie orderId op, als deze groter is dan 0, ga door met pollen 5. Informeer naar onvoltooide bestellingen Methode: POST Interface: https://kyfw.12306.cn/otn/queryOrder/queryMyOrderNoComplete Parameters: _json_att: Lege string Retourneert: JSON-formaat, bevat orderinformatie en parseert direct
Over gesproken, de 5 functies zijn in feite geïntroduceerd, maar nu zijn ze alleen bedoeld om te leren gebruiken, en zullen ze niet kwaadwillig worden aangevallen; bovendien verandert de interface van de 12306-website zeer vaak, en de interface die nu wordt geplaatst kan morgen worden aangepast, dus het belangrijkste is om te leren hoe je relevante interfaces en data kunt verzamelen, en analyseren uit de data om de bijbehorende parameters en resultaten te verkrijgen. Hier gebruik ik vooral firebug, de netwerkanalysetool die bij de chrom-browser zit, evenals de fiddler- en wireshark-tools, en de instructies voor het gebruik van gerelateerde tools, zoek er gewoon op internet naar. Tot slot, laten we klagen: de 12306-website gebruikt CDN statische cachingtechnologie, wat leidt tot de selectie van de bijbehorende servers op basis van load balancing in verschillende regio's, bandbreedte en belasting, dat wil zeggen, er zijn veel 12306-servers verspreid over het hele land. Elke gebruiker kan toegang krijgen tot de mogelijke servers zijn verschillend, maar alleen statische pagina's en js, css en afbeeldingen, enzovoort, maar elke server zal de sessie direct gedeeld houden, dat wil zeggen, als je inlogt op een van de servers, op andere servers Het bovenstaande is ook gelijk aan het landen zijn. Het is dus het beste om een server dynamisch te kunnen kiezen zodat cachetijden up-to-date zijn, stress minimaal is en data meer realtime is. In mijn implementatie verander je het server-IP één keer als je niet één query doet. Wat betreft de relevante technologie, zal ik die later onthullen. Maar de inhoud van dit artikel is genoeg om te leren. Je kunt het specifieke IP-adres in de http://tool.chinaz.com/dns zien. |