-
Notifications
You must be signed in to change notification settings - Fork 0
/
usps.py
134 lines (120 loc) · 4.94 KB
/
usps.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
from bs4 import BeautifulSoup
import requests
from uszipcode import SearchEngine
import mpu
import datetime
def uspsTracking(tracker):
retStr, fullHist = '', ''
#attempt to contact usps
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
url = f'https://tools.usps.com/go/TrackConfirmAction?qtc_tLabels1={tracker}'
try:
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.content, "html.parser")
except:
print("Unable to contact USPS. Try again.")
#remove newlines from children list
html = list(soup.children)
for x in html.copy():
if x == "\n":
html.remove(x)
#print current status of package
findStatus = soup.find_all("div",class_="delivery_status")
start = str(findStatus).find("<strong>")
end = str(findStatus).find("</strong>")
currentStatus = str(findStatus)[start + 8 :end]
#get tracking history of package by day
findHist = soup.find_all("div", class_="panel-actions-content thPanalAction")
strConv = str(findHist)
strConv = strConv.split("\t")
copied = list()
dateDict = dict()
months = {"Jan": 1, "Feb": 2, "Mar": 3, "Apr": 4, "May": 5, "Jun": 6, "Jul": 7, "Aug": 8, \
"Sep": 9, "Oct": 10, "Nov": 11, "Dec":12}
for item in strConv.copy():
if item == "":
strConv.remove(item)
if "<" in item or ">" in item:
strConv.remove(item)
for item in strConv:
item = item[:-2]
copied.append(item)
dayCount = 0
for item in copied:
if item[:3] in months:
dayCount += 1
if dayCount > 1:
for index in range(len(copied)-4):
innerList = []
if len(copied[index]) > 3 and copied[index][:3] in months:
t = 1
while index > 0 and copied[index + t][:3] not in months:
innerList.append(copied[index + t])
t += 1
if copied[index] in dateDict:
dateDict[copied[index]] += innerList
else:
dateDict[copied[index]] = innerList
else:
innerList= copied[1:]
if copied[0] in dateDict:
dateDict[copied[0]] += innerList
else:
dateDict[copied[0]] = innerList
#print breakdown
zipList = []
print("-" * 10, "RECAP", "-"*10)
for day in dateDict:
if day[-1] == ",":
print(day[:-1])
fullHist += f"<strong>{str(day[:-1])}</strong>\n"
else:
print(day)
fullHist += f"<strong>{str(day)}</strong>\n"
for event in dateDict[day]:
if event != "":
print(event)
fullHist += event + "\n"
try:
int(event[-6:])
if event[-6:].split()[0] not in zipList:
zipList.append(event[-6:].split()[0])
except:
pass
print("\n")
#find total travel distance of package
search = SearchEngine(simple_zipcode=True)
if len(zipList) > 1:
startZip = search.by_zipcode(zipList[0])
startLat = startZip.lat
startLong = startZip.lng
currentZip = search.by_zipcode(zipList[-1])
currentLat = currentZip.lat
currentLong = currentZip.lng
try:
distance = mpu.haversine_distance((startLat,startLong),(currentLat,currentLong))
print(f'Your package has traveled {distance:.2f} km.')
retStr += f'Your package has traveled {distance:.2f} km.\n'
print(f'Your package has traveled {distance * 0.621371:.2f} mi.')
retStr += f'Your package has traveled {distance * 0.621371:.2f} mi.\n'
except:
print(f"Cannot determine distance between {startZip.city} and {currentZip.city} at this time.")
retStr += f"Cannot determine distance between {startZip.city} and {currentZip.city} at this time.\n"
#find how long package has been in transit
dateTuples = []
for date in dateDict.keys():
month, day, year = date.split()
if year[-1] == ",":
year = year[:-1]
if day[-1] == ",":
day = day[:-1]
month = months[month[:3]]
dateTuples.append((int(year), int(month), int(day)))
currentDate = datetime.date.today()
sendDate = datetime.date(dateTuples[-1][0], dateTuples[-1][1], dateTuples[-1][2])
days = currentDate - sendDate
print(f"Your package has been in transit for {days.days} days.")
retStr += f"Your package has been in transit for {days.days} days.\n"
print(f"Your package's current status is {currentStatus.lower()}!")
retStr += f"Your package's current status is {currentStatus.lower()}!"
return [retStr,fullHist]