Initial working commit
This commit is contained in:
parent
55781daffd
commit
3d0dff75c2
6 changed files with 2341 additions and 0 deletions
25
.eslintrc.js
Normal file
25
.eslintrc.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
module.exports = {
|
||||||
|
env: {
|
||||||
|
es2021: true
|
||||||
|
},
|
||||||
|
extends: 'standard',
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
env: {
|
||||||
|
node: true
|
||||||
|
},
|
||||||
|
files: [
|
||||||
|
'.eslintrc.{js,cjs}'
|
||||||
|
],
|
||||||
|
parserOptions: {
|
||||||
|
sourceType: 'script'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 'latest',
|
||||||
|
sourceType: 'module'
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
}
|
||||||
|
}
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -130,3 +130,4 @@ dist
|
||||||
.yarn/install-state.gz
|
.yarn/install-state.gz
|
||||||
.pnp.*
|
.pnp.*
|
||||||
|
|
||||||
|
config.json
|
8
config-example.json
Normal file
8
config-example.json
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"libcalUrl": "",
|
||||||
|
"roomName": "",
|
||||||
|
"bookingTime": "",
|
||||||
|
"firstName": "",
|
||||||
|
"lastName": "",
|
||||||
|
"email": ""
|
||||||
|
}
|
22
package.json
Normal file
22
package.json
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"name": "libcal-bot",
|
||||||
|
"repository": "git@ssh.gitdab.com:110Percent/libcal-bot.git",
|
||||||
|
"author": "110Percent <110percent@riseup.net>",
|
||||||
|
"license": "AGPL-3",
|
||||||
|
"devDependencies": {
|
||||||
|
"@swc/cli": "^0.1.62",
|
||||||
|
"@swc/core": "^1.3.92",
|
||||||
|
"eslint": "^8.0.1",
|
||||||
|
"eslint-config-standard": "^17.1.0",
|
||||||
|
"eslint-plugin-import": "^2.25.2",
|
||||||
|
"eslint-plugin-n": "^15.0.0 || ^16.0.0 ",
|
||||||
|
"eslint-plugin-promise": "^6.0.0"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "npx swc ./src -d ./dist",
|
||||||
|
"start": "node ./dist/main.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"selenium-webdriver": "^4.14.0"
|
||||||
|
}
|
||||||
|
}
|
48
src/main.js
Normal file
48
src/main.js
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
const { Builder, Browser, By, Key, until, Select } = require('selenium-webdriver')
|
||||||
|
const config = require('../config.json');
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
const driver = await new Builder().forBrowser(Browser.FIREFOX).build()
|
||||||
|
try {
|
||||||
|
await driver.manage().setTimeouts({ implicit: 2000 })
|
||||||
|
await driver.get(config.libcalUrl)
|
||||||
|
|
||||||
|
// Pick the proper date
|
||||||
|
await driver.findElement(By.className('fc-goToDate-button')).click()
|
||||||
|
await driver.wait(until.elementIsVisible(driver.findElement(By.className('datepicker-days'))))
|
||||||
|
await driver.actions().sendKeys(Key.ARROW_DOWN).sendKeys(Key.RETURN).perform()
|
||||||
|
|
||||||
|
// Pick the correct date cell
|
||||||
|
const bookingCell = await driver.findElement(By.xpath(`//*[starts-with(@title, '${config.bookingTime}') and contains(@title,'- ${config.roomName} -')]`))
|
||||||
|
await bookingCell.click()
|
||||||
|
|
||||||
|
// Pick the longest available booking time
|
||||||
|
const dateSelectElement = await driver.findElement(By.className('b-end-date'))
|
||||||
|
const dateSelect = new Select(dateSelectElement)
|
||||||
|
await dateSelectElement.click()
|
||||||
|
const options = await dateSelect.getOptions()
|
||||||
|
await options[options.length - 1].click()
|
||||||
|
|
||||||
|
// Submit time
|
||||||
|
const submitButton = await driver.findElement(By.id('submit_times'))
|
||||||
|
await submitButton.click()
|
||||||
|
|
||||||
|
// Continue
|
||||||
|
const termsButton = await driver.findElement(By.id('terms_accept'))
|
||||||
|
await termsButton.click()
|
||||||
|
|
||||||
|
// Fill in name
|
||||||
|
await driver.wait(until.elementIsVisible(driver.findElement(By.id('fname'))))
|
||||||
|
await driver.findElement(By.id('fname')).sendKeys(config.firstName)
|
||||||
|
await driver.findElement(By.id('lname')).sendKeys(config.lastName)
|
||||||
|
await driver.findElement(By.id('email')).sendKeys(config.email)
|
||||||
|
|
||||||
|
// Submit booking
|
||||||
|
await driver.findElement(By.id('btn-form-submit')).click()
|
||||||
|
|
||||||
|
// Pause
|
||||||
|
await driver.sleep(20000)
|
||||||
|
} finally {
|
||||||
|
await driver.quit()
|
||||||
|
}
|
||||||
|
})()
|
Loading…
Reference in a new issue