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.
- Logga in och få automatisk översyn på resor du köpt som inloggad på sj.se
- Val att bevaka resor hämtade via beställningsnummer eller telefonnummer
- Val att få push-notiser förändringar i dina bevakade resor vid inställt tåg, ändrad avgångstid och byte av spår
- Som medlem i SJ Prio ser du ditt medlemsnummer, nivå och poäng att använda.
SJ API
SJ har också utökat sitt API med nya metoder för att möjliggöra de nya funktionerna i appen.
- Endpoint: https://sjmg.sj.se/api2/
- Key: E252FEDA2EAA72F0CEBF5E9E432C66BB
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 tweet.