получить ошибку при получении полных данных с моей функцией Python? - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь получить данные о продукте из 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 '}}}

Можете ли вы взглянуть на мою функцию и помочь мне узнать, чтоЯ написал неправильно, и как это должно быть?

1 Ответ

0 голосов
/ 27 мая 2018

Попробуйте, пожалуйста:

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)
        del parameters['Signature'] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...