Gli script sono disponibili sul repository SVN del Toolserver.

elezioni.py modifica

Lo script usato per aggiornare live i risultati delle elezioni di aprile 2008.

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import wikipedia
import urllib2, datetime, re, time, codecs

def pageText(url):
    request = urllib2.Request(url)
    user_agent = 'BimBot/1.0'
    request.add_header("User-Agent", user_agent)
    response = urllib2.urlopen(request)
    text = response.read()
    response.close()
    return text
 
def main():
    args = wikipedia.handleArgs()
    all = False
    for currentArgument in args:
        if currentArgument.startswith("-always"):
            all = True
            
    templateSenato = codecs.open("modello_elezioni_senato.txt", "r", "utf-8")
    modelloSenato = templateSenato.read() # Legge il modello della pagina
    templateSenato.close()
    
    templateCamera = codecs.open("modello_elezioni_camera.txt", "r", "utf-8")
    modelloCamera = templateCamera.read() # Legge il modello della pagina
    templateCamera.close()
    
    now = datetime.datetime.utcnow()
    urloSenato = "http://politiche2008.interno.it/politiche/senato080413/S000000000.htm"
    #urloSenato = "http://localhost/~pietro/senato.html"
    wikipedia.output(u'Prendo la pagina dal server...')
    try:
        senatoText = pageText(urloSenato)
    except urllib2.HTTPError:
        try:
            wikipedia.output(u"Errore del server. Aspetto 10 secondi... " + time.strftime("%d %b %Y %H:%M:%S (UTC)", time.gmtime()) )
            time.sleep(10)
            senatoText = pageText(urloSenato)
        except urllib2.HTTPError:
            wikipedia.output(u"Errore del server. Chiudo.")
            return
    urloCamera = "http://politiche2008.interno.it/politiche/camera080413/C000000000.htm"
    #urloCamera = "http://localhost/~pietro/camera.html"
    wikipedia.output(u'Prendo la pagina dal server...')
    try:
        cameraText = pageText(urloCamera)
    except urllib2.HTTPError:
        try:
            wikipedia.output(u"Errore del server. Aspetto 10 secondi... " + time.strftime("%d %b %Y %H:%M:%S (UTC)", time.gmtime()) )
            time.sleep(10)
            cameraText = pageText(urloCamera)
        except urllib2.HTTPError:
            wikipedia.output(u"Errore del server. Chiudo.")
            return
    
    bloccoTipo = "<th class=\"datotxt\" id=\".*?\" headers=\".*?\">%s</th>\s+<td class=\"datonum\" headers=\".*?\">(.*?)</td>\s+<td class=\"datonum\" headers=\".*?\">(.*?)\s+"
    sez_senato = re.search("<div class=\"Box01Cont\"><strong>Sezioni pervenute :<br/>(.*?)\s+su\s+(.*?)</strong>", senatoText)
    senato_pdl = re.search(bloccoTipo % 'IL POPOLO DELLA LIBERTA\'', senatoText)
    senato_lega = re.search(bloccoTipo % 'LEGA NORD', senatoText)
    senato_pd = re.search(bloccoTipo % 'PARTITO DEMOCRATICO', senatoText)
    senato_dipietro = re.search(bloccoTipo % 'DI PIETRO ITALIA DEI VALORI', senatoText)
    senato_udc = re.search(bloccoTipo % 'UNIONE DI CENTRO', senatoText)
    senato_arcobaleno = re.search(bloccoTipo % 'LA SINISTRA L\'ARCOBALENO', senatoText)
    senato_ladestra = re.search(bloccoTipo % 'LA DESTRA - FIAMMA TRICOLORE', senatoText)
    senato_socialisti = re.search(bloccoTipo % 'PARTITO SOCIALISTA', senatoText)
    #senato_sud = re.search(bloccoTipo % 'MOVIMENTO PER L\'AUTONOMIA ALL\.PER IL SUD', senatoText)
    #senato_comunisti = re.search(bloccoTipo % 'PARTITO COMUNISTA DEI LAVORATORI', senatoText)
    #senato_sincritica = re.search(bloccoTipo % 'SINISTRA CRITICA', senatoText)
    
    sez_camera = re.search("<div class=\"Box01Cont\"><strong>Sezioni pervenute :<br/>(.*?)\s+su\s+(.*?)</strong>", cameraText)
    camera_pdl = re.search(bloccoTipo % 'IL POPOLO DELLA LIBERTA\'', cameraText)
    camera_lega = re.search(bloccoTipo % 'LEGA NORD', cameraText)
    camera_pd = re.search(bloccoTipo % 'PARTITO DEMOCRATICO', cameraText)
    camera_dipietro = re.search(bloccoTipo % 'DI PIETRO ITALIA DEI VALORI', cameraText)
    camera_udc = re.search(bloccoTipo % 'UNIONE DI CENTRO', cameraText)
    camera_arcobaleno = re.search(bloccoTipo % 'LA SINISTRA L\'ARCOBALENO', cameraText)
    camera_ladestra = re.search(bloccoTipo % 'LA DESTRA - FIAMMA TRICOLORE', cameraText)
    camera_socialisti = re.search(bloccoTipo % 'PARTITO SOCIALISTA', cameraText)
    #camera_sud = re.search(bloccoTipo % 'MOVIMENTO PER L\'AUTONOMIA ALL\.PER IL SUD', cameraText)
    #camera_comunisti = re.search(bloccoTipo % 'PARTITO COMUNISTA DEI LAVORATORI', cameraText)
    #camera_sincritica = re.search(bloccoTipo % 'SINISTRA CRITICA', cameraText)
    
    elencoSostituzioniSenato = { # Sostituisce le variabili nel modello
        '#senato-sezioniscrut': sez_senato.group(1),
        '#senato-sezionitot': sez_senato.group(2),
        '#senato-pdl': str(float(senato_pdl.group(2).replace(',', '.'))+float(senato_lega.group(2).replace(',', '.'))).replace('.', ','),
        '#senato-partitodemocratico': str(float(senato_pd.group(2).replace(',', '.'))+float(senato_dipietro.group(2).replace(',', '.'))).replace('.', ','),
        '#senato-udc': senato_udc.group(2).replace('.', ','),
        '#senato-arcobaleno': senato_arcobaleno.group(2).replace('.', ','),
        '#senato-ladestra': senato_ladestra.group(2).replace('.', ','),
        '#senato-socialisti': senato_socialisti.group(2).replace('.', ','),
    }
    
    elencoSostituzioniCamera = { # Sostituisce le variabili nel modello
        '#camera-sezioniscrut': sez_camera.group(1),
        '#camera-sezionitot': sez_camera.group(2),
        '#camera-pdl': str(float(camera_pdl.group(2).replace(',', '.'))+float(camera_lega.group(2).replace(',', '.'))).replace('.', ','),
        '#camera-partitodemocratico': str(float(camera_pd.group(2).replace(',', '.'))+float(camera_dipietro.group(2).replace(',', '.'))).replace('.', ','),
        '#camera-udc': camera_udc.group(2).replace('.', ','),
        '#camera-arcobaleno': camera_arcobaleno.group(2).replace('.', ','),
        '#camera-ladestra': camera_ladestra.group(2).replace('.', ','),
        '#camera-socialisti': camera_socialisti.group(2).replace('.', ','),
    }
    
    nuovoTestoSenato = massiveReplace(elencoSostituzioniSenato, modelloSenato)
    nuovoTestoCamera = massiveReplace(elencoSostituzioniCamera, modelloCamera)
    
    pageSenato = wikipedia.Page(wikipedia.getSite(code='it', fam='wikinews'), "Speciale Elezioni politiche italiane 2008/Senato")
    if pageSenato.exists():
        oldtextSenato = pageSenato.get()
    else:
        oldtextSenato = ""
    wikipedia.showDiff(oldtextSenato, nuovoTestoSenato)
    if not all:
        choice = wikipedia.inputChoice(u"Modificare?",  ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
    else:
        choice = 'y'
    if choice in ['A', 'a']:
        all = True
        choice = 'y'
    if choice in ['Y', 'y']:
        pageSenato.put(nuovoTestoSenato, u"Bot: Aggiorno risultati elezioni senato")
    
    pageCamera = wikipedia.Page(wikipedia.getSite(code='it', fam='wikinews'), "Speciale Elezioni politiche italiane 2008/Camera")
    if pageCamera.exists():
        oldtextCamera = pageCamera.get()
    else:
        oldtextCamera = ""
    wikipedia.showDiff(oldtextCamera, nuovoTestoCamera)
    if not all:
        choice = wikipedia.inputChoice(u"Modificare?",  ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N')
    else:
        choice = 'y'
    if choice in ['A', 'a']:
        all = True
        choice = 'y'
    if choice in ['Y', 'y']:
        pageCamera.put(nuovoTestoCamera, u"Bot: Aggiorno risultati elezioni camera")

def massiveReplace(dict, text):
    # Dato un testo ed un dizionario di sostituzioni, usa le regex per il "find and replace"
    for k in dict:
        text = re.sub(k, dict[k], text)
    return text

if __name__ == "__main__":
    try:
        main()
    finally:
        wikipedia.stopme()

modello_elezioni_camera.txt modifica

[[Image:Sez camer dep ris.jpg]]
<div style="text-align: center;">''Dati ufficiali #camera-sezioniscrut sezioni scrutinate su #camera-sezionitot esclusi i deputati delle sezioni estero''</div>
<div style="text-align: left; color:red;">'''#camera-partitodemocratico% Partito Democratico e Italia dei Valori (- deputati<small>+- estero</small>)'''</div> 
<div style="text-align: left; color:blue;">'''#camera-pdl% Il Popolo della Libertà e Lega Nord (- deputati<small>+- estero</small>)'''</div>
<div style="text-align: left; color:green;">'''#camera-arcobaleno% Sinistra Arcobaleno (- deputati<small>+- estero</small>)'''</div>
<div style="text-align: left; color:magenta;">'''#camera-udc% Unione di Centro (- deputati<small>+- estero</small>)'''</div>
<div style="text-align: left; color:olive;">'''#camera-ladestra% La Destra-Fiamma Tricolore (- deputati<small>+- estero</small>)'''</div>
<div style="text-align: left; color:darkorange;">'''#camera-socialisti% Partito Socialista (- deputati<small>+- estero</small>)'''</div>
<div style="text-align: left; color:black;">'''#camera-altri% Altri (0 deputati<small>+- estero</small>)'''</div>
<div style="text-align: right;">''[[Speciale Elezioni politiche italiane 2008/Camera|dettagli sui risultati]]''</div>

modello_elezioni_senato.txt modifica

[[Image:Sez senato ris.jpg]]
<div style="text-align: center;">''Dati ufficiali #senato-sezioniscrut sezioni scrutinate su #senato-sezionitot esclusi i deputati delle sezioni estero''</div>
<div style="text-align: left; color:red;">'''#senato-partitodemocratico% Partito Democratico e Italia dei Valori (- senatori<small>+- estero</small>)'''</div> 
<div style="text-align: left; color:blue;">'''#senato-pdl% Il Popolo della Libertà e Lega Nord (- senatori<small>+- estero</small>)'''</div>
<div style="text-align: left; color:green;">'''#senato-arcobaleno% Sinistra Arcobaleno (- senatori<small>+- estero</small>)'''</div>
<div style="text-align: left; color:magenta;">'''#senato-udc% Unione di Centro (- senatori<small>+- estero</small>)'''</div>
<div style="text-align: left; color:olive;">'''#senato-ladestra% La Destra-Fiamma Tricolore (- senatori<small>+- estero</small>)'''</div>
<div style="text-align: left; color:darkorange;">'''#senato-socialisti% Partito Socialista (- senatori<small>+- estero</small>)'''</div>
<div style="text-align: left; color:black;">'''#senato-altri% Altri (0 deputati<small>+- estero</small>)'''</div>
<div style="text-align: right;">''[[Speciale Elezioni politiche italiane 2008/Senato|dettagli sui risultati]]''</div>