Я пытаюсь получить данные о продукте из API.
По умолчанию этот API возвращает 20 продуктов, и в одном запросе API может вернуть до 500 продуктов, если мы используем параметр API Limit = 500.
Так что для извлечения всех продуктов нам нужно использовать еще один параметр с Limit-Offset (Количество пропускаемых продуктов).
Я написал следующую функцию для достижения этой цели, но в случае полных данных моя функцияне работает должным образом, и это выдает мне ошибку, как - Ошибка входа в систему, несоответствие подписи.
def get_data(userid, api_key, action, pagination=True):
timeformat = datetime.datetime.now().replace(microsecond=0).isoformat() + '+08:00'
endpoint = 'https://example.com'
page_json = {}
# set required parameters for this api
parameters = {
'UserID': userid,
'Version': '1.0',
'Action': action,
'Format': 'JSON',
'Timestamp': timeformat
}
if pagination:
page = 0
parameters['Limit'] = 500
while True:
parameters['Offset'] = 500 * page
# set the required cryptographic signature
concatenated = urllib.parse.urlencode(sorted(parameters.items()))
parameters['Signature'] = HMAC(api_key, concatenated.encode('utf-8'), sha256).hexdigest()
page += 1
try:
response = requests.get(endpoint, params=parameters)
page_json = response.json()
except requests.exceptions.ConnectionError:
print("Connection refused!")
sleep(5)
else:
try:
concatenated = urllib.parse.urlencode(sorted(parameters.items()))
# set the required cryptographic signature
parameters['Signature'] = HMAC(api_key, concatenated.encode('utf-8'), sha256).hexdigest()
response = requests.get(endpoint, params=parameters)
page_json = response.json()
except requests.exceptions.ConnectionError:
print("Connection refused!")
sleep(5)
return page_json
Похоже, я неправильно подгоняю строку параметров своей подписи в случае полных данных. Я напечатал значение concatenated
и похоже, что
страница состоит из 1 сцепленного элемента :: Action = GetProducts & Format = JSON & Limit = 500 & Offset = 500 & Signature = 3d9cd320a4bf816aeea828b9392ed2d5a27cd584b3a337338909c0ab161sta00% 2% 2%% 2% 2% 0%% 2% 2% 0%% 2% 2% 0%% 2% 0%% 2% 0% 2% 0%% 2% 0%% 2% 0%% 2% 0% 2% 0%% 2% 0%% 2%% 0.sg & Version = 1.0 try: {'ErrorResponse': {'Head': {'ErrorCode': '7', 'ErrorMessage': 'E7: Логин fболело.Несоответствие подписи ',' ErrorType ':' Sender ',' RequestAction ':' GetProducts ',' RequestId ':' 0bb606c015273197313552686ec46f '}}}
страница состоит из двух составных частей :: Action = GetProducts & Format = JSON & Limit = 500 & Offset =1000 & Подпись = c1bda1a5ab21c4e4182cc82ca7ba87cb9fc6c5f24c36f9bb006f9da906cf7083 & Отметка времени = 2018-05-26T12% 3A58% 3A38% 2B08% 3A00 & UserID = контакт% 40example.com.sg {Ошибка: ошибка: версия: ошибка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: попытка: ошибка: версия: ошибка: ошибка: ошибка: версия':' E7: вход не выполнен.Несоответствие подписи ',' ErrorType ':' Sender ',' RequestAction ':' GetProducts ',' RequestId ':' 0bb606c015273197321748243ec3a5 '}}}
Можете ли вы взглянуть на мою функцию и помочь мне узнать, чтоЯ написал неправильно, и как это должно быть?