1- """
2- Python wrapper for the PostNL API
3- """
1+ """ Python wrapper for the PostNL API """
42
53import logging
64from datetime import datetime
1614LETTERS_URL = BASE_URL + '/mobile/api/letters'
1715
1816class PostNL_API (object ):
19-
20- """
21- Interface class for the PostNL API
22- """
17+ """ Interface class for the PostNL API """
2318
2419 def __init__ (self , user , password ):
20+ """ Constructor """
2521
2622 self ._user = user
2723 self ._password = password
@@ -39,19 +35,26 @@ def __init__(self, user, password):
3935 'content-type' : "application/x-www-form-urlencoded" ,
4036 }
4137
42- response = requests .request (
43- 'POST' , AUTHENTICATE_URL , data = payload , headers = headers )
38+ try :
39+ response = requests .request (
40+ 'POST' , AUTHENTICATE_URL , data = payload , headers = headers )
4441
45- data = response .json ()
42+ data = response .json ()
43+
44+ except Exception :
45+ _LOGGER .exception ('Credentials are wrong' )
46+ # return False
47+
48+ # if response['error']:
49+ # raise Exception(response['error']['error_description'])
4650
4751 self ._access_token = data ['access_token' ]
4852 self ._refresh_token = data ['refresh_token' ]
49- self ._token_expires_in = data ['expires_in' ] # TODO Add logic to refresh on invalidate
53+ # TODO Add logic to refresh on invalidate
54+ self ._token_expires_in = data ['expires_in' ]
5055
51- """
52- Refresh access_token
53- """
5456 def refresh_token (self ):
57+ """ Refresh access_token """
5558
5659 payload = {
5760 'grant_type' : 'refresh_token' ,
@@ -72,10 +75,8 @@ def refresh_token(self):
7275
7376 self ._access_token = data ['access_token' ]
7477
75- """
76- Retrieve shipments
77- """
7878 def get_shipments (self ):
79+ """ Retrieve shipments """
7980
8081 headers = {
8182 'api-version' : '4.6' ,
@@ -94,10 +95,28 @@ def get_shipments(self):
9495
9596 return shipments
9697
97- """
98- Retrieve profile
99- """
98+ def get_shipment (self , shipment_id ):
99+ """ Retrieve single shipment by id """
100+
101+ headers = {
102+ 'api-version' : '4.6' ,
103+ 'user-agent' : 'PostNL/1 CFNetwork/889.3 Darwin/17.2.0' ,
104+ 'authorization' : 'Bearer ' + self ._access_token
105+ }
106+
107+ response = requests .request (
108+ 'GET' , SHIPMENTS_URL + '/' + shipment_id , headers = headers )
109+
110+ if response .status_code == 401 :
111+ self .refresh_token ()
112+ shipments = self .get_shipment (shipment_id )
113+ else :
114+ shipments = response .json ()
115+
116+ return shipments
117+
100118 def get_profile (self ):
119+ """ Retrieve profile """
101120
102121 headers = {
103122 'api-version' : '4.6' ,
@@ -116,10 +135,8 @@ def get_profile(self):
116135
117136 return profile
118137
119- """
120- Retrieve letters
121- """
122138 def get_letters (self ):
139+ """ Retrieve letters """
123140
124141 headers = {
125142 'api-version' : '4.6' ,
@@ -136,16 +153,35 @@ def get_letters(self):
136153 else :
137154 letters = response .json ()
138155
139- if letters ['type' ] == 'ProfileValidationFeatureMissing' :
140- _LOGGER .error (letters ['message' ])
141- return []
156+ # TODO Add validation / exception handling
157+ # if letters['type'] == 'ProfileValidationFeatureMissing':
158+ # _LOGGER.error(letters['message'])
159+ # return []
142160
143161 return letters
144162
145- """
146- Retrieve relevant shipments
147- """
163+ def get_letter (self , letter_id ):
164+ """ Retrieve single letter by id """
165+
166+ headers = {
167+ 'api-version' : '4.6' ,
168+ 'user-agent' : 'PostNL/1 CFNetwork/889.3 Darwin/17.2.0' ,
169+ 'authorization' : 'Bearer ' + self ._access_token
170+ }
171+
172+ response = requests .request (
173+ 'GET' , LETTERS_URL + '/' + letter_id , headers = headers )
174+
175+ if response .status_code == 401 :
176+ self .refresh_token ()
177+ letter = self .get_letter (letter_id )
178+ else :
179+ letter = response .json ()
180+
181+ return letter
182+
148183 def get_relevant_shipments (self ):
184+ """ Retrieve not delivered shipments and shipments delivered today """
149185
150186 shipments = self .get_shipments ()
151187 relevant_shipments = []
@@ -159,10 +195,10 @@ def get_relevant_shipments(self):
159195
160196 # Check if package has been delivered today
161197 if shipment ['status' ]['delivery' ]:
162- delivery_date = datetime .strptime ( shipment ['status' ]['delivery' ]['deliveryDate' ][:19 ], "%Y-%m-%dT%H:%M:%S" )
198+ delivery_date = datetime .strptime (
199+ shipment ['status' ]['delivery' ]['deliveryDate' ][:19 ], "%Y-%m-%dT%H:%M:%S" )
163200
164201 if delivery_date .date () == datetime .today ().date ():
165202 relevant_shipments .append (shipment )
166- continue
167203
168- return relevant_shipments
204+ return relevant_shipments
0 commit comments