-
-
Save xuio/297e16b84d700314241393e8f3aa42f3 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby | |
require 'watir-webdriver' | |
require 'telegram/bot' | |
Telegram.bots_config = { | |
default: '<Telegram Bot token>', | |
} | |
Telegram.bot.get_updates | |
chat_id = '<Telegram Chat ID>' | |
def log (message) puts " #{message}" end | |
def success (message) puts "+ #{message}" end | |
def fail (message) puts "- #{message}" end | |
def notify (message) | |
success message.upcase | |
system 'osascript -e \'Display notification "Bürgerbot" with title "%s"\'' % message | |
rescue StandardError => e | |
end | |
def appointmentAvailable? (b) | |
url = 'https://service.berlin.de/terminvereinbarung/termin/tag.php?termin=1&dienstleister=122282&anliegen[]=120703&herkunft=1' | |
puts '-'*80 | |
log 'Trying again' | |
b.goto url | |
log 'Page loaded' | |
link = b.element css: '.calendar-month-table:first-child td.buchbar a' | |
if link.exists? | |
link.click | |
notify 'An appointment is available.' | |
log 'Enter y to keep searching or anything else to quit.' | |
Telegram.bot.send_message(chat_id: chat_id, text: 'Found an appointment! Book here: https://service.berlin.de/terminvereinbarung/termin/tag.php?termin=1&dienstleister=122282&anliegen[]=120703&herkunft=1') | |
return gets.chomp.downcase != 'y' | |
else | |
fail 'No luck this time.' | |
return false | |
end | |
rescue StandardError => e | |
fail 'Error encountered.' | |
puts e.inspect | |
return false | |
end | |
b = Watir::Browser.new | |
Telegram.bot.send_message(chat_id: chat_id, text: 'starting bot...') | |
until appointmentAvailable? b | |
log 'Sleeping.' | |
sleep 60 | |
end |
Thank you very much for this! Somehow I only manage to get telegram notifications, when starting the bot.
I don't get notified via telegram when an appointment is availbe. In console I it works fine though.
Any ideas? @davidfurlong
Error is:
#<NameError: undefined local variable or method `chat_id' for main:Object>
Hej, thanks for sharing! Got the same problem as @n0rtap and the same Error.
I´m a total newbee so i wanted to share some (maybe pretty obvious stuff) for other like me:
How do you let the bot search for the service you need and at the location you prefer?
- Open up the main side for your service (e.x.: https://service.berlin.de/dienstleistung/120335/)
- There to ways now: A) If you like to search "Berlinweit" you just copy the link of the blue button saying "Termine berlinweit suchen" B) If you like to search only at "your" Bürgeramt you scroll down and copy the link for your Bürgeramt.
- Pass it in where url stands (carfull both times!)
Hope that helps.
Looking forward to a solution for the other problem.
Thank you very much for this! Somehow I only manage to get telegram notifications, when starting the bot.
I don't get notified via telegram when an appointment is availbe. In console I it works fine though.
Any ideas? @davidfurlongError is:
#<NameError: undefined local variable or method `chat_id' for main:Object>
I found a work around. Just pass in your id direcly like:
Telegram.bot.send_message(chat_id: 32912731, text: 'Found an appointment! Book here: https://service.berlin.de/terminvereinbarung/termin/tag.php?termin=1&dienstleister=122282&anliegen[]=120703&herkunft=1')
Hope that helps. Good luck!
I've built a similar tool, but it updates a public webpage via websockets
Thanks for your help @Runflast
I got everything working but couldn't figure out from where I get the correct link.
This really helped!
@nicbou
Great idea! That could have helped a lot of people.
I'm running it now for several hours and although sometimes a free spot appears the bot is not triggered. I wonder if this got to do with the Captcha that pops up when you click manually on it.
Is there any way to get rid of the captchas when a new appointment appears?
They are here for a reason. Have a look at their robots.txt.
confirmed this works! just watch out to not get rate limited <60 seconds wait time as @davidfurlong said, thanks for the additional tips on getting all the dependencies installed.