Bavuett / mycicero.js

npm package to get Italian Transport Solutions and other data powered by MyCicero.
https://www.npmjs.com/package/mycicero.js
MIT License
6 stars 0 forks source link

Scoperta di getSecurityToken() #70

Open Giasinit opened 5 months ago

Giasinit commented 5 months ago

Ciao Bavuett, ti ringrazio della tua libreria! Volevo contribuire anch'io fornendoti quello che ho scoperto.

Ho analizzato le API di mycicero.. e ho scoperto che un sacco di richieste hanno bisogno del cosiddetto getSecurityToken(), quindi ho analizzato alcune richieste e alla richiesta 640-es2015.e423fac89717aec8fb7a.js ho notato che getSecurityToken() non è altro che

function getSecurityToken() {
    const e = "01-24-2024 15:28";
    const i = "plusmomo" + e;
    let t = 0;

    for (let o = 0; o < i.length; o++) {
        t += parseInt(i.charCodeAt(o), 10);
    }

    const a = e + t.toString();
    return btoa(a);
}

Da tener conto che ho preso quello che hanno compilato nel file e ho riassunto il loro "algoritmo" in questa maniera. Cosa ne pensi? si può implementare qualche altra funzione? In ogni caso il mio obbiettivo è il GetTPSolutionRealTimeInfo, in maniera da vedere in tempo reale tutti i bus della mia città sulla mappa.

Bavuett commented 5 months ago

Ciao Giasin! 👋

Comincio ringraziandoti per i complimenti.

Ho dato un'occhiata superficiale al codice che hai condiviso, e ho tratto la conclusione che non è detto che serva. Dico questo perché in quel file si fanno riferimento a funzioni che ho implementato io stesso nella libreria, senza però richiedere alcun tipo di token.

Quel che hai fatto tu è analisi statica (lettura del codice sorgente), perché non provi a fare un po' di analisi dinamica?

Apri gli strumenti di sviluppo del tuo browser e apri la scheda che elenca il traffico di rete. Usa poi le funzionalità di MyCicero che ti interessa implementare e analizza le richieste in modo da trovare quelle che fanno al caso tuo. Quando le avrai trovate, imitale usando app come Postman in modo da capire il comportamento di ciascuna richiesta. Per quanto possa sembrare tanta roba da fare, è decisamente più semplice di leggere righe di codice offuscate.

Farei queste cose io stesso ma hai avuto la sfortuna di beccarmi nel corso della temuta sessione invernale (studio all'Università) e di conseguenza non ho molto tempo da dedicare a questo progetto al momento.

Fammi sapere qualora dovessi avere bisogno di aiuto.

Saluti, Lorenzo.

Giasinit commented 5 months ago

Grazie @Bavuett della tua risposta.

Hai ragione, ho notato che la richiesta GetNearestStops non hai inserito il SecurityToken.. ma comunque funziona lo stesso, a differenza di quello che loro hanno scritto.

Grazie del consiglio! sto cercando di capire se i dati sono diversi dall'app facendo una intercettazione.. perché l'idea di fare richieste ogni 10 secondi per capire se ci sono aggiornamenti non mi fa impazzire.. visto che i loro sistemi non sono molto innovativi.

Appena riesco a capire come funziona il numero della soluzione del viaggio e riuscire a mappare tutte le fermate della mia città(sono di Padova) allora in quel caso provo a contribuire nella tua libreria.

Grazie ancora della tua disponibilità e ti lascio in pace che hai da studiare.. io ancora ci devo arrivare LOL. Buono studio e buona sessione

Bavuett commented 5 months ago

Figurati! È sempre un piacere aiutare.

Se c'è qualcosa che non ti torna chiaro e vuoi chiedermelo, fai pure!

Proprio come te ho imparato da zero, e sebbene anche io abbia studiato informatica alle superiori nessuno ti spiegherà mai come fare Reverse Engineering.

Giasinit commented 5 months ago

Effettivamente hai ragione.. nessuno ti spiegherà come "hackerare" a scuola.. In ogni caso sono riuscito ad analizzare molti endpoint per le corse, le tratte e le fermate. Ho scoperto che se faccio una richiesta per la ricerca di una fermata.. invece di inserire il nome della fermata.. posso usare il carattere jolly * per recuperare tutte le fermate in ITALIA.. TUTTA L'ITALIA.. assurdo! p.s. se vuoi mirare solo per una città devi cambiare il valore di un header(Client) e specificare l'azienda nel caso mio Busitalia Veneto(tpwebportal-busitaliaveneto;3.15.4).

Recuperando tutte le fermate della mia città.. circa sulle 3000 FERMATE.. ASSURDO(fino a poco tempo fa neanche sapevo i numeri), ho cercato di recuperare anche le corse esistenti. Come ben sai.. ci sono sempre le eccezioni.. La tratta valida solo i festivi, La tratta valida solo alcuni giorni ecc. Quindi sono andato alla ceca e sul mio server ho fatto partire un programma in node.js che faccia fetch di tutte i ID_Corse possibile ed esistenti(Qui non si poteva usare il carattere jolly *).

Ora dovrei avere tutte le tratte (ID_Corsa), tutti gli orari ecc. Basta che se l'orario inserito da me, ovvero proprio ora, il codice in react native mi fa un confronto degli orari e mi restituisce tutte le tratte valide, anche quelle festivi.. ma questo non importa perché a me importa avere il realtime position/approx. Quindi se non è partito significa che O non è valida la tratta per quel giorno/orario, O il bus è così vecchio che non ha il GPS, O è una vecchia tratta.

Sostanzialmente, questo mi permette di evitare di fare 7000 richieste alla volta, visto che dovrei sapere le corse attive.. tanto per ora non aggiungeranno altre fermate o corse o altro.

P.s. sono stato tutto il giorno a cercare e ho scoperto che esiste GTFS, ovvero General Transit Feed Specification, che generalmente sono tutti i data delle fermate, tratte, gli orari e altro. Molte società di trasporto lo pubblicano sul loro sito o su siti esterni ma comunque da me non hanno fatto, anche se su google ci sono tutte le fermate.. questo significa che lo hanno inviato solo a certe società e non pubblicamente. Ho trovato questo articolo di blog di Francesco Zitelli che parla di questo problema.. ma alla fine nessun risultato concreto. Ho cercato su wiki.openstreetmap.org, e ho trovato dei riferimenti, ma non completi su qualche rotta.

Alla fine ho deciso di contattare via mail il servizio clienti per farmi avere il file.. anche se SECONDO ME non mi risponderanno.. Secondo me sono dati pubblici che tutti possono avere.. se io per ESEMPIO avessi un progetto sul risparmio di carburante usando mezzi pubblici.. ho bisogno di avere un sacco di dati(p.s. tanto a scuola manco me lo fanno fare.. già è tanto se in classe mia capiscono come si scrivere una classe in java LOL).

Ti aggiornerò appena so qualcosa di nuovo. Buon lavoro.