UNPKG

basis-data

Version:

An async data retriever for Basis B1 tracker

145 lines (113 loc) 4.38 kB
'use strict'; // external libs var request = require('request'); var fs = require('fs'); var dateFormat = require('dateformat'); var rl = require('readline'); var chalk = require('chalk'); // internal libs var ask = require('./ask'); // global vars for stuff var date = new Date(); var outputFile = 'basis.json'; var usr, psw, access_token, expires; // Begin by getting the user info, either by checking for args passed or asking on command line. module.exports = function checkLogin(args) { if (args.length >= 1) { var email; console.log(chalk.green('Thanks.')); for (var i = 0; i < args.length; i++) { email = validateEmail(args[i]); if (!!email) { usr = args[i]; } psw = args[i]; } return requestUser(usr, psw); } else { console.log(chalk.red('Please enter username and/or password')); ask(chalk.green('What is your Basis username?'), function (answer) { usr = answer; ask(chalk.green('What is your Basis password?'), function (answer) { psw = answer; return requestUser(usr, psw); }); }); } }; var validateEmail = function (email) { var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return re.test(email); }; var getData = function (date) { var url, sleep = 'https://app.mybasis.com/api/v2/users/me/days/' + date + '/activities?type=sleep&expand=activities', activities = 'https://app.mybasis.com/api/v2/users/me/days/' + date + '/activities?type=run,walk,bike&expand=activities', details = 'https://app.mybasis.com/api/v1/chart/me?summary=true&interval=60&units=ms&start_date=' + date + '&start_offset=-10800&end_offset=10800&heartrate=true&steps=true&calories=true&gsr=true&skin_temp=true&bodystates=true'; ask(chalk.green('What kind of data would you like?') + chalk.blue(' sleep/activities/details'), function (answer) { if (answer === 'sleep') { url = sleep; } else if (answer === 'activities') { url = activities; } else { url = details; } request.get({ url: url, jar: access_token, json: true }, function (e, r, data) { if (e) return console.log(e); // Now let's save the JSON fs.writeFile(outputFile, JSON.stringify(data, null, 4), function (err) { if (err) { console.log(err); } else { console.log('JSON saved to ' + outputFile); } }); } ); }); }; var getToken = function (error, response) { if (error) return console.log(error); access_token = response.headers['set-cookie'][0].match(/access_token=([0-9a-f]+)/); // refresh_token = response.headers['set-cookie'][0].match( /refresh_token=([0-9a-f]+)/ ), // expires = response.headers['set-cookie'][0].match(/expires=([0-9a-f]+)/); request.get({ url: 'https://app.mybasis.com/api/v1/user/me.json', jar: access_token, json: true }, function (e, r, user) { if (e) return console.log(e); ask(chalk.green('Do you want today\'s info?') + chalk.blue(' (Y/N)'), function (answer) { var requestDate; answer.toLowerCase(); if (answer === 'y') { requestDate = dateFormat(date, 'yyyy-mm-dd'); getData(requestDate); } else { ask(chalk.green('Please enter new date.') + chalk.blue(' format: yyyy-mm-dd'), function (answer) { requestDate = answer; getData(requestDate); }); } }); }); }; var requestUser = function (usr, psw) { request({ uri: 'https://app.mybasis.com/login', method: 'POST', form: { username: usr, password: psw }, followRedirect: true, maxRedirects: 10, jar: true }, function (e, r, data) { if (e) return console.log(e); getToken(e, r, data); }); };