our-groceries-client
Version:
A client for Our Groceries
167 lines (153 loc) • 14 kB
JavaScript
'use strict';
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var request = require('request'),
urls = require('./urls'),
jar = request.jar(),
defaultHandler = require('./default-handler');
var request = request.defaults({
jar: jar,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
}
});
function OurGroceriesClient(appId) {
this._appId = appId;
}
OurGroceriesClient.prototype.authenticate = function (username, password, complete) {
complete = complete || defaultHandler;
console.log("Authenticating");
var self = this;
request.post({
url: urls.signIn,
form: {
emailAddress: username,
action: "sign-me-in",
password: password,
staySignedIn: "on"
},
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
'Referer': 'https://www.ourgroceries.com/sign-in',
'Origin': 'https://www.ourgroceries.com'
}
}, function (err, response, body) {
if (err) {
console.log("Error Authenticating: " + err);
complete({ success: false, error: err });
} else {
self.auth = jar.getCookieString(urls.signIn);
if (self.auth) {
console.log("Success");
self.getTeamId(function (teamIdResponse) {
if (teamIdResponse.success) {
self.teamId = teamIdResponse.teamId;
complete({ success: true });
} else {
complete(teamIdResponse);
}
});
} else {
complete({ success: false, error: "Invalid Credentials" });
}
}
});
};
OurGroceriesClient.prototype.getTeamId = function (complete) {
complete = complete || defaultHandler;
console.log("Getting team id");
request(urls.yourLists, function (err, response, body) {
if (err) {
console.log("Error getting team id:" + err);
complete({ success: false, error: err });
} else {
var regex = /g_teamId = \"([A-Za-z0-9]*)\"/gm;
var teamId = regex.exec(body)[1];
console.log("Success fetching team id: " + teamId);
complete({ success: true, teamId: teamId });
}
});
};
//{"recipes":[],"shoppingLists":[{"activeCount":0,"name":"Duane Reade","id":"IiYWzpD8UeuLOoC-c6iEda"},{"activeCount":1,"name":"Fairway","id":"HeRpch6y09FJ10Vrxkekxt"},{"activeCount":3,"name":"Health Nuts","id":"C-NhAwDy061LKS3K7PZmri"},{"activeCount":0,"name":"Staples","id":"CVa5TtIWkkFJXBb9ILUppr"},{"activeCount":6,"name":"Trader Joes","id":"PStVFIyKkj5K6GPaxUJynn"},{"activeCount":3,"name":"West Side Market","id":"WHfkG3KbqpviqQSiP0B8Rd"},{"activeCount":0,"name":"Whole Foods","id":"qcrVcp5fhT0KecyOACaAkS"}],"command":"getOverview"}
OurGroceriesClient.prototype.getLists = function (complete) {
complete = complete || defaultHandler;
var self = this;
request.post({
url: urls.yourLists,
headers: {
Accept: "application/json, text/javascript, */*",
Origin: "https://www.ourgroceries.com",
Referer: "https://www.ourgroceries.com/your-list",
"X-Requested-With": "XMLHttpRequest",
"Host": "www.ourgroceries.com",
"Content-Type": "application/json"
},
json: { command: "getOverview", teamId: self.teamId }
}, function (err, response, body) {
if (err) {
complete({ success: false, error: err });
} else {
complete({ success: true, response: body });
}
});
};
OurGroceriesClient.prototype.addToList = function (listId, itemName, quantity, complete) {
complete = complete || defaultHandler;
var self = this;
request.post({
url: urls.yourLists,
headers: {
Accept: "application/json, text/javascript, */*",
Origin: "https://www.ourgroceries.com",
Referer: "https://www.ourgroceries.com/your-list",
"X-Requested-With": "XMLHttpRequest",
"Host": "www.ourgroceries.com",
"Content-Type": "application/json"
},
json: { command: "insertItem", teamId: self.teamId, listId: listId, value: this.__generateItemName(itemName, quantity) }
}, function (err, response, body) {
if (err) {
complete({ success: false, error: err });
} else {
complete({ success: true, response: body });
}
});
};
OurGroceriesClient.prototype.getList = function (listId, complete) {
complete = complete || defaultHandler;
var self = this;
request.post({
url: urls.yourLists,
headers: {
"Accept": "application/json, text/javascript, */*",
"Origin": "https://www.ourgroceries.com",
"Referer": "https://www.ourgroceries.com/your-list",
"X-Requested-With": "XMLHttpRequest",
"Host": "www.ourgroceries.com",
"Content-Type": "application/json"
},
json: { command: "getList", teamId: self.teamId, listId: listId }
}, function (err, response, body) {
if (err) {
complete({ success: false, error: err });
} else {
complete({ success: true, response: body });
}
});
};
OurGroceriesClient.prototype.findList = function (lists, listName) {
listName = listName.toLowerCase().replace(/\W/g, '');
var allLists = lists.map(function (item) {
item.matchName = item.name.toLowerCase().replace(/\W/g, '');
return item;
});
var candidates = allLists.filter(function (item) {
return item.matchName.indexOf(listName) === 0 || listName.indexOf(item.matchName) === 0;
});
return candidates.length > 0 ? candidates[0] : null;
};
OurGroceriesClient.prototype.__generateItemName = function (itemName, quantity) {
if (!quantity || quantity == 0) return itemName;
return itemName + ' (' + quantity + ')';
};
module.exports = OurGroceriesClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJvdXItZ3JvY2VyaWVzLWNsaWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnByb2Nlc3MuZW52Lk5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQgPSBcIjBcIjtcblxudmFyIHJlcXVlc3QgPSByZXF1aXJlKCdyZXF1ZXN0JyksXG4gICAgdXJscyA9IHJlcXVpcmUoJy4vdXJscycpLFxuICAgIGphciA9IHJlcXVlc3QuamFyKCksXG4gICAgZGVmYXVsdEhhbmRsZXIgPSByZXF1aXJlKCcuL2RlZmF1bHQtaGFuZGxlcicpO1xuXG52YXIgcmVxdWVzdCA9IHJlcXVlc3QuZGVmYXVsdHMoe1xuICBqYXI6IGphcixcbiAgaGVhZGVyczoge1xuICAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzQxLjAuMjIyOC4wIFNhZmFyaS81MzcuMzYnXG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBPdXJHcm9jZXJpZXNDbGllbnQoYXBwSWQpIHtcbiAgdGhpcy5fYXBwSWQgPSBhcHBJZDtcbn1cblxuT3VyR3JvY2VyaWVzQ2xpZW50LnByb3RvdHlwZS5hdXRoZW50aWNhdGUgPSBmdW5jdGlvbiAodXNlcm5hbWUsIHBhc3N3b3JkLCBjb21wbGV0ZSkge1xuICBjb21wbGV0ZSA9IGNvbXBsZXRlIHx8IGRlZmF1bHRIYW5kbGVyO1xuICBjb25zb2xlLmxvZyhcIkF1dGhlbnRpY2F0aW5nXCIpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJlcXVlc3QucG9zdCh7XG4gICAgdXJsOiB1cmxzLnNpZ25JbixcbiAgICBmb3JtOiB7XG4gICAgICBlbWFpbEFkZHJlc3M6IHVzZXJuYW1lLFxuICAgICAgYWN0aW9uOiBcInNpZ24tbWUtaW5cIixcbiAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgIHN0YXlTaWduZWRJbjogXCJvblwiXG4gICAgfSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCA2LjEpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS80MS4wLjIyMjguMCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vd3d3Lm91cmdyb2Nlcmllcy5jb20vc2lnbi1pbicsXG4gICAgICAnT3JpZ2luJzogJ2h0dHBzOi8vd3d3Lm91cmdyb2Nlcmllcy5jb20nXG4gICAgfVxuICB9LCBmdW5jdGlvbiAoZXJyLCByZXNwb25zZSwgYm9keSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgQXV0aGVudGljYXRpbmc6IFwiICsgZXJyKTtcbiAgICAgIGNvbXBsZXRlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnIgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuYXV0aCA9IGphci5nZXRDb29raWVTdHJpbmcodXJscy5zaWduSW4pO1xuICAgICAgaWYgKHNlbGYuYXV0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlN1Y2Nlc3NcIik7XG4gICAgICAgIHNlbGYuZ2V0VGVhbUlkKGZ1bmN0aW9uICh0ZWFtSWRSZXNwb25zZSkge1xuICAgICAgICAgIGlmICh0ZWFtSWRSZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICBzZWxmLnRlYW1JZCA9IHRlYW1JZFJlc3BvbnNlLnRlYW1JZDtcbiAgICAgICAgICAgIGNvbXBsZXRlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcGxldGUodGVhbUlkUmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wbGV0ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogXCJJbnZhbGlkIENyZWRlbnRpYWxzXCIgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbk91ckdyb2Nlcmllc0NsaWVudC5wcm90b3R5cGUuZ2V0VGVhbUlkID0gZnVuY3Rpb24gKGNvbXBsZXRlKSB7XG4gIGNvbXBsZXRlID0gY29tcGxldGUgfHwgZGVmYXVsdEhhbmRsZXI7XG4gIGNvbnNvbGUubG9nKFwiR2V0dGluZyB0ZWFtIGlkXCIpO1xuICByZXF1ZXN0KHVybHMueW91ckxpc3RzLCBmdW5jdGlvbiAoZXJyLCByZXNwb25zZSwgYm9keSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgZ2V0dGluZyB0ZWFtIGlkOlwiICsgZXJyKTtcbiAgICAgIGNvbXBsZXRlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnIgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZWdleCA9IC9nX3RlYW1JZCA9IFxcXCIoW0EtWmEtejAtOV0qKVxcXCIvZ207XG4gICAgICB2YXIgdGVhbUlkID0gcmVnZXguZXhlYyhib2R5KVsxXTtcbiAgICAgIGNvbnNvbGUubG9nKFwiU3VjY2VzcyBmZXRjaGluZyB0ZWFtIGlkOiBcIiArIHRlYW1JZCk7XG4gICAgICBjb21wbGV0ZSh7IHN1Y2Nlc3M6IHRydWUsIHRlYW1JZDogdGVhbUlkIH0pO1xuICAgIH1cbiAgfSk7XG59O1xuLy97XCJyZWNpcGVzXCI6W10sXCJzaG9wcGluZ0xpc3RzXCI6W3tcImFjdGl2ZUNvdW50XCI6MCxcIm5hbWVcIjpcIkR1YW5lIFJlYWRlXCIsXCJpZFwiOlwiSWlZV3pwRDhVZXVMT29DLWM2aUVkYVwifSx7XCJhY3RpdmVDb3VudFwiOjEsXCJuYW1lXCI6XCJGYWlyd2F5XCIsXCJpZFwiOlwiSGVScGNoNnkwOUZKMTBWcnhrZWt4dFwifSx7XCJhY3RpdmVDb3VudFwiOjMsXCJuYW1lXCI6XCJIZWFsdGggTnV0c1wiLFwiaWRcIjpcIkMtTmhBd0R5MDYxTEtTM0s3UFptcmlcIn0se1wiYWN0aXZlQ291bnRcIjowLFwibmFtZVwiOlwiU3RhcGxlc1wiLFwiaWRcIjpcIkNWYTVUdElXa2tGSlhCYjlJTFVwcHJcIn0se1wiYWN0aXZlQ291bnRcIjo2LFwibmFtZVwiOlwiVHJhZGVyIEpvZXNcIixcImlkXCI6XCJQU3RWRkl5S2tqNUs2R1BheFVKeW5uXCJ9LHtcImFjdGl2ZUNvdW50XCI6MyxcIm5hbWVcIjpcIldlc3QgU2lkZSBNYXJrZXRcIixcImlkXCI6XCJXSGZrRzNLYnFwdmlxUVNpUDBCOFJkXCJ9LHtcImFjdGl2ZUNvdW50XCI6MCxcIm5hbWVcIjpcIldob2xlIEZvb2RzXCIsXCJpZFwiOlwicWNyVmNwNWZoVDBLZWN5T0FDYUFrU1wifV0sXCJjb21tYW5kXCI6XCJnZXRPdmVydmlld1wifVxuT3VyR3JvY2VyaWVzQ2xpZW50LnByb3RvdHlwZS5nZXRMaXN0cyA9IGZ1bmN0aW9uIChjb21wbGV0ZSkge1xuICBjb21wbGV0ZSA9IGNvbXBsZXRlIHx8IGRlZmF1bHRIYW5kbGVyO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJlcXVlc3QucG9zdCh7XG4gICAgdXJsOiB1cmxzLnlvdXJMaXN0cyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLypcIixcbiAgICAgIE9yaWdpbjogXCJodHRwczovL3d3dy5vdXJncm9jZXJpZXMuY29tXCIsXG4gICAgICBSZWZlcmVyOiBcImh0dHBzOi8vd3d3Lm91cmdyb2Nlcmllcy5jb20veW91ci1saXN0XCIsXG4gICAgICBcIlgtUmVxdWVzdGVkLVdpdGhcIjogXCJYTUxIdHRwUmVxdWVzdFwiLFxuICAgICAgXCJIb3N0XCI6IFwid3d3Lm91cmdyb2Nlcmllcy5jb21cIixcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgfSxcbiAgICBqc29uOiB7IGNvbW1hbmQ6IFwiZ2V0T3ZlcnZpZXdcIiwgdGVhbUlkOiBzZWxmLnRlYW1JZCB9XG4gIH0sIGZ1bmN0aW9uIChlcnIsIHJlc3BvbnNlLCBib2R5KSB7XG4gICAgaWYgKGVycikge1xuICAgICAgY29tcGxldGUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGVyciB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcGxldGUoeyBzdWNjZXNzOiB0cnVlLCByZXNwb25zZTogYm9keSB9KTtcbiAgICB9XG4gIH0pO1xufTtcblxuT3VyR3JvY2VyaWVzQ2xpZW50LnByb3RvdHlwZS5hZGRUb0xpc3QgPSBmdW5jdGlvbiAobGlzdElkLCBpdGVtTmFtZSwgcXVhbnRpdHksIGNvbXBsZXRlKSB7XG4gIGNvbXBsZXRlID0gY29tcGxldGUgfHwgZGVmYXVsdEhhbmRsZXI7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICByZXF1ZXN0LnBvc3Qoe1xuICAgIHVybDogdXJscy55b3VyTGlzdHMsXG4gICAgaGVhZGVyczoge1xuICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCwgKi8qXCIsXG4gICAgICBPcmlnaW46IFwiaHR0cHM6Ly93d3cub3VyZ3JvY2VyaWVzLmNvbVwiLFxuICAgICAgUmVmZXJlcjogXCJodHRwczovL3d3dy5vdXJncm9jZXJpZXMuY29tL3lvdXItbGlzdFwiLFxuICAgICAgXCJYLVJlcXVlc3RlZC1XaXRoXCI6IFwiWE1MSHR0cFJlcXVlc3RcIixcbiAgICAgIFwiSG9zdFwiOiBcInd3dy5vdXJncm9jZXJpZXMuY29tXCIsXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgIH0sXG4gICAganNvbjogeyBjb21tYW5kOiBcImluc2VydEl0ZW1cIiwgdGVhbUlkOiBzZWxmLnRlYW1JZCwgbGlzdElkOiBsaXN0SWQsIHZhbHVlOiB0aGlzLl9fZ2VuZXJhdGVJdGVtTmFtZShpdGVtTmFtZSwgcXVhbnRpdHkpIH1cbiAgfSwgZnVuY3Rpb24gKGVyciwgcmVzcG9uc2UsIGJvZHkpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBjb21wbGV0ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZXJyIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wbGV0ZSh7IHN1Y2Nlc3M6IHRydWUsIHJlc3BvbnNlOiBib2R5IH0pO1xuICAgIH1cbiAgfSk7XG59O1xuXG5PdXJHcm9jZXJpZXNDbGllbnQucHJvdG90eXBlLmdldExpc3QgPSBmdW5jdGlvbiAobGlzdElkLCBjb21wbGV0ZSkge1xuICBjb21wbGV0ZSA9IGNvbXBsZXRlIHx8IGRlZmF1bHRIYW5kbGVyO1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgcmVxdWVzdC5wb3N0KHtcbiAgICB1cmw6IHVybHMueW91ckxpc3RzLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLypcIixcbiAgICAgIFwiT3JpZ2luXCI6IFwiaHR0cHM6Ly93d3cub3VyZ3JvY2VyaWVzLmNvbVwiLFxuICAgICAgXCJSZWZlcmVyXCI6IFwiaHR0cHM6Ly93d3cub3VyZ3JvY2VyaWVzLmNvbS95b3VyLWxpc3RcIixcbiAgICAgIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiOiBcIlhNTEh0dHBSZXF1ZXN0XCIsXG4gICAgICBcIkhvc3RcIjogXCJ3d3cub3VyZ3JvY2VyaWVzLmNvbVwiLFxuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICB9LFxuICAgIGpzb246IHsgY29tbWFuZDogXCJnZXRMaXN0XCIsIHRlYW1JZDogc2VsZi50ZWFtSWQsIGxpc3RJZDogbGlzdElkIH1cbiAgfSwgZnVuY3Rpb24gKGVyciwgcmVzcG9uc2UsIGJvZHkpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBjb21wbGV0ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZXJyIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wbGV0ZSh7IHN1Y2Nlc3M6IHRydWUsIHJlc3BvbnNlOiBib2R5IH0pO1xuICAgIH1cbiAgfSk7XG59O1xuXG5PdXJHcm9jZXJpZXNDbGllbnQucHJvdG90eXBlLmZpbmRMaXN0ID0gZnVuY3Rpb24gKGxpc3RzLCBsaXN0TmFtZSkge1xuICBsaXN0TmFtZSA9IGxpc3ROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxXL2csICcnKTtcbiAgdmFyIGFsbExpc3RzID0gbGlzdHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgaXRlbS5tYXRjaE5hbWUgPSBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFcvZywgJycpO1xuICAgIHJldHVybiBpdGVtO1xuICB9KTtcbiAgdmFyIGNhbmRpZGF0ZXMgPSBhbGxMaXN0cy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS5tYXRjaE5hbWUuaW5kZXhPZihsaXN0TmFtZSkgPT09IDAgfHwgbGlzdE5hbWUuaW5kZXhPZihpdGVtLm1hdGNoTmFtZSkgPT09IDA7XG4gIH0pO1xuICByZXR1cm4gY2FuZGlkYXRlcy5sZW5ndGggPiAwID8gY2FuZGlkYXRlc1swXSA6IG51bGw7XG59O1xuXG5PdXJHcm9jZXJpZXNDbGllbnQucHJvdG90eXBlLl9fZ2VuZXJhdGVJdGVtTmFtZSA9IGZ1bmN0aW9uIChpdGVtTmFtZSwgcXVhbnRpdHkpIHtcbiAgaWYgKCFxdWFudGl0eSB8fCBxdWFudGl0eSA9PSAwKSByZXR1cm4gaXRlbU5hbWU7XG4gIHJldHVybiBpdGVtTmFtZSArICcgKCcgKyBxdWFudGl0eSArICcpJztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT3VyR3JvY2VyaWVzQ2xpZW50OyJdLCJmaWxlIjoib3VyLWdyb2Nlcmllcy1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ==