universal-parcel-scraper 0.91.1-main.983 → 0.93.0-main.987

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 CHANGED
@@ -13,7 +13,7 @@ The engine behind [Peek](https://peektracker.com) ([GitHub](https://github.com/p
13
13
  [![License: Apache-2.0](https://img.shields.io/badge/core-Apache--2.0-blue.svg)](LICENSE)
14
14
 
15
15
  <!-- GENERATED:summary -->
16
- **3,500+ carriers** through **149 dedicated adapters** and **5 universal fallbacks**
16
+ **3,500+ carriers** through **151 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,084 such statuses, each filed under one stage.
158
+ The carrier folders record 4,117 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
@@ -6708,7 +6708,9 @@
6708
6708
  "timezone": "Europe/Zagreb",
6709
6709
  "tracking": {
6710
6710
  "mode": "automatic",
6711
- "adapter": "universal"
6711
+ "adapter": "hrvatska-posta",
6712
+ "recognitionRank": 810,
6713
+ "localClocks": true
6712
6714
  },
6713
6715
  "canaryUrl": "https://posiljka.posta.hr/",
6714
6716
  "trackingUrlTemplate": "https://posiljka.posta.hr/hr/tracking/trackingdata?barcode={trackingNumber}",
@@ -6724,7 +6726,14 @@
6724
6726
  ]
6725
6727
  }
6726
6728
  ],
6727
- "detectionRules": []
6729
+ "detectionRules": [
6730
+ {
6731
+ "pattern": "^[A-Z]{2}\\d{9}HR$",
6732
+ "confidence": "low",
6733
+ "checksum": "s10",
6734
+ "preferred": true
6735
+ }
6736
+ ]
6728
6737
  },
6729
6738
  "instabox": {
6730
6739
  "displayName": "Instabox",
@@ -6929,7 +6938,9 @@
6929
6938
  "timezone": "Europe/Riga",
6930
6939
  "tracking": {
6931
6940
  "mode": "automatic",
6932
- "adapter": "universal"
6941
+ "adapter": "latvijas-pasts",
6942
+ "recognitionRank": 820,
6943
+ "localClocks": true
6933
6944
  },
6934
6945
  "canaryUrl": "https://www.pasts.lv/izsekot-sutijumu",
6935
6946
  "trackingUrlTemplate": "https://mans.pasts.lv/track?locale=lv-LV&id={trackingNumber}",
@@ -6945,7 +6956,14 @@
6945
6956
  ]
6946
6957
  }
6947
6958
  ],
6948
- "detectionRules": []
6959
+ "detectionRules": [
6960
+ {
6961
+ "pattern": "^[A-Z]{2}\\d{9}LV$",
6962
+ "confidence": "low",
6963
+ "checksum": "s10",
6964
+ "preferred": true
6965
+ }
6966
+ ]
6949
6967
  },
6950
6968
  "lbc-express": {
6951
6969
  "displayName": "LBC Express",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "catalog": 208,
3
- "activeAdapters": 149,
3
+ "activeAdapters": 151,
4
4
  "countries": 66,
5
5
  "referenceCarriers": 100,
6
6
  "comparison": {
@@ -25585,6 +25585,7 @@
25585
25585
  "intl-post"
25586
25586
  ],
25587
25587
  "asked": [
25588
+ "latvijas-pasts",
25588
25589
  "chronopost"
25589
25590
  ]
25590
25591
  },
@@ -25596,6 +25597,7 @@
25596
25597
  "intl-post"
25597
25598
  ],
25598
25599
  "asked": [
25600
+ "latvijas-pasts",
25599
25601
  "chronopost"
25600
25602
  ]
25601
25603
  },
@@ -25607,6 +25609,7 @@
25607
25609
  "intl-post"
25608
25610
  ],
25609
25611
  "asked": [
25612
+ "latvijas-pasts",
25610
25613
  "chronopost"
25611
25614
  ]
25612
25615
  },
@@ -27047,6 +27050,7 @@
27047
27050
  "intl-post"
27048
27051
  ],
27049
27052
  "asked": [
27053
+ "latvijas-pasts",
27050
27054
  "chronopost"
27051
27055
  ]
27052
27056
  },
@@ -27922,6 +27926,7 @@
27922
27926
  "intl-post"
27923
27927
  ],
27924
27928
  "asked": [
27929
+ "hrvatska-posta",
27925
27930
  "chronopost"
27926
27931
  ]
27927
27932
  },
@@ -30430,6 +30435,7 @@
30430
30435
  "intl-post"
30431
30436
  ],
30432
30437
  "asked": [
30438
+ "hrvatska-posta",
30433
30439
  "chronopost"
30434
30440
  ]
30435
30441
  },
@@ -30556,6 +30562,7 @@
30556
30562
  "intl-post"
30557
30563
  ],
30558
30564
  "asked": [
30565
+ "hrvatska-posta",
30559
30566
  "chronopost"
30560
30567
  ]
30561
30568
  },
@@ -30575,6 +30582,7 @@
30575
30582
  "intl-post"
30576
30583
  ],
30577
30584
  "asked": [
30585
+ "hrvatska-posta",
30578
30586
  "chronopost"
30579
30587
  ]
30580
30588
  },
@@ -30624,6 +30632,7 @@
30624
30632
  "intl-post"
30625
30633
  ],
30626
30634
  "asked": [
30635
+ "hrvatska-posta",
30627
30636
  "chronopost"
30628
30637
  ]
30629
30638
  },
@@ -31481,6 +31490,7 @@
31481
31490
  "intl-post"
31482
31491
  ],
31483
31492
  "asked": [
31493
+ "hrvatska-posta",
31484
31494
  "chronopost"
31485
31495
  ]
31486
31496
  },
@@ -31500,6 +31510,7 @@
31500
31510
  "intl-post"
31501
31511
  ],
31502
31512
  "asked": [
31513
+ "hrvatska-posta",
31503
31514
  "chronopost"
31504
31515
  ]
31505
31516
  },
@@ -31648,6 +31659,7 @@
31648
31659
  "intl-post"
31649
31660
  ],
31650
31661
  "asked": [
31662
+ "latvijas-pasts",
31651
31663
  "chronopost"
31652
31664
  ]
31653
31665
  },
@@ -31659,6 +31671,7 @@
31659
31671
  "intl-post"
31660
31672
  ],
31661
31673
  "asked": [
31674
+ "latvijas-pasts",
31662
31675
  "chronopost"
31663
31676
  ]
31664
31677
  },
@@ -31670,6 +31683,7 @@
31670
31683
  "intl-post"
31671
31684
  ],
31672
31685
  "asked": [
31686
+ "latvijas-pasts",
31673
31687
  "chronopost"
31674
31688
  ]
31675
31689
  },
@@ -31681,6 +31695,7 @@
31681
31695
  "intl-post"
31682
31696
  ],
31683
31697
  "asked": [
31698
+ "latvijas-pasts",
31684
31699
  "chronopost"
31685
31700
  ]
31686
31701
  },
@@ -31692,6 +31707,7 @@
31692
31707
  "intl-post"
31693
31708
  ],
31694
31709
  "asked": [
31710
+ "latvijas-pasts",
31695
31711
  "chronopost"
31696
31712
  ]
31697
31713
  },
@@ -31703,6 +31719,7 @@
31703
31719
  "intl-post"
31704
31720
  ],
31705
31721
  "asked": [
31722
+ "latvijas-pasts",
31706
31723
  "chronopost"
31707
31724
  ]
31708
31725
  },
@@ -31714,6 +31731,7 @@
31714
31731
  "intl-post"
31715
31732
  ],
31716
31733
  "asked": [
31734
+ "latvijas-pasts",
31717
31735
  "chronopost"
31718
31736
  ]
31719
31737
  },
@@ -31725,6 +31743,7 @@
31725
31743
  "intl-post"
31726
31744
  ],
31727
31745
  "asked": [
31746
+ "latvijas-pasts",
31728
31747
  "chronopost"
31729
31748
  ]
31730
31749
  },
@@ -31736,6 +31755,7 @@
31736
31755
  "intl-post"
31737
31756
  ],
31738
31757
  "asked": [
31758
+ "latvijas-pasts",
31739
31759
  "chronopost"
31740
31760
  ]
31741
31761
  },
@@ -33546,6 +33566,7 @@
33546
33566
  "intl-post"
33547
33567
  ],
33548
33568
  "asked": [
33569
+ "hrvatska-posta",
33549
33570
  "chronopost"
33550
33571
  ]
33551
33572
  },
@@ -33557,6 +33578,7 @@
33557
33578
  "intl-post"
33558
33579
  ],
33559
33580
  "asked": [
33581
+ "hrvatska-posta",
33560
33582
  "chronopost"
33561
33583
  ]
33562
33584
  },
@@ -33611,6 +33633,7 @@
33611
33633
  "intl-post"
33612
33634
  ],
33613
33635
  "asked": [
33636
+ "hrvatska-posta",
33614
33637
  "chronopost"
33615
33638
  ]
33616
33639
  },
@@ -34240,6 +34263,7 @@
34240
34263
  "intl-post"
34241
34264
  ],
34242
34265
  "asked": [
34266
+ "latvijas-pasts",
34243
34267
  "chronopost"
34244
34268
  ]
34245
34269
  },
@@ -35409,6 +35433,7 @@
35409
35433
  "intl-post"
35410
35434
  ],
35411
35435
  "asked": [
35436
+ "latvijas-pasts",
35412
35437
  "chronopost"
35413
35438
  ]
35414
35439
  },
@@ -36111,6 +36136,7 @@
36111
36136
  "intl-post"
36112
36137
  ],
36113
36138
  "asked": [
36139
+ "hrvatska-posta",
36114
36140
  "chronopost"
36115
36141
  ]
36116
36142
  },
@@ -36876,6 +36902,7 @@
36876
36902
  "intl-post"
36877
36903
  ],
36878
36904
  "asked": [
36905
+ "latvijas-pasts",
36879
36906
  "chronopost"
36880
36907
  ]
36881
36908
  },
@@ -37150,6 +37177,7 @@
37150
37177
  "intl-post"
37151
37178
  ],
37152
37179
  "asked": [
37180
+ "hrvatska-posta",
37153
37181
  "chronopost"
37154
37182
  ]
37155
37183
  },
@@ -37161,6 +37189,7 @@
37161
37189
  "intl-post"
37162
37190
  ],
37163
37191
  "asked": [
37192
+ "latvijas-pasts",
37164
37193
  "chronopost"
37165
37194
  ]
37166
37195
  },
@@ -5351,7 +5351,9 @@ var be = {
5351
5351
  timezone: "Europe/Zagreb",
5352
5352
  tracking: {
5353
5353
  mode: "automatic",
5354
- adapter: "universal"
5354
+ adapter: "hrvatska-posta",
5355
+ recognitionRank: 810,
5356
+ localClocks: !0
5355
5357
  },
5356
5358
  canaryUrl: "https://posiljka.posta.hr/",
5357
5359
  trackingUrlTemplate: "https://posiljka.posta.hr/hr/tracking/trackingdata?barcode={trackingNumber}",
@@ -5361,7 +5363,12 @@ var be = {
5361
5363
  pathPattern: "^/(?:hr/|en/)?tracking/trackingdata/?$",
5362
5364
  params: ["barcode"]
5363
5365
  }],
5364
- detectionRules: []
5366
+ detectionRules: [{
5367
+ pattern: "^[A-Z]{2}\\d{9}HR$",
5368
+ confidence: "low",
5369
+ checksum: "s10",
5370
+ preferred: !0
5371
+ }]
5365
5372
  },
5366
5373
  instabox: {
5367
5374
  displayName: "Instabox",
@@ -5520,7 +5527,9 @@ var be = {
5520
5527
  timezone: "Europe/Riga",
5521
5528
  tracking: {
5522
5529
  mode: "automatic",
5523
- adapter: "universal"
5530
+ adapter: "latvijas-pasts",
5531
+ recognitionRank: 820,
5532
+ localClocks: !0
5524
5533
  },
5525
5534
  canaryUrl: "https://www.pasts.lv/izsekot-sutijumu",
5526
5535
  trackingUrlTemplate: "https://mans.pasts.lv/track?locale=lv-LV&id={trackingNumber}",
@@ -5530,7 +5539,12 @@ var be = {
5530
5539
  pathPattern: "^/track/?$",
5531
5540
  params: ["id"]
5532
5541
  }],
5533
- detectionRules: []
5542
+ detectionRules: [{
5543
+ pattern: "^[A-Z]{2}\\d{9}LV$",
5544
+ confidence: "low",
5545
+ checksum: "s10",
5546
+ preferred: !0
5547
+ }]
5534
5548
  },
5535
5549
  "lbc-express": {
5536
5550
  displayName: "LBC Express",
@@ -7126,7 +7140,7 @@ var be = {
7126
7140
  "gofo-fr": ["gofo-fr-1", "gofo-fr-2"],
7127
7141
  "gofo-it": ["gofo-it-1"],
7128
7142
  helthjem: ["helthjem-1", "helthjem-2"],
7129
- "hrvatska-posta": [],
7143
+ "hrvatska-posta": ["hrvatska-posta-s10"],
7130
7144
  instabox: [],
7131
7145
  intelcom: [
7132
7146
  "intelcom-1",
@@ -7136,7 +7150,7 @@ var be = {
7136
7150
  "j-and-t-cargo": ["j-and-t-cargo-1", "j-and-t-cargo-2"],
7137
7151
  jitsu: [],
7138
7152
  "kuehne-nagel": ["kuehne-nagel-1", "kuehne-nagel-2"],
7139
- "latvijas-pasts": [],
7153
+ "latvijas-pasts": ["latvijas-pasts-s10"],
7140
7154
  "lbc-express": ["lbc-domestic"],
7141
7155
  "lietuvos-pastas": ["lietuvos-pastas-1"],
7142
7156
  "loomis-express": ["loomis-express-1", "loomis-express-2"],
@@ -11925,10 +11939,12 @@ var bc = {
11925
11939
  "gofo-it": 20,
11926
11940
  helthjem: 710,
11927
11941
  "hermes-de": 400,
11942
+ "hrvatska-posta": 810,
11928
11943
  inpost: 380,
11929
11944
  "j-and-t": 90,
11930
11945
  "j-and-t-cargo": 470,
11931
11946
  "la-poste": 800,
11947
+ "latvijas-pasts": 820,
11932
11948
  matkahuolto: 690,
11933
11949
  "mng-kargo": 740,
11934
11950
  nacex: 410,
@@ -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 HRVATSKA_POSTA_ENDPOINT = "https://posiljka.posta.hr/en/tracking/trackingdata";
5
+ export declare class HrvatskaPostaTracker {
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,52 @@
1
+ import { accepted, recognizeFromLookup } from '../../core/adapter/index.js';
2
+ import { IndeterminateError, TransportError } 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 { HRVATSKA_POSTA_MAX_BYTES, normalizeHrvatskaPostaNumber, parseHrvatskaPosta, PROVIDER } from './parser.js';
8
+ // The English page of Hrvatska pošta's tracker, which its tracking forms open with the number as `barcode`.
9
+ export const HRVATSKA_POSTA_ENDPOINT = 'https://posiljka.posta.hr/en/tracking/trackingdata';
10
+ const REDIRECTS = [301, 302, 303, 307, 308];
11
+ // A missing route is not a missing item: the tracker answers unknown numbers with a notice.
12
+ const GONE = [404, 410];
13
+ export class HrvatskaPostaTracker {
14
+ options;
15
+ constructor(options = {}) {
16
+ this.options = options;
17
+ }
18
+ async fetch(raw, context = {}) {
19
+ const number = normalizeHrvatskaPostaNumber(raw);
20
+ const url = `${HRVATSKA_POSTA_ENDPOINT}?${new URLSearchParams({ barcode: number })}`;
21
+ const read = async (signal, timeoutMs) => {
22
+ const { response, bytes } = await fetchBounded(url, { method: 'GET', signal, headers: {
23
+ Accept: 'text/html,application/xhtml+xml',
24
+ 'User-Agent': userAgentOf(this.options.userAgent),
25
+ } }, { provider: PROVIDER, timeoutMs: Math.max(1, Math.floor(timeoutMs)), maxBytes: HRVATSKA_POSTA_MAX_BYTES,
26
+ redirect: 'manual', allowHttpStatuses: [...REDIRECTS, ...GONE], fetcher: this.options.fetcher });
27
+ if (REDIRECTS.includes(response.status))
28
+ throw new IndeterminateError(PROVIDER, 'Hrvatska pošta sent the lookup to another page');
29
+ if (GONE.includes(response.status))
30
+ throw new TransportError(PROVIDER, 'Hrvatska pošta tracking page is unavailable');
31
+ const html = decodeText(bytes);
32
+ if (!html.trim())
33
+ throw new IndeterminateError(PROVIDER, 'Hrvatska pošta returned an empty page');
34
+ return parseHrvatskaPosta(html, number);
35
+ };
36
+ // A request that fails to reach Hrvatska pošta, or hangs, gets one more
37
+ // try: the first gets half of the budget, so the retry fits in the rest.
38
+ return runSteps({ carrier: 'hrvatska-posta', budgetMs: context.budgetMs ?? 15_000, signal: context.signal,
39
+ recorder: this.options.recorder ?? NOOP_RECORDER }, [
40
+ { id: 'direct', run: ({ signal, remainingMs }) => read(signal, firstAttemptMs(remainingMs)) },
41
+ networkRetryStep(({ signal, remainingMs }) => read(signal, remainingMs)),
42
+ ]);
43
+ }
44
+ }
45
+ export const adapter = (environment) => {
46
+ const tracker = new HrvatskaPostaTracker({ fetcher: environment.fetcher, recorder: environment.recorder, userAgent: environment.userAgent });
47
+ return {
48
+ id: 'hrvatska-posta', recordsSteps: true, steps: ['direct', 'retry'],
49
+ track: (input, context) => tracker.fetch(input.number, context),
50
+ recognize: (number, context) => recognizeFromLookup(() => tracker.fetch(number, context), () => accepted(() => normalizeHrvatskaPostaNumber(number))),
51
+ };
52
+ };
@@ -20,18 +20,52 @@
20
20
  "timezone": "Europe/Zagreb",
21
21
  "tracking": {
22
22
  "mode": "automatic",
23
- "adapter": "universal",
24
- "steps": []
23
+ "adapter": "hrvatska-posta",
24
+ "steps": [
25
+ "direct",
26
+ "retry"
27
+ ],
28
+ "recognition": {
29
+ "rank": 810
30
+ },
31
+ "localClocks": true
25
32
  },
26
- "capabilities": [],
33
+ "capabilities": [
34
+ "history",
35
+ "location",
36
+ "weight",
37
+ "pickup_point"
38
+ ],
27
39
  "portal": {
28
40
  "url": "https://posiljka.posta.hr/hr/tracking/trackingdata?barcode={trackingNumber}",
29
41
  "searchUrl": "https://posiljka.posta.hr/",
30
42
  "canaryUrl": "https://posiljka.posta.hr/",
31
- "shows": [],
32
- "scraped": [],
33
- "discarded": [],
34
- "unavailable": []
43
+ "shows": [
44
+ "status",
45
+ "history",
46
+ "location",
47
+ "weight",
48
+ "postcodes",
49
+ "delivery_unit_logo"
50
+ ],
51
+ "scraped": [
52
+ "status",
53
+ "history",
54
+ "location",
55
+ "weight",
56
+ "pickup_point"
57
+ ],
58
+ "discarded": [
59
+ "postcodes",
60
+ "delivery_unit_logo"
61
+ ],
62
+ "unavailable": [
63
+ "eta",
64
+ "service_name",
65
+ "sender_name",
66
+ "recipient_name",
67
+ "offset_timestamps"
68
+ ]
35
69
  },
36
70
  "links": [
37
71
  {
@@ -44,5 +78,13 @@
44
78
  ]
45
79
  }
46
80
  ],
47
- "detection": []
81
+ "detection": [
82
+ {
83
+ "id": "hrvatska-posta-s10",
84
+ "pattern": "^[A-Z]{2}\\d{9}HR$",
85
+ "confidence": "low",
86
+ "preferred": true,
87
+ "checksum": "s10"
88
+ }
89
+ ]
48
90
  }