2017-07-18 4 views
1

E * Trade APIを使用すると、RESTfulを使用してサイトにログオンし、アカウントを操作したり、見積もり情報を取得できます。私は下に符号化されている https://us.etrade.com/ctnt/dev-portal/getContent?contentId=306a9d46-58c2-4cac-85f6-7717aea056bdPythonを使用して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のWebサイトと一致しません。

+0

私は.NETにありますので、私は概念的には具体的なコードではなく助けてください。 – BWhite

+0

そのページのget requestリクエストの例を見てください。署名はget要求に含まれます。あなたはそれを逆にしている。 – BWhite

+0

署名メソッドは、テキストとキーの2つのパラメータをとります。キーは「コンシューマーシークレットとトークンシークレット」で、「&」で区切られています。だからあなたはその部分が正しいように私に見えます。どちらのページにも、署名するテキストの内容についての詳細は表示されません。 URLを含めないでください。さまざまな部分をエンコードして遊んでください。 – BWhite

答えて

1

1つの問題は、oauth_tokenをパラメータ文字列にエンコードする必要があることです(2つのエンコードになります)。私は以下のとおりです:

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

関連する問題