@Rjavii

Как правильно из Python сгенерировать oauth signature для cUrl запроса?

Мне нужно сделать API запрос из Python к сайту размещенному на хостинге Ucoz.

Для формирования запроса на сайте дана следующая инструкция:
curl -i -X GET -G --data-urlencode "oauth_consumer_key=ЗНАЧЕНИЕ" --data-urlencode "oauth_nonce=значение" --data-urlencode "oauth_signature_method=HMAC-SHA1" --data-urlencode "oauth_timestamp=значение" --data-urlencode "oauth_version=1.0" --data-urlencode "oauth_token=значение" --data-urlencode "auth_signature=значение" --data-urlencode "param=one" --data-urlencode "param2=two" ваш_сайт/uapi/ping

Написал код согласно инструкции.
Результатом постоянно получаю ошибку 401 {"error":{"msg":"Invalid signature","code":"INVALID_SIGNATURE"}}

В чем может быть ошибка?

Код:
spoiler

import time
import urllib.parse
import hmac
import hashlib
from base64 import b64encode
import binascii
import requests
import base64


oauth_consumer_key = 'csszonasite'
oauth_nonce = str(int(time.time()*1000))
oauth_signature_method = 'HMAC-SHA1'
oauth_timestamp = str(int(time.time()))
oauth_version = '1.0'
oauth_token = 'gFBUa63v.6kOaF5Sve0auTiZYKddqHIVEv8kb7x2'

def create_parameter_string(oauth_consumer_key,oauth_nonce,oauth_signature_method,oauth_timestamp,oauth_version,oauth_token):
    parameter_string = ''
    parameter_string = parameter_string + '&oauth_consumer_key=' + oauth_consumer_key
    parameter_string = parameter_string + '&oauth_nonce=' + oauth_nonce
    parameter_string = parameter_string + '&oauth_signature_method=' + oauth_signature_method
    parameter_string = parameter_string + '&oauth_timestamp=' + oauth_timestamp
    parameter_string = parameter_string + '&oauth_version=' + oauth_version
    parameter_string = parameter_string + '&oauth_token=' + oauth_token
    return parameter_string

parameter_string = create_parameter_string(oauth_consumer_key,oauth_nonce,oauth_signature_method,oauth_timestamp,oauth_version,oauth_token)
encoded_parameter_string = urllib.parse.quote(parameter_string, safe='')

print('строка параметров: ', '\n', parameter_string)

url = 'http://css-zona.ru/uapi/publ'
encoded_base_string = 'GET' + '&' + urllib.parse.quote(url, safe='')
encoded_base_string = encoded_base_string + '&' + encoded_parameter_string

print('базовая строка: ', '\n',  encoded_base_string)

signing_key = 'Здесь Consumer secret' + '&' + 'здесь OAuth token secret'

def create_signature(secret_key, string):
    string_to_sign = string.encode('utf-8')
    encoded_key = secret_key.encode('utf-8')
    temp = hmac.new(encoded_key, string_to_sign, hashlib.sha1).hexdigest()
    byte_array = b64encode(binascii.unhexlify(temp))
    return byte_array.decode("utf-8")

result = create_signature(signing_key, encoded_base_string)
print('сигнатура: ', '\n',  result)

params1 = {'oauth_consumer_key': oauth_consumer_key, 'oauth_nonce': oauth_nonce, 'oauth_signature_method': oauth_signature_method,
           'oauth_timestamp': oauth_timestamp, 'oauth_version': oauth_version, 'oauth_token': 'gFBUa63v.6kOaF5Sve0auTiZYKddqHIVEv8kb7x2',
           'oauth_signature': result}

resp = requests.get('http://css-zona.ru/uapi/publ', params=params1)

print('отправленный запрос: ', '\n',  resp.url)
print('ответ: ', '\n',  resp.text)
print(resp)




Выдача в процессе отработки кода:
spoiler

строка параметров:
&oauth_consumer_key=csszonasite&oauth_nonce=1687546825723&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1687546825&oauth_version=1.0&oauth_token=gFBUa63v.6kOaF5Sve0auTiZYKddqHIVEv8kb7x2

базовая строка:
GET&http%3A%2F%2Fcss-zona.ru%2Fuapi%2Fpubl&%26oauth_consumer_key%3Dcsszonasite%26oauth_nonce%3D1687546825723%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1687546825%26oauth_version%3D1.0%26oauth_token%3DgFBUa63v.6kOaF5Sve0auTiZYKddqHIVEv8kb7x2

сигнатура:
Q9J00o6gCEJdwbruysbgmGhBjdo=

отправленный запрос:
css-zona.ru/uapi/publ?oauth_consumer_key=csszonasite&oauth_nonce=1687546825723&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1687546825&oauth_version=1.0&oauth_token=gFBUa63v.6kOaF5Sve0auTiZYKddqHIVEv8kb7x2&oauth_signature=Q9J00o6gCEJdwbruysbgmGhBjdo%3D

ответ:
{"error":{"msg":"Invalid signature","code":"INVALID_SIGNATURE"}}

  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
curl вариант работает с твоими параметрами?

тогда импорт в postman
проверка работы
экспорт в python (requests обычно )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы