Jakiś czas temu zainspirowałem się ideą systemów agentowych (wykład Adama Dawidziuka na JWL ’99, SmartAgent, artykuły w prasie) i postanowiłem sprawdzić, ile zajmie mi napisanie prostego mikroagenta w Pythonie. Na pierwszy ogień poszedł 7thguard.Istnieje co prawda lista mailngowa 7thdigest, ale newsy są poucinane i przychodzą raz na dobę, a nie wtedy, kiedy się ukazują. Nie lubię tracić czasu przy przeglądarce, więc takie rozwiązanie jest dla mnie idealne.
Rezultat (mało zadawalający, zwłaszcza jeśli chodzi o formatowanie maili, a raczej jego brak) można znaleźć tutaj (a obejrzeć tu). Po rozpakowaniu wystarczy jedynie zmienić wartość zmiennej G_TO – powinien to być nasz adres mailowy. Łaty mile widziane.
To dla wszystkich leniwych 😉
Z ostatniej: nadchodzą pierwsze maile sugerujące zmianę nazwy funkcji „poczontek”. Uprzejmie informujemy, że nie ma mowy 😉 Acha – nie testowane pod Windows; teoretycznie – jeśli wymienimy localhosta na jakiegoś pobliskiego relay’a – powinno działać.
Agent ma postać demona, który działając w tle sprawdza czy nie pojawiły się nowe wiadomosci na 7thguardzie – jesli tak, pobiera je i przesyła mailem.
Raczej nie chcemy otrzymywać HTML-a, dlatego skorzystamy z modułu konwertującego go do zwykłego tekstu. Jest to minimalnie lepsza metoda niż usunięcie wszystkich znaczników.
from html2text import HTML2Text def html2text(s): parser = HTML2Text() parser.feed(s) parser.close() return parser.result
Dalej sama procedura do przesyłania newsa mailem – banalna:
def sendmesycz(mesycz): server = smtplib.SMTP('localhost') server.sendmail(G_FROM,G_TO,html2text(mesycz)) server.quit() if G_DEBUG == 1: print "mail sent"
Następnie funkcja pobierająca stronę z newsem; jak można łatwo zauważyć, mają one postać http://7thguard.net/news.php?id= i numer newsa, łatwo więc je pobrać. Nie potzrebna jest nam cała strona, tylko część zawierająca tekst. Ułatwiono nam zadanie umieszczając ładny komentarz 😉
def getpejcz(urlik): a=urllib.urlopen("http://7thguard.net/news.php?id=" + urlik) if G_DEBUG == 1: print "getting news no ", urlik b=a.read() for i in range (len(b)): pat = rxb.label.spam(rxb.exactly("")) pat.search(b) d = pat.after return d
Tutaj zaś pobieramy numery ostatnich 10 newsów z głównej strony:
def get7list(): a=urllib.urlopen("http://7thguard.net") if G_DEBUG == 1: print "index opened" b=a.read() c=string.split(b,'Przy pierwszym uruchomieniu agenta pobierze wszystkie 10 newsów z głównej strony zapamiętujac ostatni:
def poczontek(): d = get7list() d.reverse() for i in d[0:(len(d)-1)]: l = getpejcz(i) sendmesycz(l) G_LASTONE = eval(i)Wreszcie główna część: sprawdzanie czy nie pojawiły sie nowe newsy - jeśli tak, pobieranie ich.
x = 0 while x == 0: time.sleep(G_TAIMAUT) d = get7list() d.reverse() print d for i in d[0:(len(d)-1)]: if eval(i) > G_LASTONE: print "found a new news:", i l = getpejcz(str(i))Przy pierwszym uruchomieniu agenta pobierze wszystkie 10 newsów z głównej strony zapamiętujac ostatni:
def poczontek(): d = get7list() d.reverse() for i in d[0:(len(d)-1)]: l = getpejcz(i) sendmesycz(l) G_LASTONE = eval(i)Wreszcie główna część: sprawdzanie czy nie pojawiły sie nowe newsy - jeśli tak, pobieranie ich.
x = 0 while x == 0: time.sleep(G_TAIMAUT) d = get7list() d.reverse() print d for i in d[0:(len(d)-1)]: if eval(i) > G_LASTONE: print "found a new news:", i l = getpejcz(str(i)) sendmesycz(l) G_LASTONE = eval(i)Archiwalny news dodany przez użytkownika: arturs.
Kliknij tutaj by zobaczyć archiwalne komentarze.