Подключиться к Rest API в R с помощью ключа

это простой вопрос, но я до сих пор не могу понять. Я хочу подключиться к REST API с помощью своего ключа API. Я просмотрел документацию по httr, jsonlite и другим и до сих пор не могу понять, как установить ключ API.

Это конечная точка - https://api.tiingo.com/tiingo/daily//prices?startDate=2012-1-1&endDate=2016-1-1?

Я попытался использовать функцию GET для этого URL-адреса и указать свой ключ API как key в вызове. Я также пробовал api_key = key. Я всегда получаю ошибку 401 обратно.

Спасибо


person Jared Marks    schedule 18.07.2017    source источник
comment
см. мой ответ на подобный вопрос здесь: stackoverflow.com/questions/40289067/   -  person Y.L    schedule 18.07.2017


Ответы (2)


API ожидает заголовок Authorization с Token yOuRAsSiGnEdT0k3n в нем. Вы должны хранить токен в чем-то вроде переменной среды, чтобы он не застрял в сценариях. Я использовал TIINGO_TOKEN и поместил его в ~/.Renviron.

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

library(httr)
library(jsonlite)
library(tidyverse)
library(hrbrthemes)

get_prices <- function(ticker, start_date, end_date, token=Sys.getenv("TIINGO_TOKEN")) {

  GET(
    url = sprintf("https://api.tiingo.com/tiingo/daily/%s/prices", ticker),
    query = list(
      startDate = start_date,
      endDate = end_date
    ),
    content_type_json(),
    add_headers(`Authorization` = sprintf("Token %s", token))
  ) -> res

  stop_for_status(res)

  content(res, as="text", encoding="UTF-8") %>%
    fromJSON(flatten=TRUE) %>%
    as_tibble() %>%
    readr::type_convert()

}

Теперь вы можете просто передать параметры:

xdf <- get_prices("googl", "2012-1-1", "2016-1-1")

glimpse(xdf)
## Observations: 1,006
## Variables: 13
## $ date        <dttm> 2012-01-03, 2012-01-04, 2012-01-05, 2012-01-06, 2...
## $ close       <dbl> 665.41, 668.28, 659.01, 650.02, 622.46, 623.14, 62...
## $ high        <dbl> 668.15, 670.25, 663.97, 660.00, 647.00, 633.80, 62...
## $ low         <dbl> 652.3700, 660.6200, 656.2300, 649.7900, 621.2300, ...
## $ open        <dbl> 652.94, 665.03, 662.13, 659.15, 646.50, 629.75, 62...
## $ volume      <int> 7345600, 5722200, 6559200, 5380400, 11633500, 8782...
## $ adjClose    <dbl> 333.7352, 335.1747, 330.5253, 326.0164, 312.1937, ...
## $ adjHigh     <dbl> 335.1095, 336.1627, 333.0130, 331.0218, 324.5017, ...
## $ adjLow      <dbl> 327.1950, 331.3328, 329.1310, 325.9010, 311.5768, ...
## $ adjOpen     <dbl> 327.4809, 333.5446, 332.0901, 330.5955, 324.2509, ...
## $ adjVolume   <int> 3676476, 2863963, 3282882, 2692892, 5822572, 43955...
## $ divCash     <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ splitFactor <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...

И это «просто работает»:

ggplot(xdf, aes(date, close)) +
  geom_segment(aes(xend=date, yend=0), size=0.25) +
  scale_y_comma() +
  theme_ipsum_rc(grid="Y")

введите описание изображения здесь

Вы можете следовать этой идиоме для других конечных точек API. Когда закончите, подумайте о том, чтобы сделать из него пакет, чтобы сообщество могло использовать полученные вами знания.

Вы можете сделать несколько дополнительных шагов и фактически создать функции, которые принимают дату или числовые параметры, чтобы фактически принимать объекты R такого типа и также проверять их на входе.

person hrbrmstr    schedule 18.07.2017
comment
Чтобы установить токен в локальной среде: создайте файл '~/.Renviron' с текстом TIINGO_TOKEN="yOuRAsSiGnEdT0k3n" и перезапустите R/RStudio. Проверьте, что переменная загружается с помощью команды Sys.getenv("TIINGO_TOKEN") - person johnatasjmo; 13.10.2017
comment
Как создать файл в /.Renviron - person Cing; 31.12.2017
comment
Я получаю сообщение об ошибке со строкой reader::type_convert(): Проанализировано со спецификацией столбца: cols(date = col_datetime(format =)) - person Cing; 31.12.2017
comment
@Cing Я не собираюсь дальше сортировать в комментариях. Либо начните новый вопрос, либо работайте над отладкой. Я также никогда не использую этот API, поэтому я понятия не имею, изменился ли он. - person hrbrmstr; 31.12.2017
comment
Фантастика! работал первый раз. никаких правок. Спасибо - person clancy; 17.05.2021

Авторизация должна быть добавлена ​​в качестве заголовка запроса при вызове API REST. Если у вас есть имя пользователя и пароль, то заголовок авторизации будет «имя пользователя: пароль». Если это один apiKey или accessToken, это может быть что-то вроде «Bearer». Замените на свой ключ API.

Имя заголовка запроса должно быть «Авторизация».

person Bharathi Raja    schedule 18.07.2017