universal-parcel-scraper 0.76.0-main.934 → 0.78.0-main.939
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 +2 -2
- package/data/catalog.json +14 -3
- package/data/coverage-summary.json +1 -1
- package/data/detection-golden.json +17 -0
- package/dist/browser/scraper.js +33 -12
- package/dist/carriers/dpd-ie/adapter.d.ts +14 -0
- package/dist/carriers/dpd-ie/adapter.js +100 -0
- package/dist/carriers/dpd-ie/carrier.json +39 -7
- package/dist/carriers/dpd-ie/numbers.json +2 -2
- package/dist/carriers/dpd-ie/parser.d.ts +19 -0
- package/dist/carriers/dpd-ie/parser.js +198 -0
- package/dist/carriers/dpd-ie/status.d.ts +27 -0
- package/dist/carriers/dpd-ie/status.js +60 -0
- package/dist/carriers/dpd-ie/statuses.json +21 -1
- package/dist/carriers/omniva/adapter.d.ts +14 -0
- package/dist/carriers/omniva/adapter.js +60 -0
- package/dist/carriers/omniva/carrier.json +50 -7
- package/dist/carriers/omniva/numbers.json +9 -9
- package/dist/carriers/omniva/parser.d.ts +15 -0
- package/dist/carriers/omniva/parser.js +149 -0
- package/dist/carriers/omniva/status.d.ts +15 -0
- package/dist/carriers/omniva/status.js +164 -0
- package/dist/carriers/omniva/statuses.json +122 -1
- package/dist/carriers/venipak/adapter.d.ts +15 -0
- package/dist/carriers/venipak/adapter.js +63 -0
- package/dist/carriers/venipak/carrier.json +42 -7
- package/dist/carriers/venipak/numbers.json +10 -10
- package/dist/carriers/venipak/parser.d.ts +19 -0
- package/dist/carriers/venipak/parser.js +173 -0
- package/dist/carriers/venipak/status.d.ts +14 -0
- package/dist/carriers/venipak/status.js +34 -0
- package/dist/carriers/venipak/statuses.json +11 -1
- package/dist/core/catalog/statusMaps.js +7 -4
- package/dist/data/catalog.json +14 -3
- package/dist/generated/catalog.d.ts +13 -3
- package/dist/generated/catalog.js +15 -4
- package/dist/generated/recognition.js +3 -0
- package/dist/generated/registry.js +9 -3
- package/dist/server/openapi.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ The engine behind [Peek](https://peektracker.com) ([GitHub](https://github.com/p
|
|
|
13
13
|
[](LICENSE)
|
|
14
14
|
|
|
15
15
|
<!-- GENERATED:summary -->
|
|
16
|
-
**3,500+ carriers** through **
|
|
16
|
+
**3,500+ carriers** through **135 dedicated adapters** and **5 universal fallbacks**
|
|
17
17
|
|
|
18
18
|
<sub>207 catalog entries · 66 countries represented</sub>
|
|
19
19
|
<!-- /GENERATED:summary -->
|
|
@@ -155,7 +155,7 @@ createTracker({ providers: ['ParcelsApp', 'Ship24', '17TRACK', 'Postal Ninja', '
|
|
|
155
155
|
<!-- GENERATED:stages -->
|
|
156
156
|
<img src="docs/assets/stages.svg" alt="DHL: Die Sendung wurde in das Zustellfahrzeug geladen.; Mondial Relay: En cours de livraison; Correios Brazil: Objeto saiu para entrega ao destinatário; Correos Express: EN REPARTO; Yamato Transport: 配達中; La Poste / Colissimo: DISTOU. All are filed under out_for_delivery." width="760">
|
|
157
157
|
|
|
158
|
-
The carrier folders record 3,
|
|
158
|
+
The carrier folders record 3,852 such statuses, each filed under one stage.
|
|
159
159
|
<!-- /GENERATED:stages -->
|
|
160
160
|
|
|
161
161
|
Wording nobody recorded yet goes through a classifier that reads seven European languages.
|
package/data/catalog.json
CHANGED
|
@@ -5480,7 +5480,9 @@
|
|
|
5480
5480
|
"timezone": "Europe/Dublin",
|
|
5481
5481
|
"tracking": {
|
|
5482
5482
|
"mode": "automatic",
|
|
5483
|
-
"adapter": "
|
|
5483
|
+
"adapter": "dpd-ie",
|
|
5484
|
+
"recognitionRank": 62,
|
|
5485
|
+
"localClocks": true
|
|
5484
5486
|
},
|
|
5485
5487
|
"canaryUrl": "https://www.dpd.ie/tracking/",
|
|
5486
5488
|
"trackingUrlTemplate": "https://www.dpd.ie/tracking/?consignmentNumber={trackingNumber}",
|
|
@@ -7192,7 +7194,8 @@
|
|
|
7192
7194
|
"timezone": "Europe/Tallinn",
|
|
7193
7195
|
"tracking": {
|
|
7194
7196
|
"mode": "automatic",
|
|
7195
|
-
"adapter": "
|
|
7197
|
+
"adapter": "omniva",
|
|
7198
|
+
"recognitionRank": 64
|
|
7196
7199
|
},
|
|
7197
7200
|
"canaryUrl": "https://minu.omniva.ee/track",
|
|
7198
7201
|
"trackingUrlTemplate": "https://minu.omniva.ee/track/{trackingNumber}",
|
|
@@ -7228,6 +7231,12 @@
|
|
|
7228
7231
|
{
|
|
7229
7232
|
"pattern": "^JJEE[A-Z]{3}\\d{11}$",
|
|
7230
7233
|
"confidence": "high"
|
|
7234
|
+
},
|
|
7235
|
+
{
|
|
7236
|
+
"pattern": "^[A-Z]{2}\\d{9}EE$",
|
|
7237
|
+
"confidence": "low",
|
|
7238
|
+
"checksum": "s10",
|
|
7239
|
+
"preferred": true
|
|
7231
7240
|
}
|
|
7232
7241
|
]
|
|
7233
7242
|
},
|
|
@@ -8008,7 +8017,9 @@
|
|
|
8008
8017
|
"timezone": "Europe/Vilnius",
|
|
8009
8018
|
"tracking": {
|
|
8010
8019
|
"mode": "automatic",
|
|
8011
|
-
"adapter": "
|
|
8020
|
+
"adapter": "venipak",
|
|
8021
|
+
"recognitionRank": 63,
|
|
8022
|
+
"localClocks": true
|
|
8012
8023
|
},
|
|
8013
8024
|
"canaryUrl": "https://venipak.com/lt/en/parcel-tracking/",
|
|
8014
8025
|
"trackingUrlTemplate": "https://venipak.com/lt/en/tracking/track/{trackingNumber}",
|
|
@@ -25371,6 +25371,7 @@
|
|
|
25371
25371
|
"intl-post"
|
|
25372
25372
|
],
|
|
25373
25373
|
"asked": [
|
|
25374
|
+
"omniva",
|
|
25374
25375
|
"chronopost"
|
|
25375
25376
|
]
|
|
25376
25377
|
},
|
|
@@ -25382,6 +25383,7 @@
|
|
|
25382
25383
|
"intl-post"
|
|
25383
25384
|
],
|
|
25384
25385
|
"asked": [
|
|
25386
|
+
"omniva",
|
|
25385
25387
|
"chronopost"
|
|
25386
25388
|
]
|
|
25387
25389
|
},
|
|
@@ -25599,6 +25601,7 @@
|
|
|
25599
25601
|
"intl-post"
|
|
25600
25602
|
],
|
|
25601
25603
|
"asked": [
|
|
25604
|
+
"omniva",
|
|
25602
25605
|
"chronopost"
|
|
25603
25606
|
]
|
|
25604
25607
|
},
|
|
@@ -25634,6 +25637,7 @@
|
|
|
25634
25637
|
"intl-post"
|
|
25635
25638
|
],
|
|
25636
25639
|
"asked": [
|
|
25640
|
+
"omniva",
|
|
25637
25641
|
"chronopost"
|
|
25638
25642
|
]
|
|
25639
25643
|
},
|
|
@@ -25653,6 +25657,7 @@
|
|
|
25653
25657
|
"intl-post"
|
|
25654
25658
|
],
|
|
25655
25659
|
"asked": [
|
|
25660
|
+
"omniva",
|
|
25656
25661
|
"chronopost"
|
|
25657
25662
|
]
|
|
25658
25663
|
},
|
|
@@ -25683,6 +25688,7 @@
|
|
|
25683
25688
|
"intl-post"
|
|
25684
25689
|
],
|
|
25685
25690
|
"asked": [
|
|
25691
|
+
"omniva",
|
|
25686
25692
|
"chronopost"
|
|
25687
25693
|
]
|
|
25688
25694
|
},
|
|
@@ -26573,6 +26579,7 @@
|
|
|
26573
26579
|
"intl-post"
|
|
26574
26580
|
],
|
|
26575
26581
|
"asked": [
|
|
26582
|
+
"omniva",
|
|
26576
26583
|
"chronopost"
|
|
26577
26584
|
]
|
|
26578
26585
|
},
|
|
@@ -26724,6 +26731,7 @@
|
|
|
26724
26731
|
"intl-post"
|
|
26725
26732
|
],
|
|
26726
26733
|
"asked": [
|
|
26734
|
+
"omniva",
|
|
26727
26735
|
"chronopost"
|
|
26728
26736
|
]
|
|
26729
26737
|
},
|
|
@@ -30508,6 +30516,7 @@
|
|
|
30508
30516
|
"intl-post"
|
|
30509
30517
|
],
|
|
30510
30518
|
"asked": [
|
|
30519
|
+
"omniva",
|
|
30511
30520
|
"chronopost"
|
|
30512
30521
|
]
|
|
30513
30522
|
},
|
|
@@ -32984,6 +32993,7 @@
|
|
|
32984
32993
|
"intl-post"
|
|
32985
32994
|
],
|
|
32986
32995
|
"asked": [
|
|
32996
|
+
"omniva",
|
|
32987
32997
|
"chronopost"
|
|
32988
32998
|
]
|
|
32989
32999
|
},
|
|
@@ -33006,6 +33016,7 @@
|
|
|
33006
33016
|
"intl-post"
|
|
33007
33017
|
],
|
|
33008
33018
|
"asked": [
|
|
33019
|
+
"omniva",
|
|
33009
33020
|
"chronopost"
|
|
33010
33021
|
]
|
|
33011
33022
|
},
|
|
@@ -33017,6 +33028,7 @@
|
|
|
33017
33028
|
"intl-post"
|
|
33018
33029
|
],
|
|
33019
33030
|
"asked": [
|
|
33031
|
+
"omniva",
|
|
33020
33032
|
"chronopost"
|
|
33021
33033
|
]
|
|
33022
33034
|
},
|
|
@@ -33424,6 +33436,7 @@
|
|
|
33424
33436
|
"intl-post"
|
|
33425
33437
|
],
|
|
33426
33438
|
"asked": [
|
|
33439
|
+
"omniva",
|
|
33427
33440
|
"chronopost"
|
|
33428
33441
|
]
|
|
33429
33442
|
},
|
|
@@ -33435,6 +33448,7 @@
|
|
|
33435
33448
|
"intl-post"
|
|
33436
33449
|
],
|
|
33437
33450
|
"asked": [
|
|
33451
|
+
"omniva",
|
|
33438
33452
|
"chronopost"
|
|
33439
33453
|
]
|
|
33440
33454
|
},
|
|
@@ -33446,6 +33460,7 @@
|
|
|
33446
33460
|
"intl-post"
|
|
33447
33461
|
],
|
|
33448
33462
|
"asked": [
|
|
33463
|
+
"omniva",
|
|
33449
33464
|
"chronopost"
|
|
33450
33465
|
]
|
|
33451
33466
|
},
|
|
@@ -33457,6 +33472,7 @@
|
|
|
33457
33472
|
"intl-post"
|
|
33458
33473
|
],
|
|
33459
33474
|
"asked": [
|
|
33475
|
+
"omniva",
|
|
33460
33476
|
"chronopost"
|
|
33461
33477
|
]
|
|
33462
33478
|
},
|
|
@@ -33468,6 +33484,7 @@
|
|
|
33468
33484
|
"intl-post"
|
|
33469
33485
|
],
|
|
33470
33486
|
"asked": [
|
|
33487
|
+
"omniva",
|
|
33471
33488
|
"chronopost"
|
|
33472
33489
|
]
|
|
33473
33490
|
},
|
package/dist/browser/scraper.js
CHANGED
|
@@ -4443,7 +4443,9 @@ var ye = {
|
|
|
4443
4443
|
timezone: "Europe/Dublin",
|
|
4444
4444
|
tracking: {
|
|
4445
4445
|
mode: "automatic",
|
|
4446
|
-
adapter: "
|
|
4446
|
+
adapter: "dpd-ie",
|
|
4447
|
+
recognitionRank: 62,
|
|
4448
|
+
localClocks: !0
|
|
4447
4449
|
},
|
|
4448
4450
|
canaryUrl: "https://www.dpd.ie/tracking/",
|
|
4449
4451
|
trackingUrlTemplate: "https://www.dpd.ie/tracking/?consignmentNumber={trackingNumber}",
|
|
@@ -5713,7 +5715,8 @@ var ye = {
|
|
|
5713
5715
|
timezone: "Europe/Tallinn",
|
|
5714
5716
|
tracking: {
|
|
5715
5717
|
mode: "automatic",
|
|
5716
|
-
adapter: "
|
|
5718
|
+
adapter: "omniva",
|
|
5719
|
+
recognitionRank: 64
|
|
5717
5720
|
},
|
|
5718
5721
|
canaryUrl: "https://minu.omniva.ee/track",
|
|
5719
5722
|
trackingUrlTemplate: "https://minu.omniva.ee/track/{trackingNumber}",
|
|
@@ -5733,13 +5736,22 @@ var ye = {
|
|
|
5733
5736
|
pathPattern: "^/(?:era/jalgimine|abi/jalgimine|verslo/siuntos_sekimas)/?$",
|
|
5734
5737
|
params: ["barcode"]
|
|
5735
5738
|
}],
|
|
5736
|
-
detectionRules: [
|
|
5737
|
-
|
|
5738
|
-
|
|
5739
|
-
|
|
5740
|
-
|
|
5741
|
-
|
|
5742
|
-
|
|
5739
|
+
detectionRules: [
|
|
5740
|
+
{
|
|
5741
|
+
pattern: "^JJEE\\d{17}$",
|
|
5742
|
+
confidence: "high"
|
|
5743
|
+
},
|
|
5744
|
+
{
|
|
5745
|
+
pattern: "^JJEE[A-Z]{3}\\d{11}$",
|
|
5746
|
+
confidence: "high"
|
|
5747
|
+
},
|
|
5748
|
+
{
|
|
5749
|
+
pattern: "^[A-Z]{2}\\d{9}EE$",
|
|
5750
|
+
confidence: "low",
|
|
5751
|
+
checksum: "s10",
|
|
5752
|
+
preferred: !0
|
|
5753
|
+
}
|
|
5754
|
+
]
|
|
5743
5755
|
},
|
|
5744
5756
|
"orlen-paczka": {
|
|
5745
5757
|
displayName: "ORLEN Paczka",
|
|
@@ -6320,7 +6332,9 @@ var ye = {
|
|
|
6320
6332
|
timezone: "Europe/Vilnius",
|
|
6321
6333
|
tracking: {
|
|
6322
6334
|
mode: "automatic",
|
|
6323
|
-
adapter: "
|
|
6335
|
+
adapter: "venipak",
|
|
6336
|
+
recognitionRank: 63,
|
|
6337
|
+
localClocks: !0
|
|
6324
6338
|
},
|
|
6325
6339
|
canaryUrl: "https://venipak.com/lt/en/parcel-tracking/",
|
|
6326
6340
|
trackingUrlTemplate: "https://venipak.com/lt/en/tracking/track/{trackingNumber}",
|
|
@@ -6972,7 +6986,11 @@ var ye = {
|
|
|
6972
6986
|
nationex: [],
|
|
6973
6987
|
"nova-poshta": ["nova-poshta-domestic"],
|
|
6974
6988
|
omgo: ["omgo-1"],
|
|
6975
|
-
omniva: [
|
|
6989
|
+
omniva: [
|
|
6990
|
+
"omniva-1",
|
|
6991
|
+
"omniva-2",
|
|
6992
|
+
"omniva-s10"
|
|
6993
|
+
],
|
|
6976
6994
|
"orlen-paczka": ["orlen-paczka-1"],
|
|
6977
6995
|
"osm-worldwide": ["osm-worldwide-1"],
|
|
6978
6996
|
paquetexpress: [],
|
|
@@ -11710,6 +11728,7 @@ var _c = {
|
|
|
11710
11728
|
"dhl-express": 75,
|
|
11711
11729
|
dpd: 70,
|
|
11712
11730
|
"dpd-de": 65,
|
|
11731
|
+
"dpd-ie": 62,
|
|
11713
11732
|
"dpd-pl": 8,
|
|
11714
11733
|
econt: 56,
|
|
11715
11734
|
elta: 55,
|
|
@@ -11733,6 +11752,7 @@ var _c = {
|
|
|
11733
11752
|
"ninja-van": 28,
|
|
11734
11753
|
"nz-post": 32,
|
|
11735
11754
|
omgo: 1,
|
|
11755
|
+
omniva: 64,
|
|
11736
11756
|
ontrac: 21,
|
|
11737
11757
|
"orlen-paczka": 49,
|
|
11738
11758
|
"poczta-polska": 31,
|
|
@@ -11751,7 +11771,8 @@ var _c = {
|
|
|
11751
11771
|
tipsa: 24,
|
|
11752
11772
|
tnt: 44,
|
|
11753
11773
|
ukrposhta: 5,
|
|
11754
|
-
uniuni: 33
|
|
11774
|
+
uniuni: 33,
|
|
11775
|
+
venipak: 63
|
|
11755
11776
|
}, vc = 5;
|
|
11756
11777
|
function yc(e) {
|
|
11757
11778
|
let t = y(e);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type AdapterFactory, type TrackingContext } from '../../core/adapter/index.js';
|
|
2
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
3
|
+
import { type StepRecorder } from '../../core/telemetry/index.js';
|
|
4
|
+
export declare class DpdIeTracker {
|
|
5
|
+
private readonly options;
|
|
6
|
+
constructor(options?: {
|
|
7
|
+
fetcher?: typeof fetch;
|
|
8
|
+
recorder?: StepRecorder;
|
|
9
|
+
userAgent?: string;
|
|
10
|
+
});
|
|
11
|
+
fetch(raw: string, context?: TrackingContext): Promise<CarrierResult>;
|
|
12
|
+
private lookup;
|
|
13
|
+
}
|
|
14
|
+
export declare const adapter: AdapterFactory;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { accepted, recognizeFromLookup } from '../../core/adapter/index.js';
|
|
2
|
+
import { BudgetExceededError, ChallengeError, IndeterminateError, SchemaError } from '../../core/errors/index.js';
|
|
3
|
+
import { runSteps } from '../../core/runner/index.js';
|
|
4
|
+
import { firstAttemptMs, networkRetryStep } from '../../core/runner/networkRetry.js';
|
|
5
|
+
import { NOOP_RECORDER } from '../../core/telemetry/index.js';
|
|
6
|
+
import { decodeText, fetchBounded, userAgentOf } from '../../core/transport/index.js';
|
|
7
|
+
import { isDpdIeChallenge, normalizeDpdIeNumber, parseDpdIe, parseDpdIeAbsence, PROVIDER } from './parser.js';
|
|
8
|
+
// The tracker www.dpd.ie/tracking/ shows in a frame, with the frame's device type.
|
|
9
|
+
const ORIGIN = 'https://tracking.dpd.ie';
|
|
10
|
+
const RESULT = '/Home/SearchResult?deviceType=5';
|
|
11
|
+
// Where the tracker sends a consignment it does not have.
|
|
12
|
+
const ABSENT = '/Custom500.html?aspxerrorpath=/Home/SearchResult';
|
|
13
|
+
// The result page is about 10 kB.
|
|
14
|
+
const MAX_BYTES = 512 * 1024;
|
|
15
|
+
const REDIRECTS = [301, 302, 303, 307, 308];
|
|
16
|
+
const COOKIE = /^(ASP\.NET_SessionId|__cf_bm)=([A-Za-z0-9._~:=+/-]{1,512})(?:;|$)/;
|
|
17
|
+
/** The anonymous session the search opens; the result page reads the consignment from it. */
|
|
18
|
+
function sessionCookie(response) {
|
|
19
|
+
const cookies = new Map();
|
|
20
|
+
for (const header of response.headers.getSetCookie()) {
|
|
21
|
+
const match = COOKIE.exec(header);
|
|
22
|
+
if (match)
|
|
23
|
+
cookies.set(match[1], `${match[1]}=${match[2]}`);
|
|
24
|
+
}
|
|
25
|
+
return cookies.has('ASP.NET_SessionId') ? [...cookies.values()].join('; ') : null;
|
|
26
|
+
}
|
|
27
|
+
/** A redirect's target on the tracker's own host, as a path with its query, or null. */
|
|
28
|
+
function redirectPath(response) {
|
|
29
|
+
const location = response.headers.get('location');
|
|
30
|
+
if (!location)
|
|
31
|
+
return null;
|
|
32
|
+
try {
|
|
33
|
+
const target = new URL(location, `${ORIGIN}/`);
|
|
34
|
+
return target.origin === ORIGIN ? target.pathname + target.search : null;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class DpdIeTracker {
|
|
41
|
+
options;
|
|
42
|
+
constructor(options = {}) {
|
|
43
|
+
this.options = options;
|
|
44
|
+
}
|
|
45
|
+
async fetch(raw, context = {}) {
|
|
46
|
+
const number = normalizeDpdIeNumber(raw);
|
|
47
|
+
const budgetMs = context.budgetMs ?? 15_000;
|
|
48
|
+
// A request that fails to reach DPD Ireland, or hangs, gets one more try
|
|
49
|
+
// with a new session: the first gets half of the budget.
|
|
50
|
+
return runSteps({ carrier: 'dpd-ie', budgetMs, signal: context.signal, recorder: this.options.recorder ?? NOOP_RECORDER }, [
|
|
51
|
+
{ id: 'direct', run: ({ signal, remainingMs }) => this.lookup(number, signal, firstAttemptMs(remainingMs), budgetMs) },
|
|
52
|
+
networkRetryStep(({ signal, remainingMs }) => this.lookup(number, signal, remainingMs, budgetMs)),
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
async lookup(number, signal, timeoutMs, budgetMs) {
|
|
56
|
+
const deadline = performance.now() + timeoutMs;
|
|
57
|
+
const userAgent = userAgentOf(this.options.userAgent);
|
|
58
|
+
const read = async (path, cookie) => {
|
|
59
|
+
const left = deadline - performance.now();
|
|
60
|
+
if (left <= 0)
|
|
61
|
+
throw new BudgetExceededError(PROVIDER, budgetMs);
|
|
62
|
+
signal.throwIfAborted();
|
|
63
|
+
const { response, bytes } = await fetchBounded(`${ORIGIN}${path}`, { signal, headers: {
|
|
64
|
+
'User-Agent': userAgent, Accept: 'text/html', ...(cookie ? { Cookie: cookie } : {}),
|
|
65
|
+
} }, { provider: PROVIDER, timeoutMs: Math.max(1, Math.floor(left)), maxBytes: MAX_BYTES, redirect: 'manual',
|
|
66
|
+
allowHttpStatuses: [...REDIRECTS, 404, 410], fetcher: this.options.fetcher });
|
|
67
|
+
signal.throwIfAborted();
|
|
68
|
+
// A missing page says nothing about the consignment.
|
|
69
|
+
if (response.status === 404 || response.status === 410)
|
|
70
|
+
throw new IndeterminateError(PROVIDER, 'DPD Ireland tracking is unavailable');
|
|
71
|
+
return { response, html: decodeText(bytes) };
|
|
72
|
+
};
|
|
73
|
+
// The search stores the number in a new session and sends the browser to the result page.
|
|
74
|
+
const search = await read(`/?${new URLSearchParams({ deviceType: '5', consignmentNumber: number })}`);
|
|
75
|
+
if (!REDIRECTS.includes(search.response.status)) {
|
|
76
|
+
if (isDpdIeChallenge(search.html))
|
|
77
|
+
throw new ChallengeError(PROVIDER, 'DPD Ireland asked for a browser check');
|
|
78
|
+
throw new SchemaError(PROVIDER, 'DPD Ireland did not accept the consignment number');
|
|
79
|
+
}
|
|
80
|
+
const cookie = sessionCookie(search.response);
|
|
81
|
+
if (redirectPath(search.response) !== RESULT || !cookie) {
|
|
82
|
+
throw new IndeterminateError(PROVIDER, 'DPD Ireland did not open a tracking session');
|
|
83
|
+
}
|
|
84
|
+
const result = await read(RESULT, cookie);
|
|
85
|
+
if (REDIRECTS.includes(result.response.status)) {
|
|
86
|
+
if (redirectPath(result.response) !== ABSENT)
|
|
87
|
+
throw new IndeterminateError(PROVIDER, 'DPD Ireland did not keep the tracking session');
|
|
88
|
+
return parseDpdIeAbsence((await read(ABSENT)).html);
|
|
89
|
+
}
|
|
90
|
+
return parseDpdIe(result.html, number);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export const adapter = environment => {
|
|
94
|
+
const tracker = new DpdIeTracker({ fetcher: environment.fetcher, recorder: environment.recorder, userAgent: environment.userAgent });
|
|
95
|
+
return {
|
|
96
|
+
id: 'dpd-ie', recordsSteps: true, steps: ['direct', 'retry'],
|
|
97
|
+
track: (input, context) => tracker.fetch(input.number, context),
|
|
98
|
+
recognize: (number, context) => recognizeFromLookup(() => tracker.fetch(number, context), () => accepted(() => normalizeDpdIeNumber(number))),
|
|
99
|
+
};
|
|
100
|
+
};
|
|
@@ -16,18 +16,50 @@
|
|
|
16
16
|
"timezone": "Europe/Dublin",
|
|
17
17
|
"tracking": {
|
|
18
18
|
"mode": "automatic",
|
|
19
|
-
"adapter": "
|
|
20
|
-
"steps": [
|
|
19
|
+
"adapter": "dpd-ie",
|
|
20
|
+
"steps": [
|
|
21
|
+
"direct",
|
|
22
|
+
"retry"
|
|
23
|
+
],
|
|
24
|
+
"recognition": {
|
|
25
|
+
"rank": 62
|
|
26
|
+
},
|
|
27
|
+
"localClocks": true
|
|
21
28
|
},
|
|
22
|
-
"capabilities": [
|
|
29
|
+
"capabilities": [
|
|
30
|
+
"history",
|
|
31
|
+
"location",
|
|
32
|
+
"eta",
|
|
33
|
+
"delivered_at"
|
|
34
|
+
],
|
|
23
35
|
"portal": {
|
|
24
36
|
"url": "https://www.dpd.ie/tracking/?consignmentNumber={trackingNumber}",
|
|
25
37
|
"searchUrl": "https://www.dpd.ie/tracking/",
|
|
26
38
|
"canaryUrl": "https://www.dpd.ie/tracking/",
|
|
27
|
-
"shows": [
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
39
|
+
"shows": [
|
|
40
|
+
"status",
|
|
41
|
+
"history",
|
|
42
|
+
"location",
|
|
43
|
+
"eta",
|
|
44
|
+
"eta_window",
|
|
45
|
+
"parcel_count"
|
|
46
|
+
],
|
|
47
|
+
"scraped": [
|
|
48
|
+
"status",
|
|
49
|
+
"history",
|
|
50
|
+
"location",
|
|
51
|
+
"eta",
|
|
52
|
+
"eta_window",
|
|
53
|
+
"delivered_at"
|
|
54
|
+
],
|
|
55
|
+
"discarded": [
|
|
56
|
+
"parcel_count"
|
|
57
|
+
],
|
|
58
|
+
"unavailable": [
|
|
59
|
+
"weight",
|
|
60
|
+
"sender_name",
|
|
61
|
+
"offset_timestamps"
|
|
62
|
+
]
|
|
31
63
|
},
|
|
32
64
|
"links": [
|
|
33
65
|
{
|
|
@@ -244,13 +244,13 @@
|
|
|
244
244
|
"access": "indexed_excerpt"
|
|
245
245
|
},
|
|
246
246
|
"context": {
|
|
247
|
-
"assessment": "
|
|
247
|
+
"assessment": "confirmed"
|
|
248
248
|
},
|
|
249
249
|
"expect": {
|
|
250
250
|
"carrier": "unknown",
|
|
251
251
|
"confidence": "none"
|
|
252
252
|
},
|
|
253
|
-
"note": "Looked up on DPD Ireland's own tracker, as an archived address shows
|
|
253
|
+
"note": "Looked up on DPD Ireland's own tracker, as an archived address shows. DPD Ireland's tracker returns its history."
|
|
254
254
|
}
|
|
255
255
|
]
|
|
256
256
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
2
|
+
export declare const PROVIDER = "DPD Ireland";
|
|
3
|
+
export declare const DPD_IE_ZONE = "Europe/Dublin";
|
|
4
|
+
/** A DPD Ireland consignment number: nine or ten digits. */
|
|
5
|
+
export declare function normalizeDpdIeNumber(raw: string): string;
|
|
6
|
+
/** Cloudflare's challenge page in place of the tracker. Its passive script on ordinary pages is not one. */
|
|
7
|
+
export declare function isDpdIeChallenge(html: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* The page the tracker sends an unknown consignment to. A redirect to it is
|
|
10
|
+
* the tracker's only answer for a number it does not have, so its notice must
|
|
11
|
+
* be the not-found one.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseDpdIeAbsence(html: string): never;
|
|
14
|
+
/**
|
|
15
|
+
* The tracker's result for one consignment: its scans, oldest first, and a
|
|
16
|
+
* headline with the current status. A consignment of several parcels repeats
|
|
17
|
+
* each scan once per parcel.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseDpdIe(html: string, raw: string): CarrierResult;
|