Skript na ARRL DX bulletin

Tagged:

Na konferenci Českého radioklubu, na takzvaném OKLISTu v posledních dnech vyeskalovalo téma o přeposílání ARRL DX bulletinu. Ten je běžně dostupný na webu ARRL, avšak automaticky zasílán jen jeho členům.

Pro mě osobně je v této době buletin nezajímavý dokument a tak jej úspěšně ignoruji. Ovšem v následné debatě se objevil názor Karla OK1UHU s kterým se zcela ztotožnuji:

OK1UHU wrote:
Ale to neva, vysvětlíme - celý tenhle proces může dělat libovolný server (třeba webserver ČRK) poté, kdy to tam onen "středoškolák" naprogramuje - a pak už to jede automaticky. Server zajistí, že se např. každých 15 minut spustí tenhle skript, co se podívá na onu stránku ARRL, podívá se, jestli se změnila, pokud ano, text stáhne a pošle do konference. Uživatelé konference nic nepoznají. Jednou napíšu - a zapomenu. Průměrný linux administrátor to musí zvládnout, jinak ať administruje windows.

Tak jsem to pojal jako výzvu a skript v rychlosti napsal. Teď stačí jen zadat do CRONu (ve W7 je to Plánovač úloh), aby se každý čtvrtek spustil a je to. Buletiny se stahují na lokální disk, kde si je každý může v klidu přečíst. Rozšíření o přeposílání emailem by bylo pár řádků navíc, ale na to se stačí přihlásit do OKLISTu :)

K úspěšnému běhu je třeba mít nainstalovaný Python. Na Linuxu je už většinou součástí instalace.

  1. import re
  2. import urllib2
  3. import sys
  4. import os
  5.  
  6. url_bulletin_archive = "http://www.arrl.org/w1aw-bulletins-archive-dx"
  7. url_arrl_base = "http://www.arrl.org"
  8. pattern_listing = "(/w1aw-bulletins-archive/ARLD(\d+)/(\d+))"
  9. pattern_bulletin = "<pre>(.*?)</pre>"
  10. start_year = 2013
  11.  
  12. def download(url):
  13.     try:
  14.         print "Downloading..",url
  15.         response = urllib2.urlopen(url)
  16.         return response.read()
  17.     except:        
  18.         return 0
  19.  
  20. html = download(url_bulletin_archive)
  21. if not html:
  22.     print "Can't download: %s" % (url_bulletin_archive,)
  23.     sys.exit()
  24.    
  25. index_match = re.findall(pattern_listing,html)
  26. if not index_match:
  27.     print "Can't find any item in index"
  28.     sys.exit()
  29.      
  30. for item in index_match:
  31.     file_name = "arrl_%s_%s.txt" % (item[2], item[1])
  32.     if (int(item[2])>=start_year) and (not os.path.isfile(file_name)):
  33.         html = download(url_arrl_base+item[0])
  34.         if html:
  35.             bulletin_match = re.search(pattern_bulletin, html, re.S)
  36.             if bulletin_match:
  37.                 content = bulletin_match.group(1)                
  38.                 open(file_name, "wb").write(content)
  39.             else:
  40.                 print "No bulletin found, check search pattern"
  41.         else:
  42.             print "Can't download: %s" % (url_arrl_base+item[0],)