Låt oss gå rakt på sak, här vill jag främst prata om gränssnitten och dataformaten för de nuvarande 12306-funktionerna. Den är huvudsakligen indelad i fem moduler: inloggning, att få kontakter, att kontrollera ärenden, boka och att skicka ofullständiga beställningar, eftersom du för vissa andra gränssnitt som inte är viktiga kan ignorera dem direkt, som att upptäcka om verifieringskoden är korrekt, begära det återstående antalet ärenden, etc., denna artikel är nedskriven och du kan studera den själv om du behöver. 1. Logga in Inloggning är främst för att få sessionen och upprätthålla kommunikationen med servern. Det finns två huvudsteg för att logga in Först, skaffa inloggningsverifieringskoden Metod: GET Gränssnitt: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=login&rand=sjrand& Parametrar: kopiera, samma Bak: Binära bildström Andra inloggningen Metod: POST Gränssnitt: https://kyfw.12306.cn/otn/login/loginAysnSuggest Parametrar: 1. loginUserDTO.user_name Användarnamn 2. randCode-verifieringskod 3. userDTO.password-lösenord Returnerar: json-sträng, som kan avgöra om inloggningen lyckas 2. Få kontakter Metod: GET Gränssnitt: https://kyfw.12306.cn/otn/passengers/init Parametrar: Inga Return: html-fil, du kan hitta en variabel i den, som är i json-format och kan parsas till ett användarobjekt 3. Biljettkontroll Metod: GET Gränssnitt: https://kyfw.12306.cn/otn/leftTicket/query? Parametrar: leftTicketDTO.train_date: Datum för biljettkontroll leftTicketDTO.from_station: Startstation (alfabetisk kod) leftTicketDTO.to_station: Destinationsstation (alfabetskod) purpose_codes:VUXEN Return: Återgår till JSON-format och parsar direkt 4. Reservation Utnämningen är uppdelad i sex steg, ett i taget, som är sammanlänkade Först: Förinlämning Metod: POST Gränssnitt: https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest Parameter: secretStr: erhålls genom biljettkontroll (en för varje tåg, och olika varje gång, måste tolkas i realtid) train_date: Bokningsdatum back_train_date: Återvändningsdatum tour_flag: DC purpose_codes:VUXEN query_from_station_name: Avgångsstation query_to_station_name: Destinationsstation Odefinierad: en tom sträng Returnera: Returnerar JSON-formatet för att avgöra om inskicket är framgångsrikt För det andra: Hämta motsvarande parametrar Metod: POST Gränssnitt: https://kyfw.12306.cn/otn/confirmPassenger/initDc Parametrar: _json_att: Tom sträng Return: html-fil, användbar under parsing av globalRepeatSubmitToken i de första raderna, och att hämta värdet av variabeln ticketInfoForPassengerForm underifrån, är i json-format, varifrån purpose_codes, key_check_isChange, leftTicketStr, train_locatio{filter} n för att förbereda följande commits För det tredje: Skaffa verifieringskoden för inlämningen Metod: GET Gränssnitt: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp& Parametrar: Inga Returnera: Returnerar bildbinära strömmen, precis som inloggningsverifieringskoden För det fjärde: Kontrollera om inskicket kan bekräftas Metod: POST Gränssnitt: https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo Parametrar: cancel_flag:2 bed_level_order_num:0000000000000000000000000000000000 passagerarTicketStr: Sätestyp, 0, biljetttyp, namn, identitet, telefonnummer, N (om det finns flera, separerat med kommatecken) oldPassengerStr: Namn, ID-typ, ID-nummer, användartyp randCode: Schemalagd verifieringskod tour_flag:DC _json_att: Tom sträng REPEAT_SUBMIT_TOKEN: Hämta det från föregående steg Return: json-format för att avgöra om den kan göras Femte: Bekräfta inlämning Metod: POST Gränssnitt: https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue Parametrar:
passagerarTicketStr: Sätestyp, 0, biljetttyp, namn, identitet, telefonnummer, N (om det finns flera, separerat med kommatecken) oldPassengerStr: Namn, ID-typ, ID-nummer, användartyp randCode: Schemalagd verifieringskod purpose_codes: Steg 3 för att få det key_check_isChange: Ibid leftTicketStr; Ibid train_locatio{filter}n; Ibid REPEAT_SUBMIT_TOKEN: Ibid _json_att: Tom sträng Returnera: json-format, avgör om inskicket lyckas, returnera väntetiden och anropa steg 6 varje viss period för att returnera bearbetningsresultatet Sjätte: Omröstning för att få resultaten från inskickningen Metod: GET Gränssnitt: https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime? Parametrar:
slumpmässiga: Slumpmässiga nummer tourFlag:dc REPEAT_SUBMIT_TOKEN: Det finns en tredje del att skaffa _json_att: Tom sträng Returnera: json-format, returnera väntetiden, om väntetiden är mindre än 0, hämta orderinformationen orderId, om den är större än 0, fortsätt polling 5. Fråga om ofullständiga beställningar Metod: POST Gränssnitt: https://kyfw.12306.cn/otn/queryOrder/queryMyOrderNoComplete Parametrar: _json_att: Tom sträng Returnerar: JSON-format, innehåller orderinformation och tolkar direkt
På tal om det, de fem funktionerna är i princip introducerade, men nu är de bara publicerade för att lära sig använda och kommer inte att attackeras illvilligt, dessutom ändras gränssnittet på 12306-webbplatsen mycket ofta, och gränssnittet som publiceras nu kan ändras imorgon, så det viktiga är att lära sig hur man hämtar relevanta gränssnitt och data, och analyserar från data för att få motsvarande parametrar och resultat. Här använder jag främst Firebug, nätverksanalysverktyget som följer med Chrom-webbläsaren, samt Fiddler- och Wireshark-verktygen, och instruktionerna för att använda relaterade verktyg, leta bara efter det på Internet. Slutligen, låt oss klaga, 12306-webbplatsen använder CDN-statisk cacheteknik, vilket leder till att motsvarande servrar väljs utifrån lastbalansering i olika regioner, bandbredd och belastning, det vill säga det finns många 12306-servrar över hela landet. Varje användare kan komma åt de möjliga servrarna är olika, men bara statiska sidor och js, css och bilder, etc., men varje server kommer att direkt hålla sessionen delad, det vill säga om du loggar in på en av servrarna, på andra servrar Ovanstående är också likvärdigt med att ha landat. Så det är bäst att kunna välja server dynamiskt så att cache-tiderna är uppdaterade, stressen minimal och datan mer realtidsinriktad. I min implementation, om du inte gör en förfrågan, ändrar du serverns IP en gång. När det gäller relevant teknik kommer jag att avslöja den senare. Men innehållet i denna artikel räcker för att lära sig. Du kan se den specifika IP-adressen i http://tool.chinaz.com/dns. |