Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add chronodrive selection #1

Merged
merged 1 commit into from Mar 24, 2020
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file or symbol
Failed to load files and symbols.

Always

Just for now

Add chronodrive selection

  • Loading branch information
Matthieu Guigon
Matthieu Guigon committed Mar 24, 2020
commit d73f27a36b60bd9d70691d24627ea48bcee79a28
@@ -2,7 +2,7 @@

Détection automatisée de slots libres chez Chronodrive

* à mettre en crontab
* yarn start
* Une sirène sonne dès qu'un slot est libre, et bim tu valides ton panier
* Script absolument pas testé
* J'ai faim et hâte que cette sirène sonne...
@@ -0,0 +1,74 @@
const prompts = require('prompts');

module.exports = class ChronoDrive {
constructor(page, ui, status) {
this.page = page;
this.store = null;
this.ui = ui;
this.status = status;
}

async start() {
if (this.store === null) {
this.store = await this.askForStore();
this.ui.setStoreName(this.store.value);
}
this.ui.start();
this.reCheck();
}

async askForStore() {
let zipCode = prompts({type: 'text', name: 'value', message: 'Trouver un magasin proche de :'});
let pageLoader = this.page.goto('https://www.chronodrive.com', {waitUntil: 'domcontentloaded'});
let result = await Promise.all([pageLoader, zipCode]).then((result) => result[1].value);

this.ui.start();

await this.page.evaluate((zipCode) => {
document.querySelector('#searchField').value = zipCode;
document.querySelector('#linksubmit').click();
}, result);
await this.page.waitForSelector('#resultZone > ul');
let stores = await this.page.evaluate(() => {
let stores = {};
document.querySelectorAll('#resultZone > ul > li').forEach((el) => {
let title = el.querySelector('.lib-drive strong').textContent;
stores[ title ] = {
value: title,
url: el.querySelector('a.btn-green').href
}
});
return stores;
});
this.ui.stop();
let choice = await prompts({type: 'select', name: 'name', message: '', choices: Object.values(stores)});
return stores[choice.name];
}

async reCheck()
{
try {
this.status.setRequesting(true);
await this.page.goto(this.store.url, {waitUntil: 'domcontentloaded'});
this.status.setRequesting(false);
await this.check();
} catch(_) {
this.status.add('error');
}
setTimeout(async() => { this.reCheck(); }, 30000)
}

async check()
{
if (/maintenance\.html$/.test(this.page.url())) {
this.status.add('maintenance' + i < 3 ? '' : '+');
return ;
}
let hasNoSlots = await this.page.$eval('body', (el) => el.classList.contains('hasNoSlots'));
if (!hasNoSlots) {
this.status.add('available');
} else {
this.status.add('unavailable');
}
}
}
BIN +899 KB demo.gif
Binary file not shown.
@@ -6,40 +6,18 @@
* Chronovid19
*
* Teste si son Chronodrive préféré a un slot de libre
*
* la classe hasNoSlots est appliqué au body si rien n'est libre, on estime que si c'est libre cette classe n'apparait pas ...
*/

const puppeteer = require('puppeteer');

const urlStore = 'https://www.chronodrive.com/prehome.searchshop.searchshoplayercontent.goshop.actionlink_0/1007/Prehome$007c1007_Ballainvilliers$007csearch$0020results';

const util = require('util');
const exec = util.promisify(require('child_process').exec);
const status = new (require('./status'))();
const ChronoDrive = require('./chronodrive');

(async() => {
const browser = await puppeteer.launch();
const browser = await puppeteer.launch({headless: true});
const page = await browser.newPage();
await page.goto(urlStore, {waitUntil: 'domcontentloaded'});

const bodyClassList = await page.$eval('body', el => el.classList);

let hasSlots = true;
for (let [key, value] of Object.entries(bodyClassList)) {
if (value == 'hasNoSlots') {
hasSlots = false;
}
}

if (hasSlots) {
console.log(new Date(), ': YOUPI DES SLOTS :)');
// très MacOS...
await exec('say YA UN SLOTTE CHRONODRAILLVE LIBRE DEPECHE TOI DE VALIDER TON PANIER');
} else {
console.log(new Date(), ': RIEN de LIBRE :(');
}

await browser.close();
const ui = new (require('./ui'))(status, 150);

let drive = new ChronoDrive(page, ui, status);
drive.start();
})();

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.