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 rendelkeznek. 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égebbi, 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 szkriptekre 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 szkript működését, illetve egy szkript felépítését, írását is tanulmányozni tudjunk. Megbeszéljük, hogyan működik a szkript, majd megbeszéljük hogyan kellene felépíteni illetve átgondolni egy kis programot.

Linux szkriptek egyszerűen

A szkriptek 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 szkript 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álhatok ki egy-egy szkriptet.

Miután létrehoztál egy könyvtárat, kell egy szkript fájl. A szkript fájl egy sima szöveges állomány, amit bármelyik sima szövegszerkesztővel létre tudsz hozni. Én a geany-t használtam, de most már áttértem az NVim-re. 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 szkriptné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 szkripted. Ha elolvasod a szkript 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 szkriptet 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.

A minta szkript elemzése

Így nézzük is meg a mi saját kis szkriptü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 kdialog használatához telepíteni kell, de helyette használhatsz mást is.
A NEV= változónál megadsz egy nevet. Teljesen mindegy, egy szó legyen, ennyi az elvárás. A következő, amit megadunk 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 szkriptet. A legegyszerűbb megoldás, hogy a fájlkezelőbe odanavigálsz abba a könyvtárba, amiben a szkript van, nyitsz egy terminált oda, és

./szkriptneve

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

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 szkriptet. 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 szkriptünket részenként.

#!/bin/bash

Így kezdődik az összes szkript. A bash helyett az a shell-t, vagy parancsértelmező környezet kell beírni amit a szkript használ. Ez egy shell szkriptnél általában bash, de lehet más is. Ezt egy kész szkriptné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 szkriptü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 szkriptet. 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 szkriptet 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 szkript 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. Point ezért is át kell nézni egy-egy szkriptet, 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 szkript írója. Ami point erre való. Ez valami érték lesz, 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, szkript 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ű szkriptnek 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. 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 szkriptet
  • Azt érdemes egy külön könyvtárba kipróbálni
  • Mindenképp nézd át, hogy mit csinál az a szkript
  • Tudjuk, hogy lehet változókat is használni

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