Ошибка не авторизованного POST-запроса с использованием oauth2 python - PullRequest
0 голосов
/ 07 октября 2019

Вместо использования библиотеки для конкретного использования доступа к API (например, библиотеки TwitterSearch и т. Д.), Я хочу понять концепцию кодирования запросов и ответов API как можно более фундаментальную.

Из ответа этой темы Я обнаружил, что есть библиотека oauth2 , которую я могу использовать.

Я уже реализовал ее для Twitter POST и GETМетоды доступа к API через , этот пример предоставил и успешно его собрал сам.

Когда я попытался реализовать тот же метод для API Goodreads из кода API Twitter, который я построил, он был успешным для метода GETно не для POST.

Ниже приведены коды API Goodreads вместе с кодами Twitter, которые я использовал для справки.

Twitter GET:

import oauth2 as oauth
import time, ssl, json
import urllib.request, urllib.parse, urllib.error

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'
params = {
    'oauth_version': "1.0",
    'oauth_nonce': oauth.generate_nonce(),
    'oauth_timestamp': str(int(time.time())),
    'count': '3',
}

token = oauth.Token(key="75230340-cwrB.......", secret="OUsh3xgdZ.........IfIDiy")
consumer = oauth.Consumer(key="gmW4......Oh4tV", secret="S9c5J3.....unbUTL")

# Set our token/key parameters
params['oauth_token'] = token.key
params['oauth_consumer_key'] = consumer.key

# Create our request. Change method, etc. accordingly.
req = oauth.Request(method="GET", url=url, parameters=params)

# Sign the request.
signature_method = oauth.SignatureMethod_HMAC_SHA1()
req.sign_request(signature_method, consumer, token)
url_final = req.to_url()

#url request
print('\nRetrieving', url_final, '\n')
connection = urllib.request.urlopen(url_final, context=ctx)
data = connection.read().decode('utf-8')

js = json.loads(data)
jsdmp = json.dumps(js, indent=2)
print(jsdmp)

Goodreads GET:

import oauth2 as oauth
import time, ssl, json
import urllib.request, urllib.parse, urllib.error

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

url = 'https://www.goodreads.com/book/review_counts.json'
params = {
    'oauth_version': "1.0",
    'oauth_nonce': oauth.generate_nonce(),
    'oauth_timestamp': str(int(time.time())),
    'isbns': '9780439785969,0596009208,0596517742',
    'format': 'json',
}

consumer = oauth.Consumer(key="J9l.......cpgzg", secret="N8cW.....xrXF1V2uqFVoYc")
params['oauth_consumer_key'] = consumer.key

req = oauth.Request(method="GET", url=url, parameters=params)
url_final = req.to_url()

print('\nRetrieving', url_final, '\n')
connection = urllib.request.urlopen(url_final, context=ctx)
data = connection.read().decode('utf-8')

js = json.loads(data)
jsdmp = json.dumps(js, indent=2)
print(jsdmp, '\n')

Над Good Goodreads работает хорошо, что я пытался реализовать на основе предыдущего GET Twitter.

Но ниже POST Goodreads 'не работает и показывает сообщение «Not Authorized» от print (content) in client.request ()

POST в Twitter:

import oauth2 as oauth
import time, ssl
import urllib.request, urllib.parse, urllib.error

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

url = 'https://api.twitter.com/1.1/statuses/update.json'
params = {
    'oauth_version': "1.0",
    'oauth_nonce': oauth.generate_nonce(),
    'oauth_timestamp': str(int(time.time())),
    'status': 'hello, it\'s me',
}

token = oauth.Token(key="75230340-cw.............iNsP35Eq", secret="OUsh3.....IDiy")
consumer = oauth.Consumer(key="gmW4b....h4tV", secret="S9c5J3O....unbUTL")
params['oauth_token'] = token.key
params['oauth_consumer_key'] = consumer.key

client = oauth.Client(consumer, token)
resp, content = client.request(
    url,
    method='POST',
    body=urllib.parse.urlencode(params),
)
print(resp, '\n\n ***BORDER*** \n\n', content)

ПОЗИЦИЯ Goodreads:

import oauth2 as oauth
import time, ssl
import urllib.request, urllib.parse, urllib.error

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

url = 'https://www.goodreads.com/author_followings'
params = {
    'oauth_version': "1.0",
    'oauth_nonce': oauth.generate_nonce(),
    'oauth_timestamp': str(int(time.time())),
    'id': '1077326',
    'format': 'xml',
}

consumer = oauth.Consumer(key="J9l5JsnPR...gzg", secret="N8cWf4Da03.....qFVoYc")
params['oauth_consumer_key'] = consumer.key

client = oauth.Client(consumer)
resp, content = client.request(
    url,
    method='POST',
    body=urllib.parse.urlencode(params),
)
print(resp, '\n\n ***BORDER*** \n\n', content)

Я немного сбит с толку, разве это не значит, что он уже авторизован, поскольку я уже использовал:

client = oauth.Client(consumer)
resp, content = client.request(
    url,
    method='POST',
    body=urllib.parse.urlencode(params),
)

.. в POST-коде Goodreads выше? Это параметр для определения авторизации?

Это документация для POST этого Goodreads, над которым я работаю

...