venerdì 5 luglio 2024

Published luglio 05, 2024 by Django Faiola with 0 comment

iOS Booking.com - Hotels & Travel

Indice dei contenuti

Introduzione

Booking.com - Hotels & Travel è un’applicazione mobile gratuita sviluppata da Booking.com, un'agenzia di viaggi olandese, per la prenotazione di soggiorni, voli, noleggio auto e taxi. E' l'app nella categoria di viaggi più scaricata online.

Per maggiori dettagli sulle funzionalità dell'app consulta https://www.booking.com.

App Store: https://apps.apple.com/us/app/booking-com-hotels-travel/id367003839

Per lo studio di questa app sono state utilizzate sia le versioni più datate, la 20.7.1500543 e 22.0.1.1882418, che le più recenti 46.7.20634812 e 48.0.21884260 del mio iPhone.

Percorsi

Di seguito lo stralcio di Booking del poster della SANS “iOS Third-Party Apps Forensics Reference Guide Poster” con le informazioni più rilevanti per l’analisi dell’app.

Da quanto verrà illustrato di seguito è evidente che il poster deve essere aggiornato.

Account

Per la ricostruzione dell'account è sufficiente come da poster il file Plist KeyValueStorageAccountDomain[.plist] presente nell'Internal App Path "/Library/Application Support/". Nelle vecchie versioni di Booking il file è senza estensione mentre nelle versioni recenti ha l'estensione .plist. 

Per la visualizzazione ho usato dfDataViewer, il mio visualizzatore di (B)Plist, JSON(B), (B)XML, ASN.1, Protobuf, etc. ancora in fase di sviluppo e non pubblico.

KeyValueStorageAccountDomain[.plist]

Il dizionario user_profile:

  • first_nameDjango (nome);
  • last_name: Faiola (cognome);
  • nicknameDjango (nome mostrato online);
  • avatar_details(3 items) (foto del profilo);
    • availableTrue (impostata?);
    • urls.256https://lh3.googleusercontent.com/a/ACg8ocKySqfsfm_xrSJU_4Cc7PmLVCTS0nfCxK10spXaOySuiQ=s96-c?sz=256 (URL della foto con risoluzione a 256 pixel);
  • gender: male (identità di genere, es: male, female, etc.);
  • date_of_birth: 12/xx/19xx (data di nascita);
  • streetVia Antonio Canova 7 (indirizzo);
  • cityFondi (città);
  • zipcode04022 (codice postale);
  • countryit (codice paese);
  • telephone+39 349 495 5xxx (numero di telefono);
  • email_address(1 items) (indirizzi email)
    • [0]df.whatsappizza@gmail.com (indirizzo email);
  • email_data(1 items) (dati degli indirizzi email)
    • [0].email_addressdf.whatsappizza@gmail.com (indirizzo email);
    • [0].email_is_businessFalse (aziendale?);
    • [0].email_is_primaryTrue (indirizzo principale?);
    • [0].email_verifiedTrue (indirizzo verificato?);
  • is_geniusTrue (membro genius?);
  • preferred.facility(16 items) (preferenze)
    • [0].is_selected: False (selezionata?)
    • [0].name: Camere/strutture per ospiti disabili (per es: Connessione internet, Palestra, Ristorante, etc.);
  • uid 808180xxx (identificatore univoco);
  • auth_tokenca62ae5e1d178e0011ab85070cd64791xxx (token di autorizzazione).

Metodi di pagamento

Sempre all'interno dello stesso file KeyValueStorageAccountDomain[.plist], nel dizionario user_profile è presente l'array cc_details dei metodi di pagamento.

KeyValueStorageAccountDomain[.plist]

L'array dei metodi di pagamento cc_details:

  • [0].cc_expire_month: 4 (mese di scadenza);
  • [0].cc_expire_year2027 (anno di scadenza);
  • [0].cc_typeVisa (tipo di carta);
  • [0].cc_statusactive (stato);
  • [0].cc_name: Django Faiola (titolare);
  • [0].last_digits0816 (ultime quattro cifre del numero della carta);
  • [0].cc_is_businessFalse (è una carta aziendale?);
  • [0].cc_idef2b52c4-296d-43e1-bc77-bfeaefxxx (identificatore univoco della carta).

Configurazione dell'account

Nelle versioni più recenti, nell'Internal App Path "/Library/Application Support/", è presente un nuovo file Plist AccountSettings.plist con la configurazione dell'account. Non ho dei backup o estrazioni con le versioni intermedie da poter stabilire l'esatta versione con "l'entrata in scena" di questo file.

AccountSettings.plist

Il dizionario userDetails:

  • address
    • cityName = Fondi (città);
    • streetVia Antonio Canova 7 (indirizzo);
    • countryCodeIT (codice paese);
    • zip04022 (codice postale);
  • primaryEmail.addressdf.whatsappizza@gmail.com (indirizzo email);
  • primaryPhone.fullNumber+393494955xxx (numero di telefono);
  • personalDetails (dati personali)
    • avatar.urls.square256https://lh3.googleusercontent.com/a/ACg8ocKySqfsfm_xrSJU_4Cc7PmLVCTS0nfCxK10spXaOySuiQ=s96-c256 (URL della foto con risoluzione a 256 pixel);
    • dateOfBirth
      • day12 (giorno);
      • monthxx (mese);
      • year: 19xx (anno);
    • displayNameDjango (nome mostrato online);
    • genderMALE (identità di genere es: MALE, FEMALE, X);
    • name
      • first: Django (nome);
      • lastFaiola (cognome);
    • nationalityIT (nazionalità).

Configurazione dei metodi di pagamento

Nello stesso file di configurazione "/Library/Application Support/AccountSettings.plist" sono presenti anche le informazioni sulle carte di credito/debito.

AccountSettings.plist

L'array dei metodi di pagamento cardsResponse.values:

  • [0].expirationDateFormatted: 04-2027 (scadenza nel formato mm-yyyy);
  • [0].nameVisa (tipo di carta);
  • [0].statusactive (stato);
  • [0].lastDigits0816 (ultime quattro cifre del numero della carta);
  • [0].idef2b52c4-296d-43e1-bc77-bfeaefxxx (identificatore univoco della carta).

Tipi di Hotel e di Luoghi

Tipi di Hotel (hotel_type):

  • 201 = Apartment (Appartamenti)
  • 202 = Guest Accommodation (Altre strutture ricettive)
  • 203 = Hostel (Ostello)
  • 204 = Hotel (Hotel)
  • 205 = Motel (Motel)
  • 206 = Resort (Resort)
  • 207 = Residence (Residence)
  • 208 = Bed and Breakfast (Bed & Breakfast)
  • 209 = Ryokan (Ryokan)
  • 210 = Farmstay (Agriturismo)
  • 211 = Bungalow (Bungalow)
  • 212 = Resort Village (Villaggio turistico)
  • 213 = Villa (Villa)
  • 214 = Campground (Campeggio)
  • 215 = Boat (Imbarcazione)
  • 216 = Guesthouse (Affittacamera)
  • 218 = Inn (Locanda)
  • 219 = Condo Hotel (Residence)
  • 220 = Vacation Home (Casa vacanza)
  • 221 = Lodge (Lodge)
  • 222 = Homestay (Alloggio in famiglia)
  • 223 = Country House (Casa di campagna)
  • 224 = Luxury Tent (Campeggio di lusso)
  • 225 = Capsule Hotel (Hotel a capsule)
  • 226 = Love Hotel (Love hotel)
  • 227 = Riad (Riad)
  • 228 = Chalet (Chalet)
  • 229 = Condo (Condo)
  • 230 = Cottage (Cottage)
  • 231 = Economy Hotel (Hotel low cost)
  • 232 = Gite (Gita francese)
  • 233 = Health Resort (Resort cura & benessere)
  • 234 = Cruise (Crociera)
  • 235 = Student Accommodation (Residenza studentesca)

Tipi di Luoghi (locationType_):

  • 0 = City (Città);
  • 1 = District (Quartiere);
  • 2 = Region (Regione);
  • 3 = Country (Paese);
  • 4 = Hotel (Hotel);
  • 5 = Airport (Aeroporto);
  • 6 = Landmark (Punto di riferimento);
  • 7 = Google Places (Google places).

Preferiti

Sempre all'interno dello stesso Internal App Path "/Library/Application Support/" è presente il file KeyValueStorageRecentsDomain[.plist] che contiene sia i preferiti che la cronologia delle ricerche, i soggiorni visualizzati e le prenotazioni più recenti. 

KeyValueStorageRecentsDomain[.plist]

L'array wishlists con le liste dei desideri (preferiti):

  • [0].nameSperlonga (nome della lista);
  • [0].hotels(1 items) (array di "hotel");
    • [0].id7558338 (identificatore della struttura)
    • [0].created  (aggiunto in data nel formato Unix Epoch se presente).

I dettagli delle singole strutture "hotel" non sono presenti nella wishlists; l'unico modo per risalire all'hotel (Villa Maria luxury suites nell'esempio) è tramite l'id. Ho provato a tracciare tutti gli hotel presenti nei vari file analizzati creando un dizionario e nonostante tutto non è detto che vi sia un riscontro. Disattivando internet i dettagli non sono più accessibili; molto probabile che vengano richiesti al momento dell'interazione.

Visualizzati

Il dizionario viewed nel file KeyValueStorageRecentsDomain[.plist] contiene i soggiorni visualizzati almeno nelle vecchie versioni. Ho visitato diversi hotel, aperto dettagli, foto, recensioni, etc. e infine ho condiviso via email la struttura; il dizionario viewed non viene generato 😡. Il file di seguito analizzato è quello di una vecchia versione.

KeyValueStorageRecentsDomain[.plist]

Il dizionario viewed (la chiave del dizionario è l'identificatore dell'hotel):

  • 89950(5 items)
    • hotel.lastViewed05/09/2019 11:20:52 (data dell'ultima visita: 05  settembre 2019 11:20:52);
    • hotel.hotel_type: 204 (tipo di hotel, 204=Hotel);
    • hotel.hotel_id89950 (identificatore dell'hotel);
    • hotel.nameVilla Tuscolana Park Hotel (nome dell'hotel);
    • hotel.addressVia Del Tuscolo Km 1,500 (indirizzo);
    • hotel.city
      • string_: Frascati (città)
      • region_name  (regione)
    • hotel.zip00044 (codice postale);
    • hotel.latitude41.8039181924573 (latitudine);
    • hotel.longitude12.6925992965698 (longitudine);
    • hotel.currencyCodeEUR (codice valuta);
    • hotel.pictureURLhttp://r-ec.bstatic.com/images/hotel/square90/424/42435124.jpg (URL dell'immagine dell'hotel);
    • hotel.hotelURLhttps://www.booking.com/hotel/it/grand-villa-tuscolana.it.html (sito web dell'hotel).

Ricerche recenti

Nell'array stored_searches del file KeyValueStorageRecentsDomain[.plist] sono presenti le ultime dieci ricerche effettuate. Se si esegue la ricerca di una destinazione già presente nell'elenco la corrispondente viene sostituita con la nuova. 

KeyValueStorageRecentsDomain[.plist]

L'array stored_searches con le più recenti ricerche (10 destinazioni):

       = sfondo grigio, indica che la key è presente nelle vecchie versioni.

  • [1].created31/03/2024 05:17:01 (data della ricerca: 31 marzo 2024 05:17:01);
  • [1].id_622859 (identificatore della destinazione)
  • [1].destination
    • locationType_4 (tipo di luogo, 4=Hotel);
    • string_B&B Sperlonga (nome della destinazione);
    • substring_: B&B Sperlonga, Sperlonga, Lazio, Italia (località);
    • address: (indirizzo completo presente se locationType_=7=Google Places);
    • city_:
      • string_: (città);
      • region_name: (regione);
    • cityName_: Sperlonga (città);
    • region_name: (regione);
    • countryName_: (paese);
    • country: (paese presente se locationType_=7);
    • location: (presente se locationType_=7)
      • latitude: (latitudine);
      • longitude: (longitudine);
    • latitude_41.2601203918457 (latitudine);
    • longitude_13.4311723709106 (longitudine);
    • timezone: Europe/Rome (fuso orario);
  • [1].checkin2024-03-31 (data di check-in nel formato yyyy-mm-dd: 31 marzo 2024);
  • [1].checkout2024-04-01 (data di check-out nel formato yyyy-mm-dd: 01 aprile 2024);
  • [1].number_of_rooms1 (numero di stanze);
  • [1].guests_per_room2 (numero di persone per camera);
  • [1].number_of_nights1 (numero di notti);
  • [1].sourceios-app (sorgente, es: webios-appwishlist, etc.).

Nella sezione "Continua la ricerca" del dispositivo sono presenti due destinazioni: Lenola e Sperlonga. Queste sono le destinazioni più recenti identificate come città, quartiere, regione o paese (almeno dai pochi test fatti) nell'array stored_searches. Per esempio la ricerca di un hotel non compare in "Continua la ricerca".

Prenotati di recente

Ultimo artefatto di evidenza di questo file "/Library/Application Support/KeyValueStorageRecentsDomain[.plist]" è il dizionario booked, la lista delle prenotazioni recenti. 

KeyValueStorageRecentsDomain[.plist]

Il dizionario booked con l'elenco delle prenotazioni recenti:

  • 8444354(prenotazione)
    • hotel: (32 items)
      • hotel_id8444354 (identificatore dell'hotel);
      • nameOstello Ossigeno (nome dell'hotel);
      • addressStrada Regionale 82 (indirizzo);
      • city
        • string_:  (città)
        • region_name (regione)
      • cityNameCampodimele (nome della città);
      • region_name: (regione, es: Lazio);
        • zip04020 (codice postale);
        • latitude41.3493749442375 (latitudine);
        • longitude13.5230584999695 (longitudine);
        • currencyCodeEUR (codice valuta);
        • checkInFrom15:00 (testo: check-in a partire dalle ore nel fuso orario dell'hotel);
        • checkInFrom: 54000 (secondi: check-in a partire dalle ore nel fuso orario dell'hotel);
        • checkInUntil22:00 (testo: check-in entro le ore nel fuso orario dell'hotel);
        • checkInUntil: 79200 (secondi: check-in entro le ore nel fuso orario dell'hotel);
        • checkOutFrom08:00 (testo: check-out a partire dalle ore nel fuso orario dell'hotel);
        • checkOutFrom: 28800 (secondi: check-out a partire dalle ore nel fuso orario dell'hotel);
        • checkOutUntil10:00 (testo: check-out entro le ore nel fuso orario dell'hotel);
        • checkOutUntil: 36000 (secondi: check-out entro le ore nel fuso orario dell'hotel);
        • pictureURLhttps://cf.bstatic.com/xdata/images/hotel/square90/353874549.jpg?k=14xxx&o= (URL dell'immagine dell'hotel);
        • hotelURLhttps://www.booking.com/hotel/it/ostello-ossigeno-provincia-di-latina.it.html (URL dell'hotel).

    Prenotati

    Il file "/Library/Application Support/BookingClouds[.plist]" è di particolare interesse in quanto contiene tutte le informazioni sulle prenotazioni. Ho svolto prima l'analisi delle vecchie versioni a disposizione e ho definito la struttura dei dati di interesse. Non avendo prenotazioni nel mio Booking, diciamo che ho "prenotato" un alloggio con l'opzione di cancellazione gratuita😇. Ho acquisito i dati prima e dopo la cancellazione della prenotazione per avere un quadro più completo. I valori differenti dopo la cancellazione sono scritti in rosso.

    BookingClouds[.plist]

    Il dizionario AccountBookings con l'elenco delle prenotazioni:

    • 4423252xxx(prenotazione)
      • created_epoch26/06/2024 09:08:25 (data di creazione: 26 giugno 2024 09:08:25);
      • hotel_id8444354 (identificativo dell'hotel);
      • hotel_name: Ostello Ossigeno (nome dell'hotel);
      • hotel_full_addressStrada Regionale 82, 04020 Provincia di Latina (indirizzo completo);
      • hotel_country_nameItalia (nome del paese); 
      • hotel_timezoneEurope/Rome (fuso orario dell'hotel);
      • checkin: 03/07/2024 (data di check-in: 03 luglio 2024);
      • checkin_from_epoch03/07/2024 13:00:00 (orario di inizio check-in nel formato Unix Epoch; nel fuso orario dell'hotel le 15:00 del 03 luglio 2024);
      • checkin_until_epoch03/07/2024 20:00:00 (orario di fine check-in nel formato Unix Epoch; nel fuso orario dell'hotel le 22:00 del 03 luglio 2024);
      • checkout04/07/2024 (data di check-in: 04 luglio 2024);
      • checkout_from_epoch04/07/2024 06:00:00 (orario di inizio check-out nel formato Unix Epoch; nel fuso orario dell'hotel le 08:00 del 04 luglio 2024);
      • checkout_until_epoch04/07/2024 08:00:00 (orario di fine check-out nel formato Unix Epoch; nel fuso orario dell'hotel le 10:00 del 04 luglio 2024);
      • hotel_telephone+39 3204508786 (numero di telefono dell'hotel);
      • hotel_email4423252xxx-9eqt.xxx@property.booking.com (indirizzo email dell'hotel);
      • id: 4423252xxx (numero di conferma della prenotazione);
      • pincode: 32xx (codice PIN di conferma per le operazioni quali  la cancellazione di una prenotazione, la pagina stampabile della prenotazione, etc.);
      • user_selected_currency_code: EUR (codice valuta selezionata);
      • totalprice: 24.6981818181818 [0] (importo totale da pagare);
      • room: (1 items)
        • [0].name: Posto Letto in Dormitorio per 8 Persone (nome della stanza);
        • [0].guest_name: Django Faiola (nome dell'ospite);
        • [0].nr_guests: 1 (numero di persone);
        • [0].is_cancelled: False [True] (prenotazione cancellata);
        • [0].cancel_date26/06/2024 09:16:48 (prenotazione cancellata in data 26 giugno 2024 09:16:48 nel formato Unix Epoch);
        • [0].room_id: 844435403 (numero identificativo della stanza);
        • [0].room_photo:  (URL della foto della stanza);
        • [0].room_photos:  (array di foto della stanza);
          • [0].photo_id: 358890497 (identificatore della foto);
          • [0].url_original: https://cf.bstatic.com/xdata/images/hotel/max500/358890497.jpg?k=bbxxx;
          • ...
        • [0].room_reservation_id: 4968475225 (numero di prenotazione della stanza);
      • booker_firstname: Django (nome del prenotante);
      • booker_lastname: Faiola (cognome del prenotante);
      • booker_cc1: it (codice paese);
      • booker_email: df.whatsappizza@gmail.com (indirizzo email);
      • cc_number_last_digits: (ultime quattro cifre del numero della carta di credito/debito se presente);
      • source: ios-app (sorgente es: web, ios-app, wishlist, etc.).

    Condivisione della prenotazione

    Accedendo alla sezione "Gestisci la prenotazione", inserendo opportunamente il numero di conferma (4423252xxx) e il codice PIN (32xx) della struttura, è possibile condividere la prenotazione come PDF via email, whatsapp, etc. Una volta premuto il pulsante "Condividi come PDF", l'app genera il relativo documento e lo salva su file nell'Internal App Path "/Documents/" con il nome "Booking #<numero di conferma>.pdf" (es: Booking #4423252xxx.pdf).

    Destinazioni archiviate

    Il file "/Library/Application Support/KeyValueStorageSharedDomain[.plist]" contiene le destinazioni archiviate nell'array stored_destinations. Cosa rappresentano queste destinazioni e in cosa si differenziano da quelle recenti in stored_searches? Innanzitutto questa lista non è limitata a sole dieci destinazioni, ho eseguito oltre una ventina di ricerche e ci sono tutte.

    Per cercare di dare un significato a questa lista, ho fatto un test a quattro step distanti circa 1 minuto (orologio dell'app) per essere sicuro di discriminare i vari eventi: 

    1. 15:21 ho inserito il termine di ricerca;
    2. 15:22 ho selezionato uno dei risultati suggeriti, in questo caso "Terre dei Principi Bassiano", ovvero ho confermato la destinazione;
    3. 15:23 ho premuto il pulsante "Cerca";
    4. 15:24 ho visualizzato l'hotel "Terre dei Principi Bassiano.

    created=03/07/2024 13:22:02 (15:22:02 ora locale) corrisponde alla conferma della destinazione (step 2). Invece nella lista dei recenti stored_searchescreated=03/07/2024 13:23:04 (15:23:04 ora locale) corrisponde alla conferma del pulsante "Cerca", ovvero avvia la ricerca (step 3).

    In definitiva questa lista stored_destinations è una "sorta di cronologia" delle destinazioni selezionate prima di avviare la vera ricerca, mentre stored_searches è la lista dei recenti filtrati dopo l'avvio della ricerca.

    KeyValueStorageSharedDomain[.plist]

    L'array stored_destinations con l'elenco delle destinazioni:

    • stored_destinations(destinazioni)
      • [0].created03/07/2024 13:22:02 (data di creazione: 03 luglio 2024 13:22:02);
      • [0].loc (destinazione)
        • locationType_4 (tipo di luogo, 4=Hotel);
        • id_9921761 (identificativo);
        • string_Terre dei Principi Bassiano (nome);
        • substring_Terre dei Principi Bassiano, Bassiano, Lazio, Italia (descrizione);
        • address: (indirizzo completo presente se locationType_=7=Google Places);
        • city_:
          • string_: (città);
          • region_name: (regione);
        • cityName_Bassiano (città);
        • region_name: (regione);
        • countryName_: Italia (paese); 
        • country: (paese presente se locationType_=7);
        • location: (presente se locationType_=7)
          • latitude: (latitudine);
          • longitude: (longitudine);
        • latitude_40.6471786499023 (latitudine);
        • longitude_13.0311994552612 (longitudine);
        • timezoneEurope/Rome (fuso orario);
        • image_url: https://r-xx.bstatic.com/xdata/images/hotel/square60/449568562.jpg?k=e0xxx&o= (URL dell'immagine);

    Ho scritto "sorta di cronologia" in quanto da un altro piccolo test ho appurato che cercando una destinazione già presente in questa lista si ottiene un aggiornamento della stessa. Quindi la key created è si la data di creazione ma non vi è modo distinguere tra una creazione e un aggiornamento della destinazione.

    Notifiche

    Le notifiche vengono registrate localmente nella tabella ZNOTIFICATION del database SQLite "/Library/Application Support/NotificationsModel.sqlite": una cache.

    SELECT
        ROWID AS "N_ID",
        datetime(ZDATE + 978307200, 'unixepoch') AS "timestamp",
        ZIDENTIFIER AS "identifier",
        ZTITLE AS "title",
        ZBODY AS "message",
        ZVIEWED AS "viewed",
        ZLOCALLYDELETED AS "deleted",
        ZACTIONIDENTIFIER AS "action_id",
        ZACTIONARGUMENTS AS "arguments"
    FROM ZNOTIFICATION

    La tabella ZNOTIFICATION (esempio N_ID=90):

    • N_ID90 (chiave primaria);
    • ZDATE: 2024-06-26 09:16:51 (ZDATE è nel formato MAC Absolute Time; data della notifica nel formato Unix Epoch: 26 giugno 2024 09:16:51);
    • ZIDENTIFIER15020485890 (identificatore univoco della notifica);
    • ZTITLE: Prenotazione cancellata (titolo);
    • ZBODY: Vedi la conferma di cancellazione per Ostello Ossigeno (messaggio);
    • ZVIEWED: 0 (visualizzato? 0=False, 1=True);
    • ZLOCALLYDELETED: 0 (eliminato? 0=False, 1=True);
    • ZACTIONIDENTIFIER: open-confirmation (identificatore dell'azione);
    • ZACTIONARGUMENTS: <BLOB> (Plist serializzata con gli argomenti passati all'azione; es: pin code, numero di conferma, etc.).

    Il dizionario nel BLOB ZACTIONARGUMENTS può variare in base al tipo di notifica (ZACTIONIDENTIFIER).

    Nel caso di N_ID=90 è:

    • hres_id: 4423252xxx (numero di conferma della prenotazione);
    • pincode: 32xx (pin code).

    Le notifiche sull'iPhone:

    Cronologia delle ricerche dei voli

    Nell'Internal App Path "/Library/Application Support/" è presente il file JSON flight_rs_v2 che viene generato nel momento in cui si esegue una ricerca dei voli.

    flight_rs_v2

    L'array value con l'elenco delle ricerche dei voli:

    • value(voli)
      • [0].lastUpdated2024-06-29T17:11:55 (ultimo aggiornamento: 29 giugno 2024 17:11:55 nel formato ISO 8601);
      • [0].parameters.searchOptionModel (opzioni di ricerca)
        • startYear: 2024 (anno della data di andata);
        • startMonth: 10 (mese della data di andata);
        • startDay: 1 (giorno della data di andata);
        • returnYear: 2024 (anno della data di ritorno);
        • returnMonth: 10 (mese della data di ritorno);
        • returnDay8 (giorno della data di ritorno);
        • direct: false (volo diretto);
        • searchType: ONEWAY (tipo di ricerca, es: ROUNDTRIP= andata e ritorno, ONEWAY=solo andata e MULTISTOP=destinazioni multiple);
        • cabin: ECONOMY (classe di viaggio);
        • sourceAirports: (aeroporti di partenza)
          • [0].name: Aeroporto di Napoli Capodichino (nome);
          • [0].cityNameNapoli (città);
          • [0].regionNameCampania (regione);
          • [0].countryNameItalia (paese);
          • [0].typeAIRPORT (tipo);
          • [0].code: NAP (codice aeroporto);
          • [0].selected: true (selezionato?);
        • destinationAirports: (aeroporti di destinazione)
          • [0].nameAeroporto Internazionale di Malta (nome);
          • [0].cityName: La Valletta (città);
          • [0].regionName: Malta (regione);
          • [0].countryName: Malta (paese);
          • [0].typeAIRPORT (tipo);
          • [0].code: MLA (codice aeroporto);
          • [0].selectedtrue (selezionato?);
        • routes: (array con i percorsi per i voli con destinazioni multiple o con scali)
          • [0].startYear: (anno di partenza);
          • [0].startMonth: (mese di partenza);
          • [0].startDay: (giorno di partenza);
          • [0].sourceAirports: (stessa struttura di sourceAirports);
          • [0].destinationAirports: (stessa struttura di destinationAirports);
          • ...
        • travellersDetails: (dettagli dei viaggiatori)
          • adultsCount: 1 (numero di adulti);
          • childrenCount: 0 (numero di bambini);
          • childrenAges: (array con l'età dei bambini, es: 71014).

    iLEAPP 💖

    Come di consueto, a supporto del progetto iLEAPP (iOS Logs, Events, And Plists Parser) di Alexis Brignoni ho sviluppato il plugin booking.py che alla data odierna è in “pull request” e comunque disponibile sul mio GitHub.

    Di seguito alcuni screenshot del report di Booking.com:

      0 comments:

      Posta un commento