iobroker.parcel 0.0.13 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/io-package.json +7 -1
- package/main.js +118 -40
- package/package.json +13 -13
package/README.md
CHANGED
|
@@ -12,9 +12,10 @@
|
|
|
12
12
|
|
|
13
13
|
**Tests:** 
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## Paketverfolgung/Sendungsverfolgung Adapter für ioBroker
|
|
16
16
|
|
|
17
|
-
Parcel tracking
|
|
17
|
+
Parcel tracking / Sendungsverfolgung
|
|
18
|
+
Verfolge mit deinem ioBroker SmartHome deine Pakete von Amazon, DHL, DPD, Hermes, UPS und GLS. Außerdem wirst du über die Briefverfolgung von der deutschen Post informiert. Direkt per Push auf Telegram, Pushover oder Signal.
|
|
18
19
|
|
|
19
20
|
## Loginablauf
|
|
20
21
|
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "parcel",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.16",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.0.16": {
|
|
7
|
+
"en": "Fix UPS login"
|
|
8
|
+
},
|
|
9
|
+
"0.0.15": {
|
|
10
|
+
"en": "Fix DPD states and remove canvas dependency"
|
|
11
|
+
},
|
|
6
12
|
"0.0.13": {
|
|
7
13
|
"en": "Fix Amazon delivery state, add telegram user"
|
|
8
14
|
},
|
package/main.js
CHANGED
|
@@ -6,6 +6,17 @@
|
|
|
6
6
|
|
|
7
7
|
// The adapter-core module gives you access to the core ioBroker functions
|
|
8
8
|
// you need to create an adapter
|
|
9
|
+
|
|
10
|
+
//disable canvas because of missing rebuild
|
|
11
|
+
const Module = require("module");
|
|
12
|
+
const originalRequire = Module.prototype.require;
|
|
13
|
+
Module.prototype.require = function () {
|
|
14
|
+
if (arguments[0] === "canvas") {
|
|
15
|
+
return { createCanvas: null, createImageData: null, loadImage: null };
|
|
16
|
+
}
|
|
17
|
+
return originalRequire.apply(this, arguments);
|
|
18
|
+
};
|
|
19
|
+
|
|
9
20
|
const utils = require("@iobroker/adapter-core");
|
|
10
21
|
const axios = require("axios");
|
|
11
22
|
const qs = require("qs");
|
|
@@ -13,9 +24,11 @@ const Json2iob = require("./lib/json2iob");
|
|
|
13
24
|
const getPwd = require("./lib/rsaKey");
|
|
14
25
|
const tough = require("tough-cookie");
|
|
15
26
|
const { HttpsCookieAgent } = require("http-cookie-agent");
|
|
16
|
-
const { JSDOM } = require("
|
|
27
|
+
const { JSDOM } = require("jsdom");
|
|
17
28
|
const fs = require("fs");
|
|
18
29
|
const { v4: uuidv4 } = require("uuid");
|
|
30
|
+
const { sep } = require("path");
|
|
31
|
+
const { tmpdir } = require("os");
|
|
19
32
|
|
|
20
33
|
class Parcel extends utils.Adapter {
|
|
21
34
|
/**
|
|
@@ -40,6 +53,7 @@ class Parcel extends utils.Adapter {
|
|
|
40
53
|
this.ignoredPath = [];
|
|
41
54
|
this.firstStart = true;
|
|
42
55
|
this.delivery_status = { ERROR: -1, UNKNOWN: 5, REGISTERED: 10, IN_PREPARATION: 20, IN_TRANSIT: 30, OUT_FOR_DELIVERY: 40, DELIVERED: 1 };
|
|
56
|
+
this.tmpDir = tmpdir();
|
|
43
57
|
}
|
|
44
58
|
|
|
45
59
|
/**
|
|
@@ -448,6 +462,7 @@ class Parcel extends utils.Adapter {
|
|
|
448
462
|
return res.data;
|
|
449
463
|
})
|
|
450
464
|
.catch((error) => {
|
|
465
|
+
this.log.error("Amazon login failed");
|
|
451
466
|
this.log.error(error);
|
|
452
467
|
if (error.response) {
|
|
453
468
|
this.log.error(JSON.stringify(error.response.data));
|
|
@@ -821,7 +836,7 @@ class Parcel extends utils.Adapter {
|
|
|
821
836
|
UPSSecurity: {
|
|
822
837
|
UsernameToken: {},
|
|
823
838
|
ServiceAccessToken: {
|
|
824
|
-
AccessLicenseNumber: "
|
|
839
|
+
AccessLicenseNumber: "2DBACFA7974B3252",
|
|
825
840
|
},
|
|
826
841
|
},
|
|
827
842
|
LoginSubmitUserIdRequest: {
|
|
@@ -919,7 +934,7 @@ class Parcel extends utils.Adapter {
|
|
|
919
934
|
) {
|
|
920
935
|
this.upsAddressToken = res.data.GetEnrollmentsResponse.MYCEnrollmentSummaries.MYCEnrollmentSummary.AddressToken;
|
|
921
936
|
} else {
|
|
922
|
-
this.log.warn("No UPS address found");
|
|
937
|
+
this.log.warn("No UPS address found. Please activate UPS My Choice in the UPS App");
|
|
923
938
|
this.log.info(JSON.stringify(res.data));
|
|
924
939
|
}
|
|
925
940
|
})
|
|
@@ -1102,7 +1117,7 @@ class Parcel extends utils.Adapter {
|
|
|
1102
1117
|
});
|
|
1103
1118
|
}
|
|
1104
1119
|
if (this.sessions["amz"]) {
|
|
1105
|
-
this.getAmazonPackages();
|
|
1120
|
+
await this.getAmazonPackages();
|
|
1106
1121
|
}
|
|
1107
1122
|
const statusArrays = {
|
|
1108
1123
|
dhl: [
|
|
@@ -1157,6 +1172,9 @@ class Parcel extends utils.Adapter {
|
|
|
1157
1172
|
accept: "*/*",
|
|
1158
1173
|
"user-agent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.45 Safari/537.36",
|
|
1159
1174
|
"accept-language": "de-de",
|
|
1175
|
+
"Cache-Control": "no-cache",
|
|
1176
|
+
Pragma: "no-cache",
|
|
1177
|
+
Expires: "0",
|
|
1160
1178
|
},
|
|
1161
1179
|
},
|
|
1162
1180
|
],
|
|
@@ -1319,6 +1337,11 @@ class Parcel extends utils.Adapter {
|
|
|
1319
1337
|
});
|
|
1320
1338
|
}
|
|
1321
1339
|
}
|
|
1340
|
+
this.log.debug("Write states");
|
|
1341
|
+
this.setState("allProviderJson", JSON.stringify(this.mergedJson), true);
|
|
1342
|
+
this.setState("allProviderObjects", JSON.stringify(this.mergedJsonObject), true);
|
|
1343
|
+
this.setState("inDelivery", JSON.stringify(this.inDelivery), true);
|
|
1344
|
+
this.setState("inDeliveryCount", this.inDelivery.length, true);
|
|
1322
1345
|
}
|
|
1323
1346
|
async cleanupProvider(id, data) {
|
|
1324
1347
|
if (id === "dhl" && data.hasOwnProperty("grantToken")) {
|
|
@@ -1363,7 +1386,12 @@ class Parcel extends utils.Adapter {
|
|
|
1363
1386
|
if (sendung.sendungsdetails && sendung.sendungsdetails.sendungsverlauf && sendung.sendungsdetails.sendungsverlauf.kurzStatus) {
|
|
1364
1387
|
status = sendung.sendungsdetails.sendungsverlauf.kurzStatus;
|
|
1365
1388
|
}
|
|
1366
|
-
|
|
1389
|
+
if (sendung.sendungsdetails && sendung.sendungsdetails.liveTrackingVerfuegbar && sendung.sendungsdetails.liveTracking) {
|
|
1390
|
+
status = status + " " + sendung.sendungsdetails.liveTracking.countdown + " Stopps";
|
|
1391
|
+
}
|
|
1392
|
+
const name = sendung.sendungsinfo.sendungsname;
|
|
1393
|
+
|
|
1394
|
+
const sendungsObject = { id: sendung.id, name: name, status: status, source: "DHL" };
|
|
1367
1395
|
|
|
1368
1396
|
sendungsObject.delivery_status = this.deliveryStatusCheck(sendung, id, sendungsObject);
|
|
1369
1397
|
if (sendungsObject.delivery_status === this.delivery_status.OUT_FOR_DELIVERY) {
|
|
@@ -1426,19 +1454,19 @@ class Parcel extends utils.Adapter {
|
|
|
1426
1454
|
}
|
|
1427
1455
|
|
|
1428
1456
|
if (id === "dpd" && data && data.sendungen) {
|
|
1429
|
-
|
|
1430
|
-
sendung.
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
if (!sendung.delivery_status) {
|
|
1437
|
-
this.log.warn("Missing status for " + JSON.stringify(sendung));
|
|
1457
|
+
const sendungsArray = data.sendungen.map((sendung) => {
|
|
1458
|
+
const sendungsObject = { id: sendung.id, name: sendung.name, status: sendung.status || "", source: "DPD" };
|
|
1459
|
+
|
|
1460
|
+
sendungsObject.delivery_status = this.deliveryStatusCheck(sendung, id, sendungsObject);
|
|
1461
|
+
if (sendungsObject.delivery_status === this.delivery_status.OUT_FOR_DELIVERY) {
|
|
1462
|
+
sendungsObject.inDelivery = true;
|
|
1463
|
+
this.inDelivery.push(sendungsObject);
|
|
1438
1464
|
}
|
|
1439
|
-
this.mergedJsonObject[sendung.id] =
|
|
1440
|
-
|
|
1441
|
-
|
|
1465
|
+
this.mergedJsonObject[sendung.id] = sendungsObject;
|
|
1466
|
+
|
|
1467
|
+
return sendungsObject;
|
|
1468
|
+
});
|
|
1469
|
+
this.mergedJson = this.mergedJson.concat(sendungsArray);
|
|
1442
1470
|
}
|
|
1443
1471
|
if (id === "amz" && data && data.sendungen) {
|
|
1444
1472
|
const sendungsArray = data.sendungen.map((sendung) => {
|
|
@@ -1495,11 +1523,6 @@ class Parcel extends utils.Adapter {
|
|
|
1495
1523
|
this.mergedJson = this.mergedJson.concat(sendungsArray);
|
|
1496
1524
|
}
|
|
1497
1525
|
|
|
1498
|
-
this.setState("allProviderJson", JSON.stringify(this.mergedJson), true);
|
|
1499
|
-
this.setState("allProviderObjects", JSON.stringify(this.mergedJsonObject), true);
|
|
1500
|
-
this.setState("inDelivery", JSON.stringify(this.inDelivery), true);
|
|
1501
|
-
this.setState("inDeliveryCount", this.inDelivery.length, true);
|
|
1502
|
-
|
|
1503
1526
|
if (this.config.sendToActive) {
|
|
1504
1527
|
const sendungen = this.mergedJsonObject;
|
|
1505
1528
|
const ids = Object.keys(sendungen);
|
|
@@ -1515,12 +1538,30 @@ class Parcel extends utils.Adapter {
|
|
|
1515
1538
|
const sendInstances = this.config.sendToInstance.replace(/ /g, "").split(",");
|
|
1516
1539
|
const sendUser = this.config.sendToUser.replace(/ /g, "").split(",");
|
|
1517
1540
|
for (const sendInstance of sendInstances) {
|
|
1541
|
+
const text = "📦 " + sendungen[id].source + " " + sendungen[id].name + "\n" + sendungen[id].status;
|
|
1518
1542
|
if (sendUser.length > 0) {
|
|
1519
1543
|
for (const user of sendUser) {
|
|
1520
|
-
|
|
1544
|
+
if (sendInstance.includes("pushover")) {
|
|
1545
|
+
await this.sendToAsync(sendInstance, { user: user, message: text, title: "Paketstatus" });
|
|
1546
|
+
} else if (sendInstance.includes("signal-cmb")) {
|
|
1547
|
+
await this.sendToAsync(sendInstance, "send", {
|
|
1548
|
+
text: text,
|
|
1549
|
+
phone: user,
|
|
1550
|
+
});
|
|
1551
|
+
} else {
|
|
1552
|
+
await this.sendToAsync(sendInstance, { user: user, text: text });
|
|
1553
|
+
}
|
|
1521
1554
|
}
|
|
1522
1555
|
} else {
|
|
1523
|
-
|
|
1556
|
+
if (sendInstance.includes("pushover")) {
|
|
1557
|
+
await this.sendToAsync(sendInstance, { message: text, title: "Paketstatus" });
|
|
1558
|
+
} else if (sendInstance.includes("signal-cmb")) {
|
|
1559
|
+
await this.sendToAsync(sendInstance, "send", {
|
|
1560
|
+
text: text,
|
|
1561
|
+
});
|
|
1562
|
+
} else {
|
|
1563
|
+
await this.sendToAsync(sendInstance, text);
|
|
1564
|
+
}
|
|
1524
1565
|
}
|
|
1525
1566
|
}
|
|
1526
1567
|
}
|
|
@@ -1589,17 +1630,32 @@ class Parcel extends utils.Adapter {
|
|
|
1589
1630
|
return hermes_status[sendung.lastStatusId];
|
|
1590
1631
|
}
|
|
1591
1632
|
}
|
|
1592
|
-
if (id === "
|
|
1593
|
-
const
|
|
1633
|
+
if (id === "dpd" && sendung.statusId) {
|
|
1634
|
+
const dpd_status = {
|
|
1594
1635
|
0: this.delivery_status.REGISTERED,
|
|
1595
|
-
1: this.delivery_status.
|
|
1596
|
-
2: this.delivery_status.
|
|
1636
|
+
1: this.delivery_status.IN_PREPARATION,
|
|
1637
|
+
2: this.delivery_status.IN_TRANSIT,
|
|
1597
1638
|
3: this.delivery_status.IN_TRANSIT,
|
|
1598
1639
|
4: this.delivery_status.OUT_FOR_DELIVERY,
|
|
1640
|
+
5: this.delivery_status.OUT_FOR_DELIVERY,
|
|
1641
|
+
6: this.delivery_status.DELIVERED,
|
|
1642
|
+
};
|
|
1643
|
+
if (dpd_status[sendung.statusId] !== undefined) {
|
|
1644
|
+
return dpd_status[sendung.statusId];
|
|
1645
|
+
}
|
|
1646
|
+
}
|
|
1647
|
+
if (id === "gls" && sendung.status) {
|
|
1648
|
+
const gls_status = {
|
|
1649
|
+
PREADVICE: this.delivery_status.REGISTERED,
|
|
1650
|
+
1: this.delivery_status.REGISTERED,
|
|
1651
|
+
INWAREHOUSE: this.delivery_status.IN_TRANSIT,
|
|
1652
|
+
INTRANSIT: this.delivery_status.IN_TRANSIT,
|
|
1653
|
+
INDELIVERY: this.delivery_status.OUT_FOR_DELIVERY,
|
|
1599
1654
|
DELIVERED: this.delivery_status.DELIVERED,
|
|
1655
|
+
DELIVEREDPS: this.delivery_status.DELIVERED,
|
|
1600
1656
|
};
|
|
1601
|
-
if (gls_status[sendung.
|
|
1602
|
-
return gls_status[sendung.
|
|
1657
|
+
if (gls_status[sendung.status] !== undefined) {
|
|
1658
|
+
return gls_status[sendung.status];
|
|
1603
1659
|
}
|
|
1604
1660
|
}
|
|
1605
1661
|
if (id === "amz" && sendung.detailedState && sendung.detailedState.shortStatus) {
|
|
@@ -1624,7 +1680,7 @@ class Parcel extends utils.Adapter {
|
|
|
1624
1680
|
}
|
|
1625
1681
|
}
|
|
1626
1682
|
|
|
1627
|
-
return this.delivery_status
|
|
1683
|
+
return this.delivery_status.UNKNOWN;
|
|
1628
1684
|
} catch (error) {
|
|
1629
1685
|
this.log.error(error);
|
|
1630
1686
|
return this.delivery_status["ERROR"];
|
|
@@ -1666,10 +1722,15 @@ class Parcel extends utils.Adapter {
|
|
|
1666
1722
|
parcelList.querySelectorAll(".btnSelectParcel").forEach((parcel) => {
|
|
1667
1723
|
const parcelInfo = parcel.firstElementChild;
|
|
1668
1724
|
this.log.debug(parcelInfo.textContent);
|
|
1725
|
+
let statusId = parcelInfo.querySelector("img").src;
|
|
1726
|
+
if (statusId) {
|
|
1727
|
+
statusId = statusId.replace("images/status_", "").replace(".svg", "");
|
|
1728
|
+
}
|
|
1669
1729
|
result.sendungen.push({
|
|
1670
1730
|
id: parcelInfo.querySelector(".parcelNo").textContent,
|
|
1671
1731
|
name: parcelInfo.querySelector(".parcelName").textContent,
|
|
1672
1732
|
status: parcelInfo.querySelector(".parcelDeliveryStatus").textContent,
|
|
1733
|
+
statusId: statusId,
|
|
1673
1734
|
});
|
|
1674
1735
|
});
|
|
1675
1736
|
return result;
|
|
@@ -2103,25 +2164,42 @@ class Parcel extends utils.Adapter {
|
|
|
2103
2164
|
return;
|
|
2104
2165
|
}
|
|
2105
2166
|
const uuid = uuidv4();
|
|
2106
|
-
fs.writeFileSync(
|
|
2167
|
+
fs.writeFileSync(`${this.tmpDir}${sep}${uuid}.jpg`, imageBuffer.toString("base64"), "base64");
|
|
2107
2168
|
const sendInstances = this.config.sendToInstance.replace(/ /g, "").split(",");
|
|
2108
2169
|
const sendUser = this.config.sendToUser.replace(/ /g, "").split(",");
|
|
2109
2170
|
|
|
2110
2171
|
for (const sendInstance of sendInstances) {
|
|
2111
|
-
if (
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2172
|
+
if (sendUser.length > 0) {
|
|
2173
|
+
for (const user of sendUser) {
|
|
2174
|
+
if (sendInstance.includes("pushover")) {
|
|
2175
|
+
await this.sendToAsync(sendInstance, { user: user, file: `${this.tmpDir}${sep}${uuid}.jpg`, title: "✉️Briefankündigung" });
|
|
2176
|
+
} else if (sendInstance.includes("signal-cmb")) {
|
|
2177
|
+
await this.sendToAsync(sendInstance, "send", {
|
|
2178
|
+
text: "✉️Briefankündigung",
|
|
2179
|
+
phone: user,
|
|
2180
|
+
});
|
|
2181
|
+
} else {
|
|
2116
2182
|
await this.sendToAsync(sendInstance, { user: user, text: "✉️Briefankündigung" });
|
|
2117
|
-
await this.sendToAsync(sendInstance, { user: user, text:
|
|
2183
|
+
await this.sendToAsync(sendInstance, { user: user, text: `${this.tmpDir}${sep}${uuid}.jpg` });
|
|
2118
2184
|
}
|
|
2185
|
+
}
|
|
2186
|
+
} else {
|
|
2187
|
+
if (sendInstance.includes("pushover")) {
|
|
2188
|
+
await this.sendToAsync(sendInstance, { file: `${this.tmpDir}${sep}${uuid}.jpg`, title: "✉️Briefankündigung" });
|
|
2189
|
+
} else if (sendInstance.includes("signal-cmb")) {
|
|
2190
|
+
await this.sendToAsync(sendInstance, "send", {
|
|
2191
|
+
text: "✉️Briefankündigung",
|
|
2192
|
+
});
|
|
2119
2193
|
} else {
|
|
2120
2194
|
await this.sendToAsync(sendInstance, "✉️Briefankündigung");
|
|
2121
|
-
await this.sendToAsync(sendInstance,
|
|
2195
|
+
await this.sendToAsync(sendInstance, `${this.tmpDir}${sep}${uuid}.jpg`);
|
|
2122
2196
|
}
|
|
2123
2197
|
}
|
|
2124
|
-
|
|
2198
|
+
}
|
|
2199
|
+
try {
|
|
2200
|
+
fs.unlinkSync(`${this.tmpDir}${sep}${uuid}.jpg`);
|
|
2201
|
+
} catch (error) {
|
|
2202
|
+
this.log.error(error);
|
|
2125
2203
|
}
|
|
2126
2204
|
}
|
|
2127
2205
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.parcel",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.16",
|
|
4
4
|
"description": "Parcel tracking",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "TA2k",
|
|
@@ -25,33 +25,33 @@
|
|
|
25
25
|
"url": "https://github.com/TA2k/ioBroker.parcel"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@applitools/jsdom": "^1.0.4",
|
|
29
28
|
"@iobroker/adapter-core": "^2.6.0",
|
|
30
|
-
"axios": "^0.
|
|
31
|
-
"http-cookie-agent": "^1.0.
|
|
29
|
+
"axios": "^0.27.2",
|
|
30
|
+
"http-cookie-agent": "^1.0.6",
|
|
31
|
+
"jsdom": "^19.0.0",
|
|
32
32
|
"json-bigint": "^1.0.0",
|
|
33
|
-
"qs": "^6.10.
|
|
33
|
+
"qs": "^6.10.5",
|
|
34
34
|
"tough-cookie": "^4.0.0",
|
|
35
35
|
"uuid": "^8.3.2"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@iobroker/testing": "^
|
|
39
|
-
"@types/chai": "^4.3.
|
|
38
|
+
"@iobroker/testing": "^3.0.2",
|
|
39
|
+
"@types/chai": "^4.3.1",
|
|
40
40
|
"@types/chai-as-promised": "^7.1.5",
|
|
41
41
|
"@types/gulp": "^4.0.9",
|
|
42
|
-
"@types/mocha": "^9.1.
|
|
43
|
-
"@types/node": "^
|
|
42
|
+
"@types/mocha": "^9.1.1",
|
|
43
|
+
"@types/node": "^18.0.0",
|
|
44
44
|
"@types/proxyquire": "^1.3.28",
|
|
45
45
|
"@types/sinon": "^10.0.11",
|
|
46
46
|
"@types/sinon-chai": "^3.2.8",
|
|
47
47
|
"chai": "^4.3.6",
|
|
48
48
|
"chai-as-promised": "^7.1.1",
|
|
49
|
-
"eslint": "^
|
|
50
|
-
"mocha": "^
|
|
49
|
+
"eslint": "^8.18.0",
|
|
50
|
+
"mocha": "^10.0.0",
|
|
51
51
|
"proxyquire": "^2.1.3",
|
|
52
|
-
"sinon": "^
|
|
52
|
+
"sinon": "^14.0.0",
|
|
53
53
|
"sinon-chai": "^3.7.0",
|
|
54
|
-
"typescript": "~4.
|
|
54
|
+
"typescript": "~4.7.4"
|
|
55
55
|
},
|
|
56
56
|
"main": "main.js",
|
|
57
57
|
"files": [
|