From eca18a42860964f8d588dbb16991cd0dd6a51382 Mon Sep 17 00:00:00 2001 From: raminios Date: Thu, 4 Dec 2014 13:51:56 +0000 Subject: [PATCH] Added query node and dormant output node --- fatsecret/fatsecret.html | 350 ++++++++++++++++++++++++++++++ fatsecret/fatsecret.js | 418 ++++++++++++++++++++++++++++++++++++ fatsecret/icons/heart.png | Bin 0 -> 388 bytes transport/icons/bicycle.png | Bin 0 -> 455 bytes 4 files changed, 768 insertions(+) create mode 100644 fatsecret/fatsecret.html create mode 100644 fatsecret/fatsecret.js create mode 100644 fatsecret/icons/heart.png create mode 100644 transport/icons/bicycle.png diff --git a/fatsecret/fatsecret.html b/fatsecret/fatsecret.html new file mode 100644 index 00000000..2495d190 --- /dev/null +++ b/fatsecret/fatsecret.html @@ -0,0 +1,350 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fatsecret/fatsecret.js b/fatsecret/fatsecret.js new file mode 100644 index 00000000..8ab4d68c --- /dev/null +++ b/fatsecret/fatsecret.js @@ -0,0 +1,418 @@ +module.exports = function(RED) { + "use strict"; + var http = require("http"); + var crypto = require("crypto"); + + function generateSignatureString(parameterObject, secretObject, url, callback){ + parameterObject.oauth_signature_method = "HMAC-SHA1"; + parameterObject.oauth_timestamp = new Date().getTime(); + parameterObject.oauth_nonce = crypto.randomBytes(18).toString('base64').replace(/\//g, '-').replace(/\+/g, '_'); + parameterObject.oauth_version = "1.0"; + + var propertiesList = []; + + for(var key in parameterObject){ + if(parameterObject.hasOwnProperty(key)){ + propertiesList[propertiesList.length] = [key, parameterObject[key]]; + } + } + + propertiesList.sort(function(a, b) { + if (a[0] === b[0]) { + return 0; + } + else { + return (a[0] < b[0]) ? -1 : 1; + } + }); + + var urlComponent = ""; + + for(var i=0; i0){ + urlComponent = urlComponent + "&"; + } + urlComponent = urlComponent + propertiesList[i][0] + "=" + propertiesList[i][1]; + } + + var urlEncoded = encodeURIComponent(url); + var urlComponentEncoded = encodeURIComponent(urlComponent); + var signatureKey; + + var signatureBaseString = "GET&" + urlEncoded + "&" + urlComponentEncoded; + if(secretObject){ + signatureKey = secretObject.oauth_consumer_secret + "&" + (secretObject.oauth_access_secret || ""); + } + + var shasum = crypto.createHmac('sha1', signatureKey); + shasum.update(signatureBaseString); + var oauth_signature = encodeURIComponent(shasum.digest('base64')); + var completedUrl = url + "?" + urlComponent + "&oauth_signature=" + oauth_signature; + + callback(completedUrl); + } + + function getOauthTokens(key, secret, callback){ + var sigObject = {}; + var secretObject = {}; + sigObject.oauth_consumer_key = key;//"67209d50b61c4027aa08179e01f29bb4"; + secretObject.oauth_consumer_secret = secret; //"d4a5054fd17b4888a8eade385b628924"; + secretObject.oauth_access_secret = ""; + sigObject.oauth_callback = "oob"; + var urlStart = "http://www.fatsecret.com/oauth/request_token"; + + generateSignatureString(sigObject, secretObject, urlStart, function(completedUrl){ + http.get(completedUrl, function(res) { + var response = ""; + + res.on('data', function(d) { + response += d; + }); + + res.on('end', function() { + var tokenstart = response.indexOf("oauth_token=")+12; + var secretstart = response.indexOf("oauth_token_secret=")+19; + + if(tokenstart > 11 && secretstart >18){ //-1 offset for the added numbers + var oauth_token = response.substring(tokenstart, tokenstart+32); + var oauth_token_secret = response.substring(secretstart, secretstart+32); + var token_obj = {oauth_token:oauth_token, oauth_token_secret:oauth_token_secret}; + callback(token_obj); + } else { + callback({error:response}); + } + + + }); + }).on('error', function(e) { + node.error(e); + }); + }); + } + + function getAccessToken(key, secret, token, tokenSecret, verifier, callback){ + var sigObject = {}; + var secretObject = {}; + + sigObject.oauth_consumer_key = key; + secretObject.oauth_consumer_secret = secret; + secretObject.oauth_access_secret = tokenSecret; + sigObject.oauth_token = token; + sigObject.oauth_verifier = verifier; + + var urlStart = "http://www.fatsecret.com/oauth/access_token"; + generateSignatureString(sigObject, secretObject, urlStart, function(completedUrl){ + http.get(completedUrl, function(res) { + var response = ""; + + res.on('data', function(d) { + response += d; + }); + + res.on('end', function() { + var tokenstart = response.indexOf("oauth_token=")+12; + var secretstart = response.indexOf("oauth_token_secret=")+19; + if(tokenstart > 11 && secretstart >18){ //-1 offset for the added numbers + var access_token = response.substring(tokenstart, tokenstart+32); + var access_secret = response.substring(secretstart, secretstart+32); + var access_obj = {access_token:access_token, access_secret:access_secret}; + callback(access_obj); + } else { + callback({error:response}); + } + + }); + }).on('error', function(e) { + node.error(e); + callback(); + }); + }); + } + + function foodSearch(key, secret){ + var sigObject = {}; + var secretObject = {}; + + sigObject.oauth_consumer_key = key; + secretObject.oauth_consumer_secret = secret; + secretObject.oauth_access_secret = ""; + + sigObject.method = "foods.search"; + sigObject.search_expression = "Cheese"; + sigObject.max_results = 4; + + var urlStart = "http://platform.fatsecret.com/rest/server.api"; + generateSignatureString(sigObject, secretObject, urlStart, function(completedUrl){ + http.get(completedUrl, function(res) { + var response = ""; + + res.on('data', function(d) { + response += d; + }); + + res.on('end', function() { + console.log(response); + }); + }).on('error', function(e) { + node.error(e); + callback(); + }); + }); + } + + function getFood(key, secret){ + var sigObject = {}; + var secretObject = {}; + + sigObject.oauth_consumer_key = key; + secretObject.oauth_consumer_secret = secret; + + sigObject.format = "json"; + + sigObject.method = "food.get"; + sigObject.food_id = "1240"; + + var urlStart = "http://platform.fatsecret.com/rest/server.api"; + generateSignatureString(sigObject, secretObject, urlStart, function(completedUrl){ + http.get(completedUrl, function(res) { + var response = ""; + + res.on('data', function(d) { + response += d; + }); + + res.on('end', function() { + console.log(response); + }); + }).on('error', function(e) { + node.error(e); + callback(); + }); + }); + } + + function addFoodEntry(key, access_token, secret, access_secret){ + var sigObject = {}; + var secretObject = {}; + + sigObject.oauth_consumer_key = key; + secretObject.oauth_consumer_secret = secret; + secretObject.oauth_access_secret = access_secret; + sigObject.oauth_token = access_token; + + sigObject.format = "json"; + + sigObject.method = "food_entry.create"; + sigObject.food_id = "1240"; + sigObject.food_entry_name = "Cheese"; + sigObject.serving_id = "2363"; + sigObject.number_of_units = "1"; + sigObject.meal = "lunch"; + + var urlStart = "http://platform.fatsecret.com/rest/server.api"; + generateSignatureString(sigObject, secretObject, urlStart, function(completedUrl){ + http.get(completedUrl, function(res) { + var response = ""; + + res.on('data', function(d) { + response += d; + }); + + res.on('end', function() { + console.log(response); + }); + }).on('error', function(e) { + node.error(e); + callback(); + }); + }); + } + + function getFoodEntry(key, access_token, secret, access_secret, date, callback){ + var sigObject = {}; + var secretObject = {}; + + sigObject.oauth_consumer_key = key; + secretObject.oauth_consumer_secret = secret; + secretObject.oauth_access_secret = access_secret; + sigObject.oauth_token = access_token; + + sigObject.format = "json"; + + sigObject.method = "food_entries.get"; + sigObject.date = date; + + var urlStart = "http://platform.fatsecret.com/rest/server.api"; + + generateSignatureString(sigObject, secretObject, urlStart, function(completedUrl){ + http.get(completedUrl, function(res) { + var response = ""; + + res.on('data', function(d) { + response += d; + }); + + res.on('end', function() { + var jsun = JSON.parse(response); + callback(jsun); + }); + }).on('error', function(e) { + node.error(e); + callback(); + }); + }); + } + + function FatSecret(n) { + RED.nodes.createNode(this, n); + var node = this; + this.on('input', function(msg) { + console.log(n.mode); + var fatsecretConfig = RED.nodes.getNode(n.fatsecret); + if(fatsecretConfig){ + var key = fatsecretConfig.credentials.consumer_key; + var secret = fatsecretConfig.credentials.consumer_secret; + var access_token = fatsecretConfig.credentials.access_token; + var access_secret = fatsecretConfig.credentials.access_secret; + var date; + var calculatedDate; + var today = new Date(); + + if(n.date && n.mode == "date"){ + date = Date.parse(n.date.replace(/-/g,"/")); + } else if (n.mode == "message"){ + if(msg.time){ + date = msg.time.getTime(); + } else { + node.error("No msg.time present in the input."); + } + } else if(n.mode == "today"){ + date = today.getTime(); + } else if(n.mode == "yesterday"){ + date = (today.getTime())-86400000; + } else { + node.error("Missing mode entry"); //Shouldn't ever be reached + } + + if(date){ + calculatedDate = Math.floor((((date/1000)/60)/60)/24); //API requires the amount of days since 1970 rather than ms + + console.log(calculatedDate); + getFoodEntry(key, access_token, secret, access_secret, calculatedDate, function(result){ + if(result.food_entries === null){ + node.warn("No food diary found for the specified date."); + node.send(msg); + } else { + msg.data = result; + var foodlist = { "Breakfast": [], "Lunch": [], "Dinner": [], "Other":[]}; + for(var i=0; i$TcpE>9Ja|SB@KVh&?=YVaX4om^Jz)1+1||wJxdIYkwIJplSV6ro9_K-Q0%juh zUq^mH?fIuIVJeSwz9hpw0q!z;sEmXJBFA!)D3uey9zGUcg}q!Gj;~thUDx zYZn$m-Oo}OCC%1I)m3-Zet}qD-T70?)W$D^AXT@<@`1Xk_Htr9b)%HI)b(sUb=9>f i_E+obQuQBIeDMk4OcJmEr;maF0000H9s;bIxu+OA#>{ z5j_#HS`@|df4QQ9-_G$JS6VHwp@cea5ARzV8TTS$BqF*a;&DVgFVW)>aV;Wl6-Dv! zqONY@1CFqUCpc}OgIBqNPxysxyu{_2Xbxvs$HNrDQC+cqd`2%eQ!|SfIK)=qP7+Vi zm5Egx*LR3_7{Y6uUt(SVgvm|d54c``$+OS_L~^J#ZOd9v0;3zUFNgs xTAr&p`g)Usy;#jpW+q?x0AD(Pvkux4e*u@VzIEq$;M)KI002ovPDHLkV1n@YyAS{X literal 0 HcmV?d00001