mfp
Version:
A third-party API for accessing MyFitnessPal diary data
94 lines (72 loc) • 3.11 kB
JavaScript
;
var request = require('request');
var cheerio = require('cheerio');
var helpers = require('./helper-utils');
//some notes: we use the printable diary for most checks, but not water, which can't be fetched here.
var fetchSingleDate = function(username, date, fields, callback){
//get MyFitnessPal URL (eg. 'https://www.myfitnesspal.com/reports/printable_diary/npmmfp?from=2014-09-13&to=2014-09-13')
var url = helpers.mfpUrl(username, date, date);
var options = {
url: url,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
}
};
request(options, function(error, response, body) {
if (error) throw error;
var $ = cheerio.load(body);
//set results object to store data
var results = {};
//define variable for determining columns of fields on MFP page
var cols = {};
//find and set column numbers of nutrient fields
$('#food').find('thead').find('tr').find('td').each(function(index, element){
var $element = $(element);
var fieldName = $element.text().toLowerCase();
if (fieldName === "sugars") { fieldName = "sugar"; } // fixes MFP nutrient field name inconsistency
if (fieldName === "cholest") { fieldName = "cholesterol"; } // fixes MFP nutrient field name inconsistency
if (index !== 0) { cols[fieldName] = index; } //ignore first field, which just says "Foods"
});
//find row in MFP with nutrient totals
var $dataRow = $('tfoot').find('tr');
//store data for each field in results
for (var field in cols) {
var col = cols[field] + 1; //because nth-child selector is 1-indexed, not 0-indexed
var mfpData = $dataRow.find('td:nth-child(' + col + ')').first().text();
results[field] = helpers.convertToNum(mfpData);
}
if (fields !== 'all' && Array.isArray(fields)) {
//create targetFields object to hash user-specified nutrient fields
var targetFields = {};
fields.forEach(function(field){
targetFields[field] = true;
});
for (var nutrient in results) {
if (targetFields[nutrient] === undefined) {
delete results[nutrient];
}
}
}
//add date to results object
results.date = date;
//check to see if water is included
if (fields == 'all' || fields.includes('water')) {
var url = helpers.mfpWaterUrl(username, date);
var options = {
url: url,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
}
};
request(options, function(error, response, body) {
if (error) throw error;
var $ = cheerio.load(body);
results['water'] = helpers.convertToNum($('.water-counter p').text());
callback(results);
});
} else {
callback(results);
}
});
};
module.exports = fetchSingleDate;