etsy-api-oauth1 PUT-запросы возвращают неверную подпись, когда сделаны из python, но не из Почтальона - PullRequest
0 голосов
/ 10 февраля 2020

Я устранял проблему при отправке запроса PUT в API ETSY REST, когда я делаю запрос PUT, я получаю signature invalid error. Я перепробовал все решения, найденные в Google, но ни одно из них, похоже, не работает.

Отправка того же запроса через POSTMAN работает, если я задаю параметры аутентификации для go в теле. Однако, когда я пытаюсь повторить это, используя стандартные процедуры python, я получаю тот же invalid signature error.

Даже если я экспортирую код python для этого точного запроса от почтальона, я получаю недействительную подпись ошибка при запуске указанного кода в python.

Это json данные, которые мне нужно отправить:

"products": [
      {
         "product_id":4262200422,
         "sku":"00100012",
         "property_values":[
            {
               "property_id":200,
               "property_name":"Primary color",
               "scale_id":null,
               "scale_name":null,
               "values":[
                  "Black"
               ],
               "value_ids":[
                  1
               ]
            }
         ],
         "offerings":[
            {
               "offering_id":4128359213,
               "price":{
                  "amount":200,
                  "divisor":100,
                  "currency_code":"GBP",
                  "currency_formatted_short":"\\u00a32.00",
                  "currency_formatted_long":"\\u00a32.00 GBP",
                  "currency_formatted_raw":"2.00"
               },
               "quantity":12,
               "is_enabled":1,
               "is_deleted":0
            }
         ],
         "is_deleted":0
      },
      {
         "product_id":4031391357,
         "sku":"00100013",
         "property_values":[
            {
               "property_id":200,
               "property_name":"Primary color",
               "scale_id":null,
               "scale_name":null,
               "values":[
                  "Bronze"
               ],
               "value_ids":[
                  1216
               ]
            }
         ],
         "offerings":[
            {
               "offering_id":4244423138,
               "price":{
                  "amount":300,
                  "divisor":100,
                  "currency_code":"GBP",
                  "currency_formatted_short":"\\u00a33.00",
                  "currency_formatted_long":"\\u00a33.00 GBP",
                  "currency_formatted_raw":"3.00"
               },
               "quantity":56,
               "is_enabled":1,
               "is_deleted":0
            }
         ],
         "is_deleted":0
      }
   ],
"price_on_property": [200],
"quantity_on_property": [200],
"sku_on_property": [200]

Etsy использует Oauth1, запросы POST и GET работают нормально в Python, но не работают в POSTMAN , возвращая неверную ошибку подписи.

Может, они делают что-то по-другому, что вызывает такое поведение?

Мне нужно создать запрос, который просто берет данные о продукте, данные oauth1 и отправляет их Etsy. , Пожалуйста, дайте мне знать, что мне не хватает.

1 Ответ

0 голосов
/ 16 февраля 2020

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

Это код, который я использовал для выполнения запроса PUT --- Определение класса.

class etsyClient:
def __init__(self, consumer_key, consumer_secret, resource_owner_key, 
                                                  resource_owner_secret):
    self.consumer_key = consumer_key
    self.consumer_secret = consumer_secret
    self.resource_owner_key = resource_owner_key
    self.resource_owner_secret = resource_owner_secret

    self.oauthclient = self.regen()

def regen(self, sig=oauth1.SIGNATURE_HMAC_SHA1):
    client = oauth1.Client(self.consumer_key,
                           client_secret=self.consumer_secret,
                           resource_owner_key=self.resource_owner_key,
                           resource_owner_secret=self.resource_owner_secret,
                           signature_method=sig)
    return client

Фактический код запроса:

    uri, headers, body = self.client.regen(sig=oauth1.SIGNATURE_PLAINTEXT).sign(
        f"https://openapi.etsy.com/v2/listings/{self.product.listing.id}/inventory")

    r = requests.session()
    headers["Content-Type"] = "application/x-www-form-urlencoded"
    data = {
            "listing_id": self.product.listing.id,
            "products": json.dumps(products),
            'price_on_property': [200],
            'quantity_on_property': [200],
            'sku_on_property': [200]
    }
    a = r.put(uri, headers=headers, data=data)
...