70 lines
2.2 KiB
R
70 lines
2.2 KiB
R
# calculates the signature for the request as described in the docs:
|
|
# https://dev.twitter.com/docs/auth/creating-signature
|
|
|
|
#' Generates OAuth1 signature needed to authorize API request
|
|
#'
|
|
#' @param method f.x. "HMAC-SHA1"
|
|
#' @param url f.x. "https://api.twitter.com/1.1/friends/ids.json"
|
|
#' @param api f.x. c(cursor=-1, screen_name="hrw", count=10)
|
|
#' @param params named vector needed for generating oauth1 signature
|
|
#' @return signature string
|
|
oauth1_signature <- function(method, url, api, params, test=FALSE) {
|
|
library(RCurl);
|
|
library(digest);
|
|
library(base64enc);
|
|
|
|
# http://oauth.net/core/1.0/#encoding_parameters
|
|
|
|
if(curlEscape(".") == ".") {
|
|
# that's how we want it!
|
|
} else if(curlEscape(".") == "%2E") {
|
|
curlEscape <- function(str) {
|
|
esc <- RCurl::curlEscape(str)
|
|
esc <- gsub("%2E",".",esc)
|
|
esc <- gsub("%2D","-",esc)
|
|
esc <- gsub("%5F","_",esc)
|
|
esc <- gsub("%7E","~",esc)
|
|
}
|
|
} else {
|
|
stop("curlEscape('.') is supposed to be either '.' or '%2E'")
|
|
}
|
|
|
|
secrets <- params[c("consumer_secret","oauth_token_secret")];
|
|
|
|
# exclude *_secret
|
|
params <- params[! names(params) %in% c("consumer_secret","oauth_token_secret")]
|
|
|
|
params <- c(api, params);
|
|
params_sorted <- params[sort(names(params))];
|
|
params_escaped <- sapply(params_sorted, curlEscape);
|
|
pstr <- paste(paste(names(params_escaped),"=",params_escaped,sep=""),collapse="&");
|
|
|
|
# it is important to use curlEscape instead of URLencode because the latter encodes
|
|
# using lower case letters but we need upper case letters. Otherwise the resulting
|
|
# signature will be different from what Twitter/OAuth expects/calculates.
|
|
final <- sprintf("%s&%s&%s",toupper(method), curlEscape(url), curlEscape(pstr));
|
|
|
|
sig <- sprintf("%s&%s",curlEscape(secrets["consumer_secret"]),curlEscape(secrets["oauth_token_secret"]));
|
|
|
|
hmac <- hmac(sig,final,algo="sha1",raw=TRUE)
|
|
signature <- base64encode(hmac);
|
|
signature_escaped <- curlEscape(signature);
|
|
|
|
if(test) {
|
|
return(
|
|
list(
|
|
params_escaped = params_escaped,
|
|
pstr = pstr,
|
|
final = final,
|
|
sig = sig,
|
|
hmac = hmac,
|
|
signature = signature,
|
|
signature_escaped = signature_escaped
|
|
)
|
|
)
|
|
}
|
|
|
|
return(signature_escaped);
|
|
}
|
|
|