Вместо использования библиотеки для конкретного использования доступа к 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, над которым я работаю