//strahinja.org

„Уради сам“ обавештења

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, и ако је дошло до промена на страници које укључују тражени израз, биће послато обавештење. Наравно, у овом случају се подразумева да је рачунар континуирано покренут сваки дан тако да обухвати макар један такав интервал.