Yahoo API - 先前的访问令牌过期后无法请求新的访问令牌
Yahoo API - Unable to request new access token once previous access token has expired
我正在尝试使用雅虎的 API 进行梦幻足球。我最初能够收到一个访问令牌和刷新令牌,但是一旦该访问令牌过期,我就无法获得另一个。
我的代码如下:
from requests import Request, get, post
import webbrowser
import base64
baseURL = 'https://api.login.yahoo.com/'
oauthENDPOINT = "https://api.login.yahoo.com/oauth2/request_auth"
## Generate a url using the endpoint and parameters above
params = {'client_id' : client_id,
'redirect_uri' : "oob",
'response_type' : 'code'}
p = Request('GET', oauthENDPOINT, params=params).prepare()
webbrowser.open(p.url)
最后一行将我转到 Yahoo 网站,我允许自己访问并接收 authCode
。
encoded = base64.b64encode((client_id + ':' + client_secret).encode("utf-8"))
headers = {
'Authorization': f'Basic {encoded.decode("utf-8")}',
'Content-Type': 'application/x-www-form-urlencoded'
}
data = {
'grant_type': 'authorization_code',
'redirect_uri': 'oob',
'code': authCode}
tokenResponse = post(baseURL + 'oauth2/get_token', headers=headers, data=data)
tokenResponseJSON = tokenResponse.json()
access_token = tokenResponseJSON['access_token']
refresh_token = tokenResponseJSON['refresh_token']
我现在拥有检查我的联赛设置所需的所有信息(例如)。
fbURL = 'https://fantasysports.yahooapis.com/fantasy/v2'
leagueURL1 = f'{fbURL}/leagues;league_keys=nfl.l.{leagueID}/settings'
headers = {
'Authorization': f'Bearer {access_token}',
'Accept': 'application/json',
'Content-Type': 'application/json'
}
response2 = get(leagueURL1, headers=headers,params={'format': 'json'})
以上按预期工作。但是,access_token
持续 3600 秒,一旦该时间到期,我将无法使用我的 refresh_token
请求新的。我的尝试:
accessTokenData = {
'grant_type': 'refresh_token',
'redirect_uri': 'oob',
'code': authCode,
'refresh_token': refresh_token
}
accessTokenResponse = post(baseURL + 'oauth2/get_token', headers=headers, data=accessTokenData)
accessTokenJSON = accessTokenResponse.json()
在上面,我希望收到一个新的 access_token
,但是 accessTokenJSON
是这样的:
{'error': {'localizedMessage': 'client request is not acceptable or not supported',
'errorId': 'INVALID_INPUT',
'message': 'client request is not acceptable or not supported'}}
到目前为止,我一直在关注 these steps,到目前为止效果很好。我究竟做错了什么?我知道许多 Python 用户使用 yahoo_oauth
或 rauth
进行身份验证,但这涉及将 client_id
和 client_secret
分别保存在 .json
文件中,并且我正在寻找动态加载它们。我不认为我离成功很远,但在生成新 refresh_token
时我只是错过了一些东西。非常感谢所有帮助!
感谢您回头参考我们的指南。
成功重现了您的错误,而且解决起来非常简单。
您正在重新定义您对 fantasyspot url 的请求中的 headers
变量。
headers
变量在使用 refresh_token
请求新 access_token
的调用中应该与最初使用 auth_code
获取两个令牌时相同.
所以在请求新的 access_token
之前定义 header
。应如下所示:
headers = {
'Authorization': f'Basic {encoded.decode("utf-8")}',
'Content-Type': 'application/x-www-form-urlencoded'
}
response = post(base_url + 'oauth2/get_token', headers=headers, data=data)
现在应该可以工作了。
建议对用于获得 access_token
的 headers
和用于梦幻运动 url 的 headers
使用不同的变量名称。
我正在尝试使用雅虎的 API 进行梦幻足球。我最初能够收到一个访问令牌和刷新令牌,但是一旦该访问令牌过期,我就无法获得另一个。
我的代码如下:
from requests import Request, get, post
import webbrowser
import base64
baseURL = 'https://api.login.yahoo.com/'
oauthENDPOINT = "https://api.login.yahoo.com/oauth2/request_auth"
## Generate a url using the endpoint and parameters above
params = {'client_id' : client_id,
'redirect_uri' : "oob",
'response_type' : 'code'}
p = Request('GET', oauthENDPOINT, params=params).prepare()
webbrowser.open(p.url)
最后一行将我转到 Yahoo 网站,我允许自己访问并接收 authCode
。
encoded = base64.b64encode((client_id + ':' + client_secret).encode("utf-8"))
headers = {
'Authorization': f'Basic {encoded.decode("utf-8")}',
'Content-Type': 'application/x-www-form-urlencoded'
}
data = {
'grant_type': 'authorization_code',
'redirect_uri': 'oob',
'code': authCode}
tokenResponse = post(baseURL + 'oauth2/get_token', headers=headers, data=data)
tokenResponseJSON = tokenResponse.json()
access_token = tokenResponseJSON['access_token']
refresh_token = tokenResponseJSON['refresh_token']
我现在拥有检查我的联赛设置所需的所有信息(例如)。
fbURL = 'https://fantasysports.yahooapis.com/fantasy/v2'
leagueURL1 = f'{fbURL}/leagues;league_keys=nfl.l.{leagueID}/settings'
headers = {
'Authorization': f'Bearer {access_token}',
'Accept': 'application/json',
'Content-Type': 'application/json'
}
response2 = get(leagueURL1, headers=headers,params={'format': 'json'})
以上按预期工作。但是,access_token
持续 3600 秒,一旦该时间到期,我将无法使用我的 refresh_token
请求新的。我的尝试:
accessTokenData = {
'grant_type': 'refresh_token',
'redirect_uri': 'oob',
'code': authCode,
'refresh_token': refresh_token
}
accessTokenResponse = post(baseURL + 'oauth2/get_token', headers=headers, data=accessTokenData)
accessTokenJSON = accessTokenResponse.json()
在上面,我希望收到一个新的 access_token
,但是 accessTokenJSON
是这样的:
{'error': {'localizedMessage': 'client request is not acceptable or not supported',
'errorId': 'INVALID_INPUT',
'message': 'client request is not acceptable or not supported'}}
到目前为止,我一直在关注 these steps,到目前为止效果很好。我究竟做错了什么?我知道许多 Python 用户使用 yahoo_oauth
或 rauth
进行身份验证,但这涉及将 client_id
和 client_secret
分别保存在 .json
文件中,并且我正在寻找动态加载它们。我不认为我离成功很远,但在生成新 refresh_token
时我只是错过了一些东西。非常感谢所有帮助!
感谢您回头参考我们的指南。
成功重现了您的错误,而且解决起来非常简单。
您正在重新定义您对 fantasyspot url 的请求中的 headers
变量。
headers
变量在使用 refresh_token
请求新 access_token
的调用中应该与最初使用 auth_code
获取两个令牌时相同.
所以在请求新的 access_token
之前定义 header
。应如下所示:
headers = {
'Authorization': f'Basic {encoded.decode("utf-8")}',
'Content-Type': 'application/x-www-form-urlencoded'
}
response = post(base_url + 'oauth2/get_token', headers=headers, data=data)
现在应该可以工作了。
建议对用于获得 access_token
的 headers
和用于梦幻运动 url 的 headers
使用不同的变量名称。