19

REST API を介して一部のデータにアクセスする R パッケージを作成しようとしています。ただし、API は http 認証を使用せず、Cookie に依存してセッションで資格情報を保持します。

基本的に、bash スクリプトの次の 2 行を 2 つの R 関数に置き換えたいと思います。

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

4

2 に答える 2

20

一般に、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して、投稿フィールドの名前と値を表示する必要があります。

于 2013-03-16T15:39:17.170 に答える
5

私の悪い。Neal Richter が指摘してくれたhttp://www.omegahat.org/RCurl/RCurlJSS.pdf - と の違いをよりよく説明していcookiefileますcookiejar。質問のサンプル スクリプトは実際に機能します。ただし、ファイルが使用されなくなったときにのみ、ファイルをディスクに書き込みます。

于 2010-03-05T18:23:45.400 に答える