R Yahoo Fantasy API - 权限

时间:2018-04-07 17:23:11

标签: r oauth yahoo-api

我在使用Yahoo Fantasy API时遇到问题。使用示例herehere,我开发了一个非常hacky解决方案来获取我的连接。

首先,我使用以下代码创建一个oauth1标记:

library(httr)

cKey <- "mykey"
cSecret <- "mysecret"

oauth_endpoints("yahoo")
myapp <- oauth_app("yahoo", key = cKey, secret = cSecret)
token <- oauth1.0_token(oauth_endpoints("yahoo"), myapp)

然后我有另一段代码让我签名:

yahoo    <-oauth_endpoints("yahoo")
myapp <- oauth_app("yahoo", key=cKey, secret=cSecret)
yahoo_token<- oauth2.0_token(yahoo, myapp, cache=T, use_oob = T)
sig <- sign_oauth1.0(myapp, yahoo_token$oauth_token, yahoo_token$oauth_token_secret)

在我看来,我应该只需要其中一个来访问API,但我不能只使用其中一个。

无论如何,这确实允许我建立连接。为了访问API,我需要游戏ID。根据上述链接演练之一中的说明,我使用此代码执行此操作:

page_mlb <-GET("http://fantasysports.yahooapis.com/fantasy/v2/game/mlb?format=json", sig)
page_mlb_parse <- content(page_mlb, as="parsed", encoding="utf-8")
game_key <- page_mlb_parse[["fantasy_content"]][["game"]][[1]][["game_key"]]

game_key最终成为378。因此,我应该能够使用我刚刚找到的联赛ID 94107来获得联盟排名,这是我联盟中独一无二的。

leagueKey <- paste0(game_key,'.l.',lg_id)

baseURL     <- "http://fantasysports.yahooapis.com/fantasy/v2/league/"
standingsURL<-paste(baseURL, leagueKey, "/standings", sep="")
standings_page <- GET(standingsURL,sig)

standings_parse <- content(standings_page, as = "parsed", encoding = "utf-8")

但是当我将它打印到屏幕上时,我得到了:

> standings_parse
{xml_document}
<error lang="en-us" uri="http://fantasysports.yahooapis.com/fantasy/v2/league/378.l.94107/standings" xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" xmlns="http://www.yahooapis.com/v1/base.rng">
[1] <description>You are not allowed to view this page because you are not in this league.</description>
[2] <detail/>

回复:You are not allowed to view this page because you are not in this league是我挂在这里的原因。我使用相同的Yahoo登录来创建我用来建立我的幻想团队的API。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

不确定您是否仍然遇到问题,但是我在解决问题之前苦苦挣扎了一段时间。

问题:雅虎已从OAuth1.0切换到OAuth2.0。这意味着您在网上找到的许多示例脚本-几乎所有这些脚本都是在此更改之前创建的-不再功能。

在您提供的示例代码中,似乎同时使用了 1.0和2.0(此处有个有趣的注释:1.0功能用于创建“ sig”变量-一个带符号的令牌-在2.0版中不再需要。)

这是一个重写,应该可以完成您尝试做的事情而不会造成讨厌的授权问题:

library(httr)

cKey <- "mykey"
cSecret <- "mysecret"

b_url <- "https://fantasysports.yahooapis.com" #base url

#Create Endpoint
yahoo <- httr::oauth_endpoint(authorize = "https://api.login.yahoo.com/oauth2/request_auth"
                              , access = "https://api.login.yahoo.com/oauth2/get_token"
                              , base_url = b_url)
#Create App
myapp <- httr::oauth_app("yahoo", key=cKey, secret = cSecret,redirect_uri = "oob")

#Open Browser to Authorization Code
httr::BROWSE(httr::oauth2.0_authorize_url(yahoo, myapp, scope="fspt-r"
                                          , redirect_uri = yahoo_app$redirect_uri))

#Create Token
yahoo_token <- httr::oauth2.0_access_token(yahoo,yahoo_app,code="[ENTER CODE FROM BROWSER HERE]")
save(yahoo_token,file="yahoo_token.Rdata")

leagueKey <- paste0(game_key,'.l.',lg_id)

baseURL     <- "https://fantasysports.yahooapis.com/fantasy/v2/league/"
standingsURL <- paste(baseURL, leagueKey, "/standings")
standings_page <- GET(standingsURL,
                      add_headers(Authorization=paste0("Bearer ", yahoo_token$access_token)))

standings_parse <- content(standings_page, as = "parsed", encoding = "utf-8")

答案 1 :(得分:1)

我也经历了类似的挣扎,我使用了伯奇曼的答案以及大量的反复试验。

这是我解决问题的方式。

一旦您从yahoo键入密钥和密码,就可以执行以下操作。当然,我没有给我看。

options("httr_oob_default" = T)

cKey     <- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
cSecret  <- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

yahoo <- httr::oauth_endpoint(authorize ="https://api.login.yahoo.com/oauth2/request_auth", access = "https://api.login.yahoo.com/oauth2/get_token", base_url = "https://fantasysports.yahooapis.com")

myapp <- httr::oauth_app("yahoo", key=cKey, secret = cSecret,redirect_uri = "oob")

现在,当您进行下一部分时,将弹出一个浏览器。您必须复制并粘贴提供的代码。

httr::BROWSE(httr::oauth2.0_authorize_url(yahoo, myapp, scope="fspt-r", redirect_uri = myapp$redirect_uri))

passcode = "xxxxxxx"

yahoo_token <- httr::oauth2.0_access_token(yahoo,myapp,code=passcode)

下一部分将帮助您构建URL以获取所需的数据。

standings_page <- GET("https://fantasysports.yahooapis.com/fantasy/v2/game/nfl", add_headers(Authorization=paste0("Bearer ", yahoo_token$access_token)))
XMLstandings<- content(standings_page, as="parsed", encoding="utf-8")
doc<-xmlTreeParse(XMLstandings, useInternal=TRUE)
myList<- xmlToList(xmlRoot(doc))
game_key = myList$game$game_key
game_key

现在,下一段代码将提取您要查找的数据。

baseURL <- "https://fantasysports.yahooapis.com/fantasy/v2/league/"

leagueID <- "1244633"

tag <- "/scoreboard;week=1"

standingsURL <-paste0(baseURL,game_key,".l.",leagueID,tag)
standings_page <- GET(standingsURL, add_headers(Authorization = 
paste0("Bearer ", yahoo_token$access_token)))
XMLstandings <- content(standings_page, as = "parsed", encoding = "utf-8")

doc <- xmlTreeParse(XMLstandings, useInternal = TRUE)
myList <- xmlToList(xmlRoot(doc))

有关更多详细信息,这是我写的Fantasy Football Blog Post