Created
April 5, 2021 13:40
-
-
Save KL13NT/685c41e30f22a738677dc200851ea666 to your computer and use it in GitHub Desktop.
A simple NodeJS Puppeteer automation script to detect a single change on a webpage. Supports authentication.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 1. npm init -y | |
* 2. npm install puppeteer @types/puppeteer env-cmd say | |
* 3. create .env file with required variables | |
id_selector= | |
password_selector= | |
submit_selector= | |
id= | |
password= | |
login= | |
target= | |
message= | |
query= | |
* 4. npx env-cmd node index.js | |
* voila! | |
*/ | |
const puppeteer = require('puppeteer') | |
const say = require('say') | |
const { | |
id, | |
password, | |
login, | |
target, | |
message, | |
query, | |
id_selector, | |
password_selector, | |
submit_selector | |
} = process.env | |
const speak = async (message, voice, speed) => { | |
return new Promise((resolve, reject) => { | |
say.speak(message, voice, speed, err => { | |
if (err) reject(err) | |
else resolve() | |
}) | |
}) | |
} | |
const selectors = { | |
id: id_selector, | |
password: password_selector, | |
submit: submit_selector | |
} | |
/** | |
* | |
* @param {puppeteer.Page} page | |
*/ | |
const doLogin = async page => { | |
console.log('navigating to login page') | |
await page.goto(login) | |
console.log('filling in login details') | |
await (await page.$(selectors.id)).type(id, { delay: 100 }) | |
await (await page.$(selectors.password)).type(password, { delay: 100 }) | |
await (await page.$(selectors.submit)).click() | |
console.log('waiting for login redirection') | |
return page.waitForNavigation() | |
} | |
/** | |
* | |
* @param {puppeteer.Page} page | |
*/ | |
const reloadAndCheck = async page => { | |
try { | |
console.log('navigating to target') | |
await page.goto(target) | |
console.log('checking current page url', page.url()) | |
if (page.url() !== target || (await page.$(selectors.id))) { | |
console.log('not logged in?') | |
await doLogin(page) | |
console.log('navigating to target again') | |
await page.goto(target) | |
} | |
console.log('Waiting 10 seconds before checking') | |
setTimeout(async () => { | |
if ( | |
!(await page.evaluate(() => document.body.innerHTML)).includes(query) | |
) { | |
console.log('page has different content than query') | |
console.log(await speak(message, undefined, undefined)) | |
console.log(await speak(message, undefined, undefined)) | |
console.log(await speak(message, undefined, undefined)) | |
console.log(await speak(message, undefined, undefined)) | |
} else console.log('page has query') | |
}, 10000) | |
} catch (error) { | |
console.error(error) | |
speak('Something went wrong') | |
speak('Something went wrong') | |
} | |
} | |
;(async () => { | |
try { | |
const browser = await puppeteer.launch({ | |
headless: true | |
}) | |
const page = await browser.newPage() | |
await page.goto(target) | |
reloadAndCheck(page) | |
setInterval(() => reloadAndCheck(page), 1000 * 60 /* 60 seconds */) | |
} catch (error) { | |
console.log(error) | |
await browser.close() | |
} | |
})() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment