2015-01-29 29 views
12

Sto utilizzando il pacchetto R per inviare articoli su Twitter. Metto tutto all'interno di una funzione e funziona perfettamente. Tuttavia, mi piacerebbe eseguire la funzione senza essere richiesta per una risposta, e non ho capito come farlo. Eventuali suggerimenti?Autenticazione automatica dell'autottria con twitteR, fornisce risposta al prompt interattivo in modalità "batch"

Qui ci sono le ossa nude della mia funzione:

doit <- function(<snip>) { 
    <snip> 
    # connect to Twitter 
    setup_twitter_oauth(api_key, api_secret, access_token, access_token_secret) 
    <snip> 
    } 

Quando eseguo la funzione dalla riga di comando, sono richiamato per una risposta interattiva.

[1] "Using direct authentication" 
Use a local file to cache OAuth access credentials between R sessions? 
1: Yes 
2: No 

Selection: 

posso fornire queste informazioni direttamente in uno script quando la funzione setup_twitter_oauth() è al di fuori di una funzione, inserendo la risposta nel seguente riga simile può essere fatto per altre funzioni di input dell'utente come readline () o scansione().

setup_twitter_oauth(api_key, api_secret, access_token, access_token_secret) 
1 

Tuttavia, non sono stato in grado di ottenere questo approccio al lavoro quando setup_twitter_oauth() si trova all'interno di una funzione.

Apprezzerei qualsiasi suggerimento su come farlo funzionare senza richiedere l'input dell'utente.

=====

La risposta da @NicE sotto ha fatto il trucco. Ho incorporato l'impostazione delle opzioni nella mia funzione come:

doit <- function(<snip>) { 
    <snip> 
    # connect to Twitter 
    origop <- options("httr_oauth_cache") 
    options(httr_oauth_cache=TRUE) 
    setup_twitter_oauth(api_key, api_secret, access_token, access_token_secret) 
    options(httr_oauth_cache=origop) 
    <snip> 
    } 
+0

La tua domanda ha finito per aiutarmi. Dato che volevo solo passare la selezione (1) al di fuori di una funzione. Grazie! –

+0

Non ho potuto ottenere un errore durante la prova del codice con la parte . Che cosa suggerisci di sostituire con? –

+0

Il '' non è un vero codice R, è solo il mio modo stenografico per indicare che nel mio script ho rimosso qualche altro codice (non pertinente alla domanda) per chiarezza. –

risposta

11

Si può provare a impostare l'opzione httr_oauth_cache TRUE:

options(httr_oauth_cache=T) 

Il pacchetto Twitter utilizza il pacchetto httr, sulla pagina di manuale Token per quel pacchetto che danno consigli su caching:

OAuth tokens are cached on disk in a file called .httr-oauth 
saved in the current working directory. Caching is enabled if: 

The session is interactive, and the user agrees to it, OR 

The .httr-oauth file is already present, OR 

getOption("httr_oauth_cache") is TRUE 

You can suppress caching by setting the httr_oauth_cache option to FALSE. 
-1

Non ne so molto.

Ma se è in batch, magari provare questo:

doit <- function(<snip>) { 
    <snip> 
    # connect to Twitter 
    setup_twitter_oauth(api_key, api_secret, access_token, access_token_secret) 
    < echo 1 
    <snip> 
} 

hanno anche si è tentato la pubblicazione della 1 di fuori della funzione per vedere se lo fa lo stesso?

E forse funzionerà se si mette il 1 sotto la snip

Questi sono solo suggerimenti, perché non so molto sull'argomento, ma potrebbe aiutare comunque.

+0

Non sono sicuro di cosa intendi con la riga '

+0

Anche il '1' esterno alla funzione non ha funzionato. –

+2

Probabilmente è una buona idea testare la soluzione prima di postarla come risposta, soprattutto se "non si sa molto sull'argomento" ... – nrussell

0

Funziona perfettamente.

install.packages("twitteR", dependencies = T) 
install.packages(c('ROAuth','RCurl')) 
install.packages("httr") 
library(httr) 
require('ROAuth') 
require('RCurl') 
library(twitteR) 



reqURL <- "https://api.twitter.com/oauth/request_token" 

accessURL <- "https://api.twitter.com/oauth/access_token" 

authURL <- "https://api.twitter.com/oauth/authorize" 

consumerKey <- "XXXXXXXXXXXXX" 

consumerSecret <- "XXXXXXXXXXXXXXXXXXXXX" 

twitCred <-  OAuthFactory$new(consumerKey=consumerKey,consumerSecret=consumerSecret,requestURL=reqURL,accessURL=accessURL,authURL=authURL) 

download.file(url="https://curl.haxx.se/ca/cacert.pem", destfile="cacert.pem") 

twitCred$handshake(cainfo="cacert.pem") 

    setup_twitter_oauth(consumer_key, consumer_secret, access_token, access_secret)