Powiadamianie o zmianach na stronie internetowej za pomocą SMSa (Linux)

   Czasami chcielibyśmy dostawać natychmiastowe powiadomienia o zmianach na jakiejś stronie internetowej. Ciekawym rozwiązaniem jest wykorzystanie SMSa wysyłanego automatycznie z bramki. Przedstawię tu przykładowe rozwiązanie pod Linuksa.
   Zacznijmy od tego w jaki sposób będziemy śledzić zmiany na stronie. Ponieważ mało stron korzysta z RSS skorzystamy z bardzo prostej metody polegającej na okresowym ściąganiu strony i porównywaniu ze stanem poprzednim. Stworzymy więc skrypt shellowy uruchamiany przez crona i wykorzystujący przeglądarkę lynx, która będzie zapisywać stronę do pliku. Tworzymy wstępną wersję skryptu:

lynx -dump http://www.strona.pl > powiadamianie.tmp
VALID=`grep wyraztestowy < powiadamianie.tmp | wc -l`
if [ $VALID \> 0 ]
then
   if ! `cmp -s powiadamianie.src powiadamianie.tmp`
   then
      echo "Zmiana!"
   fi
   rm powiadamianie.src
   mv powiadamianie.tmp powiadamianie.src
fi

Kilka słów omówienia. Najpierw ściągamy stronę lynksem (po sparsowaniu, nie źródło) do pliku powiadamianie.tmp. Następnie szukamy grepem pewnego słowa (tutaj jest to "wyraztestowy") żeby zabezpieczyć się przed przypadkiem gdy lynx nic nie ściągnie albo ściągnie jakiś komunikat błędu np. na skutek niedziałania strony. Wybieramy więc słowo, które zawsze jest na stronie a nie ma go w komunikatach typu "Bandwidth Limit Exceeded". wc liczy linijki z tym słowem. Jeśli jest chociaż jedna, jedziemy dalej. Sprawdzenie wykonuje instrukcja if. Potem jest kolejne, najważniejsze sprawdzenie - określenie, czy jest różnica między bieżącym plikiem (bieżącą zawartością strony) a poprzednim (poprzednią zawartością strony). Jeśli tak to przechodzimy do części powiadamiającej. Zanim jednak ją omówimy, wprowadzimy dwie poprawki:

touch powiadamianie.src
timeout 20 lynx -dump http://www.strona.pl > powiadamianie.tmp
VALID=`grep wyraztestowy < powiadamianie.tmp | wc -l`
if [ $VALID \> 0 ]
then
   if ! `cmp -s powiadamianie.src powiadamianie.tmp`
   then
      echo "Zmiana!"
   fi
   rm powiadamianie.src
   mv powiadamianie.tmp powiadamianie.src
fi

Poleceniem timeout sprawiamy, że jeśli lynx w ciągu 20 sekund nie ściągnie strony, zostanie zabity. Dodajemy jeszcze polecenie touch żeby była pewność, że polecenie cmd dostanie plik powiadamianie.src. Dochodzimy do najważniejszej części: wysłania SMSa. Do tego potrzebny nam będzie program, który udając przeglądarkę wyśle SMSa z bramki operatora. Na szczęścia takich programów trochę jest więc nie ma problemu. Ja wykorzystałem program ze strony http://ceti.pl/~miki/komputery/sms.html. Instalacji tego programu nie będę omawiać bo każdy użytkownik Linuksa wie jak to się robi. Problemem może być to, że program korzysta z paru bibliotek, których możemy nie mieć zainstalowanych. Należy je oczywiście doinstalować. Ponadto ja miałem problem z biblioteką pcre++ po której skompilowaniu polecenie make install nie kopiowało pliku libpcre++.so.0.0.0 i dowiązań libpcre++.so i libpcre++.so.0 do katalogu /usr/lib i musiałem zrobić to ręcznie. Gdy program do wysyłania SMSów zostanie zainstalowany, musimy poczytać jak się wysyła SMSy z danej bramki. Ja wykorzystałem bramkę Ery. Gdy już umiemy wysłać SMSa, wstawiamy odpowiednią linijkę do naszego skryptu:

touch powiadamianie.src
timeout 20 lynx -dump http://www.strona.pl > powiadamianie.tmp
VALID=`grep wyraztestowy < powiadamianie.tmp | wc -l`
if [ $VALID \> 0 ]
then
   if ! `cmp -s powiadamianie.src powiadamianie.tmp`
   then
      echo "Zmiana!"
      sms -g era -m "Zmiana na www.strona.pl!" -n 606123123 -o omnix_user=48606123123 -o omnix_pass=mojehaslo
   fi
   rm powiadamianie.src
   mv powiadamianie.tmp powiadamianie.src
fi


I to już prawie koniec. Możemy jeszcze dodać pewien bajer. Otóż czasem czekamy na jakąś konkretną zmianę ale nie wiemy jak dokładnie ona ma wyglądać. Nie możemy więc dodać jakiegoś grepa czy ifa. Możemy za to wrzucić daną zmianę (różnicę) na stronie na inną stronę a następnie tą inną stronę ściągnąć przez WAP. Dzięki temu wiemy, czy SMS, który otrzymaliśmy oznacza rzeczywiście istotną zmianę. Ponadto widzimy tylko tą zmianę, nie musimy ściągać i przewijać nieraz długiej strony. Mniej ściągania to także mniejsza opłata za GPRS. Dochodzimy więc do finalnej wersji skryptu, w którym zmiany są wrzucane na stronkę na Onecie:

touch powiadamianie.src
timeout 20 lynx -dump http://www.strona.pl > powiadamianie.tmp
VALID=`grep wyraztestowy < powiadamianie.tmp | wc -l`
if [ $VALID \> 0 ]
then
   if ! `cmp -s powiadamianie.src powiadamianie.tmp`
   then
      echo "Zmiana!"
      diff powiadamianie.src powiadamianie.tmp > powiadamianie.diff
      ftp-upload -h ftp.republika.pl -u mojekonto --password mojehaslo powiadamianie.diff
      sms -g era -m "Zmiana na www.strona.pl!" -n 606123123 -o omnix_user=48606123123 -o omnix_pass=mojehaslo
   fi
   rm powiadamianie.src
   mv powiadamianie.tmp powiadamianie.src
fi

Polecenie diff porównuje pliki a wynik jest zapisywany do powiadomienie.diff. Następnie program ftp-upload wrzuca ten plik przez FTP na stronkę. Skrypt już mamy gotowy. Pozostaje jeszcze jego automatyczne wykonywanie co określoną ilość czasu. Do tego wykorzystamy crona. Dorzucamy do niego wpis w rodzaju:
*/1 * * * * /home/user/powiadamianie.sh
Zakładamy, że nasz skrypt nazywa się powiadamianie.sh i jest w katalogu domowym użytkownika user. */1 oznacza uruchamianie co minutę. Wiąże się z tym generowanie pewnego ruchu. Chociaż ściągnięcie strony raz na minutę to nie jest coś co może zapchać łącza albo przeciążyć serwer to jest pewne prawdopodobieństwo, że paranoiczny admin danej strony może się wkurzyć i np. nas odciąć. Dlatego przedział czasowy trzeba wybrać z rozwagą. Z drugiej strony większość adminów nie czyta logów więc niebezpieczeństwo nie jest duże.
   Przedstawiony skrypt można oczywiście napisać inaczej, w innym języku, np. w perlu i z zastosowaniem alternatywnych programów. To już zależy od naszych preferencji. Na pewno można go też było napisać lepiej jednak dla mnie osobiście okazał się wystarczający i działa bezproblemowo. I na koniec wersja przystosowana do strony Koła Naukowego Fizyków na Politechnice Warszawskiej:

touch powiadamianie.src
timeout 20 lynx -dump http://www.knf.pw.edu.pl > powiadamianie.tmp
VALID=`grep Warszawa < powiadamianie.tmp | wc -l`
if [ $VALID \> 0 ]
then
   if ! `cmp -s powiadamianie.src powiadamianie.tmp`
   then
      diff powiadamianie.src powiadamianie.tmp > powiadamianie.diff
      ftp-upload -h ftp.republika.pl -u mojekonto --password mojehaslo powiadamianie.diff
      sms -g era -m "Zmiana na stronie KNF!" -n 606123123 -o omnix_user=48606123123 -o omnix_pass=mojehaslo
   fi
   rm powiadamianie.src
   mv powiadamianie.tmp powiadamianie.src
fi