Das habe ich bei mir auch schon eingebaut, eigentlich für eine andere Sache, aber man könnte es auch für die Bestimmung der Modellnummer benutzen. Denk aber dran, dass dein api call nicht nur ein Auto zurück liefert, sondern eine Liste an Autos. Wenn der Benutzer zum Beispiel mehrere Autos mit dem gleichen Account gekauft hat. Oder wahrscheinlicher, wenn der Benutzer auch gleichzeitig ein Auto steuern darf, für das er per digital key eine Berechtigung bekommen hat.
Hier ist eine Methode, die alle Autos zurück liefert. Kannst du direkt so in das Skript einbauen.
async function getAllCars(access_token) {
const timestamp = Date.now().toString();
const nonce = randomHexString(16);
const params = { needSharedCar: 1, userId: credentials.userId };
let url = '/device-platform/user/vehicle/secure';
const sign = createSignature(nonce, params, timestamp, 'GET', url);
url = 'https://api.ecloudeu.com' + url + '?needSharedCar=1&userId=' + credentials.userId;
let req = new Request(url);
req.method = 'GET';
req.headers = {
'x-app-id': 'SmartAPPEU',
'accept': 'application/json;responseformat=3',
'x-agent-type': 'iOS',
'x-device-type': 'mobile',
'x-operator-code': 'SMART',
'x-device-identifier': deviceId,
'x-env-type': 'production',
'x-version': 'smartNew',
'accept-language': 'en_US',
'x-api-signature-version': '1.0',
'x-api-signature-nonce': nonce,
'x-device-manufacture': 'Apple',
'x-device-brand': 'Apple',
'x-device-model': 'iPhone',
'x-agent-version': '17.1',
'authorization': access_token,
'content-type': 'application/json; charset=utf-8',
'user-agent': 'Hello smart/1.4.0 (iPhone; iOS 17.1; Scale/3.00)',
'x-signature': sign,
'x-timestamp': timestamp
};
const carsResult = await req.loadJSON();
const statusCode = req.response.statusCode;
console.log('All Cars status code: ' + statusCode);
console.log(carsResult);
return carsResult;
}
Alles anzeigen
Das Ergebnis sieht dann zum Beispiel so aus:
{
"data":{
"list":[
{
"modelName":"HX11_EUL_BRABUS+_AWD_000",
"msisdn":"882*******53",
"factoryCode":"6105",
"recordTime":1666247479000,
"carProveStatus":"N",
"id":47110815,
"seriesCodeVs":"HX11",
"matCode":"HX1ETD3A61EU010471",
"simActivited":0,
"shareStatus":"N",
"vehicleOwnerLastTime":1700385629000,
"ihuId":"99********041",
"isIHUConfirm":false,
"modelCode":"HX11_EUL_BRABUS+_AWD_000",
"fccode":"6105",
"engineNo":"N8***16,N8****J",
"current":false,
"ihuPlatform":"tsp",
"plateNo":"",
"proprietaryPlatform":0,
"updateTime":1700080861000,
"vehiclePhotoBig":"",
"colorCode":"096",
"temId":"V898********0043",
"vehicleType":0,
"temType":"",
"vehiclePhotoSmall":"",
"vin":"HES********5",
"tboxPlatform":"tsp",
"seriesName":"HX11",
"fuelTankCapacity":"0",
"createTime":1666247479000,
"defaultVehicle":true,
"loginInfo":{
"loginUid":"",
"isLogined":0
},
"iccid":"8988*****1",
"colorName":"A21 SNOW POWDER WHITE"
}
]
},
"code":"1000",
"httpStatus":"OK",
"message":null,
"hint":null,
"sessionId":"f4184*******587",
"success":true
}
Alles anzeigen
Du könntest dann einfach in der Liste data.list das entsprechende Auto suchen, das zur konfigurierten vin passt und davon dann den matCode auslesen. Das wäre zum Beispiel so möglich:
const allCars = await getAllCars(credentials.apiAccessToken)
let car = arr.find(o => o.vin === vin)
const modelNumber = car.matCode
Die Widgets aktualisieren sich in etwa alle 5-7 Minuten. Das bestimmt iOS und führt es auch automatisch durch. Wie oft genau hängt von vielen Dingen ab, z.B. ob das iPhone entsperrt ist, ob es im Energiesparmodus ist, wie hoch der Akkustand noch ist usw. Steht auch alles schon auf einer der letzten Seiten.