#r #rest #api #timestamp #authorization
#r #rest #API #временная метка #авторизация
Вопрос:
Я пытаюсь извлечь данные из API Marvel с помощью R. Тем не менее, мой код выглядит так:
library(jsonlite)
library(httr)
library(digest)
pb.txt <- Sys.time()
pb.date <- as.POSIXct(pb.txt, tz = Sys.timezone)
time.stamp = strtrim(format(pb.date, tz = "GMT", usetz = FALSE, "%Y-%m-%dT%H:%M:%SZ"), 24)
public.key <- "***********************"
private.key <- "**********************************"
hash <- digest(paste0(time.stamp, private.key, public.key), algo = "md5")
url <- GET(paste("http://gateway.marvel.com/v1/public/characters?ts=", time.stamp, "amp;apikey=", public.key, "amp;hash=", hash, sep = ""))
Ошибка, которую я получаю здесь, после:
> content(url)
$code
[1] "InvalidCredentials"
$message
[1] "That hash, timestamp and key combination is invalid."
Ранее основной проблемой была временная метка, и я все еще не уверен, правильно ли я ее рассчитал.
Вот документация для API.
Я надеюсь, что любой, у кого больше опыта работы с API, мог бы мне помочь.
Комментарии:
1. Да, вы правы. Я совсем забыл. Но теперь ошибка:
$code [1] "InvalidCredentials" $message [1] "That hash, timestamp and key combination is invalid."$code [1] "InvalidCredentials" $message [1] "That hash, timestamp and key combination is invalid."
Ответ №1:
Вы можете использовать это для начальной загрузки параметров в запросы API (сохранение ваших ключей в довольно очевидных именованных переменных среды, которые лучше всего задавать ~/.Renviron
):
marvel_hash_params <- function() {
ts <- round(as.numeric(Sys.time())*1000) # can totally be just Sys.time(), too
to_hash <- sprintf("%s%s%s",
ts,
Sys.getenv("MARVEL_API_PRIVATE_KEY"),
Sys.getenv("MARVEL_API_PUBLIC_KEY"))
list(
ts=ts,
hash=digest::digest(to_hash, "md5", FALSE),
apikey=Sys.getenv("MARVEL_API_PUBLIC_KEY")
)
}
Затем сразу же инициализируйте их в своих вспомогательных функциях:
get_characters <- function(name) {
params <- marvel_hash_params()
params$name <- name
res <- httr::GET("https://gateway.marvel.com:443/v1/public/characters",
query=params)
httr::stop_for_status(res)
httr::content(res, as="parsed")
}
get_characters("spider-man")
Даже если вы не пишете полноценный пакет, я бы посоветовал прочитать рекомендации Хэдли
Комментарии:
1. Большое вам спасибо! Просто нужно выяснить, как установить переменные в .Renviron И вы имели в виду во второй функции
marvel_hash_params()
вместоmarvel_hash()
?2. да, извиняюсь. Записи в
~/.Renviron
KEY=value
: csgillespie.github.io/efficientR/3-3-r-startup.html#renviron