Доступ к FitBit API через R (без веб-скрейпинга)

У кого-нибудь есть рабочий сценарий R для доступа к API? Я вижу, что есть пакет для поиска в Интернете, но я бы предпочел использовать официальный API, если это возможно.

Все, что у меня есть, и все исследования, которые я сделал для аутентификации через oauth 1 или 2, кажутся сломанными с использованием пакета httr.

Для oauth 2:

library(httr)
app = '<OAuth 2.0 Client ID>'
key <- '<Client (Consumer) Key>'
secret <- '<Client (Consumer) Secret>'
accessTokenURL <- 'https://api.fitbit.com/oauth2/token'
authorizeURL <- 'https://www.fitbit.com/oauth2/authorize'

fbr <- oauth_app(key,app,NULL)
fitbit <- oauth_endpoint(NULL, authorizeURL,accessTokenURL)
token <- oauth2.0_token(fitbit,fbr,scope='profile',as_header=TRUE, cache=FALSE)

Когда я проверяю учетные данные токена $, я получаю сообщение об ошибке:

$errors
$errors[[1]]
$errors[[1]]$errorType
[1] "oauth"

$errors[[1]]$fieldName
[1] "n/a"

$errors[[1]]$message
[1] "No Authorization header provided in the request. Each call to Fitbit API should be OAuth signed"



$success
[1] FALSE

Я перепробовал все разные настройки в fitbit, настраивая свое приложение как в качестве сервера, так и в качестве клиента, и мой URL-адрес обратного вызова правильно настроен как http://localhost:1410

Любые идеи?

Спасибо, Исаак

ps: я перекрестно размещался на форумах fitbit: https://twitter.com/IsaacWyatt/status/637768649290350592, а также написал в Твиттере Хэдли Уикхэм с просьбой о помощи. Ретвиты приветствуются!

Current session info:
R version 3.1.2 (2014-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] httr_1.0.0

loaded via a namespace (and not attached):
[1] curl_0.9.3      httpuv_1.3.2    jsonlite_0.9.14 R6_2.0.1        Rcpp_0.11.4     stringr_0.6.2  
[7] tools_3.1.2    

person Isaac Wyatt    schedule 30.08.2015    source источник
comment
С тех пор, когда он случайным образом пишет в Твиттере людям, которые считаются подходящими. Мне кажется, это просто заблокирует вас.   -  person Dirk Eddelbuettel    schedule 31.08.2015
comment
@DirkEddelbuettel - Хэдли недавно написал в Твиттере о доступе к данным fitbit - по-видимому, он заинтересован / может быть осведомлен по этой теме.   -  person thelatemail    schedule 31.08.2015
comment
@thelatemail При всем уважении, это полная чушь. Этот человек написал в Твиттере 15 тысяч раз; и лучшее, что вы найдете, - это его пожелание, чтобы кто-то это написал.   -  person Dirk Eddelbuettel    schedule 31.08.2015
comment
Кажется, здесь решено ... stackoverflow .com / questions / 12212958 /   -  person cory    schedule 31.08.2015
comment
Привет всем - да, я согласен, что твиттер с людьми - не лучший способ, но это определенно помогает. Думаю, у меня есть решение с форумов FitBit, и я тестирую его сегодня вечером. Похоже, что помогает более заметная форма твитов / ретвитов. Решение в другом потоке Stockoverflow на самом деле не помогает решить, потому что я не знаю, как включить эти изменения. В любом случае это может быть спорным вопросом, однако, если это другое решение, которое я только что получил, сработает. Спасибо всем за ваш вклад! @DirkEddelbuettel   -  person Isaac Wyatt    schedule 01.09.2015


Ответы (2)


Доступ к API Fitbit через OAuth1.0a: не рекомендуется с 14 марта 2016 г., так что вот рабочий сценарий с использованием OAuth2.0. Возникла проблема, из-за которой пакет httr не мог запросить токен с использованием базовой проверки подлинности HTTP. (требуется Fitbit), но это исправлено новым аргументом use_basic_auth для oauth2.0_token().

Настройки приложения Fitbit

  • Тип приложения OAuth 2.0: личное
  • URL обратного вызова: http://localhost:1410 (это значение по умолчанию, ожидаемое httr)

Пример

# Until the version *following* httr 1.0.0 is available on CRAN, get the
# development version by uncommenting the following 2 lines
# library(devtools)
# install_github("hadley/httr")
library(httr)

# 1. Set up credentials
fitbit_endpoint <- oauth_endpoint(
  request = "https://api.fitbit.com/oauth2/token",
  authorize = "https://www.fitbit.com/oauth2/authorize",
  access = "https://api.fitbit.com/oauth2/token")
myapp <- oauth_app(
  appname = "data_access",
  key = "Your OAuth 2.0 Client ID", 
  secret = "Your Client (Consumer) Secret")

# 2. Get OAuth token
scope <- c("sleep","activity")  # See dev.fitbit.com/docs/oauth2/#scope
fitbit_token <- oauth2.0_token(fitbit_endpoint, myapp,
  scope = scope, use_basic_auth = TRUE)

# 3. Make API requests
resp <- GET(url = "https://api.fitbit.com/1/user/-/sleep/date/2015-10-10.json", 
  config(token = fitbit_token))
content(resp)
person Graham Parsons    schedule 09.01.2016
comment
Спасибо за добавление, Грэм! - person Isaac Wyatt; 11.01.2016
comment
Привет! Где я могу получить код аутентификации для шага № 2? - person CodingButStillAlive; 14.10.2016
comment
@CodingButStillAlive, не понимаю, что вы имеете в виду. На шаге № 1 вам необходимо ввести свои собственные значения для имени приложения (может быть любое другое), ключа и секрета (из вашего dev.fitbit.com). На шаге № 2 вы просто запускаете код как есть. - person Graham Parsons; 16.10.2016
comment
# 2 дает мне запрос кода авторизации (не токена авторизации!) В командной строке. - person CodingButStillAlive; 18.10.2016
comment
@CodingButStillAlive, я все еще не понимаю, что вы имеете в виду. Вероятно, лучше опубликовать новый вопрос с кодом, который вы используете, и точным выводом, который вы видите. - person Graham Parsons; 20.10.2016
comment
Теперь он работает, то есть открывает веб-страницу аутентификации, но затем появляется ошибка, что параметр redirect_uri недействителен. - person CodingButStillAlive; 24.11.2016

Поэтому я попросил помощи и на форумах fitbit, и пользователь grahamrp опубликовал следующее, используя oauth 1.0:

library(httr)
token_url = 'https://api.fitbit.com/oauth/request_token'
access_url = 'https://api.fitbit.com/oauth/access_token'
auth_url = 'https://www.fitbit.com/oauth/authorize'
key <- '<Client (Consumer) Key>'
secret <- '<Client (Consumer) Secret>'

myapp = oauth_app('data_access', key, secret)
fb_ep = oauth_endpoint(token_url, auth_url, access_url)
token = oauth1.0_token(fb_ep, myapp)
gtoken = config(token = token)

resp = GET('https://api.fitbit.com/1/user/-/sleep/date/today.json', gtoken)
content(resp)

Это работает для меня по состоянию на 31.08.2015. Ссылка: https://community.fitbit.com/t5/Web-API/Working-R-script-Using-API-R-Mac-OS-X/mp/931586/highlight/false#M3002

Всем спасибо за внимание к этому!

Лучший,

Исаак

person Isaac Wyatt    schedule 01.09.2015
comment
Привет! Приведенный выше код больше не работает. Вызванный веб-сайт выдает сообщение об ошибке. Я уже заменил oauth_1.0token () на oauth2.0_token (). Кто-нибудь может помочь? - person CodingButStillAlive; 24.11.2016