„Уради сам“ обавештења
22.04.2021Пре пар дана ме је изненадио нестанак воде. Увидом у страницу са објавама планираних радова, видео сам да је искључење планирано, и да би требало да траје од 02:00-22:00. Проблем је у томе што не пратим вести, а „developer“-и који одржавају сајт БВК нису на видно место поставили везу ка RSS току (што је логично и ефикасно решење за праћење новости), па чак ни најобичније обавештавање преко мејла. На срећу, ја користим ГНУ са Линуксом, а ово је одлична прилика за демонстрацију тога шта се може постићи његовим програмима који користе командну линију.
Главна идеја је да користимо curl(1) да преузмемо страницу БВК-а:
$ curl -s https://www.bvk.rs/planirani-radovi/ > radovi.html
Затим употребимо grep(1) да бисмо издвојили само оне делове странице који нас интересују:
$ grep Раковица radovi.html > rakovica.html
И на крају скинемо све HTML ознаке и избацимо сувишне размаке, а <p>
претворимо у нове пасусе:
$ sed -e's/<p>/\n\n/g' < rakovica.html | sed -e's/<[^>]\+>//g' -e's/\s\+/ /g' -e's/^\s\+//g' > rakovica.txt
Све ове наредбе можемо да искомбинујемо у једну:
$ curl -s https://www.bvk.rs/planirani-radovi/ | grep Раковица | sed -e's/<p>/\n\n/g' | sed -e's/<[^>]+>//g' -e's/\s\+/ /g' -e's/^\s\+//g' > rakovica.txt
Овим смо сачували податак о новом искључењу, који можемо сачувати за каснију проверу. Следећи пут када проверавамо страницу, само преконтролишемо да ли се нови ред појавио у листи већ виђених, и ако није, додајемо га и обавештавамо корисника:
$ if grep -v -f sacuvano.txt rakovica.txt; then cat rakovica.txt >> sacuvano.txt; fi
Како можемо обавестити корисника? Постоји више начина, али онај који се мени учинио најкориснијим јесте аутоматско слање мејла. Ово се може постићи, рецимо, програмом neomutt(1):
$ neomutt -s "БВК: Нови радови" pera@peric.com < rakovica.txt
Ово је, у суштини, основа мог скрипта pagecheck. Он се позива, рецимо, на следећи начин:
$ pagecheck Раковица https://www.bvk.rs/planirani-radovi/ pera@peric.com
Ако је било новости, pagecheck ће их исписати на стандардном излазу, што је и
подразумевано ако не задамо ниједан параметар. Новости можемо да „seen-ујемо“
позивом уз параметар -s
:
$ pagecheck -s
Ипак, најкорисније је да pagecheck позивамо програмом cron(8). Рецимо:
$ crontab -e
и унесемо следећи ред у crontab:
0 */5 * * * pagecheck Раковица https://www.bvk.rs/planirani-radovi/ pera@peric.com
Тако ће се на сваких 5 сати у позадини извршити програм pagecheck, и ако је дошло до промена на страници које укључују тражени израз, биће послато обавештење. Наравно, у овом случају се подразумева да је рачунар континуирано покренут сваки дан тако да обухвати макар један такав интервал.