-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbvapi.py
More file actions
244 lines (196 loc) · 8.22 KB
/
bvapi.py
File metadata and controls
244 lines (196 loc) · 8.22 KB
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
# Author: Thomas Beukema <thomasbeukema@outlook.com>
# This file is licensed under the MIT License. Please see LICENSE for more details.
import requests
"""
bva_api
bva_api is an API wrapper for the BVA Auction API,
which can be found at https://api-acc.bva-auctions.com/api/docs/.
"""
class bva_api:
# Base URL for every API call
base_url = "https://api-acc.bva-auctions.com/api/rest/"
base_url_no_acc = "https://api.bva-auctions.com/api/rest/"
# Headers to include with every request
request_headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'User-Agent': 'BVA API'
}
first_name = ''
language = ''
email = ''
def __init__(self, username, password, user_agent='BVA API'):
self.username = username
self.password = password
self.request_headers['User-Agent'] = user_agent
# login fetches tokens needed for protected endpoints
# returns True when successful, otherwise returns error msg
def login(self):
# set json body
data = {
'username': self.username,
'password': self.password
}
url = self.base_url + 'tokenlogin'
response = requests.post(url, json=data, headers=self.request_headers)
if response.status_code == 201: # 201 equals success
body = response.json()
# extract everything
self.first_name = body['firstName']
self.language = body['language']
self.email = body['email']
self.request_headers['accessToken'] = body['accessToken']
self.request_headers['refreshToken'] = body['refreshToken']
self.request_headers['X-CSRF-Token'] = body['csrfToken']
return True # success
else:
return response.json()['message'] # failed
# logout deletes tokens from server
def logout(self):
url = self.base_url + 'logout'
response = requests.post(url, headers=self.request_headers)
if not response.ok:
return response.json()['message']
return True
# get_current_auctions retrieves all current auctions
# @param page: the page of the auctions list. Defaults to 1.
# @param pagesize: the size of the auction list page. Defaults to 50.
def get_current_auctions(self, page=1, page_size=50):
url = self.base_url + 'ext123/auctions/bycurrent/paged'
payload = {'page': page, 'pageSize': page_size}
response = requests.get(url, headers=self.request_headers, params=payload)
if response.ok:
return response.json()
else:
return response.json()['message']
# get_auction retrieves auction details
# @param auction_id: the id of the auction
def get_auction(self, auction_id):
url = self.base_url + 'ext123/auction/{}'.format(auction_id)
response = requests.get(url, headers=self.request_headers)
if response.ok:
return response.json()
else:
return response.json()['message']
# get_auction_categories retrieves the (sub)category
# of the auction
# @param auction_id: the id of the auction
def get_auction_categories(self, auction_id):
url = self.base_url_no_acc + \
'ext123/auction/{}/nl/lotcategories/true/true'.format(auction_id)
response = requests.get(url, headers=self.request_headers)
print(url)
if response.ok:
return response.text
else:
return response.json()['message']
# get_auction_locations retrieves the locations
# of the auction, 'Online' if delivered at home
# @param auction_id: the id of the auction
def get_auction_locations(self, auction_id):
url = self.base_url + 'ext123/auction/{}/locations'.format(auction_id)
response = requests.get(url, headers=self.request_headers)
if response.ok:
return response.json()
else:
return response.json()['message']
# get_auction_lots retrieves the lots of an auction
# @param auction_id: the id of the auction
def get_auction_lots(self, auction_id):
url = self.base_url + 'ext123/auction/{}/lots'.format(auction_id)
response = requests.get(url, headers=self.request_headers)
if response.ok:
return response.json()
else:
return response.json()['message']
# get_lot_by_number retrieves a lot with lot_id
# @param lot: the id of the lot
def get_lot(self, lot_id):
url = self.base_url_no_acc + 'ext123/lot/{}'.format(lot_id)
response = requests.get(url, headers=self.request_headers)
if response.ok:
return response.json()
else:
return response.json()['message']
# get_lot_by_number retrieves a lot with auction_id and lot_number
# @param auction_id: the id of the auction
# @param lot: the id of the lot
# @param lot: additional to lot id, defaults to ''
def get_lot_by_number(self, auction_id, lot_number, lot_number_addition=''):
url = self.base_url_no_acc + \
'ext123/lot/{}/{}{}/lotbynumber'.format(
auction_id, lot_number, lot_number_addition)
response = requests.get(url, headers=self.request_headers)
if response.ok:
return response.json()
else:
return response.json()['message']
# search searches for given term
def search(self, term, additional_query=''):
url = self.base_url_no_acc + \
'search?term={}{}'.format(term, additional_query)
response = requests.get(url, headers=self.request_headers)
if response.ok:
return response.json()
else:
return response.json()['message']
def lot_summaries(self, category):
url = self.base_url_no_acc + \
'lot-summaries?fq=interestGroup:{}'.format(category)
response = requests.get(url, headers=self.request_headers)
if response.ok:
return response.json()
else:
return response.json()['message']
# get_invoices retrieves a list of invoices
def get_invoices(self, limit=20, page_index=1):
url = self.base_url + \
'/ext123/invoices?limit={}&pageNumber={}'.format(limit, page_index)
response = requests.get(url, headers=self.request_headers)
if response.ok:
return response.json()
else:
return response.json()['message']
# get_from_invoice lets you retrieve certain data by invoice
def get_from_invoice(self, invoice_id, pdf=True, status=False, payment_url=False):
toReturn = []
if pdf:
url = self.base_url + \
'ext123/invoices/{}/pdf'.format(invoice_id)
response = requests.get(url, headers=self.request_headers)
print(url)
if response.ok:
toReturn.append(response.text)
else:
toReturn.append([False, response.json()])
if status:
url = self.base_url + \
'invoices/{}/status'.format(invoice_id)
response = requests.get(url, headers=self.request_headers)
if response.ok:
toReturn.append(response.json())
else:
toReturn.append([False, response.json()])
if payment_url:
url = self.base_url + \
'ext123/invoices/{}/paymenturl'.format(invoice_id)
response = requests.get(url, headers=self.request_headers)
if response.ok:
toReturn.append(response.json())
else:
print(response.json())
toReturn.append([False, response.json()])
return toReturn
# get_interestgroups retrieves a list of categories
# for every lot
def get_interestgroups(self, language=''):
url = self.base_url_no_acc + 'ext123/interestgroups'
if language == '':
url += '?language={}'.format(self.language)
else:
url += '?language={}'.format(self.language)
response = requests.get(url, headers=self.request_headers)
if response.ok:
return response.json()
else:
return response.json()['message']