💉🤖 Bot for the German "ImpfterminService - 116117"

Overview

💉 🤖 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 
Issues
  • Docker on raspberry pi: chromedriver syntax error

    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

    opened by Bergdoc 21
  • feat: booking process is now fully automated

    feat: booking process is now fully automated

    Hi @TobseF ,

    this new PR extends the current state of this bot to be now also used for final vaccination date bookings.

    It works as follows:

    Whenever a free slot is available:

    1. Selects the first slot possible

    2. Enters all personal data (when provided within config.properties)

    3. Submits the booking finally

    4. Takes screenshots of all steps (will be stored statically: $HOME/Desktop/)

    These are the required additions within config.properties:

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

    Please let me know if these changes match your expectations. ~~I am still prettifying some minor things and removing some //TODOs though..~~

    Cheers Timo

    opened by timoknapp 16
  • Bot incorrectly enters Vermittlungscodes

    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)
    ```
    opened by fabianhick 16
  • Error message on webpage triggers

    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
    opened by rtwld 10
  • "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?

    opened by marceldrhr 10
  • Question: Terminsuche

    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!

    discussion 
    opened by Contexys 8
  • SlackBot

    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?

    opened by BurgerKing2k19 8
  • Falsche Erkennung von Terminen?

    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?

    opened by prok42 7
  • bind() failed und Timeouts

    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/[email protected]{#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)
    
    opened by LPTT 6
  • Birthdate required for Vermittlungscode

    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?

    opened by alimazhar1991 5
  • Bot does not correctly identify the second

    Bot does not correctly identify the second "Keine freien Termine" screen

    It seems that the bot does not correctly identify the second option where one can receive "Es wurden keine freien Termine in Ihrer Region gefunden. Bitte probieren Sie es später erneut." case.

    The screenshot below is accompanied by

    INFO ReportJob - Found free seats in location 74081 Heilbronn:https://002-iz.impfterminservice.de/impftermine/service?plz=74081
    Five minutes left to send the sms verification
    

    in the log.

    Screenshot 2021-06-20 at 20 01 05

    It seems to me that for some reason https://github.com/TobseF/impf-bot/blob/master/src/main/kotlin/de/tfr/impf/ReportJob.kt#L239 does not trigger anymore and it just continues on and waits for the user interaction (which allows reclicking "Schnellprüfung durchführen" but I have yet to see this change the response.

    My kotlin and selenium foo is not strong enough to track down why only one of the two isFull works correctly...

    opened by healther 0
  • Automatische Buchung scheint gebrochen:

    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 e34d36e3ebd773c59360b86287be1b55b3ad4b41 auf 7234e13c496fdcc232cad53f467b59652073fc83, 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.

    opened by error-empire 1
  • Not able to build on manjaro linux

    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

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

    element click intercepted: Element ... 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!

    opened by reggydick 0
  • Chromedriver sucht nach version 91, was in Debian buster nicht verfügbar ist

    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();

    opened by piechade 6
  • Timeout für die Termin-Reservierung zurücksetzen?

    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

    opened by error-empire 4
  • Sms Code in slack from other integration is not processed

    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?

    opened by stephankoelle 1
  • Feedback

    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 😉

    documentation 
    opened by tobias-jopp 0
  • Docker:Vermittlungscode unvollständig eingetragen

    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 ;)

    opened by lucaleicht 11
  • Feedback

    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.

    documentation 
    opened by Whitedoteu 1
Owner
Tobse
🐱‍👤 Kotlin Fanboy 🧹Clean Coder        🎮 Gaming Nerd  🦾 3D Printer             📸 Hobby Photographer 😎 Father
Tobse
Source to android-arsenal.herokuapp.com

Important information This repository contains source codes for old version of site. It is still available here: http://android-arsenal.herokuapp.com

Vladislav Bauer 542 Jul 11, 2021
Android samples built using Jetpack Window Manager for foldable and dual-screen devices like Microsoft Surface Duo.

Jetpack Window Manager samples for dual-screen and foldable devices like Microsoft Surface Duo Android app samples that use Jetpack Window Manager to

Microsoft 11 Jul 28, 2021
A Wikipedia Android app built for learning purposes

A Wikipedia Android app built for learning purposes. This app uses Wikipedia API to fetch the relevant data about the searched query. It shows search suggestions as the user types the query to be searched, saves the visited searched pages in the history section using the Room database, shows a list of fetched data about the searched item, and lets the user visit its Wikipedia page if a user clicks on it.

Udit Bhaskar 5 Jul 11, 2021
An extensive collection of Kotlin Android Utils

An extensive collection of Kotlin Android Utils This library contains small helper functions used throughout almost all of my other projects. The goal

Allan Wang 186 Jul 28, 2021
:blue_book: A diary application optimized for user experience.

Easy Diary README of Korean(한국어) This is a diary application optimized for user experience. Demo videos Basic function preview Support Features 01. Wr

Bulbasaur 246 Jul 27, 2021
🏀 An Android app for dribbble.com

Mango Mango is an Android application for Dribbble. Inspired by Resplash, Plaid and Protein. Features ✨ Kotlin and RxKotlin: Yes, fully written in Kot

Li Zhao Tai Lang 662 Jul 22, 2021
CovidCertificate Apps for Android

COVID Certificate Apps - Android This project is released by the the Federal Office of Information Technology, Systems and Telecommunication FOITT on

Swiss Admin 91 Jul 30, 2021
DNS-based Host Blocker (and lightweight ad blocker) for Android

DNS-Based Host Blocking for Android This is a DNS-based host blocker for Android. In the default configuration, several widely-respected host files ar

Julian Andres Klode 1.7k Jul 27, 2021