Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Śledzenie zmian na stronach (#!/bin/bash).

Z uwagi na pojawianie się ostatnimi czasy wpisów użytkownika webnull na temat wykorzystania konsoli Uniksowej postanowiłem nieco dodać.

Skrypt jedynie testowałem na #!/bin/bash . Taki ze mnie specjalista, jak żaden - nawet nie mam pojęcia czy na standardowej powłoce(w systemie pozbawionym Basha) skrypt dałoby się uruchomić.

Co chcemy zrobić?

Chcemy śledzić w przyjemny i prosty sposób blogi użytkowników dobrych programów(by nam żaden wpis nie uciekł). Zauważyłem, że DobreProgramy (wcześniej: nie generują plików potrzebnych; powinno być przekreślone) generują pliki potrzebne do poprawnej pracy czytnikom/odbiorcom newsów.

Ponieważ lubię proste rozwiązania, a dodatkowo nie chcę nikogo zrazić, to skrypt będzie wykonywać podstawową czynność - sprawdzał, czy już była jakaś aktualizacja.
Do pracy
Najpierw musimy wiedzieć, co chcemy osiągnąć. Chcemy jedynie sprawdzić czy strona się zmieniła. Wymaga to (standardowo) pobrania jej na nasz dysk twardy. Odpowiedź czy nastąpiły jakieś zmiany od czasu ostatniego sprawdzenia dostarczy nam diff(program wyświetla różnicę w dwóch podanych plikach tekstowych).
Chcemy również otrzymywać przyjemne powiadomienia. Tutaj przyda nam się program notify-send.
Dodatkowo przydatne będzie narzędzie wget.
Instalujemy potrzebne zależności
W celu przystąpienia do pracy musimy się upewnić, że mamy zainstalowane wszystkie narzędzia. Bardzo proszę w tym celu uruchomić terminal i wpisać kolejno ich nazwy(separatorem będzie przejście do nowej linii - enter). >wget >notify-send >diff Jeżeli któregoś z tych programów nie mielibyśmy zainstalowanego, to system powinien nas poinstruować, co zrobić.
Rozwiązanie #!/bin/bash URL="http://www.dobreprogramy.pl/nintyfan" name="nintyfan-blog" if [ ! -e ${HOME}/.${name} ]; then wget $URL -O ${HOME}/.${name} else wget $URL -O ${HOME}/.${name}.2 if [ "`diff ${HOME}/.${name} ${HOME}/.${name}.2`" != "" ]; then notify-send "Zajrzyj na "${name} mv ${HOME}/.${name}.2 ${HOME}/.${name} fi fi Analiza
Jak zapewne się domyślacie, to linijka #!/bin/bash jest niemal, że obowiązkowa. Wskazuje ona jądru(lub linkerowi) interpretej do wykonania skryptu. Należy pamiętać, że rozszerzenia plików nie są niezbędne w innych systemach niż Windows. W Windows przyjęto konwencję, że każdy plik powinien mieć jakieś rozszerzenie. W systemach Uniksowych rodzaj pliku jest rozpoznawany po jego analizie.

URL, name są naszymi wewnętrznymi zmiennymi. W językach powłoki oznaczają po prostu: wszędzie tam, gdzie poproszę cię o podanie tej zmiennej, to wkleisz jej zawartość. Nazwy zmiennych wystarczy poprzedzić znakiem dolara. Dodatkowe klamerki są użyte, by powłoka wiedziała, co stanowi nazwę zmiennej(łączymy tekst ze zmiennej i z innym tekstem).

By połączyć tekst wystarczy jeden napisać obok drugiego:
"AAA""BBB"
Zostanie połączone do postaci AAABBB .
Należy pamiętać, że spacja pomiędzy takimi tekstami spowoduje, że nie zostaną one połączone. Będą traktowane, jako dwa oddzielne ciągi znaków. Dozwolone jest natomiast:
"AAA ""BBB"

W naszym skrypcie wywołujemy parę wcześniej wspomnianych programów. Nie będę tutaj jednak opisywać zupełnych podstaw programowania w powłoce(już i tak dosyć dużo w tym zagadnieniu napisałem).

Skrypt działa dosyć prosto: Pobieramy stronę z podanego adresu, zapisując wynik w naszym katalogu domowym + "/." + nazwa_bloga . Jeżeli plik istnieje, to zapisujemy tak pobrany skrypt pod inną nazwą (dodanie .2 ), a następnie porównujemy oba pliczki. W przypadku wykrycia różnic wyświetlamy określony komunikat (notify-send), a także nanosimy nowszą wersję na starszą.

To tyle na dzisiaj. 

Komentarze

0 nowych
nintyfan   10 #1 14.11.2010 17:44

Podałem zły adres do mojego bloga.

webnull   9 #2 14.11.2010 19:26

Fajny i sprytny sposób sprawdzania czy coś zostało zmienione na stronie.

XeonBloomfield   5 #3 14.11.2010 20:50

Coś o konsoli, czyli wpisy jakie czyta się przyjemnie i z uśmiechem na ustach.

W końcu dokładnie widać, że Linux znajduje miejsce i przypada do gustu ludziom, którzy znają się na komputerach, zajmują się programowaniem i pisaniem skryptów oraz administratorom serwerów. Oby tak dalej.

  #4 14.11.2010 23:49

Wszystko fajnie gdyby nie fakt ze na blogu jest wiele dynamicznych elementow ktore moga przeklamac powiadamianie o nowym wpisie.

Sprawdzaj odnosniki, dla przykladu, ten wpis ma numer 21497, nowy bedzie mial 21498, w zwiazku z tym co jakis czas sprawdzaj adres dobreprogramy.pl/,Blog,21498.html i wylapuj czy nie otrzymasz bledu 404 w przeciwnym wypadku sa nowe wpisy...

empirewar   2 #5 15.11.2010 02:02

Przyjemne rozwiązanie, jednak wystarczy drobna zmiana treści strony (np. inna reklama, nowy komentarz pod wiadomością) i otrzymamy niepotrzebne powiadomienie. Brakuje mi również wywołania cyklicznego (np. przy użyciu crona).

  #6 15.11.2010 06:03

@empirewar | 15.11.2010 2:02 :
Cron to jest zupełnie odrębny temat. Równie dobrze moglibyśmy napisać o AT. Po prostu - jeżeli ktoś chce korzystać z CRON, to sobie sam to zrobi. Nie dotyczy to tylko mojego skryptu.
Chyba, że zrobi się automatyczną instalację mojego skryptu w CRON, ale to bardziej potrafiłoby człowieka zdenerwować niż być przydatne.

  #7 15.11.2010 06:05

W takim razie trzeba napisać coś o sed. Będziemy wyrzucać niektóre odnośniki/informacje ze strony z obu plików, a potem dopiero porównywać.

Damned   2 #8 15.11.2010 08:06

"Wskazuje ona jądru(lub linkerowi)" WTF?! Co ma tu jądro lub linker (zgadywać które?) do rzeczy?

  #9 15.11.2010 13:25

boskie, nie wiem jak to w zasadzie działa :D ale boskie. Muszę wypróbować.

Dzięki za wpis.

  #10 15.11.2010 13:28

BTW, dlaczego nie...

lyx/links/elinks/w3c -dump zamiast wget?

borzole   4 #11 15.11.2010 13:46

nie chce mi się tego dalej pisać, ale można porównywać tylko fragment strony, tu same komentarze:


#!/usr/bin/env python
#-*- coding:utf-8 -*-

import urllib, BeautifulSoup

url="http://www.dobreprogramy.pl/Sledzenie-zmian-na-stronach-binbash,Blog,21497.html"

soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url))
print soup.html.head.title

for comment in soup.findAll('div', { 'class':'commentContent'}):
print comment

  #12 15.11.2010 15:09

@borzole | 15.11.2010 13:46 :
Nigdy nie korzystałem z modułu BeautifulSoup. Korzystałem z XML.DOM.Minidom .

nintyfan   10 #13 15.11.2010 17:50

@herr (niezalogowany) | 15.11.2010 13:28 :
Właściwie, to nie przemyślałem sprawy.

  #14 15.11.2010 18:25

@nintyfan

użycie jakiejś przeglądarki tekstowej z -dump ułatwiłoby sprawę bo można by dodać head albo tail... albo jedno i drugie ;-)

mktos   9 #15 16.11.2010 13:44

Masz na myśli, że blogi dobrychprogramów nie generują RSS?
RSS jest, ale nie w sekcji head, więc z automatu go nie widać: http://www.dobreprogramy.pl/60852,nintyfan,Blog,Rss.html

borzole   4 #16 16.11.2010 15:34

@Nemhein
nie chodzi o artykuły, nic nie śledzi komentarzy na DP

nintyfan   10 #17 17.11.2010 21:16

@borzole | 16.11.2010 15:34 :
No niestety. Chodziło mi faktycznie o śledzenie nowych wpisów. Jednak rozwiązanie tak naprawdę wyśledzi każdą zmianę.

Zostało stworzone do śledzenia zmian na stronie pewnego doktora(statyczna strona internetowa, a ja nie wiedziałem, co konkretnie porównywać, więc postanowiłem odwiedzać stronę przy każdej zmianie).

nintyfan   10 #18 11.12.2010 12:50

@womperm | 20.11.2010 18:49 :
Masz moje zezwolenie. Prosiłbym tylko o dodanie odnośnika do tego wpisu, by ludzie wiedzieli, co skrypt robi.