始终使用来自httr package

时间:2017-09-11 21:28:46

标签: r oauth-2.0 reddit httr

正如标题所说,我正在尝试连接到reddit API,我在我的个人资料上创建了一个应用程序(名为注释提取器),并复制粘贴公钥和密钥,并使用http://localhost:1410/作为重定向URI和URL。该应用程序是一个脚本,但我尝试了网络应用程序,但结果相同。

我正在使用的代码只是从Hadleys httr演示中复制粘贴,但我交换了我自己的密钥(所有内容都使用最新版本的httr,1.3.1)。

library(httr)

# 1. Find OAuth settings for reddit:
#    https://github.com/reddit/reddit/wiki/OAuth2
reddit <- oauth_endpoint(
  authorize = "https://www.reddit.com/api/v1/authorize",
  access =    "https://www.reddit.com/api/v1/access_token"
)

# 2. Register an application at https://www.reddit.com/prefs/apps
app <- oauth_app("comment extractor", "rrG5wfgHkm5Kvw", "[secret key]")


# 3b. If get 429 too many requests, the default user_agent is overloaded.
# If you have an application on Reddit then you can pass that using:
token <- oauth2.0_token(
  reddit, app,
  scope = c("read", "modposts"),
  use_basic_auth = TRUE,
  config_init = user_agent("reddit_username")
)

网页浏览器打开,我被要求允许或拒绝令牌,一切似乎都很好,但是这个消息总是失败

Waiting for authentication in browser...
Press Esc/Ctrl + C to abort
Authentication complete.
Error in oauth2.0_access_token(endpoint, app, code = code, user_params = 
user_params,  : 
  Unauthorized (HTTP 401). Failed to get an access token.

我不确定如何处理用户代理,我注意到应用程序要求开发人员名称,所以我尝试了一些随机文本并使用我的reddit用户名,无论哪种方式,我总是得到401错误,这似乎意思是错误的键,但肯定不是。

任何帮助都会非常感激,当我在最基本的步骤停下来并且不知道接下来该做什么时,我有点不知所措。

2 个答案:

答案 0 :(得分:0)

我有完全相同的问题! 我还没有找到解决方案,但我想我已经找到了问题所在。

错误发生在oauth2.0_ access _token函数中,而不是在oauth2.0_token函数中。 在oauth2.0_token函数中,我们设置了&#34; use_basic_auth&#34;为真。但是在oauth2.0_ access _token函数中默认为&#34; use_basic_auth&#34;设置为FALSE。

由于令牌功能似乎调用了acces_token函数,我不知道如何更改默认值...但我希望我的见解会让我们更近一步(如果你找到了最终的解决方案,请你分享一下吗?和我在一起?)

答案 1 :(得分:0)

我找到了解决问题的方法! 通过使init.oauth2.0()传递use_basic_auth,httr github页面的拉请求#485解决了我们的问题。 因此,您可以通过添加以下行来安装他的httr版本:

#install.packages("devtools")  
library(devtools)  
devtools::install_github("r-lib/httr#485")
library(httr)  

以下是我的完整代码(不要用来定义密钥和秘密):

#install.packages("httr")
#install.packages("devtools")
library(devtools)
devtools::install_github("r-lib/httr#485")
library(httr)

# 1. Find OAuth settings for reddit:
#    https://github.com/reddit/reddit/wiki/OAuth2
endpoint <- oauth_endpoint(
  authorize = "https://www.reddit.com/api/v1/authorize",
  access =    "https://www.reddit.com/api/v1/access_token"
)

# 2. Register an application at https://www.reddit.com/prefs/apps
app <- oauth_app("Test_App", key, secret)

# 3b. If get 429 too many requests, the default user_agent is overloaded.
# If you have an application on Reddit then you can pass that using:
token <- oauth2.0_token(
  endpoint = endpoint, 
  app=app,
  scope = c("read", "modposts"),
  use_basic_auth = TRUE,
#  cache = F,
  config_init = user_agent("Testing Oauth with httr")
)

#trying to make a call
#Important! Make sure to put oauth.reddit.com instad of reddit.com!
request_url <- "https://oauth.reddit.com/r/AskReddit/comments/7az0np/what_is_the_most_pointless_piece_of_information/.json"
response <- GET(request_url,
                user_agent("Testing Oauth with httr"),
                config(token = token)
                )

content(response, "text")