Code Monkey home page Code Monkey logo

impf-bot's Introduction

💉🤖 Impf-Bot

Kotlin Java Gradle Selenium

Searches the official "ImpfterminService - Der Patientenservice 116117" for free Corona vaccination slots. It can search multiple locations at once which can be provided in a list. When it finds a free slot, it can use Slack to send you a message. All timings can be configured for your needs and to avoid blocking.

📱 Also the SMS verification step is managed by a Slack bot. Simply write the verification code into the Slack channel:

sms:999-999

⭐ Features

 ⭐ Full browser automation
 ⭐ No API Hacks
 ⭐ Telegram integration
 ⭐ Slack integration
 ⭐ Waiting room detection
 ⭐ Customizable by property file
 ⭐ Docker support to run it locally or in the cloud

🤩 Thank You

This bot exits and became so useful because of the over 20 people who contributed to this project. That is strength of open-source power 💪
zaanposni fabicodes atpanos philib s01iD superflo22 seppi91 alfonsrv schniggie h0nIg Timwun TobseF
So any thanks has to go to all contributors.
If anybody still wants to honor the initial publish you can buy Tobse a choco donut 🍩.

🧭 Overview

Sequence Digramm These steps are repeated for every location. So it's no problem to check 14 locations at once. If the bot recognizes that no free slots are available, it waits 30 seconds and goes on to the next location.

⚠ Warning: The online booking isn't an authorization

On the booking date you still have to bring the documents with you, to proof that you are qualified to receive the vaccination. Check out the official guidelines and make sure you are qualified for them. This bot doesn't help you get a privilege. It only allows you to get a date without losing the nerves or waisting a lifetime in pointless callcenter calls.

What is Slack and do I need it?

This bot can also work without it. Slack is a messaging application for companies. It is useful to get realtime updates from the bot and to do the SMS verification without the need to be in front of your computer. Otherwise, when the verification starts, you have only 10 minutes left to type the code into the automated browser window. If you take a journey through the dangerous outside world, this may be unpractical. I have chosen Slack, because it proves a nice Java API and it was already running in our company.

🛠 Setup

Java

To build and run the bot you need at least a Java 14 installation.

Selenium

The Impf-Bot uses Selenium to automate a webbrowser. Selenium requires a locally installed driver and browser - Chrome is recommended. The download of the chromedriver is done automatically via WebDriverManager.

config.properties

Settings are stored in a config file which is located in: src/main/resources/config.properties.
Edit these settings before the first run. A missing boolean property will be treated as false.

mainPageUrl = https://www.impfterminservice.de/impftermine
# Name of the state from the select list
state = Baden-Württemberg
# Comma separated list of locations. Optional, if you already have a placement code just add it in square brackets after the place. Since placement codes are not related to locations but to servers you can furthermore optionally specify the related server code next to the placement code in parentheses. The server code can be found in the URL e.g. "001-iz.impfterminservice.de" -> server code == "001".
locations = 69124 Heidelberg[XXXX-XXXX-XXXX](XXX),76137 Karlsruhe

# Birth date, used for age verification (which also changes the available vaccines).
birthDate = 31.12.1994

# Waiting time before checking the next location in seconds [s]
waitingTime = 120
# Waiting time for a manual user interaction in minutes [m]
waitingTimeForUserAction = 15
# Waiting time in Waiting Room in minutes [m]
waitingTimeInWaitingRoom = 15
# Timeout when searching an element on the page in seconds [s]
searchElementTimeout = 16
# Explicit waiting time for browser updates in seconds [s]
waitingTimeForBrowser = 2

# Settings for the request page. Only needed if you set `sendRequest = true`
sendRequest = false
email = [email protected]
# Mobile number for sms verification. Numbers after the "+49"
mobileNumber = 152123123123

# Enabled the Slack messages
slackEnabled = false
# These can be skipped, if Slack is disabled
slackBotApiToken = xoxb-123123123-123123123123123123123123123
slackBotChannel = #random
# Also read the SMS back from a channel. Needs the slackBotChannelReadSms-Name and Id.
readSmsFromSlack = false
slackBotChannelReadSmsName = #smsgameway
slackBotChannelReadSmsId = CE99999PY

# Enabled the Telegram messages
telegramEnabled = false
# These can be skipped, if Telegram is disabled
telegramApiToken = 10000001:AAEMkawDRi5-_yX7fr-pxxxxxxxxx-2EOE
telegramBotUsername = @iufdhsgouihsdfgbot
telegramChatId = 1231231231

# Enabled the Twilio Sendgrid email messages
sendgridEnabled = false
# These can be skipped, if Sendgrid is disabled
sendgridApiToken = SG.aaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
sendgridEmailFrom = [email protected]
sendgridEmailTo = [email protected]

# Enabled the Gmail email messages
gmailEnabled = false
# These can be skipped, if Gmail is disabled
gmailAppPassword = xxxxxxxxxxxxxxxx
gmailEmailFrom = [email protected]
# Can be the same as the from email
gmailEmailTo = [email protected]

# Enabled the IFTTT notifications
iftttEnabled = false
# These can be skipped, if IFTTT is disabled
iftttApiKey = xxxxxxxxxxxxxxxx
iftttEventName = notify

# Enabled alarm sound.
# Alarm will be played on start and in addition to an enabled notification service.
alarmEnabled = false
# Alarm duration in msec
alarmDuration = 2000
# Tone frequency in hz
alarmFrequency = 800
# Volume in percentage (0.0-1.0)
alarmVolumeInPercentage = 0.5

# Automatically selects the first possible vaccination date and enters all required personal data based on the following values to book this vaccination slot for you.
bookingEnabled = false
# Takes screenshots during booking process to have proof of you booking. (Optional)
takeScreenshots = false
# Defines the path were all screenshots will be stored in (Optional). Files will be prefixed with "impf-bot-"
outputPath = /home
# Personal Data
# Salutation (m=man, w=women, d=divers, c=child)
personalDataSalutation = m
# Firstname
personalDataFirstname = Max
# Lastname
personalDataLastname = Mustermann
# Zipcode
personalDataZipcode = 69124
# City
personalDataCity = Heidelberg
# Street
personalDataStreet = Hauptstraße
# House number
personalDataHouseNumber = 911
# Phone number. Numbers after the "+49"
personalDataMobileNumber = 152123123123
# E-Mail
personalDataEmail = [email protected]

# It seems that non windows agents are blocked. You can set it to "default" to use the default one of chrome.
# Could be something like: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"
userAgent = default

# Clears browser cookies to avoid bot detection. Disabled by default.
clearCookies = false
# Experimental feature, which tries to clear the browser cache to avoid bot detection. Disabled by default.
experimentalClearBrowser = false

Setup Slack

This step is optional. You can find detailed setup instructions here: SlackBot Setup.

Setup Telegram

This step is optional. You can find detailed setup instructions here: TelegramBot Setup.

Setup Gmail

This step is optional. You can find detailed setup instructions here: Gmail Setup.

Setup Ifttt

This step is optional. You can find detailed setup instructions here: Ifttt Setup.

Docker

This step is optional. To run this tool in Docker, follow this tutorial: Docker.

simplelogger.properties

Per default the bot logs only successful bookings.
To change the Log-Level edit the defaultLogLevel:
org.slf4j.simpleLogger.defaultLogLevel = info
| ℹ Change the log level to debug to get a more detailed output during every step.

🔨 Build

gradle build

The build creates runnable Java-fat-jar which contains all dependencies and the config:
build/libs/impf-bot-1.0-SNAPSHOT-all.jar

🚀 Start

To run the bot, simply use the gradle command:

gradle run

As an alternative, you can also start it with the fat-jar in the command line by:

java -jar build/libs/impf-bot-1.0-SNAPSHOT-all.jar 

📜 License

This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means.

For more information, check out unlicense.org

impf-bot's People

Contributors

alfonsrv avatar atpanos avatar dirkbloessl avatar fabicodes avatar gitolicious avatar h0nig avatar jahill92 avatar jufr avatar lk3de avatar ncface avatar pfuenzle avatar philib avatar rohtagra avatar schniggie avatar seppi91 avatar superflo22 avatar timoknapp avatar timwun avatar tobsef avatar zaanposni avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

impf-bot's Issues

[Hint] How to use selenium Grid

I had a little issues with Selenium, so I'm running selenium inside a docker container with SeleniumHQ/docker-selenium. I simply started it with

docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:4.0.0-beta-3-prerelease-20210422

You can see that it works by opening http://localhost:4444/ui/index.html#/.

Then I changed the createDriver() method a little to use the Grid server:

import de.tfr.impf.config.Config
import mu.KotlinLogging
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
import org.openqa.selenium.*;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.util.concurrent.TimeUnit

fun createDriver(): WebDriver {
    try {
        val nodeURL = "http://localhost:4444/wd/hub";
        val capability = DesiredCapabilities.chrome();
        capability.setBrowserName("chrome");
        val chromeDriver = RemoteWebDriver(URL(nodeURL), capability);

        chromeDriver.setTimeOut(Config.timeOutDefault)
        return chromeDriver
    } catch (e: MalformedURLException) {
        log.error("Failed to setup RemoteWebDriver ($e)")
        System.exit(1)
        return null
    }
}

And voila.. avoided installing Selenium. :) I don't know a good way to integrate this easily. I somehow found an appointment for one of my family anyway 30min before I got that working, so I was happy I didn't need it anymore. But this might help someone else. 😁

Automatische Buchung scheint gebrochen: "element click intercepted: Element ... is not clickable at point (331, 821)"

Heute habe ich mal wieder den sehr guten Bot für einen Bekannten angeworfen, vorher noch Update von e34d36e auf 7234e13, neu gebaut und gestartet.
Im laufe des Nachmittags hatte ich gleich die Möglichkeit einen Termin zu buchen, allerdings gab es folgende Ausgabe auf der Konsole:

17.06 14:21:58 INFO ReportJob - Found free vaccination dates in location 75175 Pforzheim:https://005-iz.impfterminservice.de/impftermine/suche/YOU-DONT-CARE/75175
Ten minutes left to choose a date.
17.06 14:22:00 INFO ReportJob - Selected first vaccination date
17.06 14:22:03 INFO ReportJob - Second booking step is shown
17.06 14:22:06 INFO ReportJob - Showing personal data form
17.06 14:22:08 INFO ReportJob - Salutation entered...
17.06 14:22:11 INFO ReportJob - Firstname entered...
17.06 14:22:13 INFO ReportJob - Lastname entered...
17.06 14:22:15 INFO ReportJob - Zipcode entered...
17.06 14:22:18 INFO ReportJob - City entered...
17.06 14:22:20 INFO ReportJob - Street entered...
17.06 14:22:22 INFO ReportJob - Housenumber entered...
17.06 14:22:24 INFO ReportJob - Phone entered...
17.06 14:22:27 INFO ReportJob - Email entered...
17.06 14:22:30 ERROR ReportJob - Failed to check location: 75175 Pforzheim
element click intercepted: Element <button type="submit" class="btn kv-btn btn-magenta text-center d-inline-block" disabled="">...</button> is not clickable at point (331, 821). Other element would receive the click: <div class="form-group">...</div>
  (Session info: chrome=91.0.4472.106)
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'L1960', ip: '192.168.0.11', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '15.0.1'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 91.0.4472.106, chrome: {chromedriverVersion: 91.0.4472.101 (af52a90bf870..., userDataDir: C:\Users\ANONY~1\AppData\L...}, goog:chromeOptions: {debuggerAddress: localhost:15254}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}
Session ID: 0791f65980b74718309bad725711b497
org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element <button type="submit" class="btn kv-btn btn-magenta text-center d-inline-block" disabled="">...</button> is not clickable at point (331, 821). Other element would receive the click: <div class="form-group">...</div>

Ich vermute, dass an der Seite sich irgendwas geändert hat, weswegen die automatische Buchung nicht mehr funktioniert.
Hat jemand das selbe Problem derzeit? 🤔

Es wurde auch leider nur ein Screenshot vom ersten Buchungsschritt (impf-bot-vaccination-date-YOU-DONT-CARE.png) erstellt, wobei das Problem allem Anschein nach ja erst einen Schritt später entstanden ist.

Docker on raspberry pi: chromedriver syntax error

Hi,
while trying to run docker on a raspberry pi 4 I encountered some issues with chromedriver. Does anyone of you have a running setup with a rpi4 (or 3)? The error occurs when running the docker container, it was built without any problems. I am not a docker expert, is there any way to narrow down the error?

/app/chromedriver: 1: /ap/chromedriver: Syntax error: "(" unexpected

chromedriver syntax error

Sms Code in slack from other integration is not processed

I have build an integration that auto posts the sms code to the slack channel, but impfbot only processes it after a 'real' user repost the code (to the same channel).

Any idea what needs to be changed, that it reads the posts of other slack apps?

Feedback

Hallo zusammen, ich habe heute meine erste Spritze erhalten!!

Ich habe den Bot etwa 2 Tage durch Laufen lassen und dann einen Termin erhalten, allerdings habe ich 2 Instanzen aufgesetzt.

Eine Instanz hat nach Vermittlungscodes gesucht und die andere nach Termine, da mir das mit einer Instanz zu lange gedauert hat.

Folgende Einstellungen habe ich benutzt, ohne den Fehler 429 Too many requests erhalte zu haben.

# Waiting time before checking the next location in seconds [s]
waitingTime = 120
# Waiting time for a manual user interaction in minutes [m]
waitingTimeForUserAction = 15
# Waiting time in Waiting Room in minutes [m]
waitingTimeInWaitingRoom = 1
# Timeout when searching an element on the page in seconds [s]
searchElementTimeout = 5
# Explicit waiting time for browser updates in seconds [s]
waitingTimeForBrowser = 5

Zudem habe ich mir Fehlermeldung, die in der Konsole angezeigt werden, noch per Telegram zukommen lassen, um ggf. über Remotedesktopverbindung eingreifen zu können.

Vielen Dank für den Bot!

Falls das hier nicht gewünscht wird, bitte löschen, bin noch neu bei Github 😉

Installing problems

I have problems installing the ChromeDriver and Google Chrome.

Your program expects "chromedriver.exe" in
C:\ProgramData\chocolatey\lib\chromedriver\tools
whereas it is located at
C:\tools\selenium\.
A simple Copy&Paste solves this problem for me (At least I think so).

My second problem is Google Chrome. I can`t choose the directory it will be installed in, so Google Chrome installs itself in

C:\Program Files\Google\Chrome\Application\.

According to Github ChromeDriver expects it in
C:\Users\%USERNAME%\AppData\Local\Google\Chrome\Application\chrome.exe.
Without moving the files, your program (or selenium) can`t find Chrome. If I move the files, "chrome.exe" gets found, but crashes instantly.

Am I missing something?

Falsche Erkennung von Terminen?

Hallo zusammen,

heute morgen hatte ich es zweimal, dass der Bot bei hinterlegten Vermittlungscodes inkl. ServerId (Also Format [XXXX-XXXX-XXXX](00X)) der Meinung war, er hätte einen buchbaren Termin gefunden; der ferngesteuerte Browser zeigte aber lediglich den "Termine suchen"-Button an (also kein geöffnetes Overlay mit tatsächlichen Terminen drin). Bonus-Info: das Impfzentrum war zu dem Zeitpunkt schon wieder auf Warteraum gestellt - uU geht da im Hintergrund ein XHR-Request in die Büsche (bekommt Warteraum HTML statt JSON) und das JS reagiert nicht/falsch/unerwartet darauf und Selenium "findet" die Termin-Struktur.

Leider schlecht dokumentierbar/nachstellbar. Kann sich jemand von euch einen Reim darauf machen?

Donation Link fehlt

Hi,
Da der Bot mir und meinen Kollegen sehr dabei geholfen hat, Termine zu bekommen, ein fettes Danke von uns !
Hast du irgendwo einen Donation-Link oder sowas, das man dir nen virtuellen Kasten Bier schicken kann ? :-)

Also dann doch wieder zurück zu den Issues: "Der Donation Link fehlt" :-)

SlackBot

Hi, Kann mir jemand erklären, wie man den Slackbot startet? Ich habe in der config alles angepasst aber wie starte ich die SlackClient.kt datei?

aktuellen Chromedriver aus chocolatey ziehen

Hi @TobseF

kleiner Punkt für die Doku (und leider keine Zeit für einen PR):
In Deiner Doku nutzt Du via chocolatey den "selenium-chrome-driver", dieser ist aber veraltet und funktioniert mit einem aktuellen Chrome nicht mehr (siehe https://community.chocolatey.org/packages/selenium-chrome-driver -> Für Chrome Version 84 )

Stattdessen sollte die Doku direkt https://community.chocolatey.org/packages/chromedriver erwähnen, dann passen auch die Versionen zueinander bzw. dort sollten auch zeitnah aktuellere Versionen zu finden sein, wenn wieder neue erscheinen

"Es ist ein unerwarteter Fehler aufgetreten" [Bot Protection?]

Seit heute ist glaube ich die Bot Protection nochmal massiv hochgefahren worden. Aktuell hält mein Bot ca. 20min durch bevor ich nach der Eingabe der Codes die im Titel genannte Nachricht erhalte und die Abfrage im Hintergrund einen 429 erhält (Too many requests). Frische, neue IP-Adressen verlängern dies mittlerweile auch nicht mehr. Würde es Sinn falls die Meldung kommt dem ganze automatisch 30min oder ähnliches zu geben und denen keine Anfragen gestellt werden oder besteht bei euch dieses Problem gar nicht?

Gradle-Run-Error

Recently got this error. Is there any way of fixing it? Thanks in advance.

grafik

Question: Age Feld

Hi zusammen,
ich habe mir eben das Projekt angeschaut und wollt mich zunächst bei allen contributenden für die tolle Arbeit bedanken :)

Ich habe eine kurze Frage, bei der ich aber nicht weiß ob sie hier überhaupt von jemandem beantwortet werden kann:
In wie weit entscheidet das Age Feld über die Ausgabe von freien Terminen? Im konkreten Fall liegt eine Impfbescheinigung vor, weshalb das Alter zunächst für die Entscheidung der Impfberechtigung keine Rolle spielen dürfte. Oder geht es hier darum welcher Impfstoff zur Verfügung steht?

Falls das jemand weiß wäre ich dankbar! :)

Feedback

Hi, first of all! thanks for making the bot!
I had my first shot today.

I ran the Bot while working, on my second Virtuell Monitor.
So for about 12h per day for 4 Days.
I turned down 4 Appointments because they were far away and more than 3 Weeks in the Future.

After the first successful attempt at getting to the Appointmentscreen, I tried to find an earlier option.

I modified the Coding for Slack to get a response every time a got a failed attempt. => I added a debug/spam channel.
So it was easy to track if the bot is running.

Bot funktioniert auf dem Raspberry pi nicht

Hallo, ich würde gerne das Programm auf meinem Raspberry pi laufen lassen, jedoch bekomme ich folgende Fehlermeldung, wenn ich gradle run eingebe:

FAILURE: Build failed with an exception.

* What went wrong:
Task 'run' not found in root project 'impf-bot'.

* Try:
Run gradle tasks to get a list of available tasks. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 3s

Auf meinem Haupt-PC funktioniert es aber.

Reproduction steps (on the raspberry pi)

  1. git clone https://github.com/TobseF/impf-bot.git
  2. Die src/main/resources/config.properties Datei angepasst
  3. gradle build

Output von gradle build:


> Task :buildEnvironment

------------------------------------------------------------
Root project
------------------------------------------------------------

classpath
No dependencies


BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed
  1. gradle run.
    Output von gradle run:

FAILURE: Build failed with an exception.

* What went wrong:
Task 'run' not found in root project 'impf-bot'.

* Try:
Run gradle tasks to get a list of available tasks. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at
FAILURE: Build failed with an exception.

* What went wrong:
Task 'run' not found in root project 'impf-bot'.

* Try:
Run gradle tasks to get a list of available tasks. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 3s https://help.gradle.org

BUILD FAILED in 3s

Wenn ich genau diese Schritte auf meinem PC mache, funktioniert es.

Rest

Die Pakete habe ich folgendermaßen installiert (auf'm pi):

sudo apt install gradle chromium-chromedriver

Gradle run error

Hi,
i spend almost the whole night searching for the solution, reinstalled java, etc, but I still get this error with gradle run. Do you have an idea what to do?

Task :run FAILED

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':run'.

Process 'command 'C:\Program Files\AdoptOpenJDK\jdk-16.0.1.9-hotspot\bin\java.exe'' finished with non-zero exit value 1

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

  • Get more help at https://help.gradle.org

BUILD FAILED in 15s
3 actionable tasks: 1 executed, 2 up-to-date

Exception in stacktrace (value=//input[@formcontrolname='age')

Hi, I have the following exception in the stacktrace. I am a bit concerned, that the bot does not handle age properly. Any idea, how to fix?

 Element info: {Using=xpath, value=//input[@formcontrolname='age']}
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
        at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
        at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
        at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
        at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
        at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:323)
        at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:428)
        at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
        at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315)
        at de.tfr.impf.page.AbstractPage.findBy(AbstractPage.kt:19)
        at de.tfr.impf.page.LocationPage.enterAge(LocationPage.kt:44)
        at de.tfr.impf.ReportJob.checkClaim(ReportJob.kt:124)
        at de.tfr.impf.ReportJob.checkLocation(ReportJob.kt:70)
        at de.tfr.impf.ReportJob.checkLocations(ReportJob.kt:44)
        at de.tfr.impf.ReportJob.reportFreeSlots(ReportJob.kt:37)
        at de.tfr.impf.StartKt.main(Start.kt:4)
        at de.tfr.impf.StartKt.main(Start.kt)

ist das ein Fehler oder weil keine Termine frei sind

Hallo,
erstmal danke für das zur Verfügung stellen des Bots,
ich habe eine Frage zu diesem Eintrag im Log ERROR ReportJob - Failed to check location: egal welche Location ich angebe.

Ist das ein Fehler oder weil gerade keine Termin zur Verfügung stehen?

Gruss Manuel

fillUserData(userData)

I have a question about booking an appointment:

"fillUserData(userData)" from ImpfBot to ImpfPortal but where did the bot get my userData from? Can I set it somewhere? I have not found anything :/

Leistungsmerkmale

Wofür stehen denn die Leistungsmerkmale L920, L921, L922, L923 ? Sind die Vermittlungscodes an ein Merkmal gebunden? Im anderen offenen Issue wurde erwähnt L921 zu verwenden, passt das noch?

gradle run error

Hi,

i got the following exception. Im wondering about the path on this exception:
"C:\impf\ oolsseleniumchromedriver.exe"

image

Selenium Chrome Driver Settings

pathDriver = C:\tools\selenium
nameDriver = webdriver.chrome.driver
exeDriver = chromedriver.exe

Problem with Umlauts in Locations

Using the docker version:

impf-bot    | Session ID: 0aadc7e2740679977b3e80c3834d2151
impf-bot    |   at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
impf-bot    |   at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
impf-bot    |   at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
impf-bot    |   at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
impf-bot    |   at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
impf-bot    |   at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
impf-bot    |   at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
impf-bot    |   at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
impf-bot    |   at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
impf-bot    |   at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
impf-bot    |   at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:285)
impf-bot    |   at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:84)
impf-bot    |   at de.tfr.impf.page.LocationPage.submitInput(LocationPage.kt:30)
impf-bot    |   at de.tfr.impf.page.LocationPage.searchForFreeDate(LocationPage.kt:63)
impf-bot    |   at de.tfr.impf.ReportJob.searchFreeDateByCode(ReportJob.kt:83)
impf-bot    |   at de.tfr.impf.ReportJob.checkLocation(ReportJob.kt:59)
impf-bot    |   at de.tfr.impf.ReportJob.checkLocations(ReportJob.kt:35)
impf-bot    |   at de.tfr.impf.ReportJob.reportFreeSlots(ReportJob.kt:28)
impf-bot    |   at de.tfr.impf.StartKt.main(Start.kt:4)
impf-bot    |   at de.tfr.impf.StartKt.main(Start.kt)
impf-bot    | 10.05 10:15:48 ERROR ReportJob - Failed to check location: 74613 ?hringen
impf-bot    | element not interactable: element has zero size
impf-bot    |   (Session info: chrome=90.0.4430.93)
~/impf-bot$ cat config.properties | grep loca
# Comma separated list of locations.
locations = 71636 Ludwigsburg,74081 Heilbronn,74360 Ilsfeld-Auenstein,74549 Wolpertshausen,70174 Stuttgart,70376 Stuttgart,70629 Leinfelden-Echterdingen,71334 Waiblingen,74585 Rot am See,74613 Öhringen,74821 Mosbach,74889 Sinsheim,75056 Sulzfeld

Location mit zwei Zeilen können nicht selektiert werden

Hallo TobseF,

vielen Dank für das Projekt, coole Sache! Leider scheint es ein Problem zu geben wenn der Standort zwei Zeilen hat im Auswahlmenü. z.B 88444 Ummendorf
Screenshot from 2021-05-26 12-22-27

[89584 Ehingen, 72762 Reutlingen, 88444 Ummendorf]
26.05 10:05:11 ERROR ReportJob - Failed to check location: 88444 Ummendorf
element click intercepted: Element ... is not clickable at point (467, 499). Other element would receive the click:

...

(Session info: chrome=90.0.4430.93)

429 Too many requests

Is it only me?
After some small amount of time I get only 429 on the termincheck.
Any workaround?
I did not change any time parameter.

SyntaxError: Unexpected token < in JSON at position 1

Hatte jemand anderes schonmal diesen Fehler beim suchen von Terminen? Das Termine Suchen Fenster Popup ist garnicht geöffnet. Sobald ich es öffne erscheint der Fehler oben. Heißt das das der Termin schon weg ist? Jedenfalls kommt dieser spezifische Fehler, weil er beim drücken von Termine Suchen die URL https://001-iz.impfterminservice.de/rest/suche/impfterminsuche?plz=xxxxx aufruft, was jedoch html anstelle JSON zurückgibt.

Einen Check zu noVacError hinzuzufügen scheint nicht zu helfen.

JSON response bei rest/login?plz=

Mal eine Frage, bei dem Request an xyz.impfterminservice.de/rest/login?plz=%plz% habe ich beobachtet, dass man diese Response (siehe unten) erhält. Jemand eine Idee für was "kv" und "verknuepft" (qualifikationen ist mir klar, die Kategorien für welchen Impfstoff man geeignet ist)?

{"kv":"52","qualifikationen":["L921"],"verknuepft":true}

[Bitte als Diskussion markieren oder entfernen falls unerwünscht]

[Frage] SMS Verifizierungs HTML Dokument öffnet sich

Zuersteinmal danke, dass Sie den Bot hier erstellt haben!

Nachdem ich alles in die impf-bot/src/main/resources/config.properties Datei eingetragen und dann gradle build ausgeführt habe, öffnet sich bei mir auf einmal Chrome mit einer impf-bot/build/resources/test/de/tfr/impf/page/SMS-Verifizierung.html Datei. Ist das Absicht?

Ich verwende Arch Linux, falls diese Information hilft.

element click intercepted: Element <span>...</span> is not clickable at point (231,332). Other element would receive the click

Hallo
Erstmal dankeschön für den Bot! Läuft einwandfrei auf meinem PC, allerdings bin ich die nächsten Tage nicht in dessen Reichweite und wollte das ganze jetzt noch auf meinem Laptop zum laufen bringen. Allerdings bekomme ich folgende Fehlermeldung:

03.06 22:54:53 DEBUG ReportJob - Choose State: Bitte auswählen
03.06 22:54:54 ERROR ReportJob - Failed to check location:  76646 Bruchsal-Heidelsheim
element click intercepted: Element <span class="select2-selection select2-selection--single" role="combobox" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-disabled="false" aria-labelledby="select2-qvvo-container">...</span> is not clickable at point (231, 332). Other element would receive the click: <p _ngcontent-nfa-c38="" class="pb-3 pb-md-0">...</p>
  (Session info: chrome=91.0.4472.77)
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'name', ip: 'ip', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_291'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 91.0.4472.77, chrome: {chromedriverVersion: 90.0.4430.24 (4c6d850f087da..., userDataDir: C:\Users\username\AppData\L...}, goog:chromeOptions: {debuggerAddress: localhost:52831}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}
Session ID: id
org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element <span class="select2-selection select2-selection--single" role="combobox" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-disabled="false" aria-labelledby="select2-qvvo-container">...</span> is not clickable at point (231, 332). Other element would receive the click: <p _ngcontent-nfa-c38="" class="pb-3 pb-md-0">...</p>
  (Session info: chrome=91.0.4472.77)
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'name', ip: 'ip', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_291'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 91.0.4472.77, chrome: {chromedriverVersion: 90.0.4430.24 (4c6d850f087da..., userDataDir: C:\Users\username\AppData\L...}, goog:chromeOptions: {debuggerAddress: localhost:52831}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}
Session ID: 2a147d3d8176acb13615027d71ce4aaa
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
	at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
	at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:285)
	at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:84)
	at de.tfr.impf.ReportJob.openMainPage(ReportJob.kt:215)
	at de.tfr.impf.ReportJob.checkLocation(ReportJob.kt:55)
	at de.tfr.impf.ReportJob.checkLocations(ReportJob.kt:45)
	at de.tfr.impf.ReportJob.reportFreeSlots(ReportJob.kt:38)
	at de.tfr.impf.StartKt.main(Start.kt:4)
	at de.tfr.impf.StartKt.main(Start.kt)

Bin leider überfragt woran das hängen kann. (Habe die selbe Version schließlich auf dem PC problemlos zum laufen gebracht).

Habe mir das aktuelle Repo auch noch runtergeladen, in der Hoffnung, dass der Fehler dort nicht auftritt. Da bekomme ich aber schon beim build Probleme mit (" \IfttClient.kit: unsolved reference http")

Wäre froh, wenn mir jemand weiterhelfen könnte!

Vermittlungscodes sind server- und nicht standortgebunden

Hallo,

ich bin ein absoluter Noob, was Github angeht, möchte aber weiterhelfen. Dieser Post hier ist bestimmt auf der falschen Seite, verschiebe ihn einfach.

Ich habe durch Zufall herausgefunden, dass die Vermittlungscodes nicht standort-, sondern servergebunden sind. Der Vermittlungscode, der für "https://005-iz.impfterminservice.de/impftermine/service/75555" gilt, gilt NICHT für "https://002-iz.impfterminservice.de/impftermine/service/75555", aber auch für "https://005-iz.impfterminservice.de/impftermine/service/75556".

Zudem ist dein offizieller Weg, auf die Vermittlungscodes zu warten, viel zu umständlich. Wenn du die Antwort des Servers auf die Terminabfrage abfängst und abänderst, können sofort Vermittlungscodes erstellt werden. Aus
{"termineVorhanden":false,"vorhandeneLeistungsmerkmale":[]}
wird somit z.B.
{"termineVorhanden":true,"vorhandeneLeistungsmerkmale":["L921"]}
für Moderna und Biontech. 2x geändert und es kann über die Webseite ein Code generiert werden.

Question: Terminsuche

Hey, danke für das Veröffentlichen dieses Bots!

Ich habe leider kein passenderen Ort für meine Frage gefunden deshalb steht sie nun hier.

Wenn ich nach neuen Impfterminen (mit Vermittlungscode) suche dann setzt sich der Timer für die Reservierung nicht zurück.
Daher stelle ich mir die Frage ob überhaupt die Möglichkeit besteht, dass nach einer Aktualisierung (innerhalb der 10 Minuten) neue Termine auftauchen.

Falls dazu nichts bekannt ist reichen mir auch eure Erfahrungsberichte.

Danke für die Antwort!

Error failed finding property `state`

In the latest docker image I get a error at start of the chrome browser.

REPOSITORY TAG IMAGE ID CREATED SIZE
pfuenzle/impf-bot latest 096573139298 4 hours ago 2.58GB

edit the location to just the plz or remove a second location does not help. Switching back to the version 1.2 does resolve the problem.

pfuenzle/impf-bot v1.2 ced83d6c9ec6 10 days ago 2.7GB

Bildschirmfoto 2021-05-17 um 18 47 49

Error message on webpage triggers "found free vaccinations dates"

The situation is the following: Impfbot searches for free appointments at a specific location with a Vermittlungscode.

The webpage throws an error "Es ist ein unerwarteter Fehler aufgetreten":

scrrn

Impfbot, however, triggers a "found free vaccinations dates" event:

Screenshot 2021-04-21 at 10 57 29

Unable to watch the file system for changes after build successful message

With current HEAD (18eaa6c) during gradle build I get the following output:

BUILD SUCCESSFUL in 19s
11 actionable tasks: 11 executed
Unable to watch the file system for changes
net.rubygrapefruit.platform.NativeException: Could not query file systems: could not get volume information (errno 53)
        at net.rubygrapefruit.platform.internal.PosixFileSystems.getFileSystems(PosixFileSystems.java:32)
        at org.gradle.internal.watch.vfs.impl.DefaultWatchableFileSystemDetector.detectUnsupportedFileSystems(DefaultWatchableFileSystemDetector.java:64)
        at org.gradle.internal.watch.registry.impl.WatchableHierarchies.removeUnwatchableFileSystems(WatchableHierarchies.java:113)
        at org.gradle.internal.watch.registry.impl.WatchableHierarchies.removeUnwatchableContent(WatchableHierarchies.java:82)
        at org.gradle.internal.watch.registry.impl.HierarchicalFileWatcherUpdater.buildFinished(HierarchicalFileWatcherUpdater.java:98)
        at org.gradle.internal.watch.registry.impl.DefaultFileWatcherRegistry.buildFinished(DefaultFileWatcherRegistry.java:146)
        at org.gradle.internal.watch.vfs.impl.WatchingVirtualFileSystem$2.lambda$call$0(WatchingVirtualFileSystem.java:199)
        at org.gradle.internal.watch.vfs.impl.WatchingVirtualFileSystem.withWatcherChangeErrorHandling(WatchingVirtualFileSystem.java:320)
        at org.gradle.internal.watch.vfs.impl.WatchingVirtualFileSystem.access$1000(WatchingVirtualFileSystem.java:53)
        at org.gradle.internal.watch.vfs.impl.WatchingVirtualFileSystem$2.call(WatchingVirtualFileSystem.java:199)
        at org.gradle.internal.watch.vfs.impl.WatchingVirtualFileSystem$2.call(WatchingVirtualFileSystem.java:179)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.watch.vfs.impl.WatchingVirtualFileSystem.lambda$beforeBuildFinished$5(WatchingVirtualFileSystem.java:179)
        at org.gradle.internal.vfs.impl.VfsRootReference.update(VfsRootReference.java:40)
        at org.gradle.internal.watch.vfs.impl.WatchingVirtualFileSystem.beforeBuildFinished(WatchingVirtualFileSystem.java:179)
        at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:93)
        at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:49)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:44)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.lambda$execute$0(InProcessBuildActionExecuter.java:59)
        at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:86)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:58)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
        at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.lambda$execute$0(BuildTreeScopeLifecycleBuildActionExecuter.java:34)
        at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
        at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:33)
        at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:28)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:104)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:55)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:64)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:37)
        at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.lambda$execute$0(SessionScopeLifecycleBuildActionExecuter.java:54)
        at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:67)
        at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:50)
        at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:36)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:58)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:42)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
        at java.base/java.lang.Thread.run(Thread.java:832)

However I can start the app successfully via gradle run.
Setup is Windows 10, gradle 7.0, OpenJDK 15.0.1, ChromeDriver 90.0.4430.24, Chrome 90.0.4430.93.

I could not observe this behaviour last week with my ZIP download from 5th May, strange is that the exception also occurs now with this old revision. It happens also in an elevated cmd console.

So it seems that something has been changed on my machine. Could you please point me into the right direction?

Docker:Vermittlungscode unvollständig eingetragen

Hallo zusammen,
nachdem ich bei der Desktop-Installation an einem unerklärlichen Java-Problem gescheitert bin, habe ich es jetzt mit Docker versucht.
Grundsätzlich bin ich hier schon deutlich weiter. Allerdings werden teilweise die Vermittlungscodes nicht vollständig eingetragen. Mal nur der erste Block, mal fehlen die letzten zwei Ziffern/Lettern. Manchmal fehlen in der Mitte Teile des Codes. Manchmal wird überhaupt kein Code eingetragen. Alles total willkürlich. Grundsätzlich arbeitet sich das System aber regulär durch.

Vielleicht ist dieses Problem ja lösbarer als das letzte ;)

CookieNagComponent funktioniert nicht wie gewünscht?

Hi,

habe mir das Projekt gestern abend auf Stand Commit 3ac48d4 gepullt und auf einer Windows 10 Maschine mit JDK 16, Gradle 7.01, Chrome 90 und passendem chromedriver eingerichtet.
Leider scheitert der Bot schon initial auf der Startseite von "impfterminservice.de/ipftermine", da er das gewünschte Impfzentrum nicht auswählen kann, weil es vom CookieBanner überdeckt wird (liegt möglicherweise an meiner Auflösung, bei höherer Auflösung wird das Dropdown vmtl nicht überdeckt).

Ich dachte erst, dass der Bot sich gar nicht um Cookies kümmert, habe dann aber die CookieNagComponent gefunden, die, soweit ich das ohne Kotlin Kenntnisse beurteilen kann, das richtige tun sollte (der Button für die Cookies heißt nach wie vor "Auswahl bestätigen"), allerdings ist diese Bestätigung für jeden der Impfserver 001, 002, 003 zu machen.

Workaround ist: Schnell manuell klicken und dann den Bot laufen lassen.

Ich kann Dir leider keinen Merge Request anbieten (habe leider keinen Dunst von Kotlin) - wäre es möglich, auf der Startseite gleich auf das Cookiebanner zu prüfen?

Birthdate required for Vermittlungscode

Hi All Together,

@TobseF thanks for the awesome bot. It looks like there is a little problem with the Vermittlungscode search. It now queries the date of birth field instead of Persons age. Is there any way to change this?

bind() failed und Timeouts

Sowohl mit dem Image von docker, als auch mit dem local build bekomme ich Timeouts.
Jemand einen Tipp, was schief läuft?

Starting ChromeDriver 90.0.4430.24 (4c6d850f087da467d926e8eddb76550aed655991-refs/branch-heads/4430@{#429}) on port 31822
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
[1620372363.140][SEVERE]: bind() failed: Cannot assign requested address (99)
ChromeDriver was started successfully.

[1620372664.322][SEVERE]: Timed out receiving message from renderer: 300.000
[1620372664.322][SEVERE]: Timed out receiving message from renderer: -0.001
[1620372664.326][SEVERE]: Timed out receiving message from renderer: -0.001
07.05 07:31:04 ERROR ReportJob - Failed to check location: 69124 Heidelberg
timeout: Timed out receiving message from renderer: -0.001
  (Session info: headless chrome=90.0.4430.93)
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'bd4382711c49', ip: '172.17.0.2', os.name: 'Linux', os.arch: 'amd64', os.version: '5.10.25-linuxkit', java.version: '11.0.11'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 90.0.4430.93, chrome: {chromedriverVersion: 90.0.4430.24 (4c6d850f087da..., userDataDir: /tmp/.com.google.Chrome.IFnWoK}, goog:chromeOptions: {debuggerAddress: localhost:38567}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}
Session ID: ff68dce71cc1ee272b1bb66193a8c6bf
org.openqa.selenium.TimeoutException: timeout: Timed out receiving message from renderer: -0.001
  (Session info: headless chrome=90.0.4430.93)
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'bd4382711c49', ip: '172.17.0.2', os.name: 'Linux', os.arch: 'amd64', os.version: '5.10.25-linuxkit', java.version: '11.0.11'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 90.0.4430.93, chrome: {chromedriverVersion: 90.0.4430.24 (4c6d850f087da..., userDataDir: /tmp/.com.google.Chrome.IFnWoK}, goog:chromeOptions: {debuggerAddress: localhost:38567}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}
Session ID: ff68dce71cc1ee272b1bb66193a8c6bf
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
	at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
	at org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:277)
	at de.tfr.impf.page.MainPage.open(MainPage.kt:10)
	at de.tfr.impf.ReportJob.openMainPage(ReportJob.kt:188)
	at de.tfr.impf.ReportJob.checkLocation(ReportJob.kt:47)
	at de.tfr.impf.ReportJob.checkLocations(ReportJob.kt:37)
	at de.tfr.impf.ReportJob.reportFreeSlots(ReportJob.kt:30)
	at de.tfr.impf.StartKt.main(Start.kt:4)
	at de.tfr.impf.StartKt.main(Start.kt)

Slack integration documentation

The app works great with email/phone! I couldn't get the Slack integration to work though. Could the developer give instructions on how to set up the Slack integration?

For example, where does one get the slackBotApiToken? xoxb-* seems to be a Bot user token. Does the user have to create a bot to integrate impf-bot with Slack?

A slightly more verbose howto would be much appreciated!

Not able to build on manjaro linux

Hello,
acutally I'm not able to get the bot running. On Manjaro Linux the gradle build fails with:

> Task :compileKotlin FAILED
e: /home/syljo/git/impf-bot/src/main/kotlin/de/tfr/impf/ifttt/IftttClient.kt: (7, 17): Unresolved reference: http
e: /home/syljo/git/impf-bot/src/main/kotlin/de/tfr/impf/ifttt/IftttClient.kt: (8, 17): Unresolved reference: http
e: /home/syljo/git/impf-bot/src/main/kotlin/de/tfr/impf/ifttt/IftttClient.kt: (9, 17): Unresolved reference: http
e: /home/syljo/git/impf-bot/src/main/kotlin/de/tfr/impf/ifttt/IftttClient.kt: (21, 26): Unresolved reference: HttpClient
e: /home/syljo/git/impf-bot/src/main/kotlin/de/tfr/impf/ifttt/IftttClient.kt: (22, 27): Unresolved reference: HttpRequest
e: /home/syljo/git/impf-bot/src/main/kotlin/de/tfr/impf/ifttt/IftttClient.kt: (27, 34): Unresolved reference: HttpResponse
e: /home/syljo/git/impf-bot/src/main/kotlin/de/tfr/impf/ifttt/IftttClient.kt: (38, 42): Unresolved reference: HttpRequest
e: /home/syljo/git/impf-bot/src/main/kotlin/de/tfr/impf/ifttt/IftttClient.kt: (43, 12): Unresolved reference: HttpRequest

FAILURE: Build failed with an exception.

When trying to use docker I get a different error message in the container:

Current browser version is 90.0.4430.93 with binary path /usr/bin/chromium
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: '18a6139af3be', ip: '172.18.0.2', os.name: 'Linux', os.arch: 'amd64', os.version: '5.10.41-1-MANJARO', java.version: '11.0.11'
Driver info: driver.version: ChromeDriver
remote stacktrace: #0 0x55f6bcb02949 <unknown>

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.openqa.selenium.remote.W3CHandshakeResponse.lambda$errorHandler$0(W3CHandshakeResponse.java:62)
	at org.openqa.selenium.remote.HandshakeResponse.lambda$getResponseFunction$0(HandshakeResponse.java:30)
	at org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$0(ProtocolHandshake.java:126)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
	at java.base/java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
	at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
	at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:543)
	at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:128)
	at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:74)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:136)
	at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
	at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:213)
	at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:131)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:181)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:168)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:157)
	at de.tfr.impf.selenium.DriverFactoryKt.createDriver(DriverFactory.kt:19)
	at de.tfr.impf.ReportJob.<init>(ReportJob.kt:16)
	at de.tfr.impf.StartKt.main(Start.kt:4)
	at de.tfr.impf.StartKt.main(Start.kt)

> Task :run FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':run'.
> Process 'command '/usr/lib/jvm/java-11-openjdk-amd64/bin/java'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 13s
3 actionable tasks: 2 executed, 1 up-to-date

So at the end both approaches does not work for me.

Any ideas are warmly welcome :-)

Cheers
Jörg

Chromedriver sucht nach version 91, was in Debian buster nicht verfügbar ist

In der Docker Datei wird chromium=90.0.4430.212-1~deb10u1 installiert, was völlig richtig ist. Dabei handelt es um die letzte Version im repo.
Aber wenn Sie den Container ausführen, sucht der Treiber-Downloader nach dem Chrome 91 Treiber.

Ich habe es so repariert:
WebDriverManager.chromedriver().driverVersion("90.0.4430.212").setup();

Timeout für die Termin-Reservierung zurücksetzen?

Moin zusammen!
Erst mal vielen Dank für die tolle Software! 👏
Ich konnte darüber schon für zwei Personen Termine buchen! 😀
Was mir allerdings schon öfter aufgefallen ist:
Der Timeout für die Terminreservierung startet bei nachfolgenden Anfragen (also der zweiten, dritten, vierten, etc. Impfzentrumsanfrage) nicht neu bei 10m, sondern lässt den "alten" Timer runterzählen bis er bei 0 Sekunden angekommen ist und startet erst danach neu. Dadurch entsteht die Situation, dass Termine nur noch wenige Minuten oder unter Umständen sogar nur wenige Sekunden verfügbar sind.

Besteht die Möglichkeit dieses Verhalten anzupassen? Z.B. Durch eine Skriptanpassung (indem beispielsweise nach jeder Suchanfrage der Browser neu gestartet wird) oder evtl. durch eine Browser-Einstellung im Chrome?

Viele Grüße
Timo

Bot incorrectly enters Vermittlungscodes

Thanks for developing this bot!

However, it seems that it unfortunately mistypes the Vermittlungscode on the booking page (i.e. only fills in the first two blanks, but misses the first letter) and then throws an error:

impf-bot    | 16.05 16:35:20 ERROR ReportJob - Failed to check location: 72072 T?bingen
impf-bot    | element click intercepted: Element <button _ngcontent-nfa-c113="" type="submit" class="btn kv-btn btn-magenta text-uppercase d-inline-block" disabled="">...</button> is not clickable at point (467, 499). Other element would receive the click: <div _ngcontent-nfa-c113="" class="form-group text-center">...</div>
impf-bot    |   (Session info: chrome=90.0.4430.93)
impf-bot    | Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
impf-bot    | System info: host: '6adf4305179a', ip: '172.28.0.2', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-141-generic', java.version: '11.0.11'
impf-bot    | Driver info: org.openqa.selenium.chrome.ChromeDriver
impf-bot    | Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 90.0.4430.93, chrome: {chromedriverVersion: 90.0.4430.24 (4c6d850f087da..., userDataDir: /tmp/.com.google.Chrome.TyvRGF}, goog:chromeOptions: {debuggerAddress: localhost:40049}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}
impf-bot    | Session ID: 9f166dc743c26769d1d90159048048e9
impf-bot    | org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element <button _ngcontent-nfa-c113="" type="submit" class="btn kv-btn btn-magenta text-uppercase d-inline-block" disabled="">...</button> is not clickable at point (467, 499). Other element would receive the click: <div _ngcontent-nfa-c113="" class="form-group text-center">...</div>
impf-bot    |   (Session info: chrome=90.0.4430.93)
impf-bot    | Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
impf-bot    | System info: host: '6adf4305179a', ip: '172.28.0.2', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-141-generic', java.version: '11.0.11'
impf-bot    | Driver info: org.openqa.selenium.chrome.ChromeDriver
impf-bot    | Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 90.0.4430.93, chrome: {chromedriverVersion: 90.0.4430.24 (4c6d850f087da..., userDataDir: /tmp/.com.google.Chrome.TyvRGF}, goog:chromeOptions: {debuggerAddress: localhost:40049}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}
impf-bot    | Session ID: 9f166dc743c26769d1d90159048048e9
impf-bot    |   at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
impf-bot    |   at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
impf-bot    |   at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
impf-bot    |   at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
impf-bot    |   at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
impf-bot    |   at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
impf-bot    |   at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
impf-bot    |   at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
impf-bot    |   at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
impf-bot    |   at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
impf-bot    |   at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:285)
impf-bot    |   at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:84)
impf-bot    |   at de.tfr.impf.page.LocationPage.submitInput(LocationPage.kt:33)
impf-bot    |   at de.tfr.impf.page.LocationPage.searchForFreeDate(LocationPage.kt:66)
impf-bot    |   at de.tfr.impf.ReportJob.searchFreeDateByCode(ReportJob.kt:100)
impf-bot    |   at de.tfr.impf.ReportJob.checkLocation(ReportJob.kt:68)
impf-bot    |   at de.tfr.impf.ReportJob.checkLocations(ReportJob.kt:44)
impf-bot    |   at de.tfr.impf.ReportJob.reportFreeSlots(ReportJob.kt:37)
impf-bot    |   at de.tfr.impf.StartKt.main(Start.kt:4)
impf-bot    |   at de.tfr.impf.StartKt.main(Start.kt)
```

Docker image fails booting with error message

When using the latest commit(c2f358d) I'm unable to get the bot working.
It throws an IllegalStateException. See the full log:

xauth:  file /root/.Xauthority does not exist

New 'X' desktop is 769e2417d62f:1

Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/769e2417d62f:1.log

WebSocket server settings:
  - Listen on :6901
  - Flash security policy server
  - Web server. Web root: /usr/share/novnc
  - No SSL/TLS support (no cert file)
  - Backgrounding (daemon)
Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could not be reused, use --status for details
> Task :compileKotlin UP-TO-DATE
> Task :compileJava NO-SOURCE
> Task :processResources
> Task :classes

> Task :run FAILED
Exception in thread "main" java.lang.ExceptionInInitializerError
	at de.tfr.impf.selenium.DriverFactoryKt.createDriver(DriverFactory.kt:10)
	at de.tfr.impf.ReportJob.<init>(ReportJob.kt:16)
	at de.tfr.impf.StartKt.main(Start.kt:4)
	at de.tfr.impf.StartKt.main(Start.kt)
Caused by: java.lang.IllegalStateException: Failed finding property `userAgent`
	at de.tfr.impf.config.KProperties.getProperty(KProperties.kt:21)
	at de.tfr.impf.config.KProperties$LazyProperty.getValue(KProperties.kt:33)
	at de.tfr.impf.config.Config.getUserAgent(Config.kt)
	at de.tfr.impf.config.Config.<clinit>(Config.kt:85)
	... 4 more

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':run'.
> Process 'command '/usr/lib/jvm/java-11-openjdk-amd64/bin/java'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 9s
3 actionable tasks: 2 executed, 1 up-to-date

The docker command used was: docker run --name impf-bot -e VNC_PASSWORD=123 -it -p 6901:6901 --rm -v $PWD/config.properties:/app/src/main/resources/config.properties impfbot where impfbot is the locally built docker image.
Did I make a mistake during building?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.