Reputation: 4365
I'm new to Python. Trying to automate some painful API calls using the Python requests
module. Getting pretty close, but can't figure out how to pass lists of timestamps as request parameters
Example: Generate list of lastModified
timestamps
import datetime
from datetime import datetime, timedelta
earliest_ts_str = '2020-10-01T15:00:00Z'
earliest_ts_obj = datetime.strptime(earliest_ts_str, timestamp_format)
#bottom_ts_obj = earliest_ts_obj.replace(second=0, microsecond=0, minute=0)
latest_ts_str = '2020-10-01T23:00:00Z'
latest_ts_obj = datetime.strptime(latest_ts_str, timestamp_format)
ts_raw = []
while earliest_ts_obj < latest_ts_obj:
ts_raw.append(earliest_ts_obj)
earliest_ts_obj += timedelta(hours=1)
ts_raw.append(latest_ts_obj)
ts_formatted = [d.strftime('%Y-%m-%dT%H:%M:%SZ') for d in ts_raw]
ts_formatted
Results:
['2020-10-01T15:00:00Z',
'2020-10-01T16:00:00Z',
'2020-10-01T17:00:00Z',
'2020-10-01T18:00:00Z',
'2020-10-01T19:00:00Z',
'2020-10-01T20:00:00Z',
'2020-10-01T21:00:00Z',
'2020-10-01T22:00:00Z',
'2020-10-01T23:00:00Z']
Example 2: Create the request
call
lastModifiedStart
parameter? ANDlastModifiedEnd
parameter?import requests
method = 'get'
base_url = 'https://sandbox-api.com/'
api_type = 'items'
api_version = '/v1/'
api_path = api_type + api_version
api_key = 'myKey'
full_url = base_url + api_path
def make_historic_calls(last_mod_start, last_mod_end):
last_mod_start = for ts in ts_formatted: ts
last_mod_end = for ts in ts_formatted: ts
parameters = {'api_key':api_key, 'lastModifiedStart': last_mod_start, 'lastModifiedEnd': last_mod_end}
auth_header = {'Authorization': 'Basic <base64EncodedStringHere>'}
resp_raw = requests.request(method, full_url, headers=auth_header, params=parameters)
resp_processed = json.loads(resp_raw.content)
resp_pretty = json.dumps(resp_processed, indent=2, sort_keys=True)
return print(pretty)
test = make_historic_calls(ts_formatted, ts_formatted)
I know this isn't an easy solve (its taken me days and days to get this far), but any guidance on how to tackle this would be appreciated.
Thank you
EDIT 1: This adjusted function works great!
def make_historic_calls(ts_formatted):
for last_mod_start, last_mod_end in zip(ts_formatted, ts_formatted[1:]):
parameters = {'api_key':api_key, 'lastModifiedStart': last_mod_start, 'lastModifiedEnd': last_mod_end}
auth_header = {'Authorization': 'Basic <base64EncodedString>'}
resp_raw = requests.request(method, full_url, headers=auth_header, params=parameters)
print(f'{resp_raw.url} Status Code: {str(resp_raw.status_code)}')
return print(resp_raw)
test = make_historic_calls(ts_formatted)
Upvotes: 0
Views: 1682
Reputation: 283
So basically what you want to do is to chunk the list by 2 elements, and then unpack those 2 element lists and pass them to functions, consider something like the following generator:
def chunks(l, n):
"""Yield successive n-sized chunks from l."""
for i in range(0, len(l), n):
yield l[i:i + n]
And then you can use it like the following:
for first, second in chunks(iterable, 2):
make_historic_calls(first, second)
Hope this helps
Edit: I'm not sure if you want to pass the variables by pairs that overlap or don't, if you want them to overlap like (0,1) (1,2) (2,3)... instead of (0,1) (2,3) (4,5)... then use the version of "chunks" below:
def chunks(l, n, repeat=True):
"""Yield successive n-sized chunks from l."""
for i in range(0, len(l), n):
additional = int(repeat)
yield l[i:i + n + additional]
Upvotes: 2
Reputation: 11230
The standard trick for extracting pairs of consecutive items from a list is:
for this_one, next_one in zip(my_list, my_list[1:]):
...
So your code needs to be something like:
def make_historic_calls(ts_formatted):
for last_mod_start, last_mod_end in zip(ts_formatted, ts_formatted[1:]):
make the request using last_mod_start and last_mod_end
return some value combining all of the results from your requests
make_historic_calls(ts_formatted)
I hope I've understood correctly what it is you're trying to do.
Upvotes: 2