2013-02-23 4 views
1

Я пытаюсь использовать следующий код, чтобы получать сообщения со страницы на Facebook. Я получаю сообщение об ошибке, даже если запрос работает, когда я печатаю его в браузере. Это ошибка, которую я получаю:Как получить самую популярную публикацию Facebook в R

WWW-Authenticate: OAuth "Facebook Platform" "invalid_request" "Unknown path components: 

Любые мысли очень ценятся!

# go to 'https://developers.facebook.com/tools/explorer' to get your access token 
access_token <- "### token ###" 

require(RCurl) 
require(rjson) 

cafile <- system.file("CurlSSL", "cacert.pem", package = "RCurl") 

options(RCurlOptions = list(verbose = TRUE, followlocation = TRUE, timeout = 100, useragent = "R")) 


# set the curl options 
curl <- getCurlHandle() 
options(RCurlOptions = list(capath = system.file("CurlSSL", "cacert.pem", 
              package = "RCurl"), 
         ssl.verifypeer = FALSE, verbose = TRUE, cookiejar = 'my_cookies.txt', 
         cookiefile = 'my_cookies.txt', followlocation = TRUE,                   
         useragent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3')) 
curlSetOpt(.opts = list(proxy = 'proxyserver:port'), curl = curl) 


# Facebook json function copied from original (Romain Francois) post 
facebook <- function(path = "me", access_token, options){ 
if(!missing(options)){ 
options <- sprintf("?%s", paste(names(options), "=", unlist(options), collapse = "&", sep = "")) 
} else { 
options <- "" 
} 
data <- getURL(sprintf("https://graph.facebook.com/%s%s&access_token=%s", path, options, access_token)) 
fromJSON(data) 
} 


### TED FACEBOOK PAGE 
# http://www.facebook.com/TED 
# TED's Facebook ID 29092950651 can be found on http://graph.facebook.com/TED 

ted <- list() 
i<-0 
next.path <- "29092950651/posts" 

# download all TED posts 
while(length(next.path)!=0) { 
    i<-i+1 
    ted[[i]] <- facebook(path=next.path , access_token=access_token) 
    next.path <- sub("https://graph.facebook.com/","",ted[[i]]$paging$'next') 
} 
ted[[i]] <- NULL 

# parse just video links posted by TED 
parse.count.ted <- function(x) 
    if (x$type=="link" & x$from$id=="29092950651") x$likes$count else NA 
parse.link.ted <- function(x) 
    if (x$type=="link" & x$from$id=="29092950651") x$link else NA 
ted.counts <- unlist(sapply(ted, parse.master, f=parse.count.ted)) 
ted.links <- unlist(sapply(ted, parse.master, f=parse.link.ted)) 

# see three most popular talks 
ted.links[order(ted.counts,decreasing=TRUE)][1:3] 
+1

Можете ли вы довести свой вопрос до определенного места в вашем коде, где вы получите сообщение об ошибке? –

ответ

3

Возможно, это проблема с форматированием URL-адреса. Если аргумент options не указан, результирующий URL-адрес будет выглядеть так: /me/photos&access_token=.... Здесь path будет /me/photos&access_token, который, вероятно, не является допустимым URL-компонентом в соответствии с API Facebook.

Я думаю, что следующие изменения в функции facebook бы это исправить:

require(RCurl) 
require(rjson) 

facebook <- function(path = "me", access_token = token, options){ 
    if(!missing(options)){ 
     options <- sprintf( 
          "?%s&", 
          paste( 
           names(options), "=", unlist(options), 
           collapse = "&", sep = "" 
           ) 
          ) 
    } else { 
     options <- "?" 
    } 

    urlTemplate <- "https://graph.facebook.com/%s%saccess_token=%s" 
    data <- getURL( 
        sprintf( 
          urlTemplate, 
          path, 
          options, 
          access_token 
          ) 
        ) 
    fromJSON(data) 
} 

Теперь, даже если options аргумент отсутствует, в результате URL будет выглядеть следующим образом: /me/photos?access_token=....

+0

Спасибо большое! Теперь я получаю следующую ошибку: Ошибка в myposts [[1]] $ paging $ "next": Оператор $ недействителен для атомных векторов – Lauren

+0

Я не смотрел данные JSON, возвращенные вызовом 'facebook', поэтому Я не могу прокомментировать это. Однако это звучит как отдельный вопрос. Можете ли вы опубликовать данные JSON (и 'myposts [[1]], возможно) в другом вопросе и принять этот ответ, если он решил текущую проблему? –

+0

Спасибо большое! Вот ссылка на отдельный вопрос: http://stackoverflow.com/questions/15069078/parsing-facebook-json-results – Lauren