2017-07-18 100 views
1

E * Trade API允许您使用RESTful登录到该网站并操作帐户或检索报价信息。虽然我无法生成符合他们的“实践问题”位于朝 https://us.etrade.com/ctnt/dev-portal/getContent?contentId=306a9d46-58c2-4cac-85f6-7717aea056bd使用Python为ETrade API生成oauth_signature

简单HMAC-SMA1算法已被编码下方的底部,并再现从这里https://oauth.net/core/1.0a/#sig_base_example的OAuth的核心1.0a的签名值的oauth_signature。虽然我无法获得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网站不匹配。

+0

我在.NET中,所以我只能帮概念,不specfic代码。 – BWhite

+0

查看该页面上的示例获取请求。签名进入获取请求。你有相反的方向。 – BWhite

+0

签名方法需要两个参数,文本和一个键。关键是“消费者秘密和令牌秘密,由'&'分隔”。所以它看起来像你有那个部分是正确的。我没有在任何一页上看到有关要签署文本的细节。很确定它不应该包含URL。玩编码不同的作品。 – BWhite

回答

1

一个问题是,oauth_token需要在参数字符串中进行编码(它最终会被双重编码)。我的是以下几点:

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

这些字符串由Python3中的quote_plus()函数编码。然后,这由后面的.encode()编码为utf-8。这是我传递给哈希函数的东西;键= 7d30246211192cda43ede3abd9b393b9&XCF9RzyQr4UEPloA%2BWlC06BnTfYC1P0Fwr3GUw%2FB0Es%3D 原料= GET&HTTPS%3A%2F%2Fetws.etrade.com%2Faccounts%2Frest%2Faccountlist&oauth_consumer_key%3Dc5bb4dcb7bd6826c7c4340df3f791188%26oauth_nonce%3D0bba225a40d1bbac2430aa0c6163ce44%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1344885636%26oauth_token%3DVbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI% 3D – jsfa11

+0

@ jsfa11这就是我所说的双重编码。你的oauth_token应该已经单独编码了,并且你的代码中的quote_plus会再次对它进行编码。例如,'='变成%3D,然后变成%253D。您的密钥字符串是正确的,但 '原始' 应该是:GET和HTTPS%3A%2F%2Fetws.etrade.com%2Faccounts%2Frest%2Faccountlist&oauth_consumer_key%3Dc5bb4dcb7bd6826c7c4340df3f791188%26oauth_nonce%3D0bba225a40d1bbac2430aa0c6163ce44%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1344885636%26oauth_token%3DVbiNYl63EejjlKdQM6FeENzcnrLACrZ2JYD6NQROfVI %253D – kingdc

+0

你知道些什么?谢谢kingdc!我在这一个上很慢。你的回答是正确的。 – jsfa11