Hoje nosso amigo Marcio Chiara nos procurou pedindo ajuda pois não estava conseguindo fazer o pacote Rfacebook funcionar. O problema estava logo no começo: a autenticação com a API do Facebook.
O procedimento
O procedimento básico para autenticar no Facebook usando o pacote Rfacebook
consiste em três passos:
- Crie um aplicativo no facebook developers:
- O aplicativo deve ser do tipo “Login do Facebook”
- Depois de clicar em “Configurar”, seleccione a plataforma “web”
- No menu da esquerda, clique em Configurações e obtenha o ID do Aplicativo e a Chave Secreta do Aplicativo.
- Guarde nos objetos
client_id
eclient_secret
. Exemplo:
- Guarde nos objetos
Rodar Rfacebook::fbOAuth()
.
Exemplo (não rode):
client_id <- "274017323361669"
client_secret <- "6ced33b11f41944e5a960f74c475a5fe"
Rfacebook::fbOAuth(client_id, client_secret)
O erro
O erro aparece ao rodar
Rfacebook::fbOAuth(client_id, client_secret,
extended_permissions = TRUE)
A opção extended_permissions
serve para dar acesso à algumas opções adicionais como aniversário, cidade de nascimento, etc. O erro que aparece é esse aqui:
Como somos pessoas espertinhas, o que fizemos? Abrimos os links que o Facebook sugeriu? Re-estudamos toda a API do Facebook? Não! Apenas lemos e interpretamos o erro. A API estava recusando acesso às opções user_relationships
e publish_actions
, que são requeridas por meio da função Rfacebook::fbOAuth()
. Aha!
Depois de estudar um pouquinho, notamos que a API do Facebook mudou recentemente. Isso ocorreu por conta de alterações na política de privacidade do Facebook, que é sempre algo polêmico. Hoje em dia não é mais possível autorizar aplicativos para terem acesso à rede de relacionamentos e ações do usuário.
O problema é que infelizmente o mantenedor do Rfacebook
parou de atualizar o pacote:
Então, o que fazer? Quando temos uma ferramenta que não funciona mais ou que está obsoleta, podemos i) jogar fora e fazer outra do zero ou ii) tentar arrumá-la para ficar top novamente.
Por sorte, o R é open-source e permite que (ii) seja feito sem maiores esforços. De fato, basta mudar uma linha de código para que tudo volte a funcionar como antes. Basta mudar o objeto scope
de
scope <- c("user_birthday", "user_hometown", "user_location",
"user_relationships", "publish_actions", "user_status",
"user_likes")
para
scope <- c("user_birthday", "user_hometown", "user_location",
"user_status", "user_likes")
A solução
Com base nessas alterações, a Bruna sugere a utilização da função modificada abaixo:
new_fbOAuth <- function (app_id, app_secret, extended_permissions = FALSE,
legacy_permissions = FALSE, scope = NULL) {
facebook <- oauth_endpoint(authorize = "https://www.facebook.com/dialog/oauth",
access = "https://graph.facebook.com/oauth/access_token")
myapp <- oauth_app("facebook", app_id, app_secret)
if (is.null(scope)) {
if (extended_permissions == TRUE) {
# as alterações significativas estão aqui >>>
scope <- c("user_birthday", "user_hometown", "user_location",
# "user_relationships", "publish_actions",
"user_status", "user_likes")
} else {
scope <- c("public_profile", "user_friends")
}
if (legacy_permissions == TRUE) {
scope <- c(scope, "read_stream")
}
}
if (packageVersion("httr") < "1.2") {
stop("Rfacebook requires httr version 1.2.0 or greater")
}
if (packageVersion("httr") <= "0.2") {
facebook_token <- oauth2.0_token(facebook, myapp, scope = scope)
fb_oauth <- sign_oauth2.0(facebook_token$access_token)
if (GET("https://graph.facebook.com/me", config = fb_oauth)$status == 200) {
message("Authentication successful.")
}
}
if (packageVersion("httr") > "0.2" & packageVersion("httr") <=
"0.6.1") {
fb_oauth <- oauth2.0_token(facebook, myapp, scope = scope, cache = FALSE)
if (GET("https://graph.facebook.com/me", config(token = fb_oauth))$status == 200) {
message("Authentication successful.")
}
}
if (packageVersion("httr") > "0.6.1" & packageVersion("httr") <
"1.2") {
Sys.setenv(HTTR_SERVER_PORT = "1410/")
fb_oauth <- oauth2.0_token(facebook, myapp, scope = scope,
cache = FALSE)
if (GET("https://graph.facebook.com/me", config(token = fb_oauth))$status == 200) {
message("Authentication successful.")
}
}
if (packageVersion("httr") >= "1.2") {
fb_oauth <- oauth2.0_token(facebook, myapp, scope = scope,
cache = FALSE)
if (GET("https://graph.facebook.com/me", config(token = fb_oauth))$status == 200) {
message("Authentication successful.")
}
}
error <- tryCatch(callAPI("https://graph.facebook.com/pablobarbera",
fb_oauth), error = function(e) e)
if (inherits(error, "error")) {
class(fb_oauth)[4] <- "v2"
}
if (!inherits(error, "error")) {
class(fb_oauth)[4] <- "v1"
}
return(fb_oauth)
}
É isso. Happy coding ;)
Nota: Se você já tinha um app criado no Facebook antes da mudança de política de privacidade, o ideal é que ele passe pelo App Review, como sugerido no próprio pacote do Rfacebook
.