Skip to content

Instantly share code, notes, and snippets.

@lances101
Created July 19, 2018 20:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lances101/28f6ec457de296be24a66e28b58a7393 to your computer and use it in GitHub Desktop.
Save lances101/28f6ec457de296be24a66e28b58a7393 to your computer and use it in GitHub Desktop.
http://call-bill.com washing machine availability notifier
/**
* visits call-bill.com, logs in and
* searches for available washing machines
* execs whatever is in the exec command when machine is found
* by default uses OSX "say" command.
* =====
* requires puppeteer: npm i puppeteer
* =====
*/
const puppeteer = require('puppeteer');
const EMAIL = "";
const PASSWORD = "";
const EXEC_INTRO = 'say "Checking up on CallBill"';
const EXEC_FOUND = 'say "Machine {0} is {1}"';
const WAIT_TIME_SECONDS = 60;
(async() => {
const exec = require('child_process').execSync;
function delay(time) {
return new Promise(function(resolve) {
setTimeout(resolve, time)
});
}
const browser = await puppeteer.launch({
// headless: false,
});
exec(EXEC_INTRO);
const page = await browser.newPage();
console.log("Started")
await page.goto('https://call-bill.com/nl/', {
waitUntil: ['load', 'networkidle0']
});
console.log("On main page");
await page.click("#navbar > ul.nav.navbar-nav.navbar-right > li.button.login.login-box-open");
await page.type("#loginbox > div:nth-child(2) > input", EMAIL);
await page.type("#loginbox > div:nth-child(3) > input", PASSWORD)
await page.click("#loginbox > div:nth-child(4) > button");
console.log("Tried to log in. Now waiting for transactions block");
await page.waitForSelector("div.active_block.WASHING_MACHINE", {
visible: true
})
console.log("Seems like we are in.");
const MACHINES_TABLE_SELECTOR = "div.wb-modal.pop.show > div > div > div.wb-modal-scroll > table > tbody.filterContent > tr"
while (true) {
console.log("Doing check now");
await page.click("div.active_block.WASHING_MACHINE");
await page.waitForSelector(MACHINES_TABLE_SELECTOR)
var results = await page.evaluate(MACHINES_TABLE_SELECTOR => {
var rows = Array.from(document.querySelectorAll(MACHINES_TABLE_SELECTOR))
var results = []
for (var rowi in rows) {
var row = rows[rowi];
var id = row.querySelector("td:nth-child(2)").innerText
var status = row.querySelector("td:nth-child(3) > div > span").innerText;
results.push({
"id": id,
"status": status
})
}
return results;
}, MACHINES_TABLE_SELECTOR);
for (var entryi in results) {
var entry = results[entryi];
console.log(`${entry['id']} - ${entry['status']}`);
if (entry['status'] != "Occupied")
exec(EXEC_FOUND.replace("{0}", entry['id']).replace("{1}", entry['status']))
}
console.log("Closing modal")
await page.click("div.wb-modal.pop.show > div > div > div.wb-modal-header > div > span")
console.log("Waiting 60 seconds");
await delay(WAIT_TIME_SECONDS * 1000);
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment