在 Python 中从 etrade 获取 oauth 请求令牌 [英] Getting an oauth request token from etrade in Python
问题描述
我正在尝试使用 Python 从 etrade api(沙箱)获取 oauth 请求令牌:
I'm trying to get an oauth request token from the etrade api (sandbox) in Python with this thing:
import requests
from oauthlib.oauth1 import Client
consumer_key = 'foo' # actual key used
consumer_secret = 'bar' # actual secret used
request_url = 'https://etwssandbox.etrade.com/oauth/sandbox/request_token'
client = Client(consumer_key, client_secret = consumer_secret)
uri, headers, body = client.sign(request_url)
add_params = ', realm="", oauth_token= "", oauth_callback="oob"'
headers['Authorization'] += add_params
r = requests.get(url = uri, headers = headers)
print(r.text) # abbreviated resp: " . . . .auth_problem=consumer_key_rejected,oauth_problem_advice=The oauth_consumer_key foo can be used only in SANDBOX environment . . .
生成的标题为:
<代码> { '授权':的OAuth oauth_nonce = 99985873301258063061424248905",oauth_timestamp = 1424248905",oauth_version = 1.0",oauth_signature_method = HMAC-SHA1",oauth_consumer_key = foo" 的,oauth_signature =A7ZY91UyZz6NfSGmMA5YWGnVM%2FQ%3D", realm="", oauth_token="", oauth_callback="oob"'}
我也试过这个网址:'https://etwssandbox.etrade.com/oauth/sandbox/rest/request_token'
I have also tried the url: 'https://etwssandbox.etrade.com/oauth/sandbox/rest/request_token'
而且我尝试了没有 add_params 的标题(它似乎需要空白的 oauth_token?)
And I have tried the header without the add_params (it seems to need the blank oauth_token?)
注意:令人困惑的是,响应会定期返回:Http/1.1 400 Bad Request",具有完全相同的 url/header.
Note: Confusingly, the response periodically comes back: "Http/1.1 400 Bad Request" with exactly the same url/header.
知道我做错了什么吗?
推荐答案
etrade 的一位乐于助人的人澄清了 doc-challenged 所有 oauth api 请求(无论您是否在沙箱中工作)都需要发送到主 API 网址:https://etws.etrade.com/oauth/{api}".
A helpful person at etrade clarified for the doc-challenged that all oauth api requests (whether you are working in the sandbox or not) need to be sent to the main api url: 'https://etws.etrade.com/oauth/{api}'.
只有在验证会话后才应使用沙箱网址:'https://etwssandbox.etrade.com/{non-oauth-module}/sandbox/rest/{api}'.
It is only after authenticating a session that the sandbox urls should be used: 'https://etwssandbox.etrade.com/{non-oauth-module}/sandbox/rest/{api}'.
如果其他人在 python3 中使用 etrade 验证会话时遇到问题,这至少在沙箱中有效:
In case others are having problems authenticating a session with etrade in python3, this works in the sandbox at least:
from rauth import OAuth1Service
import webbrowser
def getSession():
# Create a session
# Use actual consumer secret and key in place of 'foo' and 'bar'
service = OAuth1Service(
name = 'etrade',
consumer_key = 'foo',
consumer_secret = 'bar',
request_token_url = 'https://etws.etrade.com/oauth/request_token',
access_token_url = 'https://etws.etrade.com/oauth/access_token',
authorize_url = 'https://us.etrade.com/e/t/etws/authorize?key={}&token={}',
base_url = 'https://etws.etrade.com')
# Get request token and secret
oauth_token, oauth_token_secret = service.get_request_token(params =
{'oauth_callback': 'oob',
'format': 'json'})
auth_url = service.authorize_url.format(consumer_key, oauth_token)
# Get verifier (direct input in console, still working on callback)
webbrowser.open(auth_url)
verifier = input('Please input the verifier: ')
return service.get_auth_session(oauth_token, oauth_token_secret, params = {'oauth_verifier': verifier})
# Create a session
session = getSession()
# After authenticating a session, use sandbox urls
url = 'https://etwssandbox.etrade.com/accounts/sandbox/rest/accountlist.json'
resp = session.get(url, params = {'format': 'json'})
print(resp)
这篇关于在 Python 中从 etrade 获取 oauth 请求令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!