fitbit-livedata
Version:
This project aims to getting `livedata` from Fitbit tracker
88 lines (72 loc) • 3.5 kB
JavaScript
;Object.defineProperty(exports, "__esModule", { value: true });var _axios = require('axios');var _axios2 = _interopRequireDefault(_axios);
var _querystring = require('querystring');var _querystring2 = _interopRequireDefault(_querystring);
var _deviceTypes = require('./deviceTypes');var _deviceTypes2 = _interopRequireDefault(_deviceTypes);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
_axios2.default.defaults.baseURL = 'https://android-cdn-api.fitbit.com';
var SCOPE = ''; // activity heartrate location nutrition profile settings sleep social weight mfa_ok';
var GRANT_TYPE_AUTHCODE = 'authorization_code';
var GRANT_TYPE_PASSWORD = 'password';
var REDIRECT_URI = 'https://horihiro.github.io/node-fitbit-livedata/';
var AUTHORIZATION = 'Basic MjI4VlNSOjQ1MDY4YTc2Mzc0MDRmYzc5OGEyMDhkNmMxZjI5ZTRm';
var URL_OAUTH = 'https://android-api.fitbit.com/oauth2/token';
var PATH_USER_DEVICES = '/1/user/-/devices.json';
var PATH_GENBLECREDS = '/1/user/-/devices/tracker/generateBtleClientAuthCredentials.json';exports.default =
function (accounts) {
var accountArray = function () {return accounts instanceof Array ? accounts : [accounts];}();
return Promise.all(accountArray.map(function (account) {
var params = function () {
var queries = {
scope: SCOPE };
if (account.username && account.password) {
queries.username = account.username;
queries.password = account.password;
queries.grant_type = GRANT_TYPE_PASSWORD;
} else if (account.authCode) {
queries.code = account.authCode;
queries.redirect_uri = REDIRECT_URI;
queries.grant_type = GRANT_TYPE_AUTHCODE;
} else {
return null;
}
return _querystring2.default.stringify(queries);
}();
if (!params) return null;
var options = {
headers: {
Authorization: AUTHORIZATION } };
return _axios2.default.post(URL_OAUTH, params, options);
})).then(function (responses) {
var promises = responses.map(function (response) {return _axios2.default.get(PATH_USER_DEVICES, {
headers: {
Authorization: 'Bearer ' + response.data.access_token } });});
return Promise.all(promises).then(function (results) {return {
responses: results,
tokens: responses.map(function (response) {return response.data.access_token;}) };});
}).then(function (results) {var
tokens = results.tokens;
var allDevices = results.responses.reduce(function (prev, curr, index) {
var userDevices = curr.data;
return prev.concat(userDevices.map(function (device) {
var serialNumber = device.wireId;
var address = device.mac.match(/.{2}/g).reverse().join(':');
var metadata = _deviceTypes2.default.filter(function (type) {return type.name === device.deviceVersion;});
var params = _querystring2.default.stringify({
serialNumber: device.wireId });
return _axios2.default.post(PATH_GENBLECREDS, params, {
headers: {
Authorization: 'Bearer ' + tokens[index] } }).
then(function (res2) {
var auth = res2.data;
if (metadata.length === 1) {
auth.type = metadata[0].authType;
}
return {
name: metadata[0].name,
auth: auth,
serialNumber: serialNumber,
address: address };
});
}));
}, []);
return Promise.all(allDevices);
});
};