2017-09-11 17 views
0

Comme le dit le titre, j'essaie de me connecter à l'API reddit, j'ai créé une application (nommée extracteur de commentaires) sur mon profil, et copie collez les clés publiques et secrètes et utilisez http://localhost:1410/ comme URL de redirection et sur l'URL. L'application est un script, mais j'ai essayé l'application web avec le même résultat.Toujours obtenir l'erreur 401 de l'API reddit en utilisant oauth_token2.0 du paquet httr

Le code que j'utilise est juste copié collé à partir de démos Hadtys httr, mais j'ai échangé les clés pour le mien (tout fait avec la dernière version de 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") 
) 

Le navigateur Web ouvre, je suis invité à autoriser ou refuser le jeton, et tout semble bien, mais il ne parvient pas toujours avec ce message

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. 

Je ne savais pas de quoi faire avec l'agent utilisateur, j'ai remarqué que l'application demande des noms de développeurs, j'ai donc essayé un texte aléatoire et en utilisant mon nom d'utilisateur reddit, de toute façon, je reçois toujours une erreur 401, qui ne veut pas dire.

Toute aide serait grandement appréciée, je suis un peu perdu quand je suis arrêté à l'étape la plus élémentaire et je ne sais pas quoi faire ensuite.

Répondre

0

J'ai exactement le même problème! Je n'ai pas encore trouvé de solution, mais je pense avoir trouvé le problème.

L'erreur se produit dans la fonction oauth2.0_ d'accès et non dans la fonction oauth2.0_token. Dans la fonction oauth2.0_token, nous avons défini "use_basic_auth" sur TRUE. MAIS dans le oauth2.0_ acces Fonction _token la valeur par défaut pour "use_basic_auth" est définie sur FALSE. Puisque la fonction jeton semble appeler la fonction acces_token, je n'ai aucune idée de la façon de changer cette valeur par défaut ... mais j'espère que mon point de vue nous rapprochera un peu plus (si vous avez trouvé la solution finale, s'il vous plait partager ceci avec moi?)

+0

mettra à jour ici Si je comprends bien, je suis à peu près épuisé ce que je peux penser, j'ai ouvert un problème sur le github paquet httr dans l'espoir que Hadley ou quelqu'un d'autre a une idée de ce qui doit être fait (ou ce que je je fais mal). –

0

J'ai trouvé une solution à notre problème! Tirez la requête #485 de la page httr github a résolu notre problème en faisant init.oauth2.0() passer use_basic_auth. Vous pouvez ainsi installer sa version HTTR en ajoutant des lignes suivantes:

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

Voici mon code complet qui a fonctionné pour moi (ne pas foret pour définir la clé et secret):

#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")