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
|
||||
.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