使用Python为ETrade API生成oauth_签名

使用Python为ETrade API生成oauth_签名,python,oauth,etrade-api,Python,Oauth,Etrade Api,E*Trade API允许您使用RESTful登录到站点并操作帐户或检索报价信息。尽管我在生成一个oauth_签名时遇到了麻烦,该签名与位于页面底部的“实践问题”相匹配 下面对简单的HMAC-SMA1算法进行了编码,并从此处复制了oauth core 1.0a签名值。虽然我无法获得E*Trade签名值进行复制 def generate_oauth_signature(): from urllib.parse import quote_plus from hashlib impo

E*Trade API允许您使用RESTful登录到站点并操作帐户或检索报价信息。尽管我在生成一个oauth_签名时遇到了麻烦,该签名与位于页面底部的“实践问题”相匹配

下面对简单的HMAC-SMA1算法进行了编码,并从此处复制了oauth core 1.0a签名值。虽然我无法获得E*Trade签名值进行复制

def generate_oauth_signature():
    from urllib.parse import quote_plus
    from hashlib import sha1
    import binascii
    import hmac

    key = quote_plus('7d30246211192cda43ede3abd9b393b9') + \
          '&' + \
          quote_plus('XCF9RzyQr4UEPloA+WlC06BnTfYC1P0Fwr3GUw/B0Es=')
    key = key.encode()
    raw = quote_plus('GET') + '&' + \
          quote_plus('https://etws.etrade.com/accounts/rest/accountlist') + '&' + \
          quote_plus('oauth_consumer_key=c5bb4dcb7bd6826c7c4340df3f791188&oauth_nonce=0bba225a40d1bbac2430aa0c6163ce44&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1344885636&oauth_token=VbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI=')
    raw = raw.encode()
    hashed = hmac.new(key, raw, sha1)
    sig = hashed.digest()
    oauth_signature = quote_plus(binascii.b2a_base64(hashed.digest())[:-1])
该函数应该产生“%2FXiv96DzZabnUG2bzPZIH2RARHM%3D”,但我还没有。有人为E*Trade API设计过哈希吗


我知道etradepy.py是一个不错的软件包,但有点过时,与当前的E*Trade网站不匹配

一个问题是oauth_令牌需要在参数字符串中编码(它最终将被双重编码)。我的意见如下:

oauth_consumer_key=c5bb4dcb7bd6826c7c4340df3f791188&oauth_nonce=0bba225a40d1bbac2430aa0c6163ce44&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1344885636&oauth_token=VbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI%3D

我在.NET中,所以我只能在概念上提供帮助,而不能提供特定的代码。签名进入get请求。签名方法有两个参数,文本和密钥。密钥是“消费者机密和令牌机密,由“&”分隔。所以在我看来你的那部分是正确的。我在这两页上都没有看到关于要签署的文本应该是什么的任何细节。很确定它不应该包含URL。使用不同的编码进行处理。我的标题大致类似于授权:OAuth OAuth_token=“UedyRLaPYUX0shFt3jYLPUVDhT5MsfOWQc%2f9tx2xszwg%3D”,OAuth_nonce=“7f4352f8d79094648bc5629c39981d31”,OAuth_consumer_key=“fc30012ef9f37fd768e935e84f1e413e”,OAuth_签名方法=“HMAC-SHA1”,OAuth_timestamp=“1500449672”,OAuth_version=“1.0”,oauth_signature=“cayqmncuz5dzsxeuwxyunhufgs%3D”非常感谢您花时间回答我的问题。这是一件有趣的事,这件事。。。。但是这是来自OAuth网站here()。字符串由Python3中的quote_plus()函数编码。然后,下面的.encode()将其编码为utf-8。下面是我传递给散列函数的内容;密钥=7D3024621192CDA43EDE3ABD9B393B9和XCF9RzyQr4UEPloA%2BLLC06BNTFYC1P0FWR3GUW%2BF0ES%3D原始=获取和https%3A%2F%2etws.etrade.com%2Accounts%2Frest%2AccountList&oauth_consumer_key%3dc5bb4dcb7bd6826c7c340df3f791188%26oauth_nonce%3D0bba225a40d1bbac2430aa0c6163ce44%26oauth_签名方法%3DHMAC-SHA1%26oauth_时间戳%3dcn1344885636%26oauth_令牌%3dvbinyl63;3D@jsfa11这就是我的意思双重编码。您的oauth_令牌应该已经单独编码,并且代码中的引号_plus将再次对其进行编码。例如,“=”变成%3D,然后变成%253D。您的密钥字符串正确,但“原始”应为:获取和https%3A%2F%2etws.etrade.com%2accounts%2Frest%2accountlist&oauth\u消费者密钥%3dc5bb4dcb7bd6826c7c7c340df3f791188%26oauth\u当前值%3D0bba225a40d1bbac2430aa0c6163ce44%26oauth\u签名\u方法%3DHMAC-SHA1%26oauth\u时间戳%3d1344885z6%26oauth\u令牌%3dvbinyl63eejjjjjjjkdqnz6feenzvvi知道吗?谢谢kingdc!我在这件事上做得很慢。你的答案是正确的。我花了很长时间才让他们的例子与我的(不是用python)相匹配,这不是一个非常直观的过程。你认为你能再次提供帮助吗?我拿到了我的令牌,这是秘密,然后我想访问一些引用是下一件容易的事情。我试了很多。新的时间戳,新的签名,新的令牌和密码,带和不带验证码。只是不适合我。这些文档对于请求的标头和oauth中包含的内容是模糊的。