universal-parcel-scraper 0.93.0-main.987 → 0.94.0-main.990
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 +21 -8
- package/dist/browser/scraper.js +15 -4
- package/dist/carriers/slovak-parcel-service/adapter.d.ts +14 -0
- package/dist/carriers/slovak-parcel-service/adapter.js +78 -0
- package/dist/carriers/slovak-parcel-service/carrier.json +48 -7
- package/dist/carriers/slovak-parcel-service/numbers.json +12 -12
- package/dist/carriers/slovak-parcel-service/parser.d.ts +36 -0
- package/dist/carriers/slovak-parcel-service/parser.js +218 -0
- package/dist/carriers/slovak-parcel-service/status.d.ts +7 -0
- package/dist/carriers/slovak-parcel-service/status.js +16 -0
- package/dist/carriers/slovak-parcel-service/statuses.json +15 -1
- package/dist/carriers/slovenska-posta/adapter.d.ts +15 -0
- package/dist/carriers/slovenska-posta/adapter.js +65 -0
- package/dist/carriers/slovenska-posta/carrier.json +70 -8
- package/dist/carriers/slovenska-posta/parser.d.ts +12 -0
- package/dist/carriers/slovenska-posta/parser.js +246 -0
- package/dist/carriers/slovenska-posta/status.d.ts +17 -0
- package/dist/carriers/slovenska-posta/status.js +240 -0
- package/dist/carriers/slovenska-posta/statuses.json +151 -1
- package/dist/core/catalog/statusMaps.js +7 -5
- package/dist/data/catalog.json +14 -3
- package/dist/generated/catalog.d.ts +12 -3
- package/dist/generated/catalog.js +15 -4
- package/dist/generated/recognition.js +2 -0
- package/dist/generated/registry.js +6 -2
- 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 **153 dedicated adapters** and **5 universal fallbacks**
|
|
17
17
|
|
|
18
18
|
<sub>208 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 4,
|
|
158
|
+
The carrier folders record 4,279 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
|
@@ -7916,7 +7916,9 @@
|
|
|
7916
7916
|
"timezone": "Europe/Bratislava",
|
|
7917
7917
|
"tracking": {
|
|
7918
7918
|
"mode": "automatic",
|
|
7919
|
-
"adapter": "
|
|
7919
|
+
"adapter": "slovak-parcel-service",
|
|
7920
|
+
"recognitionRank": 830,
|
|
7921
|
+
"localClocks": true
|
|
7920
7922
|
},
|
|
7921
7923
|
"canaryUrl": "https://www.sps-sro.sk/moja-zasielka/",
|
|
7922
7924
|
"trackingUrlTemplate": "https://www.sps-sro.sk/moja-zasielka/?shipment_id={trackingNumber}",
|
|
@@ -7953,7 +7955,9 @@
|
|
|
7953
7955
|
"timezone": "Europe/Bratislava",
|
|
7954
7956
|
"tracking": {
|
|
7955
7957
|
"mode": "automatic",
|
|
7956
|
-
"adapter": "
|
|
7958
|
+
"adapter": "slovenska-posta",
|
|
7959
|
+
"recognitionRank": 840,
|
|
7960
|
+
"localClocks": true
|
|
7957
7961
|
},
|
|
7958
7962
|
"canaryUrl": "https://www.posta.sk/sledovanie-zasielok",
|
|
7959
7963
|
"trackingUrlTemplate": "https://www.posta.sk/sledovanie-zasielok#parcel={trackingNumber}",
|
|
@@ -7982,7 +7986,14 @@
|
|
|
7982
7986
|
]
|
|
7983
7987
|
}
|
|
7984
7988
|
],
|
|
7985
|
-
"detectionRules": [
|
|
7989
|
+
"detectionRules": [
|
|
7990
|
+
{
|
|
7991
|
+
"pattern": "^[A-Z]{2}\\d{9}SK$",
|
|
7992
|
+
"confidence": "low",
|
|
7993
|
+
"checksum": "s10",
|
|
7994
|
+
"preferred": true
|
|
7995
|
+
}
|
|
7996
|
+
]
|
|
7986
7997
|
},
|
|
7987
7998
|
"speedpak": {
|
|
7988
7999
|
"displayName": "SpeedPAK",
|
|
@@ -19948,10 +19948,10 @@
|
|
|
19948
19948
|
],
|
|
19949
19949
|
"asked": [
|
|
19950
19950
|
"hermes-de",
|
|
19951
|
+
"slovak-parcel-service",
|
|
19951
19952
|
"dpd",
|
|
19952
19953
|
"dpd-de",
|
|
19953
|
-
"seur"
|
|
19954
|
-
"brt"
|
|
19954
|
+
"seur"
|
|
19955
19955
|
]
|
|
19956
19956
|
},
|
|
19957
19957
|
{
|
|
@@ -19989,11 +19989,11 @@
|
|
|
19989
19989
|
"slovak-parcel-service"
|
|
19990
19990
|
],
|
|
19991
19991
|
"asked": [
|
|
19992
|
+
"slovak-parcel-service",
|
|
19992
19993
|
"dpd",
|
|
19993
19994
|
"dpd-de",
|
|
19994
19995
|
"seur",
|
|
19995
|
-
"brt"
|
|
19996
|
-
"relais-colis"
|
|
19996
|
+
"brt"
|
|
19997
19997
|
]
|
|
19998
19998
|
},
|
|
19999
19999
|
{
|
|
@@ -20015,10 +20015,10 @@
|
|
|
20015
20015
|
],
|
|
20016
20016
|
"asked": [
|
|
20017
20017
|
"hermes-de",
|
|
20018
|
+
"slovak-parcel-service",
|
|
20018
20019
|
"dpd",
|
|
20019
20020
|
"dpd-de",
|
|
20020
|
-
"seur"
|
|
20021
|
-
"brt"
|
|
20021
|
+
"seur"
|
|
20022
20022
|
]
|
|
20023
20023
|
},
|
|
20024
20024
|
{
|
|
@@ -20038,11 +20038,11 @@
|
|
|
20038
20038
|
"slovak-parcel-service"
|
|
20039
20039
|
],
|
|
20040
20040
|
"asked": [
|
|
20041
|
+
"slovak-parcel-service",
|
|
20041
20042
|
"dpd",
|
|
20042
20043
|
"dpd-de",
|
|
20043
20044
|
"seur",
|
|
20044
|
-
"brt"
|
|
20045
|
-
"relais-colis"
|
|
20045
|
+
"brt"
|
|
20046
20046
|
]
|
|
20047
20047
|
},
|
|
20048
20048
|
{
|
|
@@ -25176,6 +25176,7 @@
|
|
|
25176
25176
|
"intl-post"
|
|
25177
25177
|
],
|
|
25178
25178
|
"asked": [
|
|
25179
|
+
"slovenska-posta",
|
|
25179
25180
|
"chronopost"
|
|
25180
25181
|
]
|
|
25181
25182
|
},
|
|
@@ -25390,6 +25391,7 @@
|
|
|
25390
25391
|
"intl-post"
|
|
25391
25392
|
],
|
|
25392
25393
|
"asked": [
|
|
25394
|
+
"slovenska-posta",
|
|
25393
25395
|
"chronopost"
|
|
25394
25396
|
]
|
|
25395
25397
|
},
|
|
@@ -26769,6 +26771,7 @@
|
|
|
26769
26771
|
"intl-post"
|
|
26770
26772
|
],
|
|
26771
26773
|
"asked": [
|
|
26774
|
+
"slovenska-posta",
|
|
26772
26775
|
"chronopost"
|
|
26773
26776
|
]
|
|
26774
26777
|
},
|
|
@@ -26884,6 +26887,7 @@
|
|
|
26884
26887
|
"intl-post"
|
|
26885
26888
|
],
|
|
26886
26889
|
"asked": [
|
|
26890
|
+
"slovenska-posta",
|
|
26887
26891
|
"chronopost"
|
|
26888
26892
|
]
|
|
26889
26893
|
},
|
|
@@ -26986,6 +26990,7 @@
|
|
|
26986
26990
|
"intl-post"
|
|
26987
26991
|
],
|
|
26988
26992
|
"asked": [
|
|
26993
|
+
"slovenska-posta",
|
|
26989
26994
|
"chronopost"
|
|
26990
26995
|
]
|
|
26991
26996
|
},
|
|
@@ -27521,6 +27526,7 @@
|
|
|
27521
27526
|
"intl-post"
|
|
27522
27527
|
],
|
|
27523
27528
|
"asked": [
|
|
27529
|
+
"slovenska-posta",
|
|
27524
27530
|
"chronopost"
|
|
27525
27531
|
]
|
|
27526
27532
|
},
|
|
@@ -27532,6 +27538,7 @@
|
|
|
27532
27538
|
"intl-post"
|
|
27533
27539
|
],
|
|
27534
27540
|
"asked": [
|
|
27541
|
+
"slovenska-posta",
|
|
27535
27542
|
"chronopost"
|
|
27536
27543
|
]
|
|
27537
27544
|
},
|
|
@@ -27638,6 +27645,7 @@
|
|
|
27638
27645
|
"intl-post"
|
|
27639
27646
|
],
|
|
27640
27647
|
"asked": [
|
|
27648
|
+
"slovenska-posta",
|
|
27641
27649
|
"chronopost"
|
|
27642
27650
|
]
|
|
27643
27651
|
},
|
|
@@ -30811,6 +30819,7 @@
|
|
|
30811
30819
|
"intl-post"
|
|
30812
30820
|
],
|
|
30813
30821
|
"asked": [
|
|
30822
|
+
"slovenska-posta",
|
|
30814
30823
|
"chronopost"
|
|
30815
30824
|
]
|
|
30816
30825
|
},
|
|
@@ -30822,6 +30831,7 @@
|
|
|
30822
30831
|
"intl-post"
|
|
30823
30832
|
],
|
|
30824
30833
|
"asked": [
|
|
30834
|
+
"slovenska-posta",
|
|
30825
30835
|
"chronopost"
|
|
30826
30836
|
]
|
|
30827
30837
|
},
|
|
@@ -33590,6 +33600,7 @@
|
|
|
33590
33600
|
"intl-post"
|
|
33591
33601
|
],
|
|
33592
33602
|
"asked": [
|
|
33603
|
+
"slovenska-posta",
|
|
33593
33604
|
"chronopost"
|
|
33594
33605
|
]
|
|
33595
33606
|
},
|
|
@@ -33645,6 +33656,7 @@
|
|
|
33645
33656
|
"intl-post"
|
|
33646
33657
|
],
|
|
33647
33658
|
"asked": [
|
|
33659
|
+
"slovenska-posta",
|
|
33648
33660
|
"chronopost"
|
|
33649
33661
|
]
|
|
33650
33662
|
},
|
|
@@ -33975,6 +33987,7 @@
|
|
|
33975
33987
|
"intl-post"
|
|
33976
33988
|
],
|
|
33977
33989
|
"asked": [
|
|
33990
|
+
"slovenska-posta",
|
|
33978
33991
|
"chronopost"
|
|
33979
33992
|
]
|
|
33980
33993
|
},
|
package/dist/browser/scraper.js
CHANGED
|
@@ -6274,7 +6274,9 @@ var be = {
|
|
|
6274
6274
|
timezone: "Europe/Bratislava",
|
|
6275
6275
|
tracking: {
|
|
6276
6276
|
mode: "automatic",
|
|
6277
|
-
adapter: "
|
|
6277
|
+
adapter: "slovak-parcel-service",
|
|
6278
|
+
recognitionRank: 830,
|
|
6279
|
+
localClocks: !0
|
|
6278
6280
|
},
|
|
6279
6281
|
canaryUrl: "https://www.sps-sro.sk/moja-zasielka/",
|
|
6280
6282
|
trackingUrlTemplate: "https://www.sps-sro.sk/moja-zasielka/?shipment_id={trackingNumber}",
|
|
@@ -6298,7 +6300,9 @@ var be = {
|
|
|
6298
6300
|
timezone: "Europe/Bratislava",
|
|
6299
6301
|
tracking: {
|
|
6300
6302
|
mode: "automatic",
|
|
6301
|
-
adapter: "
|
|
6303
|
+
adapter: "slovenska-posta",
|
|
6304
|
+
recognitionRank: 840,
|
|
6305
|
+
localClocks: !0
|
|
6302
6306
|
},
|
|
6303
6307
|
canaryUrl: "https://www.posta.sk/sledovanie-zasielok",
|
|
6304
6308
|
trackingUrlTemplate: "https://www.posta.sk/sledovanie-zasielok#parcel={trackingNumber}",
|
|
@@ -6319,7 +6323,12 @@ var be = {
|
|
|
6319
6323
|
params: ["q"]
|
|
6320
6324
|
}
|
|
6321
6325
|
],
|
|
6322
|
-
detectionRules: [
|
|
6326
|
+
detectionRules: [{
|
|
6327
|
+
pattern: "^[A-Z]{2}\\d{9}SK$",
|
|
6328
|
+
confidence: "low",
|
|
6329
|
+
checksum: "s10",
|
|
6330
|
+
preferred: !0
|
|
6331
|
+
}]
|
|
6323
6332
|
},
|
|
6324
6333
|
speedpak: {
|
|
6325
6334
|
displayName: "SpeedPAK",
|
|
@@ -7184,7 +7193,7 @@ var be = {
|
|
|
7184
7193
|
saia: [],
|
|
7185
7194
|
sameday: ["sameday-1"],
|
|
7186
7195
|
"slovak-parcel-service": ["slovak-parcel-service-1"],
|
|
7187
|
-
"slovenska-posta": [],
|
|
7196
|
+
"slovenska-posta": ["slovenska-posta-s10"],
|
|
7188
7197
|
speedpak: ["speedpak-1"],
|
|
7189
7198
|
speedy: [],
|
|
7190
7199
|
"spx-ph": [
|
|
@@ -11965,6 +11974,8 @@ var bc = {
|
|
|
11965
11974
|
"relais-colis": 250,
|
|
11966
11975
|
sameday: 530,
|
|
11967
11976
|
seur: 430,
|
|
11977
|
+
"slovak-parcel-service": 830,
|
|
11978
|
+
"slovenska-posta": 840,
|
|
11968
11979
|
speedy: 540,
|
|
11969
11980
|
sto: 100,
|
|
11970
11981
|
"swiss-post-cargo": 110,
|
|
@@ -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 const SPS_API = "https://backend.sps-sro.sk/api/tracking/";
|
|
5
|
+
export declare class SlovakParcelServiceTracker {
|
|
6
|
+
private readonly options;
|
|
7
|
+
constructor(options?: {
|
|
8
|
+
fetcher?: typeof fetch;
|
|
9
|
+
recorder?: StepRecorder;
|
|
10
|
+
userAgent?: string;
|
|
11
|
+
});
|
|
12
|
+
fetch(raw: string, context?: TrackingContext): Promise<CarrierResult>;
|
|
13
|
+
}
|
|
14
|
+
export declare const adapter: AdapterFactory;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { accepted, recognizeFromLookup } from '../../core/adapter/index.js';
|
|
2
|
+
import { 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 { isRecord } from '../../core/types.js';
|
|
8
|
+
import { normalizeSpsNumber, parseSpsParcelStatus, parseSpsSearch, parseSpsShipment, SPS, SPS_MAX_BYTES, spsParcelStatusTarget, } from './parser.js';
|
|
9
|
+
// The service the tracking page (www.sps-sro.sk/moja-zasielka) calls from the visitor's browser.
|
|
10
|
+
export const SPS_API = 'https://backend.sps-sro.sk/api/tracking/';
|
|
11
|
+
export class SlovakParcelServiceTracker {
|
|
12
|
+
options;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.options = options;
|
|
15
|
+
}
|
|
16
|
+
async fetch(raw, context = {}) {
|
|
17
|
+
const number = normalizeSpsNumber(raw);
|
|
18
|
+
const get = async (path, signal, deadline, allowHttpStatuses) => {
|
|
19
|
+
// The service words its notices and scans in Slovak, the language its not-found notice is pinned in.
|
|
20
|
+
const { response, bytes } = await fetchBounded(`${SPS_API}${path}`, { signal, headers: {
|
|
21
|
+
Accept: 'application/json', 'Accept-Language': 'sk', 'User-Agent': userAgentOf(this.options.userAgent),
|
|
22
|
+
} }, { provider: SPS, timeoutMs: Math.max(1, Math.floor(deadline - Date.now())), maxBytes: SPS_MAX_BYTES,
|
|
23
|
+
allowHttpStatuses, fetcher: this.options.fetcher });
|
|
24
|
+
const text = decodeText(bytes);
|
|
25
|
+
try {
|
|
26
|
+
return { status: response.status, payload: JSON.parse(text) };
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
// A gateway's own error page, or a page for a route that moved, says nothing about the parcel.
|
|
30
|
+
if (response.status !== 200)
|
|
31
|
+
throw new IndeterminateError(SPS, `Slovak Parcel Service returned HTTP ${response.status} without its error reply`, { cause: error });
|
|
32
|
+
if (/<(?:!doctype|html|head|body)\b/i.test(text))
|
|
33
|
+
throw new ChallengeError(SPS, 'Slovak Parcel Service answered with a web page instead of its tracking reply', { cause: error });
|
|
34
|
+
throw new SchemaError(SPS, 'Slovak Parcel Service returned a reply that is not JSON', { cause: error });
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const read = async (signal, timeoutMs) => {
|
|
38
|
+
// The shipment, the search and the parcel's own scans share the step's time.
|
|
39
|
+
const deadline = Date.now() + timeoutMs;
|
|
40
|
+
const id = encodeURIComponent(number);
|
|
41
|
+
const shipment = await get(`shipment?shipment_id=${id}`, signal, deadline, [404, 502]);
|
|
42
|
+
if (shipment.status === 404)
|
|
43
|
+
throw new IndeterminateError(SPS, 'Slovak Parcel Service tracking service moved');
|
|
44
|
+
if (shipment.status === 502) {
|
|
45
|
+
// One failure answers both an unknown number and a shipment whose history did
|
|
46
|
+
// not load: the search the page runs first tells them apart.
|
|
47
|
+
if (!isRecord(shipment.payload) || shipment.payload.ok !== false)
|
|
48
|
+
throw new SchemaError(SPS, 'Slovak Parcel Service returned an unexpected error reply');
|
|
49
|
+
const search = await get(`find-shipment?shipment_id=${id}&source=tracking`, signal, deadline, [404]);
|
|
50
|
+
return parseSpsSearch(search.status, search.payload);
|
|
51
|
+
}
|
|
52
|
+
// A shipment without scans has them under its dashed parcel number, as the page asks.
|
|
53
|
+
const parcel = spsParcelStatusTarget(shipment.payload, number);
|
|
54
|
+
if (!parcel)
|
|
55
|
+
return parseSpsShipment(shipment.payload, number);
|
|
56
|
+
const scans = await get(`parcel-status?parcel_id=${encodeURIComponent(parcel)}`, signal, deadline, [404]);
|
|
57
|
+
// The shipment exists, so a missing route or parcel leaves only its history open.
|
|
58
|
+
if (scans.status === 404)
|
|
59
|
+
throw new IndeterminateError(SPS, 'Slovak Parcel Service did not return the parcel’s scans');
|
|
60
|
+
return parseSpsShipment(shipment.payload, number, parseSpsParcelStatus(scans.payload, parcel));
|
|
61
|
+
};
|
|
62
|
+
// A request that fails to reach SPS, or hangs, gets one more try: the first
|
|
63
|
+
// gets half of the budget, so the retry fits in the rest.
|
|
64
|
+
return runSteps({ carrier: 'slovak-parcel-service', budgetMs: context.budgetMs ?? 15_000, signal: context.signal,
|
|
65
|
+
recorder: this.options.recorder ?? NOOP_RECORDER }, [
|
|
66
|
+
{ id: 'direct', run: ({ signal, remainingMs }) => read(signal, firstAttemptMs(remainingMs)) },
|
|
67
|
+
networkRetryStep(({ signal, remainingMs }) => read(signal, remainingMs)),
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export const adapter = (environment) => {
|
|
72
|
+
const tracker = new SlovakParcelServiceTracker({ fetcher: environment.fetcher, recorder: environment.recorder, userAgent: environment.userAgent });
|
|
73
|
+
return {
|
|
74
|
+
id: 'slovak-parcel-service', recordsSteps: true, steps: ['direct', 'retry'],
|
|
75
|
+
track: (input, context) => tracker.fetch(input.number, context),
|
|
76
|
+
recognize: (number, context) => recognizeFromLookup(() => tracker.fetch(number, context), () => accepted(() => normalizeSpsNumber(number))),
|
|
77
|
+
};
|
|
78
|
+
};
|
|
@@ -16,18 +16,59 @@
|
|
|
16
16
|
"timezone": "Europe/Bratislava",
|
|
17
17
|
"tracking": {
|
|
18
18
|
"mode": "automatic",
|
|
19
|
-
"adapter": "
|
|
20
|
-
"steps": [
|
|
19
|
+
"adapter": "slovak-parcel-service",
|
|
20
|
+
"steps": [
|
|
21
|
+
"direct",
|
|
22
|
+
"retry"
|
|
23
|
+
],
|
|
24
|
+
"localClocks": true,
|
|
25
|
+
"recognition": {
|
|
26
|
+
"rank": 830
|
|
27
|
+
}
|
|
21
28
|
},
|
|
22
|
-
"capabilities": [
|
|
29
|
+
"capabilities": [
|
|
30
|
+
"history",
|
|
31
|
+
"location",
|
|
32
|
+
"provider_code",
|
|
33
|
+
"weight"
|
|
34
|
+
],
|
|
23
35
|
"portal": {
|
|
24
36
|
"url": "https://www.sps-sro.sk/moja-zasielka/?shipment_id={trackingNumber}",
|
|
25
37
|
"searchUrl": "https://www.sps-sro.sk/moja-zasielka/",
|
|
26
38
|
"canaryUrl": "https://www.sps-sro.sk/moja-zasielka/",
|
|
27
|
-
"shows": [
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
39
|
+
"shows": [
|
|
40
|
+
"status",
|
|
41
|
+
"history",
|
|
42
|
+
"location",
|
|
43
|
+
"weight",
|
|
44
|
+
"sender_name",
|
|
45
|
+
"recipient_name",
|
|
46
|
+
"postcodes",
|
|
47
|
+
"customer_reference",
|
|
48
|
+
"tracking_alias",
|
|
49
|
+
"delivery_partner_reference",
|
|
50
|
+
"parcel_count"
|
|
51
|
+
],
|
|
52
|
+
"scraped": [
|
|
53
|
+
"status",
|
|
54
|
+
"history",
|
|
55
|
+
"location",
|
|
56
|
+
"provider_code",
|
|
57
|
+
"weight"
|
|
58
|
+
],
|
|
59
|
+
"discarded": [
|
|
60
|
+
"sender_name",
|
|
61
|
+
"recipient_name",
|
|
62
|
+
"postcodes",
|
|
63
|
+
"customer_reference",
|
|
64
|
+
"tracking_alias",
|
|
65
|
+
"delivery_partner_reference",
|
|
66
|
+
"parcel_count"
|
|
67
|
+
],
|
|
68
|
+
"unavailable": [
|
|
69
|
+
"eta",
|
|
70
|
+
"offset_timestamps"
|
|
71
|
+
]
|
|
31
72
|
},
|
|
32
73
|
"links": [
|
|
33
74
|
{
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"evri-uk"
|
|
27
27
|
]
|
|
28
28
|
},
|
|
29
|
-
"note": "Looked up on SPS's own tracker, as an archived address shows; the capture was not opened. It carries two digits more than SPS's parcel numbers, and the next address shows the tracker answering with the parcel of those first fourteen digits."
|
|
29
|
+
"note": "Looked up on SPS's own tracker, as an archived address shows; the capture was not opened. It carries two digits more than SPS's parcel numbers, and the next address shows the tracker answering with the parcel of those first fourteen digits. SPS's tracker accepts that longer form, which its tracking service also uses to name parcels, but no longer knows this one, so no reply ties it to SPS."
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"number": "703-010-30781471",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"slovak-parcel-service"
|
|
59
59
|
]
|
|
60
60
|
},
|
|
61
|
-
"note": "Named as the parcel of a shipment looked up on SPS's own tracker, as an archived result address shows; the capture was not opened."
|
|
61
|
+
"note": "Named as the parcel of a shipment looked up on SPS's own tracker, as an archived result address shows; the capture was not opened. SPS's tracking service no longer knows it, which can mean its records expired."
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
"number": "030-43181455",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"access": "indexed_excerpt"
|
|
72
72
|
},
|
|
73
73
|
"context": {
|
|
74
|
-
"assessment": "
|
|
74
|
+
"assessment": "confirmed"
|
|
75
75
|
},
|
|
76
76
|
"expect": {
|
|
77
77
|
"carrier": "unknown",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"dhl-ecommerce-pl"
|
|
88
88
|
]
|
|
89
89
|
},
|
|
90
|
-
"note": "Looked up on SPS's own tracker without the 703 country prefix, as an archived address shows
|
|
90
|
+
"note": "Looked up on SPS's own tracker without the 703 country prefix, as an archived address shows. SPS's tracking service returns the parcel's history for this form too."
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
93
|
"number": "703-030-43181455",
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"access": "indexed_excerpt"
|
|
101
101
|
},
|
|
102
102
|
"context": {
|
|
103
|
-
"assessment": "
|
|
103
|
+
"assessment": "confirmed"
|
|
104
104
|
},
|
|
105
105
|
"expect": {
|
|
106
106
|
"carrier": "unknown",
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
"slovak-parcel-service"
|
|
119
119
|
]
|
|
120
120
|
},
|
|
121
|
-
"note": "Named as the parcel of a shipment looked up on SPS's own tracker, as an archived result address shows
|
|
121
|
+
"note": "Named as the parcel of a shipment looked up on SPS's own tracker, as an archived result address shows. SPS's tracking service returns its history."
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
124
|
"number": "030-43181927",
|
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
"access": "indexed_excerpt"
|
|
132
132
|
},
|
|
133
133
|
"context": {
|
|
134
|
-
"assessment": "
|
|
134
|
+
"assessment": "confirmed"
|
|
135
135
|
},
|
|
136
136
|
"expect": {
|
|
137
137
|
"carrier": "unknown",
|
|
@@ -144,7 +144,7 @@
|
|
|
144
144
|
"dhl-ecommerce-pl"
|
|
145
145
|
]
|
|
146
146
|
},
|
|
147
|
-
"note": "Looked up on SPS's own tracker without the 703 country prefix, as an archived address shows
|
|
147
|
+
"note": "Looked up on SPS's own tracker without the 703 country prefix, as an archived address shows. SPS's tracking service returns the history of the parcel with that prefix."
|
|
148
148
|
},
|
|
149
149
|
{
|
|
150
150
|
"number": "703-030-43181927",
|
|
@@ -157,7 +157,7 @@
|
|
|
157
157
|
"access": "indexed_excerpt"
|
|
158
158
|
},
|
|
159
159
|
"context": {
|
|
160
|
-
"assessment": "
|
|
160
|
+
"assessment": "confirmed"
|
|
161
161
|
},
|
|
162
162
|
"expect": {
|
|
163
163
|
"carrier": "unknown",
|
|
@@ -176,7 +176,7 @@
|
|
|
176
176
|
"slovak-parcel-service"
|
|
177
177
|
]
|
|
178
178
|
},
|
|
179
|
-
"note": "Named as the parcel of a shipment looked up on SPS's own tracker, as an archived result address shows
|
|
179
|
+
"note": "Named as the parcel of a shipment looked up on SPS's own tracker, as an archived result address shows. SPS's tracking service returns its history."
|
|
180
180
|
},
|
|
181
181
|
{
|
|
182
182
|
"number": "703-030-44933746",
|
|
@@ -189,7 +189,7 @@
|
|
|
189
189
|
"access": "indexed_excerpt"
|
|
190
190
|
},
|
|
191
191
|
"context": {
|
|
192
|
-
"assessment": "
|
|
192
|
+
"assessment": "confirmed"
|
|
193
193
|
},
|
|
194
194
|
"expect": {
|
|
195
195
|
"carrier": "unknown",
|
|
@@ -207,7 +207,7 @@
|
|
|
207
207
|
"slovak-parcel-service"
|
|
208
208
|
]
|
|
209
209
|
},
|
|
210
|
-
"note": "Looked up on SPS's own tracker, as an archived address shows
|
|
210
|
+
"note": "Looked up on SPS's own tracker, as an archived address shows. SPS's tracking service returns its history."
|
|
211
211
|
}
|
|
212
212
|
]
|
|
213
213
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
2
|
+
export declare const SPS = "Slovak Parcel Service";
|
|
3
|
+
export declare const SPS_MAX_BYTES: number;
|
|
4
|
+
/** An SPS parcel number in the compact form its tracking service accepts. */
|
|
5
|
+
export declare function normalizeSpsNumber(raw: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Whether a number the reply gives names the requested parcel: the same
|
|
8
|
+
* number, or a shorter form of the same barcode. Two barcodes must agree in full.
|
|
9
|
+
*/
|
|
10
|
+
export declare function samePackage(requested: string, id: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* The parcel whose own scans the website asks for when a shipment comes
|
|
13
|
+
* without them: one with a dashed parcel number, the requested one first.
|
|
14
|
+
* Null when the reply has scans or no such parcel.
|
|
15
|
+
*/
|
|
16
|
+
export declare function spsParcelStatusTarget(payload: unknown, raw: string): string | null;
|
|
17
|
+
/** The rows of a `parcel-status` reply for `parcel`, which must all name that parcel. */
|
|
18
|
+
export declare function parseSpsParcelStatus(payload: unknown, parcel: string): unknown[];
|
|
19
|
+
/**
|
|
20
|
+
* The reply of `GET /api/tracking/shipment`. The shipment, each parcel and
|
|
21
|
+
* each scan name their numbers; one of them must be the requested parcel or
|
|
22
|
+
* the barcode it is short for. The shipper, receiver, receiver's name,
|
|
23
|
+
* destination postcode, references, remarks and the handheld's coordinates in
|
|
24
|
+
* the same reply are never read. `rows` replaces the reply's scans with those
|
|
25
|
+
* a `parcel-status` request returned.
|
|
26
|
+
*/
|
|
27
|
+
export declare function parseSpsShipment(payload: unknown, raw: string, rows?: readonly unknown[]): CarrierResult;
|
|
28
|
+
/** The search's notice for a number SPS does not know. */
|
|
29
|
+
export declare const SPS_NOT_FOUND_TITLE = "Z\u00E1sielku sa n\u00E1m nepodarilo n\u00E1js\u0165";
|
|
30
|
+
/**
|
|
31
|
+
* The website search's answer (`GET /api/tracking/find-shipment`) after the
|
|
32
|
+
* shipment request failed upstream. A 404 with the not-found notice is an
|
|
33
|
+
* unknown number; the address of the shipment's page means SPS knows it and
|
|
34
|
+
* only its history failed. Anything else proves nothing.
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseSpsSearch(status: number, payload: unknown): never;
|