30
30
"arrived at facility" : "At Facility"
31
31
}
32
32
33
+ # Headers that need to exist for UPS to respond
34
+ # I'm not sure why they check *these* headers, but ¯\_(ツ)_/¯
35
+ UPS_HEADERS = {
36
+ "Accept-Encoding" : "gzip, deflate, br, zstd" ,
37
+ "Accept-Language" : "en-US,en;q=0.5" ,
38
+ "Sec-Fetch-Dest" : "document" ,
39
+ "Sec-Fetch-Site" : "none" ,
40
+ "Sec-Fetch-User" : "?1" ,
41
+ "Sec-GPC" : "1" ,
42
+ "User-Agent" : USER_AGENT ,
43
+ }
44
+
33
45
# Main class
34
46
class UPSTracking :
35
47
_session : Session | None = None
@@ -46,15 +58,12 @@ def track_package(cls, tracking_number: str) -> Package:
46
58
47
59
try :
48
60
if not cls ._session .cookies :
49
- cls ._session .get ("https://www.ups.com/track" , headers = { "User-Agent" : USER_AGENT } , timeout = 5 )
61
+ cls ._session .get ("https://www.ups.com/track" , headers = UPS_HEADERS , timeout = 5 )
50
62
51
63
response = cls ._session .post (
52
64
"https://webapis.ups.com/track/api/Track/GetStatus?loc=en_US" ,
53
65
json = {"Locale" : "en_US" , "TrackingNumber" : [tracking_number ]},
54
- headers = {
55
- "Accept-Encoding" : "gzip, deflate, br, zstd" ,
56
- "Accept-Language" : "en-US,en;q=0.5" ,
57
- "User-Agent" : USER_AGENT ,
66
+ headers = UPS_HEADERS | {
58
67
"X-XSRF-TOKEN" : cls ._session .cookies ["X-XSRF-TOKEN-ST" ]
59
68
},
60
69
timeout = 5
0 commit comments