-
Notifications
You must be signed in to change notification settings - Fork 0
/
api_inces-backend_rs.py
239 lines (209 loc) · 8.27 KB
/
api_inces-backend_rs.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
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
# -*- coding: utf-8 -*-
'''
Monday, August 19, 2019
Stacy Bridges
'''
# IMPORTS ---------------------------------------------------------
import csv, os
import requests
import pandas as pd
from pandas import ExcelWriter
import numpy as np
import sys
import io
# UTF-8 Encoding --------------------------------------------------
# allow printing of special characters to console without error
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')
# GLOBALS ---------------------------------------------------------
mMats_test = []
mMats = []
# FUNCTIONS -------------------------------------------------------
def import_csv(d):
code = ''
with open(d) as data:
csv_reader = csv.reader(data, delimiter='|')
i = 0
for row in csv_reader:
if i > 0:
if len(row) == 0:
code = 'x'
else:
code = row[0]
mMats.append(code)
i += 1
# end function //
# MAIN ------------------------------------------------------------
def main():
# config ------------------------------------------------------\\
test = False
mMats_test = [
'249-2366',
'764-3471',
'ZB4BA3',
'199-2966'
]
# config ------------------------------------------------------//
# define path to input file
folder_path = os.path.dirname(os.path.abspath(__file__))
inFile = folder_path + '\\api_in_ids.csv'
# define path to output file
outFile = folder_path + '\\api_out_results.xlsx'
outFile_test = folder_path + '\\api_out_results_test.xlsx'
if test == True:
pdFile = outFile_test
else:
pdFile = outFile
# external id inputs
if test == False:
import_csv(inFile)
# setup pandas containers to hold contents of xlsx columns
# wBrand | wManufacturerPartNo | wSupplierId | wSource | wDescription | wSupplementalDetails | wCategory | wStatus
# p_brands | p_manufacturerIds | p_supplierIds | p_sources | p_descriptions | p_details | p_categories | wStatus
p_brands = [] # field = wBrand
p_manufacturerIds = [] # field = wManufacturerPartNo
p_supplierIds = [] # wSupplierId
p_sources = [] # field = wSource
p_descriptions = [] # field = wDescription
p_details = [] # field = wSupplementalDetails
p_categories = [] # field = wCategory
p_status = [] # field = wStatus
# set api-endpoint and parameters
# product?apikey=4f032b1a18ab3f36&supplier=RS&id=100-0151
# https://api.ince.live/product?apikey=4f032b1a18ab3f36&supplier=RS&id=121-084
# https://api.ince.live/product?apikey=4f032b1a18ab3f36&id=60032-RSH
URL = "https://api.ince.live/product"
apikey = '4f032b1a18ab3f36'
supplier = 'RS'
if test == True:
search_vals = mMats_test
else:
search_vals = mMats
i = 0
for code in search_vals:
if code == 'x':
print(code, ': empty')
p_brands.append('')
p_manufacturerIds.append('')
p_supplierIds.append('')
p_sources.append('')
p_descriptions.append('')
p_details.append('')
p_categories.append('')
p_status.append('')
i += 1
continue
elif code != 'x':
#print(code) # test
# send get request to api and save the response in a response object
#PARAMS = {'apikey':apikey, 'supplier':supplier, 'id':code}
PARAMS = {'apikey':apikey, 'supplier': supplier, 'id':code}
r = requests.get(url = URL, params = PARAMS)
# extract the data in json format
# handle code 500 server error
try:
data = r.json()
except:
data = 'Status code 500'
print('{}: {}:{}'.format(code, 'server error', '[500]'))
# print results to pandas col arrays
p_brands.append('')
p_manufacturerIds.append('')
p_supplierIds.append('')
p_sources.append('')
p_descriptions.append('')
p_details.append('')
p_categories.append('')
p_status.append('')
i += 1
continue
# check to see if the api responds to the id request
try:
searchId = data['searchID'] # searchId = data[0]['searchID']
except:
searchId = 'id not found'
# if api returns response to the id request,
# it will return a list, so proceed by parsing
# the list by looping through it index-wise
# to retrieve brandStr as brand and descriptionStr as brand:manufacturerID:description
if searchId != 'id not found':
print(code, ' ', end = '')
print(data['brand'])
print('{}: {}: {}'.format(r, data['searchID'], data)) # TEST -----------------------
# because the api may return multiple dictionaries for a single searchID,
# we'll collect the results in list containers, and afterward append the lists
# to the column containers for pandas; the mapping is:
# -------------------------------------------------------------------------------------------------------------------------------------------------------
# api key: brand | manufacturerID | supplierID | source | description | details | productCategory |
# wx field: wBrand | wManufacturerId | wSupplierId | wSource | wDescription | wSupplementalDetails | wCategory | wStatus
# py container: p_brands | p_manufacturerIds | p_supplierIds | p_sources | p_descriptions | p_details | p_categories |
# -------------------------------------------------------------------------------------------------------------------------------------------------------
detailsStr = []
# handle errors where details return a null value
try:
details = data[0]['details']
except:
details = 'none'
# print results to console
print('{}: {} | {} | {} | {} | {} | {} | {}'.format(
code, data['brand'], data['manufacturerID'],
data['supplierID'], data['source'], data['description'],
details, data['productCategory']))
'''
print('{}: {} | {} | {} | {} | {} | {} | {}'.format(
code, data[0]['brand'], data[0]['manufacturerID'],
data[0]['supplierID'], data[0]['source'], data[0]['description'],
details, data[0]['productCategory']))
'''
# print results to pandas col arrays
p_brands.append(data['brand']) # (brandStr)
p_manufacturerIds.append(data['manufacturerID'])
p_supplierIds.append(data['supplierID'])
p_sources.append(data['source'])
p_descriptions.append(data['description']) # (descriptionStr)
p_details.append(details)
p_categories.append(data['productCategory'])
p_status.append('External')
else:
# print results to console
print('{}: empty'.format(code))
# print results to pandas col arrays
p_brands.append('')
p_manufacturerIds.append('')
p_supplierIds.append('')
p_sources.append('')
p_descriptions.append('')
p_details.append('')
p_categories.append('')
p_status.append('')
i+= 1
# end api call //
# clean up details
'''
j = 0
for item in p_details:
# if there are details returned by api, clean them up before
# printing them to the excel file
if p_details[j] != '':
nuDetail = p_details[j]
nuDetail = nuDetail.replace('- Bore', 'Bore')
nuDetail = nuDetail.replace('- Width', ', Width')
nuDetail = nuDetail.replace('- Outer', ', Outer')
nuDetail = nuDetail.strip()
p_details[j] = nuDetail
j += 1
'''
# print contents of pandas arrays to excel file (.xlsx)
# ---------------------------------------------------------------------------------------------------------------------------------------------------------
# api key: brand | manufacturerID | supplierID | source | description | details | productCategory |
# wx field: wBrand | wManufacturerId | wSupplierId | wSource | wDescription | wSupplementalDetails | wCategory | wStatus
# py container: p_brands | p_manufacturerIds | p_supplierIds | p_sources | p_descriptions | p_details | p_categories |
# ---------------------------------------------------------------------------------------------------------------------------------------------------------
df = pd.DataFrame({'wBrand':p_brands, 'wManufacturerId':p_manufacturerIds, 'wSupplierId':p_supplierIds, 'wSource':p_sources, 'wDescription':p_descriptions, 'wSupplementalDetails':p_details, 'wCategory':p_categories, 'wStatus':p_status})
writer = pd.ExcelWriter(pdFile)
df.to_excel(writer,'Product Data', index=False)
writer.save()
print('File written to: \n{}'.format(pdFile))
# end program
print('Done.')
if __name__ == '__main__': main()