From 34bccd8defd351e8b4d5d874d6472b392381733b Mon Sep 17 00:00:00 2001 From: Alex Drinkwater Date: Mon, 19 Jul 2021 09:28:50 -0600 Subject: [PATCH] Add the ability to search for specific days, months or any date. (#33) * Add the ability to search for specific days, months or any date. * Remove console.log * Bump version * Add reset button * Add refresh time --- MIQ-Booking-Assistance/index.html | 47 ++++++--- MIQ-Booking-Assistance/miq-assistance.js | 128 +++++++++++++++-------- MIQ-Booking-Assistance/package.json | 2 +- MIQ-Booking-Assistance/renderer.js | 85 ++++++++++++++- 4 files changed, 196 insertions(+), 66 deletions(-) diff --git a/MIQ-Booking-Assistance/index.html b/MIQ-Booking-Assistance/index.html index 071ed3a..68e7a93 100644 --- a/MIQ-Booking-Assistance/index.html +++ b/MIQ-Booking-Assistance/index.html @@ -15,34 +15,47 @@

MIQ Booking Assistance


Settings:

- -
+

Find any date:

+ +
+ +
+ +
+
+ + + + + +
+

Dates:

+
    +
+
+
+

-
+

Accessibility Room:



+ +
+ + + +
+
+ +
\ No newline at end of file diff --git a/MIQ-Booking-Assistance/miq-assistance.js b/MIQ-Booking-Assistance/miq-assistance.js index 42f8090..f13c221 100644 --- a/MIQ-Booking-Assistance/miq-assistance.js +++ b/MIQ-Booking-Assistance/miq-assistance.js @@ -1,8 +1,11 @@ // MIQ BOOKING ASSISTANCE -// CHANGE MONTH NUMBER TO DESIRED MONTH -// january = 1, february = 2, march = 3, april = 4, may = 5, june = 6, july = 7, august = 8, september = 9, october = 10, november = 11, december = 12 -let month = 11; +// CHANGE DATES TO WHAT YOU ARE LOOKING FOR +let myDates = ['2021-8-5', '2021-8-10', '2021-9']; + +// DON'T CARE ABOUT A SPECIFIC DATE? SET THIS TO TRUE +let findAnyDate = true; + let accessibilityRequirement = false; // change to "true" if you have accessibility requirement let roomType = 'twin'; // double or twin @@ -20,15 +23,20 @@ const password = 'YOUR_PASSWORD'; // -------------- // OPTIONAL: How many seconds to refresh the page. // Don't decrease this further to prevent 403 errors: https://github.com/jvolker/miq-nz-booking-tools/issues/8 -const secondsTillRefresh = 5; +let secondsTillRefresh = 5; // -------------- const puppeteer = require('puppeteer-extra'); const StealthPlugin = require('puppeteer-extra-plugin-stealth'); +let reset = false; let checkedCount = 0; let electronWindow; +// Enter some dates to simulate the MIQ website having availability, e.g. '2021-10-1' +// It allows three checks before the injecting the date +let testDates = []; + const service = { start: start } @@ -53,11 +61,12 @@ function start(window, ipcMain) { await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'); + console.log('Welcome to the MIQ Booking Assistance!') + updateElectronStatus('status', 'A new browser window should appear. Please navigate to "Secure your allocation" page.'); + console.log('A new browser window should appear. Please navigate to "Secure your allocation" page.') + if (step === "login") await login(page) - else { - console.log('Welcome to the MIQ Booking Assistance!') - updateElectronStatus('status', 'A new browser window should appear. Please navigate to "Secure your allocation" page.'); - console.log('A new browser window should appear. Please navigate to "Secure your allocation" page.') + if (!page.url().includes('MIQ-DEFAULT-EVENT/accommodation')) { await page.goto('https://allocation.miq.govt.nz/portal/dashboard'); while (true) { await page.waitForTimeout(300); @@ -65,11 +74,27 @@ function start(window, ipcMain) { break } } + } + updateElectronStatus('status', 'Found "Secure your allocation" page! Wait for beep sound, then select date and continue booking.') + console.log('Found "Secure your allocation" page! Wait for beep sound, then select date and continue booking.') + while (true) { + await prepareAndCheckPage(page) + while(true) { + // Found date availability + // Wait for the reset button to be pressed. + updateElectronAvailable(); + await page.waitForTimeout(300); + if (page.url().includes('/event/MIQ-DEFAULT-EVENT/accommodation') && reset) { + reset = false; + await page.reload({ waitUntil: ["networkidle0", "domcontentloaded"] }); + break; + } + } - updateElectronStatus('status', 'Found "Secure your allocation" page! Wait for beep sound, then select date and continue booking.') - console.log('Found "Secure your allocation" page! Wait for beep sound, then select date and continue booking.') - await prepareAndCheckPage(page, window) } + + + })(); } @@ -81,12 +106,10 @@ async function login(page) { await page.$eval('#username ', (el, email) => { el.value = email }, email); // replace YOUR_EMAIL_ADDRESS with your email address await page.$eval('#password ', (el, password) => { el.value = password }, password); // replace YOUR_PASSWORD with your password address - // const consentButton = '#gtm-acceptAllCookieButton'; - // await page.waitForSelector(consentButton); - // await page.click(consentButton); + await page.waitForNavigation({ waitUntil: ["networkidle0", "domcontentloaded"], timeout: 0}) } -async function prepareAndCheckPage(page, window) { +async function prepareAndCheckPage(page) { //accessibility requirement await page.waitForSelector('#form_rooms_0_accessibilityRequirement_1'); page.$eval('#form_rooms_0_accessibilityRequirement_' + (accessibilityRequirement ? 0 : 1), elem => { @@ -104,36 +127,12 @@ async function prepareAndCheckPage(page, window) { }, roomType); await page.waitForSelector('.flatpickr-input'); - const found = await page.$eval('.flatpickr-input', (elem, month) => { - elem.scrollIntoView(); - const fp = elem._flatpickr - - //choose month - fp.changeMonth(month - 1, false) - - //find available spots - var available = document.querySelectorAll('.flatpickr-day:not(.flatpickr-disabled)'); - const found = available.length > 0 - if (found) { - console.log("AVAILABLE! Found at: " + new Date().toLocaleString()) - console.log(available) - beep() - return found - } else { - return false - } - - function beep() { - var snd = new Audio("data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU="); - snd.loop = true; - snd.play(); - } - }, month); - if (found) { + if (await findAvailability(page)) { const status = "AVAILABLE! Found at: " + new Date().toLocaleString(); console.log(status) updateElectronStatus('status-count', status); + testDates = []; } else { // Remove the previous log message if we have checked before and we are running in node. if (process.stdout.moveCursor && checkedCount){ @@ -146,17 +145,55 @@ async function prepareAndCheckPage(page, window) { updateElectronStatus('status-count', status); await page.waitForTimeout(secondsTillRefresh * 1000); await page.reload({waitUntil: ["networkidle0", "domcontentloaded"]}); - await prepareAndCheckPage(page, window) + await prepareAndCheckPage(page) } } +async function findAvailability(page) { + return await page.evaluate((myDates, testDates, findAnyDate, checkedCount) => { + const calendarElem = document.getElementById('accommodation-calendar'); + const fp = calendarElem._flatpickr; + if (testDates && testDates.length > 0 && checkedCount > 2) { + fp.config.enable = testDates; + calendarElem.setAttribute('data-arrival-dates', testDates.join("_")); + } + calendarElem.scrollIntoView(); + + const dataArrivalDates = calendarElem.getAttribute('data-arrival-dates'); + const availableDates = dataArrivalDates.split('_'); + const matchingDates = availableDates.filter(d => myDates.indexOf(d) !== -1); + const myMonths = [...new Set(myDates.filter(d => d.split('-').length === 2).map(d => d.split('-')[1]))].sort(); + const matchingMonths = availableDates.filter(d => myMonths.indexOf(d.split('-')[1])) + if (matchingDates.length > 0 || matchingMonths.length > 1 || (findAnyDate && availableDates[0])) { + const month = (findAnyDate ? availableDates[0] : matchingDates[0]).split('-')[1] - 1; + fp.changeMonth(month, false) + beep() + return true; + } + + return false; + + function beep() { + var snd = new Audio("data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU="); + snd.loop = true; + snd.play(); + } + }, myDates, testDates, findAnyDate, checkedCount) +} + function initElectron(ipcMain, window) { electronWindow = window; if (!ipcMain) return; ipcMain.on('settings', (ev, settings) => { - month = settings.month; + myDates = settings.dates; accessibilityRequirement = settings.accessibilityRequirement; roomType = settings.roomType; + findAnyDate = settings.findAnyDate; + secondsTillRefresh = settings.refreshTime; + + if (settings.reset) { + reset = true; + } }); } @@ -165,4 +202,9 @@ function updateElectronStatus(channel, message) { electronWindow.webContents.send(channel, { message: message }) } +function updateElectronAvailable() { + if (!electronWindow) return; + electronWindow.webContents.send('available', { available: true }) +} + module.exports = service; \ No newline at end of file diff --git a/MIQ-Booking-Assistance/package.json b/MIQ-Booking-Assistance/package.json index 6852230..7699c26 100644 --- a/MIQ-Booking-Assistance/package.json +++ b/MIQ-Booking-Assistance/package.json @@ -1,6 +1,6 @@ { "name": "miq-nz-booking-assistance", - "version": "0.9.0", + "version": "0.10.0", "description": "A tool to help you book MIQ", "main": "main.js", "scripts": { diff --git a/MIQ-Booking-Assistance/renderer.js b/MIQ-Booking-Assistance/renderer.js index d299527..a6dc65f 100644 --- a/MIQ-Booking-Assistance/renderer.js +++ b/MIQ-Booking-Assistance/renderer.js @@ -1,28 +1,103 @@ const { ipcRenderer } = require('electron') -const monthSelect = document.getElementById('months'); const accessibilityRoomYes = document.getElementById('accessibilityRoom_yes'); const accessibilityRoomNo = document.getElementById('accessibilityRoom_no'); +const findAnyDateYes = document.getElementById('findAnyDate_yes'); +const findAnyDateNo = document.getElementById('findAnyDate_no'); const roomType = document.getElementById('roomType'); +const dateButton = document.getElementById('date-button'); +const monthButton = document.getElementById('month-button'); +const dateList = document.getElementById('date-list'); +const clearButton = document.getElementById('clear-button'); +const dateInput = document.getElementById('date-input'); +const dateDiv = document.getElementById('date-div'); +const resetButton = document.getElementById('reset-button'); +const refreshTime = document.getElementById('refresh'); + +dateDiv.style.display = "none"; + +let dates = []; let date = new Date(); date.setMonth(date.getMonth() + 2); -monthSelect.value = date.getMonth(); sendSettings(); ipcRenderer.on('status', function (evt, status) { document.getElementById('status').innerText = status.message; + resetButton.disabled = true; }); ipcRenderer.on('status-count', function (evt, status) { document.getElementById('status-count').innerText = status.message; + resetButton.disabled = true; +}); + +ipcRenderer.on('available', function (evt, message) { + resetButton.disabled = false; }); -monthSelect.addEventListener('change', sendSettings) accessibilityRoomYes.addEventListener('change', sendSettings) accessibilityRoomNo.addEventListener('change', sendSettings) roomType.addEventListener('change', sendSettings) -function sendSettings(){ - ipcRenderer.send('settings', {month: monthSelect.value, accessibilityRequirement: accessibilityRoomYes.checked, roomType: roomType.value}); +dateButton.addEventListener('click', () => { + if(dateInput.value && dates.indexOf(dateInput.value) === -1){ + dates.push(dateInput.value); + } + updateDateUI(); + sendSettings(); +}) + +monthButton.addEventListener('click', () => { + if(dateInput.value && dates.indexOf(dateInput.value.substring(0, 7)) === -1){ + dates.push(dateInput.value.substring(0, 7)); + } + updateDateUI(); + sendSettings(); +}) + +clearButton.addEventListener('click', () => { + dates = []; + updateDateUI(); + sendSettings(); +}) + +findAnyDateYes.addEventListener('change', () => { + dateDiv.style.display = "none"; + sendSettings(); +}) + +findAnyDateNo.addEventListener('change', () => { + dateDiv.style.display = ""; + sendSettings(); +}) + +resetButton.addEventListener('click', () => { + sendSettings(true); +}) + +refreshTime.addEventListener('change', () => { + sendSettings(); +}) + +function updateDateUI() { + dateList.innerHTML = ""; + dates.forEach(d => { + var li = document.createElement("li"); + li.appendChild(document.createTextNode(d)); + dateList.appendChild(li); + }) +} + +function sendSettings(reset = false){ + ipcRenderer.send( + 'settings', + { + dates: dates, + accessibilityRequirement: accessibilityRoomYes.checked, + roomType: roomType.value, + findAnyDate: findAnyDateYes.checked, + reset: reset, + refreshTime: refreshTime.value + }); }