npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

api-trenitalia

v2.0.2

Published

Un modulo npm per l'utilizzo delle API di trenitalia messe a disposizione tramite il portale lefrecce.it Edit

Downloads

20

Readme

api-trenitalia

NPM

API di trenitalia messe a disposizione tramite il portale lefrecce.it

Link al pacchetto npm

Un semplice wrapper per le API di Trenitalia messe a disposizione tramite il portale lefrecce.it
La versione 2.0 del progetto comprende ora molte più funzionalità legate all'account, nonché una rivisitazione del codice per renderlo più semplciemente utilizzabile e testabile.

Feature

  • Cercare un viaggio di sola andata
  • Autocompletamento
  • Cercare maggiori dettagli su una soluzione
  • Cercare informazioni sui prezzi delle soluzioni
  • Login/Logout
  • Dettagli account
  • Storico acquisti
  • Download di biglietti in PDF

Esempi di utilizzo

  • Esempio di ricerca

    const Trenitalia = require("api-trenitalia");
    const moment = require('moment');
    (async () => {
        const t = new Trenitalia();
        const stations_from = await t.autocomplete("milano");
        const station_from = stations_from[0].name;
        const stations_to = await t.autocomplete("bari");
        const station_to = stations_to[0].name;
    
        const date = moment().add(3, 'months').format("DD/MM/YYYY");
        const solutions = await t.getOneWaySolutions(station_from, station_to, date, "13", 2, 0);
        console.log(solutions);
    })();

    JSON di risposta:

    [{
            "idsolution": "5c486363d2ac4ba6f8dd152cab869932i0",
            "origin": "Milano Centrale",
            "destination": "Bari Centrale",
            "direction": "A",
            "departuretime": 1582891800000,
            "arrivaltime": 1582918020000,
            "minprice": 185.6,
            "optionaltext": null,
            "duration": "07:17",
            "changesno": 1,
            "bookable": true,
            "saleable": true,
            "trainlist": [{
                    "trainidentifier": "FRECCIAROSSA 9539",
                    "trainacronym": "FR",
                    "traintype": "F",
                    "pricetype": "D"
                }, {
                    "trainidentifier": "FRECCIABIANCA 8811",
                    "trainacronym": "FB",
                    "traintype": "F",
                    "pricetype": "D"
                }
            ],
            "onlycustom": false,
            "extraInfo": [],
            "showSeat": true,
            "specialOffer": null,
            "transportMeasureList": []
        }, 
        ...
        {
            "idsolution": "5c486363d2ac4ba6f8dd152cab869932i4",
            "origin": "Milano Centrale",
            "destination": "Bari Centrale",
            "direction": "A",
            "departuretime": 1582899000000,
            "arrivaltime": 1582924920000,
            "minprice": 195.8,
            "optionaltext": null,
            "duration": "07:12",
            "changesno": 1,
            "bookable": true,
            "saleable": true,
            "trainlist": [{
                    "trainidentifier": "FRECCIAROSSA 1000 9547",
                    "trainacronym": "FR",
                    "traintype": "F",
                    "pricetype": "D"
                }, {
                    "trainidentifier": "FRECCIABIANCA 8815",
                    "trainacronym": "FB",
                    "traintype": "F",
                    "pricetype": "D"
                }
            ],
            "onlycustom": false,
            "extraInfo": [],
            "showSeat": true,
            "specialOffer": null,
            "transportMeasureList": []
        }
    ]
  • Cerca tutte le tratte dalla prima città autocompletata per "milano" fino a "bari, prende la prima soluzione e ne stampa alcuni dettagli

    const Trenitalia = require('api-trenitalia');
    const moment = require('moment');
    (async () => {
        const t = new Trenitalia();
    
        const stations_from = await t.autocomplete("milano");
        const station_from = stations_from[0].name;
        const stations_to = await t.autocomplete("bari");
        const station_to = stations_to[0].name;
        console.log(`Partenza da: ${station_from}, arrivo a: ${station_to}`);
    
        const date = moment().add(3, 'months').format("DD/MM/YYYY");
        const solutions = await t.getOneWaySolutions(station_from, station_to, date, "13", 2, 0);
        const firstSolution = solutions[0];
        console.log('=== Prima soluzione disponibile ===');
        console.log(`Treno da:\t${firstSolution.origin}`);
        console.log(`Treno a:\t${firstSolution.destination}`);
        console.log(`Partenza:\t${new Date(firstSolution.departuretime)}`);
        console.log(`Arrivo: \t${new Date(firstSolution.arrivaltime)}`);
        console.log(`Prezzo minimo:\t${firstSolution.minprice}`);
        console.log(`Durata: \t${firstSolution.duration}`);
        console.log(`Numero cambi:\t${firstSolution.changesno}`);
        console.log(`Treni:  \t${firstSolution.trainlist.map(x => x.trainidentifier).join(', ')}`);
    
        const priceDetail = await t.getCustomizedPriceDetails(firstSolution.idsolution);
        console.log('=== Alcune possibilità dalla prima soluzione ===');
        let result = '';
        for (const service of priceDetail.leglist[0].travelerlist[0].servicelist) {
            const firstOffer = service.offerlist[0];
            result += `${service.name.padEnd(25)}\t${firstOffer.name.padEnd(15)}\t${firstOffer.points || 0} punti \t${firstOffer.price || 0}€\t${firstOffer.available || 0} posti disponibili ${firstOffer.visible ? '' : '(non visibile)'}\n`
            const secondOffer = service.offerlist[1];
            result += `${'-'.padEnd(25)}\t${secondOffer.name.padEnd(15)}\t${secondOffer.points || 0} punti \t€${secondOffer.price || 0}\t${secondOffer.available || 0} posti disponibili ${secondOffer.visible ? '' : '(non visibile)'}\n`
        };
        console.log(result);
    })();

    Output:

    Partenza da: MILANO ( TUTTE LE STAZIONI ), arrivo a: BARI ( TUTTE LE STAZIONI )
    === Prima soluzione disponibile ===
    Treno da:       Milano Centrale
    Treno a:        Bari Centrale
    Partenza:       Fri Feb 28 2020 13:10:00 GMT+0100 (GMT+01:00)
    Arrivo:         Fri Feb 28 2020 20:27:00 GMT+0100 (GMT+01:00)
    Prezzo minimo:  185.6
    Durata:         07:17
    Numero cambi:   1
    Treni:          FRECCIAROSSA 9539, FRECCIABIANCA 8811
    === Alcune possibilità dalla prima soluzione ===
    EXECUTIVE                       BASE            142.1 punti     120€    8 posti disponibili
    -                               Economy         125 punti       €102.9  6 posti disponibili
    BUSINESS SALOTTINO              BASE            92.1 punti      70€     8 posti disponibili
    -                               Economy         72 punti        €49.9   8 posti disponibili
    WORKING AREA                    BASE            92.1 punti      70€     3 posti disponibili
    -                               Economy         72 punti        €49.9   3 posti disponibili
    BUSINESS AREA SILENZIO          BASE            92.1 punti      70€     16 posti disponibili
    -                               Economy         77 punti        €54.9   16 posti disponibili
    BUSINESS                        BASE            92.1 punti      70€     119 posti disponibili
    -                               Economy         72 punti        €49.9   22 posti disponibili
    PREMIUM                         BASE            79.1 punti      57€     53 posti disponibili
    -                               Economy         65 punti        €42.9   10 posti disponibili
    STANDARD AREA SILENZIO          BASE            78.1 punti      56€     68 posti disponibili
    -                               CONVENZIONI     0 punti         €0      68 posti disponibili
    STANDARD                        BASE            78.1 punti      56€     266 posti disponibili
    -                               CONVENZIONI     0 punti         €0      266 posti disponibili
    
  • Effettua il login, stampa informazioni relative all'utente, dettagli relativi ad un acquisto e ne scarica il biglietto in PDF

    const Trenitalia = require('api-trenitalia');
    
    (async () => {
        username = '<USERNAME ACCOUNT TRENITALIA>';
        password = '<PASSWORD ACCOUNT TRENITALIA>';
        const t = new Trenapi();
        if (await t.login(username, password)) {
            console.log('Login riuscito');
            let result = await t.userDetails();
            console.log('Dettagli utente:');
            console.log(result);
            result = await t.getPurchases("01/01/2019", "01/01/2020");
            console.log('Primo acqusito del 2019:');
            console.log(result[0]);
            const idsales = result[0].idsales
            result = await t.getPurchaseDetails(idsales);
            console.log('Dettagli acqusito:');
            console.log(result);
            // Download del biglietto in pdf come "biglietto.pdf"
            const fileName = 'biglietto.pdf';
            result = await t.getTicketPdf(idsales, 1, fileName);
            await t.logout();
        }
    })();

    Output:

    Login riuscito
    
    Dettagli utente:
    {
        name: <rimosso>,
        surname: <rimosso>,
        email: <rimosso>,
        cfcode: <rimosso>,
        cftype: 'CARTAFRECCIA_ARGENTO',
        cfstatus: 'ACTIVE',
        cfdescription: 'CARTAFRECCIA ARGENTO',
        points: <rimosso>,
        nextcftype: 'Gold',
        nextpoints: <rimosso>,
        mobile: <rimosso>,
        loyaltyFault: false,
        customerkey: <rimosso>,
        birthdate: <rimosso>,
        period: <rimosso>,
        loyaltyProfile: <rimosso>,
        loyaltyProgram: <rimosso>,
        originalPlatform: <rimosso>,
        customerCategory: <rimosso>,
        customerType: <rimosso>,
        channelId: <rimosso>,
        userType: <rimosso>,
        pointsBalanceNotUpdated: <rimosso>,
        individualInvoice: <rimosso>,
        commercialCards: <rimosso>
    }
    
    Primo acqusito del 2019:
    {
        idsales: <rimosso>,
        traveldescription: <rimosso>,
        purchasedate: <rimosso>,
        departuredate: <rimosso>,
        type: 'Ticket',
        status: 'Purchased',
        tsstatus: <rimosso>,
        channel: 'APP',
        showmore: true,
        expiration: null,
        pnr: <rimosso>,
        travelName: 'Il mio viaggio <rimosso>',
        tsid: <rimosso>,
        departureDatetime: <rimosso>,
        arrivalDatetime: <rimosso>,
        origin: <rimosso>,
        destination: <rimosso>,
        mainTransportTypes: [ 'TRAIN' ],
        typeCodes: <rimosso>,
        closed: false
    }
    
    Dettagli acqusito:
    {
        totalprice: 91.25,
        idsales: <rimosso>,
        odlist: [
            {
            tsid: 2,
            origin: <rimosso>,
            destination: <rimosso>,
            deptime: <rimosso>,
            arrtime: <rimosso>,
            direction: 'A',
            adultno: 1,
            childno: 0,
            price: 40.5,
            leglist: [Array],
            availoperations: [Object],
            discountcodelist: [],
            discountCodeMessage: null,
            saleCompanyIds: [Array],
            date: null,
            quantity: 1
            },
            {
            tsid: 1,
            origin: <rimosso>,
            destination: <rimosso>,
            deptime: <rimosso>,
            arrtime: <rimosso>,
            direction: 'R',
            adultno: 1,
            childno: 0,
            price: 50.75,
            leglist: [Array],
            availoperations: [Object],
            discountcodelist: [],
            discountCodeMessage: null,
            saleCompanyIds: [Array],
            date: null,
            quantity: 1
            }
        ],
        email: <rimosso>,
        pdfallowed: true,
        ticketless: true,
        expdate: null,
        smsallowed: true,
        invoicerequest: false,
        mailError: false,
        isssueCreditNoteError: false,
        electronicValues: [],
        serviceType: 'SEAT',
        legToBookingsConfirmeds: [],
        subscriptioncode: 0,
        seatNotAssigned: false,
        taxiSharingEnable: false,
        paymentNotAuthorized: false
    }

Ringraziamenti

Purtroppo sono API piuttosto convolute e poco intuitive, per questo ringrazio il fondamentale aiuto di questo progetto:
Trenitalia-API di SimoDax, una wiki sul loro funzionamento
Visitate pure il suo sito simodax.github.io e mostrategli un po' di affetto.

Chi sono io

Io sono Trintragula (Daniele), dal 2017. Non usate questo codice per scopi malvagi e rispettate il servizio offerto.

Potete trovarmi scrivendo a danielescarinci42 (at) gmail (dot) com