Skip to content

Instantly share code, notes, and snippets.

@KL13NT
Created April 5, 2021 13:40
Show Gist options
  • Save KL13NT/685c41e30f22a738677dc200851ea666 to your computer and use it in GitHub Desktop.
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.
/**
* 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