Honlapfigyelő script

Kövessük a változásokat!
Kövessük a változásokat!

Már régóta keresek olyan programot, ami azt az egyszerű funkciót tudja, ha egy honlap megváltozik akkor értesít engem. Természetesen erre vannak az interneten különböző oldalak, melyek vagy fizetősek vagy esetleg ingyenesen, de kisebb szolgáltatási körrel ezt megteszik. Ha az oldal megváltozik akkor küldenek levelet, vagy értesítést. Én szerettem volna erre valami programot keresni, de azzal szembesültem, hogy nincs, illetve csak pár van. De vagy régebbik, esetlegesen működnek vagy egyáltalán nem működik, ami bosszantó. Bár az is lehet, hogy én kerestem rosszul, és ezerszám van ilyen az interneten, csak én nem találtam… Miután ráébredtem arra, hogy én nem találok megfelelő grafikus programot, a keresést kiterjesztettem a scriptekre is. Természetesen találtam is többfélét. Én jelen pillanatban egyet szeretnék bemutatni. Egyrészt azért, mert ez számomra hasznos és napi szinten tudom használni. Másrészt pedig arra is nagyon jó, hogy egy script működését, illetve egy script felépítését, írását is tanulmányozni tudjunk. Megbeszéljük, hogyan működik a script, majd megbeszéljük hogyan kellene felépíteni illetve átgondolni egy kis programot.

Linux scriptek egyszerűen

A scriptek kipróbálásához, használatához első lépésként érdemes létrehozni egy olyan könyvtárat, amelyben az ilyen szkripteket kipróbáljuk. Ennek egy célja van: ha véletlenül egy-egy script ilyen-olyan fájlokat létrehozna, illetve törölne, vagy akármi fájlműveletet végezne, abba a könyvtárba tudjuk elvégezni. Nehogy véletlenül valamit kitöröljünk, összevissza írogassunk fájlokat. Illetve egy helyen, egy törlési művelet után eltüntethető legyen az egész. Ha alkalmazunk átmeneti fájlokat is, azokat egy helyen találjuk meg, bele tudunk nézni, ellenőrizni tudjuk a tartalmát. Későbbiekben bármilyen könyvtárszerkezet használhatunk. de én szeretem ha egy könyvtáron belül próbálok ki egy-egy scriptet.

Miután létre hoztál egy könyvtárat, kell egy script fájl. A script fájl egy sima szöveges állomány, amit bármelyik sima szövegszerkesztővel létre tudsz hozni. Én a geany-t használom. Majd ennek a fájlnak egy futtatási jogot is kell adni, Amit a kedvenc fájlkezelőddel meg is tehetsz. Fura hibajeleket kaphatsz, ha ezt nem teszed meg. Így már futtatni is tudjuk.

A következő lépés egy-egy ilyen internetről levadászott és megkívánt scriptnél nagyon egyszerű: megnyitod az állományt – mármint az üres fájt – és bemásolod. Ennyi! Ezek után már kész is van a scripted. Ha elolvasod a script leírását – általában a legtöbb ilyen kis programokhoz viszonylag normális leírás tartozik -, akkor már a legtöbb esetben használatra kész.

Mindenképp tedd meg!

Itt az első kiegészítő gondolat, amit mindenképp érdemes – főleg aki nem ért a programozáshoz – átgondolni: bár nem valószínű, illetve kicsi az esélye, hogy kártékony scriptet találsz normális, megbízható oldalon, ami tönkreteheti a gépedet, a programjaidat, vagy a Linux disztribúciódat, de azért jó lenne megszokni egy fontos teendőt. A másolás előtt, vagy a másolás után – ahogy neked kényelmes – nézed meg az adott állományt, azaz ne legyen benne olyan kódsor, amit nagyjából sem értesz. Ha valami parancsrész, paraméter nem világos, olvass utána. Ez csak az első pár esetben lesz körülményes, egy idő után összeszedtél olyan tudást, ami ez gyorsítja.

Így nézzük is meg a mi saját kis scriptünk használatát. Nagyon egyszerű.

#!/bin/bash

NEV=Mint
URL=https://linuxmint.hu/forum/manjaro-mar-nepszerubb-mint-a-linux-mint
for (( ; ; )); do
     mv$NEV"_new".html $NEV"_old".html 2>/dev/null
     curl$URL-L--compressed-s>$NEV"_new".html
     DIFF_OUTPUT="$(diff $NEV"_new".html $NEV"_old".html)"
  if["0"!="${#DIFF_OUTPUT}"];
  then
     kdialog --msgbox "A(z) $NEV megváltozott."
  else
     exit
  fi
done

A NEV= változónál megadsz egy nevet. Teljesen mindegy, egy szó legyen, ennyi az elvárás. A következő, amit meg kell adni az elérési út. Az a webcím, amit figyelni szeretnél, ha azon a tartalom változik szeretnél, te értesítést akarsz kapni. Beírod, lemented.

Lefuttatod a scriptet. A legegyszerűbb megoldás, hogy a fájlkezelőbe odanavigálsz abba a könyvtárba, amiben a script van, nyitsz egy terminált oda, és

./scriptneve

Én a fantáziadús teszt nevet adom legtöbbször a teszt scriptnek.

Gyakorlatilag nem csinál, mást csak létrehoz neked egy fájlt. Majd megnézzük, hogy milyen nevezékkel történik ez, mert az is szabályozni fogjuk. Utána semmi nem történik. A következő lépésként amikor kíváncsi vagy, változott-e az adott honlap, újra lefuttatod a scriptet. Jó esetben, ha van változás, akkor jelzi, hogy változás történt. Vagy nem. De erre ki fogunk még térni :). A használatáról nagyjából ennyit kell tudni. Természetesen ezt nem úgy használom, lefuttatom, majd amikor eszembe jut újra. Betettem a cron időzítőbe és óránként, naponta, illetve, olyan ütemben ahogy nekem tetszik, le fog futni.

Nézzük is meg a scriptünket részenként.

#!/bin/bash

Így kezdődik az összes script. A /bash helyett az a shell-t, vagy parancsértelmező környezet kell beírni amit a script használ. Ez egy shell scriptnél általában bash, de lehet más is. Ezt egy kész scriptnél ne változtasd meg, a programozó állítja be, úgy ahogy kell.

A következő két sok egy „változó”.

NEV=Mint
URL=https://linuxmint.hu/forum/manjaro-mar-nepszerubb-mint-a-linux-mint

Ami nem más, mint egy egyszerűsítés. Ezentúl ha hivatkozol az „URL”-re, akkor a scriptünk tudni fogja, hogy oda be kell helyettesíteni a https://linuxmint.hu/forum/manjaro-mar-nepszerubb-mint-a-linux-mint szöveget. Praktikus? Igen az! Most fura lehet, hogy változónak nevezünk egy statikus dolgot, de a későbbiekben megérted, hogy ez valóban lehet, hogy változik.

A következő rész már több. És érdekesebb is.

Egy megszokott, és sokat használt szerkezetet használunk. Ami annyit mond el nekünk

for (( ; ; )); do

Csináld meg ezt, amiket ide írtam

if ha ez a feltétel teljesül, akkor

then ezt csináld,

else ha nem, akkor pedig ezt

fi vége választási lehetőségeknek

done mehetsz tovább!

Bár nagyon leegyszerűsítettem, de alapszinten így elmagyaráztuk a programnak, hogy mi is a feladata.

“Csináld meg ezt, amiket ide írtam”

Ez az egyik legfontosabb rész, mert itt logikusan össze kell szedni mi is a faladata a programnak.
Nagyjából annyit akarunk elérni, hogy nézze meg, hogy változott-e az adott lap tartalma. Ehhez kell egy alapállapot, amihez hasonlítjuk a jelenlegit. Nyilván egy program nem „megnézi” a lapot, hanem valami digitális megoldást kellene adni, amit ő is megért. Így a legjobb lenne, ha az előtte (old) és a mostani (new) forráskódját hasonlítgatná össze. Figyeljünk arra, hogy az előtte az mindig az előző állapot lesz, ami változik, ha folyamatosan használjuk a scriptet. Ezt kezelni kell.
Ami nem olyan rémítően bonyolult, mint ahogy az hangzik. Le tudjuk szedni az adott lap forráskódját, amit össze is tudunk hasonlítani. Nagyon egyszerűen. Amit most leszedünk, annak legyen a neve az általunk megadott név+new, azaz az új állapot. A régi pedig legyen +old. Így ha több, eltérő oldalnál is ezt a scriptet használod nem keverednek össze az állományok. Ha a NEV= változót megváltoztatod.

mv $NEV"_new".html $NEV"_old".html 2> /dev/null

Nevezze át az előző alkalommal leszedett forráskódot _old végűre. Hiszen lesz az alap, amihez a mostanit hasonlítani akarjuk. Az mv parancsot ismerjük, ha nem, akkor olvass utána. Alapparancs, ismerni kell!

$NEV”_new” Itt már használjuk a változót, hiszen a letöltött oldal neve változik. Ha a NEV változóban megváltoztatjuk az egyenlősség utáni karaktereket, akkor itt is mást kell használnia. Itt csak féltucatszor használja ezt helyesbítést, de ha egy program komolyabb, akkor esetleg több százszor. Ha ezt kézzel kellene mindenhol pontosan megadni, akkor – legalábbis nálam – biztos lenne egy elütés. Ami hibához vezetne.
Már van egy bázis fájl, amihez hasonlítani tudjuk az új honlap forrását.

Értelemszerűen, ha most futtatjuk, akkor nincs _new fájl, mert még nem hoztuk létre. Ami azt adná, hogy az mv parancs alapesetben siránkozna, hogy nincs ilyen fájl, mit tegyen most… Ezt akadályozza meg, hogy a végén a hibajelzést (2) a digitális feketelyukba a dev/null-ba küldjük.
Érdemes ezt a kis trükköt megjegyezni…

curl $URL -L --compressed -s > $NEV"_new".html

Hogyan lehet egy honlapot gyorsan „tükrözni” a gépedre? Sokféleképp, de most a curl parancsot használta a script készítője. Itt sem kézzel írogatta be a honlap címét. A $URL-el felkérte a programot, hogy illessze be ide a URL változót, ami itt egy állandó érték, a honlap címe. Majd a leszedett forrást átirányította egy fájlba, aminek a neve legyen a NEV változóban tárolt érték (itt egy karaktersorozat) és tegye hozz az idézőjelek közé tett karaktereket.

Következtetés: ha nincs a curl a gépeden telepíteni kell. Pont ezért is át kell nézni egy-egy scriptet, mert lehet, hogy olyant programot is használ, ami nincs a gépeden.

DIFF_OUTPUT="$(diff $NEV"_new".html $NEV"_old".html)"

Na itt már a  változó készítés eredménye valóban egy változó érték lesz. Ez a változók egyik nagy előnye, hogy menet közben létrehozhatsz egy olyan értéket, amiről előtte semmit nem tudsz, hogy milyen érték lesz, mit tartalmaz.

Ha már van két lementett honlap verziód, akkor az össze kell hasonlítani. Itt a diff kis programot használja a script írója. Ami pont erre való. Ez valami érték lehet, ha egyezik az érték, akkor a diff eredménye nulla lesz. De lehet más is.
Ezt az értéket vizsgálni fogjuk, hogy nulla vagy más. Ezért jó lenne, ha a későbbiekben nem kellene kiszámolni, hanem kapna egy nevet, azaz egy változóban, mint egy felcímkézett dobozban tároljuk el.

Bár maga a szerkezet, a sor első látásra elég bonyolultnak tűnik, most elég annyit tudni, hogy van ilyenre lehetőség: egy, a program, script futásakor kiszámolt, vagy akármilyen más módon lefuttatott program eredményét és sok egyebet is el tudunk tárolni változóban. Így nem csak az elején adhatunk meg ezeknek értéket, hanem bármikor. Ami még ennél is jobb, ezt az értéket változtatni is tudjuk, folyamatosan kaphat új értéket is. De ez már messze nem ennek az egyszerű scriptnek a témája 🙂

Ok, a feladatunk kész. Vagy egyezik a két időpontban leszedett lap forrása vagy nem. Már csak azt kellene megmondani, hogy ha nem egyezik, akkor valamit csináljon, szóljon nekünk. Ha meg egyezik, akkor hanyagolja a zavarásunk.

if [ "0" != "${#DIFF_OUTPUT}" ];

!= ezzel mondjuk meg, hogy ha nem egyezik, nem egyenlő a DIFF_OUTPUT értéke a nullával, akkor

then

Csináljon valamit:

kdialog --msgbox "A(z) $NEV megváltozott."

Hogy mit, az már egy külön téma, én úgy döntöttem, hogy a kdialog nevű kis panelkezelő eszközzel küldjön nekem egy üzenetet. Itt is igaz, hogy ha nincs fenn a gépeden a kdialog, akkor…

Jogos kérdés, hogy miért kdialog? Csak. Mert éppen ez volt fenn a gépen, és ezt választottam. Ha meg komolyabb okot keresünk, akkor az is szubjektív: nekem jobban tetszik, és többet tud, mint a zenity. Azt használsz, amit akarsz 🙂

A csináljon valamit, bár pongyola megfogalmazás, de takarhat bármi olyan elvégzendő feladatot, amit akkor várok el a programtól, ha a feltétel igaz. Lejátszhat egy hangot, küldhet levelet, de akár meg is nyithatja a honlapot stb.. Ezt az utóbbit én elvetettem, mert értesítést vártam el. Majd akkor nézek rá, ha valóban lesz időm. Ha megnyitja az adott lapot, akkor már a munkámról arra terelődik a figyelem, ha már úgyis nyitva, akkor el is olvasom…
Ide azt programozol le, amit akarsz. A mi szintünkön ez a “programozol le” pár bevált panelmegoldás beillesztése.

else

Ha nem igaz az állítás, azaz nullától eltérő az érték, akkor mit tegyen. Itt az elvárt feladatot teszi meg: semmit, kilép a programrészből, nem zavar, hogy kiírja, hogy nem változott meg…

Összefoglalva:

  • Gyorsan tudunk keresni a legtöbb feladatra scriptet
  • Azt érdemes egy külön könyvtárba kipróbálni
  • Mindenképp nézd át, hogy mit csinál az a script
  • Tudjuk, hogy lehet változókat is használni

Bár egy egyszerű feladatra készült pár soros scriptet mutattam, de talán hasznos lehet maga a script is. Ha pedig elfogadod, hogy érdemes bele is nézni, kicsit elemezni a scripteket, akkor egyrészt tanulni is fogsz a scriptekből, másrészt sok hasznos ötletet is összeszedhetsz.

A FAQ részben több hasznos scriptet is találsz, így oda is nézz be…. Bár oda csak pár szavas leírás kerül, esetleg találsz neked is hasznosat.

A scriptet 2020. februárjában Arcolinux alatt teszteltem.