Skip to content

Commit 7dc0636

Browse files
committed
switch to selectolax, clean up, etc
1 parent 3068b09 commit 7dc0636

File tree

5 files changed

+98
-193
lines changed

5 files changed

+98
-193
lines changed

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ authors = [
66
{ name = "iiPython", email = "[email protected]" }
77
]
88
dependencies = [
9-
"beautifulsoup4>=4.12.3",
109
"click>=8.1.7",
1110
"requests>=2.32.3",
1211
"rich>=13.8.1",
12+
"selectolax>=0.3.26",
1313
"selenium>=4.25.0",
1414
"typer>=0.12.5",
1515
]

usps/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.9.0"
1+
__version__ = "0.9.1"

usps/tracking/__init__.py

+20-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from datetime import datetime
77
from dataclasses import dataclass
88

9+
from requests import Session
10+
911
# Typing
1012
@dataclass
1113
class Step:
@@ -32,14 +34,28 @@ class StatusNotAvailable(Exception):
3234
# Constants
3335
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.3"
3436

37+
SESSION = Session()
38+
SESSION.headers.update({
39+
"Accept-Encoding": "gzip, deflate, br, zstd",
40+
"Accept-Language": "en-US,en;q=0.5",
41+
"Sec-Fetch-Dest": "document",
42+
"Sec-Fetch-Site": "none",
43+
"Sec-Fetch-User": "?1",
44+
"Sec-GPC": "1",
45+
"User-Agent": USER_AGENT,
46+
})
47+
3548
# Handle actual tracking
36-
from .ups import UPSTracking # noqa: E402
49+
from .ups import UPSTracking # noqa: E402
3750
from .usps import USPSTracking # noqa: E402
3851

39-
UPS_PACKAGE_REGEX = re.compile(r"1Z[A-Z0-9]{6}[0-9]{10}")
52+
UPS_PACKAGE_REGEX = re.compile(r"^1Z[A-Z0-9]{6}[0-9]{10}$")
4053

4154
def get_service(tracking_number: str) -> str:
42-
return "UPS" if re.match(UPS_PACKAGE_REGEX, tracking_number) else "USPS"
55+
if re.match(UPS_PACKAGE_REGEX, tracking_number):
56+
return "UPS"
57+
58+
return "USPS"
4359

4460
def track_package(tracking_number: str) -> Package:
45-
return (UPSTracking if get_service(tracking_number) == "UPS" else USPSTracking).track_package(tracking_number)
61+
return {"UPS": UPSTracking, "USPS": USPSTracking}[get_service(tracking_number)].track_package(tracking_number)

usps/tracking/ups.py

+7-31
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,9 @@
66
from requests import Session
77

88
from usps.timezones import LOCAL_TIMEZONE
9-
from usps.tracking import USER_AGENT, Package, Step, StatusNotAvailable
9+
from usps.tracking import Package, Step, StatusNotAvailable
1010

1111
# Handle mapping
12-
UPS_CMS_MAPPINGS = {
13-
"cms.stapp.jan": "January",
14-
"cms.stapp.feb": "February",
15-
"cms.stapp.mar": "March",
16-
"cms.stapp.apr": "April",
17-
"cms.stapp.may": "May",
18-
"cms.stapp.jun": "June",
19-
"cms.stapp.jul": "July",
20-
"cms.stapp.aug": "August",
21-
"cms.stapp.sep": "September",
22-
"cms.stapp.oct": "October",
23-
"cms.stapp.nov": "November",
24-
"cms.stapp.dec": "December"
25-
}
2612
UPS_MILESTONE_MAPPINGS = {
2713
"we have your package": "Has Package",
2814
"departed from facility": "Left Facility",
@@ -31,18 +17,6 @@
3117
"out for delivery": "Delivering"
3218
}
3319

34-
# Headers that need to exist for UPS to respond
35-
# I'm not sure why they check *these* headers, but ¯\_(ツ)_/¯
36-
UPS_HEADERS = {
37-
"Accept-Encoding": "gzip, deflate, br, zstd",
38-
"Accept-Language": "en-US,en;q=0.5",
39-
"Sec-Fetch-Dest": "document",
40-
"Sec-Fetch-Site": "none",
41-
"Sec-Fetch-User": "?1",
42-
"Sec-GPC": "1",
43-
"User-Agent": USER_AGENT,
44-
}
45-
4620
# Main class
4721
class UPSTracking:
4822
_session: Session | None = None
@@ -59,12 +33,12 @@ def track_package(cls, tracking_number: str) -> Package:
5933

6034
try:
6135
if not cls._session.cookies:
62-
cls._session.get("https://www.ups.com/track", headers = UPS_HEADERS, timeout = 1)
36+
cls._session.get("https://www.ups.com/track", timeout = 1)
6337

6438
response = cls._session.post(
6539
"https://webapis.ups.com/track/api/Track/GetStatus?loc=en_US",
6640
json = {"Locale": "en_US", "TrackingNumber": [tracking_number]},
67-
headers = UPS_HEADERS | {
41+
headers = {
6842
"X-XSRF-TOKEN": cls._session.cookies["X-XSRF-TOKEN-ST"]
6943
},
7044
timeout = 1
@@ -87,9 +61,11 @@ def track_package(cls, tracking_number: str) -> Package:
8761
estimated_delivery = None
8862
if data["scheduledDeliveryDateDetail"]:
8963
delivery = data["scheduledDeliveryDateDetail"]
90-
month, year = UPS_CMS_MAPPINGS[delivery["monthCMSKey"]], datetime.now().year
9164
estimated_delivery = [
92-
datetime.strptime(f"{month} {delivery['dayNum']} {time.replace('.', '')}", "%B %d %I:%M %p").replace(year = year)
65+
datetime.strptime(
66+
f"{delivery['monthCMSKey'].split('.')[-1]} {delivery['dayNum']} {time.replace('.', '')}",
67+
"%b %d %I:%M %p"
68+
).replace(year = datetime.now().year)
9369
for time in data["packageStatusTime"].split(" - ")
9470
]
9571

0 commit comments

Comments
 (0)