Senast jag skrev om SJ API och deras app uppmärksammade jag hur de hanterar personlig data. I onsdags uppdaterade SJ sin mobilapplikation med några nya efterfrågade funktioner.

SJ API

SJ har också utökat sitt API med nya metoder för att möjliggöra de nya funktionerna i appen.

API-metoder

Metodanropen dokumenterade nedan är de som jag hittills haft möjlighet att se över. Håll utkik efter fler uppdateringar genom att följa mig på Twitter.

Register device

GET deviceRegistration/{token}/{iphone|android}

Exempelfråga:

$ curl https://sjmg.sj.se/api2/deviceRegistration/1/iphone \
    -H "Appkey: E252FEDA2EAA72F0CEBF5E9E432C66BB" \
    -H "Devicetype: iphone" \
    -H "Version: 3"

Get stations

GET stations.json

Exempelfråga:

$ curl "https://sjmg.sj.se/api2/stations.json" \
    -H "Appkey: E252FEDA2EAA72F0CEBF5E9E432C66BB" \
    -H "Devicetype: iphone" \
    -H "Version: 3"

Exempelsvar:

{
    "stations":
    [
        {
            "id": 1,
            "stationName": "Stockholm C",
            "city": "Stockholm C",
            "stationType": "sj"
        },
        …
        {
            "id": 924,
            "stationName": "Stenstorp",
            "city": "Stenstorp",
            "stationType": "sj"
        }
    ]
}

Station timetable

GET stationTimeTable/{id}.json

Exempelfråga:

$ curl https://sjmg.sj.se/api2/stationTimeTable/1.json \
    -H "Appkey: E252FEDA2EAA72F0CEBF5E9E432C66BB" \
    -H "Devicetype: iphone" \
    -H "Version: 3"

Exempelsvar:

{
    "id": 1,
    "stationName": "Stockholm C",
    "city" :"Stockholm C",
    "stationType": "SJ",
    "arrivals":
    [
        {
            "trainNumber": "93",
            "date": "2012-03-23",
            "time":
            {
                "scheduledTime": "2012-03-24T12:05",
                "newTime": "2012-03-24T12:30"
            },
            "track":
            {
                "scheduledTrack": "12",
                "newTrack": ""
            },
            "fromStationName": "Riksgränsen",
            "toStationName": "Stockholm C",
            "stationNames":
            [
                "Riksgränsen",
                "Katterjåkk",
                "Björkliden",
                "Abisko turiststation",
                "Abisko Östra",
                "Kiruna C",
                "Gällivare",
                "Murjek",
                "Boden C",
                "Älvsbyn",
                "Jörn",
                "Bastuträsk",
                "Umeå C",
                "Örnsköldsvik C",
                "Mellansel",
                "Långsele",
                "Bräcke",
                "Ånge",
                "Sundsvall C",
                "Söderhamn",
                "Gävle C",
                "Uppsala C",
                "Arlanda C",
                "Stockholm C"
            ],
            "isPassed": true,
            "cancelled": false
        },
        …
        {
            "trainNumber": "91",
            "date": "2012-03-24",
            "time":
            {
                "scheduledTime": "2012-03-25T06:42",
                "newTime": ""
            },
            "track":
            {
                "scheduledTrack": "12",
                "newTrack": ""
            },
            "fromStationName": "Luleå C",
            "toStationName": "Göteborg C",
            "stationNames":
            [
                "Luleå C",
                "Sunderby sjukhus",
                "Boden C",
                "Älvsbyn",
                "Jörn",
                "Bastuträsk",
                "Vindeln",
                "Umeå C",
                "Örnsköldsvik C",
                "Mellansel",
                "Långsele",
                "Ånge",
                "Ljusdal",
                "Bollnäs",
                "Gävle C",
                "Uppsala C",
                "Arlanda C",
                "Stockholm C",
                "Hallsberg",
                "Skövde C",
                "Herrljunga",
                "Göteborg C"
            ],
            "isPassed": false,
            "cancelled":false
        }
    ],
    "departures":
    [
        {
            "trainNumber": "633",
            "date": "2012-03-24",
            "time":
            {
                "scheduledTime": "2012-03-24T12:21",
                "newTime": "2012-03-24T12:22"
            },
            "track":
            {
                "scheduledTrack": "10",
                "newTrack": ""
            },
            "fromStationName": "Stockholm C",
            "toStationName": "Karlstad C",
            "stationNames":
            [
                "Stockholm C",
                "Södertälje Syd",
                "Katrineholm C",
                "Hallsberg",
                "Degerfors",
                "Kristinehamn",
                "Karlstad C"
            ],
            "isPassed": true,
            "cancelled": false
        },
        …
        {
            "trainNumber": "808",
            "date": "2012-03-25",
            "time":
            {
                "scheduledTime": "2012-03-25T07:11",
                "newTime": ""
            },
            "track":
            {
                "scheduledTrack": "3",
                "newTrack": ""
            },
            "fromStationName": "Stockholm C",
            "toStationName": "Uppsala C",
            "stationNames":
            [
                "Stockholm C",
                "Märsta",
                "Knivsta",
                "Uppsala C"
            ],
            "isPassed": false,
            "cancelled": false
        }
    ]
}

Train timetable

GET trainTimeTable/{train}/{Y-m-d}

Exempelfråga:

$ curl https://sjmg.sj.se/api2/trainTimeTable/8456/2012-03-24 \
    -H "Appkey: E252FEDA2EAA72F0CEBF5E9E432C66BB" \
    -H "Devicetype: iphone" \
    -H "Version: 3"

Exempelsvar:

{
    "trainNumber": "8456",
    "date": "2012-03-24",
    "trainType": "",
    "fromStationName": "Upplands Väsby",
    "toStationName": "Uppsala C",
    "trainPosition":
    {
        "latitude": 59.52166666666667,
        "longitude": 17.899444444444445,
        "timestamp": ""
    },
    "stops":
    [
        {
            "station":
            {
                "id": 782,
                "stationName": "Upplands Väsby",
                "city": "Upplands Väsby",
                "stationType": "SJ"
            },
            "arrivalTime":
            {
                "scheduledTime": "",
                "newTime": ""
            },
            "departureTime":
            {
                "scheduledTime": "2012-03-24T19:20",
                "newTime": ""
            },
            "track":
            {
                "scheduledTrack": "32a",
                "newTrack":""
            },
            "isCancelled": false,
            "isPassed": false
        },
        …
        {
            "station":
            {
                "id": 5,
                "stationName": "Uppsala C",
                "city": "Uppsala C",
                "stationType": "SJ"
            },
            "arrivalTime":
            {
                "scheduledTime": "2012-03-24T19:47",
                "newTime": ""
            },
            "departureTime":
            {
                "scheduledTime": "",
                "newTime": ""
            },
            "track":
            {
                "scheduledTrack": "3",
                "newTrack": ""
            },
            "isCancelled": false,
            "isPassed": false
        }
    ],
    "nextStop": 0,
    "isSubscribeable": true
}

Login user

GET login?username={username}&password={password}&deviceID={id}&deviceType={iphone|android}

Exempelfråga:

$ curl "https://sjmg.sj.se/api2/login?username={username}&password={password}&deviceID=1&deviceType={iphone|android}" \
    -H "Appkey: E252FEDA2EAA72F0CEBF5E9E432C66BB" \
    -H "Devicetype: iphone" \
    -H "Version: 3"

Exempelsvar:

{
    "customerID": "censurerad",
    "firstName": "ERIK",
    "lastName": "PETTERSSON",
    "hash": "censurerad",
    "sjPrioCards":
    [
        {
            "cardNo": "censurerad",
            "priority": "Svart",
            "points": 6998
        }
    ]
}

Customer tickets

GET customerTickets/{customerID}/{deviceID}/{iphone|android}?hash={hash}

Exempelfråga:

$ curl https://sjmg.sj.se/api2/customerTickets/{customerID}/{deviceID}/iphone?hash={hash} \
-H "Appkey: E252FEDA2EAA72F0CEBF5E9E432C66BB" \
-H "Devicetype: iphone" \
-H "Version: 3"

Exempelsvar:

[
    {
        "ticketID": "censurerad0001",
        "orderID": "censurerad",
        "travellerID": "censurerad",
        "itineraries":
        [
            {
                "trainNumber": "85",
                "trainType": "74",
                "departureStation": "Gävle C",
                "departureTime": "2012-03-25T21:00",
                "arrivalStation": "Stockholm C",
                "arrivalTime": "2012-03-25T22:35",
                "isSubscribeable": true,
                "subscriptionID": "censurerad",
                "stops":
                [
                    {
                        "station":
                        {
                            "id": 210,
                            "stationName": "Gävle C",
                            "city": "Gävle C",
                            "stationType": "SJ"
                        },
                        "arrivalTime":
                        {
                            "scheduledTime": "2012-03-25T20:50",
                            "newTime": ""
                        },
                        "departureTime":
                        {
                            "scheduledTime": "2012-03-25T21:00",
                            "newTime": ""
                        },
                        "track":
                        {
                            "scheduledTrack": "1",
                            "newTrack": ""
                        },
                        "isCancelled": false,
                        "isPassed": false
                    },
                    –
                    {
                        "station":
                        {
                            "id": 1,
                            "stationName": "Stockholm C",
                            "city": "Stockholm C",
                            "stationType": "SJ"
                        },
                        "arrivalTime":
                        {
                            "scheduledTime": "2012-03-25T22:33",
                            "newTime": ""
                        },
                        "departureTime":
                        {
                            "scheduledTime": "",
                            "newTime": ""
                        },
                        "track":
                        {
                            "scheduledTrack": "4",
                            "newTrack": ""
                        },
                        "isCancelled": false,
                        "isPassed": false
                    }
                ],
                "nextStop":0,
                "trainPosition":
                {
                    "latitude":63.351274,
                    "longitude":14.38646,
                    "timestamp": "2012-03-25T16:47"
                }
            }
        ]
    }
]

SJ skickar användarens position till tredje part

Något som jag reagerade på är att SJ utan användarens medgivande skickar vidare dess position till tredje part. För kännedom gäller det tjänsten Xtify. Om vi ser till Apples riktlinjer för iOS applikationer måste användaren ge sitt medgivande vid förmedling, användning och nyttjande av positionsinformation. I annat fall hävdar Apple att applikationen inte kommer bli godkänd och synas i App Store. Men den här gången blev det fel.

Fler som skrivit om uppdateringen av Min resa


För att kommentera det här inlägget, skriv en .