【发布时间】:2020-03-25 07:52:10
【问题描述】:
我一直在尝试制作一个与 MKM 的 API 交互的应用,但我决定不使用 OAuth1 库并自己制作标头,但我遇到了 Oauth1 需要的签名问题。整个过程(对于php)可以在here找到。
这是我目前拥有的代码(我正在通过尝试发送单个请求来测试 API,以便了解它是如何工作的)
代码:
#!/usr/bin/env python3
import requests
from urllib.parse import quote_plus as rawurlencode
import time
import string
import random
import operator
import uuid
from hashlib import sha1
from hmac import new as hmac
#check this https://stackoverflow.com/questions/27075944/oauth1-0-api-issue-with-python/32510649
def main():
app_token = "XXXXXXXXX"
app_secret = "XXXXXXXXX"
access_token = "XXXXXXXXX"
access_token_secret = "XXXXXXXXX"
signing_key = str(app_secret+'&'+access_token_secret)
nonce = uuid.uuid4().hex
url = 'https://api.cardmarket.com/ws/v2.0/account'
base_url='GET&'+rawurlencode(url)+'&'
params = 'oauth_consumer_key=XXXXXXXXX&'+ \
'oauth_nonce='+nonce+'&'+\
'oauth_signature_method="HMAC-SHA1&'+\
'oauth_timestamp='+str(int(time.time()))+'&'+\
'oauth_token=XXXXXXXXX&'+\
'oauth_version=1.0'
base_string = rawurlencode(params)
string_f = base_url+base_string
signature = hmac(signing_key.encode('utf-8'), base_string, sha1).digest().encode('base64')[:-1]
MyHeader = 'OAuth ' + 'realm="' + url + '", '
MyHeader += 'oauth_consumer_key' + '="' + 'XXXXXXXXX' + '",'
MyHeader += 'oauth_nonce' + '="' + nonce + '",'
MyHeader += 'oauth_signature_method' + '="' + 'HMAC-SHA1' + '",'
MyHeader += 'oauth_timestamp' + '="' + str(int(time.time())) + '",'
MyHeader += 'oauth_token' + '="' + 'XXXXXXXXX' + '",'
MyHeader += 'oauth_version' + '="' + '1.0' + '",'
MyHeader += 'oauth_signature="' + signature +'"'
headers = {'Authorization': MyHeader}
response = request.get(url,headers=headers)
print(response.json())
#print(base_string+"\n\n")
#print("KEY "+signing_key+"\n\n")
#print("String final "+string_f+"\n\n")
if __name__ == "__main__":
main()
当我使用脚本时,我会收到下一条消息:
Traceback (most recent call last):
File "origin.py", line 58, in <module>
main()
File "origin.py", line 36, in main
signature = hmac(signing_key.encode('utf-8'), base_string, sha1).digest().encode('base64')[:-1]
File "/usr/lib/python3.6/hmac.py", line 144, in new
return HMAC(key, msg, digestmod)
File "/usr/lib/python3.6/hmac.py", line 84, in __init__
self.update(msg)
File "/usr/lib/python3.6/hmac.py", line 93, in update
self.inner.update(msg)
TypeError: Unicode-objects must be encoded before hashing
现在,我一直在对此进行调查,并在 HMAC 构造函数上尝试了不同的方法,因此它不会失败,我什至将构造函数和 digest() 分开,以便我可以更准确地确定错误是。话虽如此,我已经没有想法了,我已经阅读了大约 100 篇关于这个特定 TypeError 的不同帖子,我真的不知道该怎么办了,这可能会是一件非常愚蠢的事情,但我真的需要你的帮助大家,老实说我有点失去理智:D
【问题讨论】:
标签: python python-3.x oauth typeerror hmac