Să mergem direct la subiect, aici vreau să vorbesc în principal despre interfețele și formatele de date ale funcțiilor actuale 12306. Este împărțită în principal în cinci module: autentificare, obținerea contactelor, verificarea tichetelor, rezervări și interogarea comenzilor nefinalizate, deoarece pentru unele alte interfețe care nu sunt importante, le poți ignora direct, cum ar fi detectarea codului de verificare corect, solicitarea numărului rămas de tichete etc., acest articol este scris și îl poți studia singur dacă ai nevoie. 1. Autentificare Autentificarea este în principal pentru a obține sesiunea și a menține comunicarea cu serverul. Există doi pași principali pentru a te conecta Mai întâi, obține codul de verificare a autentificării Metodă: GET Interfață: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=login&rand=sjrand& Parametri: copiat, același Spate: Flux binar de imagini A doua autentificare Metodă: POST Interfață: https://kyfw.12306.cn/otn/login/loginAysnSuggest Parametri: 1. loginUserDTO.user_name Nume de utilizator 2. cod de verificare randCode 3. parola userDTO.password Returnează: json string, care poate determina dacă autentificarea este reușită 2. Obține contacte Metodă: GET Interfață: https://kyfw.12306.cn/otn/passengers/init Parametri: Niciunul Return: fișier html, poți găsi o variabilă în el, care este în format json și poate fi analizată într-un obiect utilizator 3. Verificarea biletelor Metodă: GET Interfață: https://kyfw.12306.cn/otn/leftTicket/query? Parametri: leftTicketDTO.train_date: Data verificării biletelor leftTicketDTO.from_station: Stația de start (cod alfabetic) leftTicketDTO.to_station: Stația de destinație (cod alfabetic) purpose_codes:ADULT Return: Revine la formatul JSON și analizează direct 4. Rezervare Numirea este împărțită în 6 etape, unul câte unul, interconectate În primul rând: Pre-trimitere Metodă: POST Interfață: https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest Parametru: secretStr: obținut prin verificarea biletelor (câte unul pentru fiecare tren și diferit de fiecare dată, trebuie analizat în timp real) train_date: Data rezervării back_train_date: Data revenirii tour_flag: dc purpose_codes:ADULT query_from_station_name: Stația de plecare query_to_station_name: Stația de destinație nedefinit: un șir gol Returnare: Returnează formatul JSON pentru a determina dacă trimiterea este reușită În al doilea rând: Obține parametrii corespunzători Metodă: POST Interfață: https://kyfw.12306.cn/otn/confirmPassenger/initDc Parametri: _json_att: Șnur gol Return: fișier html, util la analizarea globalRepeatSubmitToken în primele rânduri și obținerea valorii variabilei ticketInfoForPassengerForm de mai jos, este în format json, din care purpose_codes, key_check_isChange, leftTicketStr, train_locatio{filter} n pentru a se pregăti pentru următoarele commit-uri În al treilea rând: Obține codul de verificare a trimiterii Metodă: GET Interfață: https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp& Parametri: Niciuna Return: Returnează fluxul binar al imaginii, la fel ca codul de verificare a autentificării În al patrulea rând: Verifică dacă depunerea poate fi confirmată Metodă: POST Interfață: https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo Parametri: cancel_flag:2 bed_level_order_num:0000000000000000000000000000000000 passengerTicketStr: Tipul scaunului, 0, tipul biletului, nume, identitate, telefon, N (dacă sunt mai multe, separate printr-o virgulă) oldPassengerStr: Nume, Tip ID, Număr ID, Tip de utilizator randCode: Cod de verificare programată tour_flag:dc _json_att: Șnur gol REPEAT_SUBMIT_TOKEN: Ia-l de la pasul anterior Return: format json pentru a determina dacă poate fi angajat În al cincilea rând: Confirmă trimiterea Metodă: POST Interfață: https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue Parametri:
passengerTicketStr: Tipul scaunului, 0, tipul biletului, nume, identitate, telefon, N (dacă sunt mai multe, separate printr-o virgulă) oldPassengerStr: Nume, Tip ID, Număr ID, Tip de utilizator randCode: Cod de verificare programată purpose_codes: Pasul 3 pentru a-l obține key_check_isChange: Ibid leftTicketStr; Ibid train_locatio{filter}n; Ibid REPEAT_SUBMIT_TOKEN: Ibid _json_att: Șnur gol Returnează: format json, determină dacă trimiterea este reușită, returnează timpul de așteptare și apelează pasul 6 la fiecare anumit interval pentru a returna rezultatul procesării Al șaselea rând: Sondaj pentru a obține rezultatele trimiterii Metodă: GET Interfață: https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime? Parametri:
aleatoriu: Numere aleatorii TurneuDrapel: dc REPEAT_SUBMIT_TOKEN: Există o a treia parte de obținut _json_att: Șnur gol Return: json format, returnează timpul de așteptare, dacă waitTime este mai mic de 0, primește orderId-ul cu informații de comandă, dacă este mai mare de 0, continuă interogarea 5. Să întrebăm despre comenzi nefinalizate Metodă: POST Interfață: https://kyfw.12306.cn/otn/queryOrder/queryMyOrderNoComplete Parametri: _json_att: Șnur gol Returnează: format JSON, conține informații despre ordine și analizează direct
Apropo, cele 5 funcții sunt practic introduse, dar acum sunt postate doar pentru a învăța să le folosească și nu vor fi atacate cu rău intenție, mai mult, interfața site-ului 12306 se schimbă foarte frecvent, iar interfața postată acum ar putea fi schimbată mâine, așa că important este să înveți cum să preiei interfețele și datele relevante și să analizezi din date pentru a obține parametrii corespunzători și rezultatele corespunzătoare. Aici folosesc în principal Firebug, instrumentul de analiză a rețelei care vine cu browserul Chrome, precum și instrumentele Fiddler și Wireshark, și instrucțiunile pentru folosirea uneltelor conexe, caută-le pe Internet. În final, să ne plângem, site-ul 12306 folosește tehnologia de cache statică CDN, ceea ce va duce la selecția serverelor corespunzătoare în funcție de echilibrarea sarcinii în diferite regiuni, lățime de bandă și încărcare, adică există multe servere 12306 în toată țara. Fiecare utilizator poate accesa serverele posibile sunt diferite, dar doar pagini statice și js, css și poze etc., însă fiecare server va păstra direct sesiunea partajată, adică dacă te conectezi pe unul dintre servere, pe alte servere Cele de mai sus sunt echivalente și cu a fi aterizat. Așadar, cel mai bine este să poți alege un server dinamic, astfel încât timpii de cache să fie actualizați, stresul să fie minim și datele să fie mai în timp real. În implementarea mea, dacă nu interogezi o singură dată, vei schimba IP-ul serverului o singură dată. În ceea ce privește tehnologia relevantă, o voi dezvălui mai târziu. Dar conținutul acestui articol este suficient pentru a învăța. Poți vedea adresa IP specifică în http://tool.chinaz.com/dns. |