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.

Oznaczone jako → 
Share →