Как я могу использовать куки с RCurl? - PullRequest
18 голосов
/ 05 марта 2010

Я пытаюсь написать пакет R, который обращается к некоторым данным через REST API. API, однако, не использует http-аутентификацию, а скорее использует куки-файлы для сохранения учетных данных во время сеанса.

По сути, я хотел бы заменить следующие две строки скрипта bash на две функции R: одну для входа в систему и сохранения файла cookie сеанса, а другую для получения данных.

curl -X POST -c cookies.txt -d"username=xxx&password=yyy" http://api.my.url/login
curl         -b cookies.txt                               http://api.my.url/data

Я явно не понимаю, как RCurl работает с параметрами curl. Мой скрипт в его нынешнем виде имеет:

library(RCurl)
curl <- getCurlHandle()
curlSetOpt(cookiejar='cookies.txt', curl=curl)
postForm("http://api.my.url/login", username='xxx', password='yyy', curl=curl)
getURL('http://api.my.url/data", curl=curl)

Финальный getURL() завершается с ошибкой «Не авторизован». сообщение с сервера, и после postForm() нет cookies.txt файла существует.

Ответы [ 2 ]

17 голосов
/ 16 марта 2013

Как правило, вам не нужно создавать файл cookie, если вы не хотите изучать файлы cookie.

Учитывая это, по сути, веб-серверы используют данные агента, перенаправляя и скрытые данные публикации, но это должно помочь:

library(RCurl)

#Set your browsing links 
loginurl = "http://api.my.url/login"
dataurl  = "http://api.my.url/data"

#Set user account data and agent
pars=list(
     username="xxx"
     password="yyy"
)
agent="Mozilla/5.0" #or whatever 

#Set RCurl pars
curl = getCurlHandle()
curlSetOpt(cookiejar="cookies.txt",  useragent = agent, followlocation = TRUE, curl=curl)
#Also if you do not need to read the cookies. 
#curlSetOpt(  cookiejar="", useragent = agent, followlocation = TRUE, curl=curl)

#Post login form
html=postForm(loginurl, .params = pars, curl=curl)

#Go wherever you want
html=getURL(dataurl, curl=curl)

#Start parsing your page
matchref=gregexpr("... my regexp ...", html)

#... .... ...

#Clean up. This will also print the cookie file
rm(curl)
gc()

Важно

За пределами имени пользователя и пароля часто могут быть скрытые почтовые данные. Чтобы захватить его, вы можете захотеть, например, в Chrome использовать Developer tools ( Ctrl Shift I ) -> Network Tab, чтобы отображать имена и значения полей записей.

5 голосов
/ 05 марта 2010

Мой плохой. Нил Рихтер указал мне http://www.omegahat.org/RCurl/RCurlJSS.pdf - что лучше объясняет разницу между cookiefile и cookiejar. Пример сценария в вопросе на самом деле работает . Но он записывает файл на диск только тогда, когда он больше не используется.

...