Here the code I used to run the bot. Please consider that the script is merely a collection of routines, written for personal use into a personal (and far from expert) "slang". Many of them are devoted to specific works into it.source; I presume that a reader could be interested about readSummary() and pb(), that I used to build An introduction to linear drawing and its sections from data contained into Page:An introduction to linear drawing.djvu/21. Just a personal test ... far from usable routine by another user!

#!/usr/bin/python
# -*- coding: utf-8 -*-
import wikipedia
import pickle
import catlib
import pagegenerators
from datetime import date
from dummy_threading import Timer
import query as wquery
import urllib

from time import gmtime, strftime
from random import random
#from sets import Set
import sys
from Ale import carica_pcl, salva_pcl


a="{{}}"
b="}}"
nsobs="0|102|108|110" # principale, autore, pagina, indice
output="cp1252"

wnamespaces={'': 0, 'Principale': 0, 'Discussioni categoria': 15, 'MediaWiki': 8, 'Template': 10,
            'Discussioni portale': 107, 'Categoria': 14, 'Discussioni progetto': 105,
            'Discussioni file': 7, 'Discussioni indice': 111, 'Discussioni aiuto': 13,
            'Media': -2, 'Discussioni template': 11, 'Autore': 102, 'Speciale': -1,
            'Discussioni Wikisource': 5, 'Pagina': 108, 'Utente': 2, 'Wikisource': 4,
            'Progetto': 104, 'Discussioni utente': 3, 'Indice': 110, 'Discussioni pagina': 109,
            'Discussioni MediaWiki': 9, 'Discussione': 1, 'Discussioni autore': 103, 'Portale': 106,
            'File': 6, 'Aiuto': 12}
vecchiePagine=[]

# progetto pagemaker (pm)

def leggi_pagina_en(nomePagina):
   testo=leggi_pagina(nomePagina,site="en")
   return testo

def scrivi_pagina_en(testo="",aggiungi=False,nome_pagina="User:Alex brollo/Sandbox",commento="Edit by Alex BrolloBot",code="en"):
   esito=scrivi_pagina(testo,aggiungi,nome_pagina,commento,code)
   return esito

def pageFromLink(link):
   
   if not "[[" in link:
      link=link
   elif "|" in link:
      link=find_stringa(link,"[[","|")
   else:
      link=find_stringa(link,"[[","]]")
   return link

def readSummary(nomePagina):

   indexName=nomePagina.split("/")[0].replace("Page:","Index:")
   #print indexName
   testoIndex=leggi_pagina_en(indexName)
   
   indexTitle=pageFromLink(find_stringa(testoIndex,"|Title=","\n"))
   indexYear=find_stringa(testoIndex,"|Year=","\n")
   indexAuthor=pageFromLink(find_stringa(testoIndex,"|Author=","\n"))
   indexTranslator=pageFromLink(find_stringa(testoIndex,"|Translator=","\n"))
   #print indexName,indexTitle, indexYear,indexAuthor,indexTranslator
   testo=leggi_pagina_en(nomePagina).split("\n")
   r=[]
   dati=[] # nomeCapitolo,titoloCapitolo, paginaIniziale, paginaFinale
   for i in testo:
      if "Djvu page link|" in i:
         r.append(i)
   c=1
   for i in r:
      
      
      link=find_stringa(i,"[[","]]")
      if "|" in link:
         link=link.split("|")
         nomeCapitolo=link[0]
         titoloCapitolo=link[1]
      else:
         nomeCapitolo="Chapter "+str(c)
         titoloCapitolo=link
      c=c+1
      pages=find_stringa(i,"{{Djvu page link|","}}").split("|")
      paginaIniziale=eval(pages[0])+eval(pages[1])
      paginaFinale=0
      dati.append([nomeCapitolo,titoloCapitolo,paginaIniziale,paginaFinale])
      for i in range(len(dati)-1):
         dati[i][3]=dati[i+1][2]-1
   return {"indexName":indexName, "indexTitle":indexTitle, "indexYear":indexYear,
           "indexAuthor":indexAuthor,"indexTranslator":indexTranslator,"dati":dati}

def pb(nomePagina="Page:An introduction to linear drawing.djvu/21"):
   '''{{header
 | title    = [[../]]
 | author   = Lewis Carroll
 | section  = Chapter 3: A Caucus-Race and a Long Tale
 | previous = [[../Chapter 2|Chapter 2]]
 | next     = [[../Chapter 4|Chapter 4]]
 | year     = 1865
 | notes    =
}}'''
   header='''{{header
 | title    = #title
 | author   = #author
 | section  = #section
 | previous = #previous
 | next     = #next
 | year     = #year
 | notes    =
}}'''
   dati=readSummary(nomePagina)
   headerBase=header.replace("#author",dati["indexAuthor"].replace("Author:",""))\
         .replace("#translator",dati["indexTranslator"]).replace("#year",dati["indexYear"])\
         .replace("#title",dati["indexTitle"])
   #main
   pagine=[]
   p='<div class="prose">\n'+headerBase.replace("#title",dati["indexTitle"]).replace("#previous","").replace("#next","").replace("#section","")
   p+="\n==Contents==\n"
   datiCapitoli=dati["dati"][:-1]
   #print datiCapitoli
   for i in range(len(datiCapitoli)):
      p+="* [[/"+datiCapitoli[i][0]+"|"+datiCapitoli[i][1]+"]]\n"
   p+='<div class="prose">'
   pagine.append([dati["indexTitle"],p])
   for i in range(len(datiCapitoli)):
      p='<div class="prose">\n'+headerBase.replace("#title","../").replace("#section",datiCapitoli[i][1])
   
      if i==0:
         previous="[[#p1|#p2]]".replace("#p1","../").replace("#p2","Main page")
         nextt="[[#p1|#p2]]".replace("#p1","../"+datiCapitoli[i+1][0]).replace("#p2",datiCapitoli[i+1][1])
      elif i==len(datiCapitoli)-1:
         previous="[[#p1|#p2]]".replace("#p1","../"+datiCapitoli[i-1][0]).replace("#p2",datiCapitoli[i-1][1])
         nextt=""
                                        
      else:
         previous="[[#p1|#p2]]".replace("#p1","../"+datiCapitoli[i-1][0]).replace("#p2",datiCapitoli[i-1][1])
         nextt="[[#p1|#p2]]".replace("#p1","../"+datiCapitoli[i+1][0]).replace("#p2",datiCapitoli[i+1][1])
      p=p.replace("#next",nextt).replace("#previous",previous)
      
      p=p.replace("#section",datiCapitoli[i][1])
      p+='\n<pages index="nome djvu" from=#pi to=#pf />'\
          .replace("#pi",str(datiCapitoli[i][2]))\
          .replace("#pf",str(datiCapitoli[i][3]))\
          .replace("nome djvu",find_stringa(nomePagina,"Page:","/"))
      p+="\n</div>"
      pagine.append([dati["indexTitle"]+"/"+datiCapitoli[i][0],p])

   return pagine
   
   
   

         

   

def rc(rcstart=None,rcend=None,number=50,namespace="0|102|108|110",rcshow="!bot!redirect",rctype="edit|new"):
   ''' modulo per la lettura di number eventi da recentchanges

   Restituisce l'ultimo timestamp letto e una lista di eventi, in cui sono eliminati i doppioni (edit sulle stesse pagine).
   La lista va ulteriormente depurata dai doppioni letti nella stessa sessione (testare il valore number ideale per leggere
   l'intera lista in una sola lettura)'''
   sito=wikipedia.Site("it")
   listgen=sito.recentchanges(number=number,rcstart=rcstart,rcshow=rcshow,rctype=rctype,namespace=namespace)
   lista=[]
   for i in listgen:
      lista.append(i)

   return lista

def iw(ini,fin):
   for p in range(ini,fin):
      nomePagina="Pagina:Canti (Sole).pdf/"+str(p)
      testoPagina=leggi_pagina(nomePagina)
      header=find_stringa(testoPagina,"<noinclude><page","</noinclude>",1)
      footer=find_stringa(testoPagina,"<noinclude>\n<ref","</noinclude>",1)
      testoPagina=find_stringa(testoPagina,header,footer)
      testoPagina=testoPagina.replace(find_stringa(testoPagina,"<noinclude>","</noinclude>",1),"")
      while find_stringa(testoPagina,"<ref>","</ref>",1)!="":
         testoPagina=testoPagina.replace(find_stringa(testoPagina,"<ref>","</ref>",1),"")
      testoPagina="<section begin=1 />"+testoPagina+"<section end=1 /><noinclude>\n\n\n{{Iwpage|la|1}}</noinclude>"
      print header+testoPagina+footer
      scrivi_pagina(header+testoPagina+footer,False,nomePagina)
   return
def testAutore(autore): # autore: istanza Autore o titolo pagina Autore
   preDati='<!--non modificare da qui:--><includeonly><section begin=dati />'
   postDati='<section end=dati /></includeonly><!-- a qui-->'
   if isinstance(autore, type("stringa")):
      autore=wikipedia.Page(wikipedia.Site("it"), autore)
   autore=Autore(autore)
   #datiAttuali=find_stringa(autore.dati,preDati,postDati).split("/")
   d=find_stringa(autore.testo,preDati,postDati)
   if d=='':
      print "Autore:"+autore.nome+" "+autore.cognome+" ",
      print "La sezione dati non esiste"
      return
   else:
      d=d.split("/")
   
   modifiche=False
   campi_mod=[]
   if d[0]!=autore.nome:
      campi_mod.append("nome")
      modifiche=True
   if d[1]!=autore.cognome:
      campi_mod.append("cognome")
      modifiche=True
   if d[6]!=autore.gm_nascita:
      campi_mod.append("gm_nascita")
      modifiche=True
   if d[7]!=autore.a_nascita:
      campi_mod.append("a_nascita")
      modifiche=True
   if d[8]!=autore.gm_morte:
      campi_mod.append("gm_morte")
      modifiche=True
   if d[9]!=autore.a_morte:
      campi_mod.append("a_morte")
      modifiche=True
   if d[10]!=autore.secolo:
      campi_mod.append("secolo")
      modifiche=True
   if d[11]!=autore.secolo2:
      campi_mod.append("secolo2")
      modifiche=True
   if d[12]!=autore.prof_naz:
      campi_mod.append("prof_naz")
      modifiche=True
   if d[13]!=autore.wikipedia:
      campi_mod.append("wikipedia")
      modifiche=True
   if d[14]!=autore.wikiquote:
      campi_mod.append("wikiquote")
      modifiche=True
   if d[15]!=autore.wikinotizie:
      campi_mod.append("wikinotizie")
      modifiche=True
   if d[16]!=autore.commons:
      campi_mod.append("commons")
      modifiche=True
      
   print "Autore:"+autore.nome+" "+autore.cognome+" "   
   if not modifiche:
      print "I dati non sono stati modificati"
   else:
      print "Sono stati modificati:",
      for i in campi_mod:
         print i,
      print
      
   return 
   
   

def rcSession():
   '''legge recentchanges e produce una lista delle pagine nuove o editate

   La lettura si ferma all'edit con timestamp memorizzato in dati/rcend.pcl'''
   rcFinale=carica_pcl("rcend")
   lTitoli=[]
   lPagine=[]
   fineSerie=False
   rcIniziale=rc(number=1)[0][1]
   if rcFinale==rcIniziale:
      print "Nessuna attività nell'intervallo"
      return
   rcIn=rcIniziale
   while fineSerie==False:
      print "Leggo 50 elementi..."
      print rcIn
      lista=rc(number=50,rcstart=rcIn)
      rcIn=lista[len(lista)-1][1]
      print "Analizzo gli elementi..."
      for i in lista:
         if i[1] == rcFinale:
              fineSerie=True
              print "Trovato l'edit finale: procedo"
              break
              
         if i[0].title() in lTitoli:
              continue
         lTitoli.append(i[0].title())
         lPagine.append(i)
         if len(lTitoli)>500:
            fineSerie=True
            print "Raggiunto il massimo  di pagine previsto: procedo"
            break
   print "Elaboro le pagine..."
   
   for i in lPagine:
      
      elabora(i[0]) # fai qualcosa
   print "Salvo il timestamp per la successiva sessione..."
   salva_pcl(rcIniziale,"rcend")
   return

def elabora(pagina): # elemento è una tuple il cui primo elemento è un oggetto pagina
   if pagina.isRedirectPage():
      return
   #print pagina,pagina.namespace()
   testoPagina=pagina.get()
   testoPaginaCorretto=testoPagina
   if pagina.namespace()==108: # Pagina:
      print "Verifico apostrofi di ",pagina.title()
      testoPaginaCorretto=correggiApostrofi(testoPagina)
      
   elif pagina.namespace()==0: # principale:
      print "Verifico apostrofi di ",pagina.title()
      testoPaginaCorretto=correggiApostrofi(testoPagina)

      print "Verifico conteggio pagine di ",pagina.title()
      testoPaginaCorretto=conteggioPagine(testoPagina)

      print "Verifico infotesto di: ",pagina.title()
      verificaInfotesto(pagina)
      
   elif pagina.namespace()==102: # Autore:
      print "Verifico dati di ",pagina.title()
      testAutore(pagina)
      

   elif pagina.namespace==110: # Indice:
      print "verifica di ",pagina.title()
      
      
   if testoPaginaCorretto!=testoPagina:
      scrivi_pagina(testoPaginaCorretto,False,pagina.title(),commento="Correzione via bot")
   return
   
def correggiApostrofi(testoPagina):
   tp=apos(testoPagina)
   return tp

def conteggioPagine(testoPagina):
   tp=testoPagina
   if not "[[" in testoPagina:
      tp=testoPagina+"\n{{Conteggio pagine|[[Speciale:Statistiche]]}}"
   return tp
      
def verificaInfotesto(pagina):
   paginaDiscussione=pagina.toggleTalkPage()
   talkTesto=leggi_pagina(paginaDiscussione.title())
   if talkTesto=="": # la pagina discussione non esiste
      if pagina.namespace()==0: # ns0
         if "/" in pagina.title(): # sottopagina
            scrivi_pagina("{{IncludiInfotesto}}",False,paginaDiscussione.title(),commento="Aggiunta pagina discussione con IncludiInfotesto")
            print "Aggiunto infotesto a ",paginaDiscussione.title()
                     
   elif pagina.namespace() == 108: # ns Pagina
         scrivi_pagina("{{IncludiInfotesto}}",False,paginaDiscussione.title(),commento="Aggiunta pagina discussione con IncludiInfotesto")
         print "Aggiunto infotesto a ",paginaDiscussione.title()
   return

def apos(p=""):
    if p=="":

        p='''prova ''test'' <test1> prova' test {{test2<br />}} prova test
<test1> prova test [[test3' {{test2' <br />}} ]]
prova [test4] prova' http://www.alex'.com prova '''
    lista=[]
    p1=p[:]
    ne=0
    l=produci_lista(p1,u"<math>",u"</math>",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
            #print "math",ne,

    #print
    l=produci_lista(p1,u"{{{",u"}}}",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
            #print "templ",ne,
    #print
    l=produci_lista(p1,u"<",u">",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
            #print "html",ne,
    #print "<>"
    l=produci_lista(p1,u"[[",u"]]",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
            #print "wlink",ne,
    #print "[[]]"
            
    l=produci_lista(p1,u"[",u"]",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
            #print "link1",ne,
    #print "[]"
    l=produci_lista(p1,u"http://",u" ",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
            #print "link2",ne,
    #print "http:"
    l=produci_lista(p1,u"{{",u"}}",1)
    for r in l:
        if not r in lista:
            el="#e"+str(ne)+"#"
            lista.append((r,el))
            p1=p1.replace(r,el)
            ne=ne+1
            #print "templ",ne,
    #print u"{{}}"
    #return p1
    if "'''" in p1:
        p1=p1.replace("'''","#ebold#")
        lista.append(("'''","#ebold#"))
    if "''" in p1:
        p1=p1.replace("''","#eitalic#")
        lista.append(("''","#eitalic#"))
    if not "'" in p1:
        #non vi sono apostrofi tipografici nel testo modificabile,
        #la stringa viene restituita immutata
        return p                  
    #qui modificare p1
    
    p1=p1.replace(u"'",u"’")
##    p1=p1.replace(u"’’’",u"'''")
##    p1=p1.replace(u"’’",u"''")

    lista.reverse()
    p2=p1[:]
    for r in lista:
        p2=p2.replace(r[1],r[0])
        #print r[1],r[0]

    return p2

# estrai lista pagine di un ns (default:102, Autore)
def listaPagine(ns=102,includeredirects=False):
   lista=[]
   lpg=pagegenerators.AllpagesPageGenerator(namespace=102,includeredirects=includeredirects)
   for i in lpg:
      lista.append(i)
   return lista
   
def templateR(ini=79,fin=85,test=False,versoIniziale=0,basePagina="Pagina:Canti (Sole).pdf/xxx"):
   
   nv=versoIniziale
   if nv>0:
      versi=True
   else:
      versi=False
   spaziatura={}
   cancella=False
   for i in range(ini,fin):
      nomePagina=basePagina.replace("xxx",str(i))
      testoPagina=leggi_pagina(nomePagina)
      testoPagina=testoPagina.replace("<!-- no verso-->","<!-- no verso -->")
      rigaPagina=testoPagina.split("\n")
      versiPagina=rigaPagina[:]
      for i in range(len(versiPagina)):
         versiPagina[i]=""
      # algoritmo riconoscimento versi
      for r in range(len(versiPagina)):
         if "<!-- schema" in rigaPagina[r]:
            sch=find_stringa(rigaPagina[r],"<!-- schema","-->").split(";")
            for i in sch:
               el=i.split(":")
               if len(el)==1:
                  spaziatura["l"]=eval(el[0])
               else:
                  spaziatura[eval(el[0])]=eval(el[1])
            print spaziatura
            
         if not versi:
##            if "<!-- inizio versi -->" in rigaPagina[r].lower():
##               
##               versi=True
            if "<!-- inizio poesia -->" in rigaPagina[r].lower():
               cancella=True
               versi=True
               versiPagina[r]="*"
            else:
               continue

         if versi:
            if cancella:
               rigaPagina[r]=rigaPagina[r].lstrip()
               rigaPagina[r]=rigaPagina[r].replace(find_stringa(rigaPagina[r],"{{R|","}}",1),"")
            rp=rigaPagina[r].replace("<poem>","").replace("</poem>","")
            rp=rp.replace("<noinclude>","").replace("</noinclude>","")
            rp=rp.strip()
            
            if rp==u"":
               continue
            elif "<!-- no verso -->" in rigaPagina[r].lower():
               continue
            elif "{{centrato" in rigaPagina[r].lower():
               continue
            elif "pagequality" in rigaPagina[r].lower():
               continue
            elif "references" in rigaPagina[r].lower():
               continue
            else:
               versiPagina[r]+="*"
               if "<!-- fine versi -->" in rigaPagina[r].lower():
                  versi=False
      for r in range(len(versiPagina)):
         if versiPagina[r]=="**":
            nv=1
            if "l" in spaziatura and (nv-1) % spaziatura["l"] in spaziatura:
               rigaPagina[r]=" "*spaziatura[(nv-1) % spaziatura["l"]]+rigaPagina[r].lstrip()
         elif versiPagina[r]=="*":
            nv=nv+1
            if "l" in spaziatura and (nv-1) % spaziatura["l"] in spaziatura:
               rigaPagina[r]=" "*spaziatura[(nv-1) % spaziatura["l"]]+rigaPagina[r].lstrip()
            if nv % 5 ==0:
               if "</poem>" in rigaPagina[r]:
                  rigaPagina[r]=rigaPagina[r].replace("</poem>","{{R|##}}".replace("##",str(nv)))
               else:
                  rigaPagina[r]=rigaPagina[r].rstrip()+"{{R|##}}".replace("##",str(nv))
         print versiPagina[r],rigaPagina[r]
      testoPagina="\n".join(rigaPagina)
      testoPagina=testoPagina.replace("<!-- inizio poesia -->","")\
.replace("<!-- inizio versi -->","").replace("<!-- fine versi -->","")
      #print testoPagina
      if not test:
         scrivi_pagina(testoPagina,False,nomePagina)
   return
         
         
              
            

def correggiPoem(pagina):
   testoPagina=leggi_pagina(pagina)
   testoPagina=testoPagina.replace("<poem> \n","<poem>").replace("\n</poem>","</poem>")
   scrivi_pagina(testoPagina,False,pagina,commento="Normalizzazione tag poem via bot")
   return

def chiamaCorreggiPoem(basePagina):
   numeroPagina=1
   while True:
      pagina=basePagina+str(numeroPagina)
      testoPagina=leggi_pagina(pagina)
      if testoPagina=="":
         print "Fine controllo"
      if "<poem> \n" in testoPagina or "\n</poem>"in testoPagina:
         correggiPoem(pagina)
         numeroPagina+=1
      else :
         print "Pagina", pagina, "non contiene tag poem"
         numeroPagina+=1
         
   return
   
      
   
   
   
   
   
def correggiSAL():
   lista=produci_lista(leggi_pagina("Wikisource:Pagina delle prove"),"{{testo|","}}")
   for i in lista:
      if "Sonetti romaneschi" in i:
         testo=leggi_pagina(i)
         testo=testo.replace(find_stringa(testo,u"{{Qualità|avz=25%|","}}",1),"")
         scrivi_pagina(testo,False,i)
   return 
                       
def caricaLibro(folder="dati/text", baseFile="An_introduction_to_linear_drawing - ", \
                zf=4, basePagina="Page:An introduction to linear drawing.djvu/#", ini=1,fin=1,poem=False,code="en"):
   for pag in range(ini,fin+1):
      pagina=open(folder+"/"+baseFile+str(pag).zfill(zf)+".txt").read()
      pagina=unicode(pagina,"utf-8")
      if poem:
         pagina="<poem> \n"+pagina+"</poem>"
      nomePagina=basePagina.replace("#",str(pag-1))
      scrivi_pagina(pagina,False,nomePagina, commento="External OCR text upload by unflagged bot (trial)",code=code)
      
   return

def recentchanges(number = 200, rcstart = None, rcdir="newer",
      rcend = None, rcshow = None, rctype ='edit|new', namespace="0|102|108|110", 
      includeredirects=False, repeat = False):
   # chiama il metodo recentchanges() di wikipedia.Site()
   # produce un generatore che restituisce la seguente tuple di esempio:
   # (Page{[[Poema paradisiaco/Hortus Larvarum]]}, u'2010-04-25T08:23:24Z',
   # u'LloydApplebaum', u'Porto il SAL a SAL 75%', '')
   # ossia: page, i['timestamp'], i['user'], comment, loginfo
   
   rcstart=carica_pcl("rcstart")
      
   """def recentchanges(self, number = 100, rcstart = None,
      rcend = None, rcshow = None, rctype ='edit|new', namespace=None,
      includeredirects=True, repeat = False):
        
        Yield ImagePages from APIs, call: action=query&list=recentchanges&rctype=edit|new&rclimit=500

        Options directly from APIs:
        ---
        Parameters:
          rcstart        - The timestamp to start enumerating from.
          rcend          - The timestamp to end enumerating.
          rcdir          - In which direction to enumerate.
                           One value: newer, older
                           Default: older
          rcnamespace    - Filter log entries to only this namespace(s)
                           Values (separate with '|'):
                           0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
          rcprop         - Include additional pieces of information
                           Values (separate with '|'):
                           user, comment, flags, timestamp, title, ids, sizes,
                           redirect, patrolled, loginfo
                           Default: title|timestamp|ids
          rctoken        - Which tokens to obtain for each change
                           Values (separate with '|'): patrol
          rcshow         - Show only items that meet this criteria.
                           For example, to see only minor edits done by
                           logged-in users, set show=minor|!anon
                           Values (separate with '|'):
                           minor, !minor, bot, !bot, anon, !anon,
                           redirect, !redirect, patrolled, !patrolled
          rclimit        - How many total changes to return.
                           No more than 500 (5000 for bots) allowed.
                           Default: 10
          rctype         - Which types of changes to show.
                           Values (separate with '|'): edit, new, log"""
   source=wikipedia.Site("it")
   rctype="new"
   tnew=t
   tedit=t
   pagineRecentiNuove=source.recentchanges(number, rcstart , rcend,  rcshow, rcdir,  rctype, namespace, includeredirects, repeat)
   lnew=[]
   for i in pagineRecentiNuove:
      lnew.append(i)
   if len(lnew)>0:
      tnew=lnew[len(lnew)-1][1]
   rctype="edit"
   rcshow="!bot|!redirect"
   pagineRecentiEdit=source.recentchanges(number, rcstart , rcend,  rcshow, rcdir,  rctype , namespace, includeredirects, repeat)
   ledit=[]
   for i in pagineRecentiEdit:
      ledit.append(i)
   if len(ledit)>0:
      tedit=ledit[len(ledit)-1][1]
   salva_pcl(max(tnew,tedit),"rcstart")
      
   return lnew,ledit



   
           
         
      
   
   


   
      

def rs(elenco):
   for i in elenco:
      rivediSottopagine(i)
   return

def rivediSottopagine(pagina,commento="Correzione tag poem"):
   pag=leggi_pagina(pagina)
   pag=pag.replace("{{Testo","{{testo")
   lista=produci_lista(pag, "{{testo|","}}")
   for i in range(len(lista)):
      if "|" in lista[i]:
         lista[i]=lista[i][:lista[i].find("|")]
      if lista[i].startswith("/"):
         lista[i]=pagina+lista[i]
   for sottopagina in lista:
      testo=leggi_pagina(sottopagina)
      if testo>"":
         # azione da fare sulle sottopagine
         testo1=modifica(testo,sottopagina)
         if testo1!=testo:
            scrivi_pagina(testo1,False,sottopagina,commento=commento)
   
         
         
   return 

def modifica(testo,sottopagina):
   if "<poem>\n" in testo:
      testo=testo.replace("<poem>\n","<poem> \n")
   else:
      print sottopagina,"OK"
   # altre azioni...
   return testo


def nuovePagineTest():
   np=[]
   npag=pagegenerators.NewpagesPageGenerator(number=10,namespace=0)
   for i in npag:
      np.append(i)
   return np

schemaDatiAutore='''
<includeonly>{{{{{2|Autore}}}
 0   | Nome ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|1}}
 1   | Cognome ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|2}}
 2   | Iniziale del cognome ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|3}}
 3   | Eventuale altro nome ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|4}}
 4   | Eventuale pseudonimo ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|5}}
 5   | Eventuale nome reale ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|6}}
 6   | Giorno e mese di nascita ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|7}}
 7   | Anno di nascita ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|8}}
 8   | Giorno e mese di morte ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|9}}
 9   | Anno di morte ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|10}}
 10   | Secolo di attività ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|11}}
 11   | Eventuale secondo secolo di attività ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|12}}
 12   | Professione e nazionalità ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|13}}
 13   | Nome della pagina su Wikipedia ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|14}}
 14   | Nome della pagina su Wikiquote ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|15}}
 15   | Nome della pagina su Wikinotizie ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|16}}
 16   | Nome della pagina su Commons ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|17}}
 17   | Nome dell'immagine ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|18}}
 18   | Vuoi l'indice dei contenuti? ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|19}}
 19   | Abbiamo testi scritti dall'autore? ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|20}}
 20   | Abbiamo traduzioni scritte dall'autore? ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|21}}
 21   | L'autore è citato in altre opere pubblicate? ={{#titleparts:{{#section:Autore:{{{1|Giacomo Leopardi}}}|dati}}|1|22}}
    }}</includeonly>'''



class Autore(wikipedia.Page): # Acquisisce tutti i metodi di Site
   def __init__(self, pagina):      # nota: pagina è già un'istanza di Page, me la passa pagegenerators.py
      self.testo=pagina.get()       # e infatti, i suoi  metodi funzionano, compreso get
      if "{{Autore" in self.testo:
         self.intestazione=find_stringa(self.testo,"{{Autore","}}",1)   # find_stringa è una funzione mia (la mia prediletta...)
                                                                                            # fa una cosetta che con le regex si impazzirebbe.... almeno io.
      else:
         self.intestazione=find_stringa(self.testo,"{{autore","}}",1)
      intStandard=self.intestazione.replace("| ","|").replace(" =","=") # una sistemata a eventuali varianti di spazi
      self.intStandard=intStandard                                                                # questo è un  print di debug
      self.page=pagina
      self.nome=find_stringa(intStandard,u"|Nome=","\n").strip()
      self.cognome=find_stringa(intStandard,u"|Cognome=","\n").strip()
      self.iniziale=find_stringa(intStandard,u"|Iniziale del cognome=","\n").strip()
      self.altro_nome=find_stringa(intStandard,u"|Eventuale altro nome=","\n").strip()
      self.pseudonimo=find_stringa(intStandard,u"|Eventuale pseudonimo=","\n").strip()
      self.nome_reale=find_stringa(intStandard,u"|Eventuale nome reale=","\n").strip()
      self.gm_nascita=find_stringa(intStandard,u"|Giorno e mese di nascita=","\n").strip()
      self.a_nascita=find_stringa(intStandard,u"|Anno di nascita=","\n").strip()
      self.gm_morte=find_stringa(intStandard,u"|Giorno e mese di morte=","\n").strip()
      self.a_morte=find_stringa(intStandard,u"|Anno di morte=","\n").strip()
      self.secolo=find_stringa(intStandard,u"|Secolo di attività=","\n").strip()
      self.secolo2=find_stringa(intStandard,u"|Eventuale secondo secolo di attività=","\n").strip()
      self.prof_naz=find_stringa(intStandard,u"|Professione e nazionalità=","\n").strip()
      self.wikipedia=find_stringa(intStandard,u"|Nome della pagina su Wikipedia=","\n").strip()
      self.wikiquote=find_stringa(intStandard,u"|Nome della pagina su Wikiquote=","\n").strip()
      self.wikinotizie=find_stringa(intStandard,u"|Nome della pagina su Wikinotizie=","\n").strip()
      self.commons=find_stringa(intStandard,u"|Nome della pagina su Commons=","\n").strip()
      self.immagine=find_stringa(intStandard,u"|Nome dell'immagine=","\n").strip()
      self.indice=find_stringa(intStandard,u"|Vuoi l'indice dei contenuti?=","\n").strip()
      self.testi=find_stringa(intStandard,u"|Abbiamo testi scritti dall'autore?=","\n").strip()
      self.traduzioni=find_stringa(intStandard,u"|Abbiamo traduzioni scritte dall'autore?=","\n").strip()
      self.citazioni=find_stringa(intStandard,u"|L'autore è citato in altre opere pubblicate?=","\n").strip()
      self.dati="<!--non modificare da qui:--><includeonly><section begin=dati />"+\
self.nome+"/"+self.cognome+"/"+self.iniziale+"/"+self.altro_nome+"/"+self.pseudonimo+"/"+\
self.nome_reale+"/"+self.gm_nascita+"/"+self.a_nascita+"/"+\
self.gm_morte+"/"+self.a_morte+"/"+self.secolo+"/"+self.secolo2+"/"+self.prof_naz+"/"+\
self.wikipedia+"/"+self.wikiquote+"/"+self.wikinotizie+"/"+self.commons+"/"+\
self.immagine+"/"+self.indice+"/"+self.testi+"/"+self.traduzioni+"/"+self.citazioni+\
"<section end=dati /></includeonly><!-- a qui-->\n"
   def autore_per_indici(self): # usa nome,cognome,gm_nascita,a_nascita,gm_morte,a_morte,prof_naz
      riga="<tr><td>'''''[[Autore:"+self.nome
      if self.cognome!="":
         riga+="_"+self.cognome
      riga+="|"
      if self.cognome=="":
         riga+=self.nome
      else:
         riga+=self.cognome+",&nbsp;"+self.nome
      riga+="]]'''''</td>"
      if self.a_nascita=="":
         if self.a_morte=="":
            if self.secolo=="":
               riga+="<td>&nbsp;</td>"
            else:
               riga+="<td>"+self.secolo+"</td>"
         else:
            if self.gm_morte=="":
               riga+=u"<td>????&nbsp;–&nbsp;"+self.a_morte+"</td>"
            else:
               riga+=u"<td>????&nbsp;–&nbsp;{{DataGiorno|"+self.gm_morte+"}}&nbsp;"+self.a_morte+"</td>"
      else:
         if self.a_morte=="":
            if self.gm_nascita=="":
               riga+="<td>"+self.a_nascita+u"&nbsp;–&nbsp;...</td>"
            else:
               riga+="{{DataGiorno|"+self.gm_nascita+u"}}&nbsp;"+self.a_nascita+u"&nbsp;–&nbsp;...</td>"
         else:
            if self.gm_morte=="":
               if self.gm_nascita=="":
                  riga+="<td>"+self.a_nascita+u"&nbsp;–&nbsp;"+self.a_morte+"</td>"
               else:
                  riga+="<td>{{DataGiorno|"+self.gm_nascita+"}}&nbsp;"+self.a_nascita+u"&nbsp;–&nbsp;"+self.a_morte+"</td>"
            else:
               if self.gm_nascita=="":
                  riga+="<td>"+self.a_nascita+u"&nbsp;–&nbsp;{{DataGiorno|"+self.gm_morte+u"}}&nbsp;"+self.a_morte+"</td>"
               else:
                  riga+="<td>{{DataGiorno|"+self.gm_nascita+"}}&nbsp;"+self.a_nascita+\
                     u"&nbsp;–&nbsp;{{DataGiorno|"+self.gm_morte+"}}&nbsp;"+self.a_morte+"</td>"
      if self.prof_naz=="":
         riga+=u"<td>&nbsp;</td>"
      else:
         riga+="<td>{{lcfirst:"+self.prof_naz+"}}</td>"
      riga+="</tr>"
      return riga
   def autore_per_indici_new(self): # usa nome,cognome,gm_nascita,a_nascita,gm_morte,a_morte,prof_naz
      riga="<tr><td>'''''[[Autore:"+self.nome
      if self.cognome!="":
         riga+="_"+self.cognome
      riga+="|"
      if self.cognome=="":
         riga+=self.nome
      else:
         riga+=self.cognome+",&nbsp;"+self.nome
      riga+="]]'''''</td>" # cella 1
      if self.gm_nascita!="":
         riga+="<td>[[Wikisource:Ricorrenze/"+self.gm_nascita+"|"+ self.gm_nascita+"]]</td>"
      else:
         riga+="<td>&nbsp;</td>"
      if self.a_nascita!="":
         riga+="<td>"+self.a_nascita+"</td>"
      else:
         riga+="<td>&nbsp;</td>"
      if self.gm_morte!="":
         riga+="<td>[[Wikisource:Ricorrenze/"+self.gm_morte+"|"+ self.gm_morte+"]]</td>"
      else:
         riga+="<td>&nbsp;</td>"
      if self.a_nascita!="":
         riga+="<td>"+self.a_morte+"</td>"
      else:
         riga+="<td>&nbsp;</td>"
      if self.a_nascita!="":
         riga+="<td>"+self.secolo+"</td>"
      else:
         riga+="<td>&nbsp;</td>"
      if self.prof_naz!="":
         riga+="<td>"+self.prof_naz+"</td></tr>\n"
      else:
         riga+="<td>&nbsp;</td></tr>\n"
      return riga


def ritorna():
   return



   

def leggiNuovePagine(lnew,ledit):
   for ns in ["Autore","Principale","Pagina","Indice"]: # :["Pagina"]
      #np=nuovePagine(nPag=200, ns=ns, repeat=False)
      np=[]
      for i in lnew:
         if i[0].namespace()==wnamespaces[ns]:
            np.append(i[0])
            
      if len(np)>0:
         azioniNuovePagine(np,ns)
         
      else:
         print "Nessuna nuova pagina ", ns
##      ep=[]
##      for i in ledit:
##         if i[0].namespace()==wnamespaces[ns]:
##            ep.append(i[0])
##            
##      if len(np)>0:
##         azioniPagineEditate(ep,ns)
##         
##      else:
##         print "Nessuna pagina editata", ns
##         
   print "Numero delle pagine editate: ", len(ledit)
   return

def azioniNuovePagine(np,ns):
   print "Nuove pagine ",len(np)
   for i in np:

      print i.title()
      if ns=="Pagina":
         titleDiscussione=i.title().replace("Pagina:","Discussioni pagina:")
         print titleDiscussione
         if leggi_pagina(titleDiscussione)=="":
            scrivi_pagina("{{IncludiInfotesto}}",False,titleDiscussione,commento="Aggiunta tl IncludiInfotesto via bot")
      elif ns=="Principale":
         if not "/" in i.title():
            testo=i.get().replace("{{Raccolta","{{raccolta")
            raccolta=find_stringa(testo,"{{raccolta|","}}")
            #print raccolta
            if not raccolta=="":
            
               if leggi_pagina("Discussione:"+raccolta) != "":
                  pagDiscussione="Discussione:"+i.title()
                  if leggi_pagina(pagDiscussione) == "":
                  #print "Scriverò su", pagDiscussione, "{{Discussione:"+raccolta+"}}"
                     scrivi_pagina("{{Discussione:"+raccolta+"}}",False,pagDiscussione)
                  else:
                     print pagDiscussione, "esistente"
   return

def azioniPagineEditate(np,ns):
   print "Pagine editate ",len(np)
   for i in np:

      print i.title()
##      if ns=="Pagina":
##         titleDiscussione=i.title().replace("Pagina:","Discussioni pagina:")
##         print titleDiscussione
##         if leggi_pagina(titleDiscussione)=="":
##            scrivi_pagina("{{IncludiInfotesto}}",False,titleDiscussione,commento="Aggiunta tl IncludiInfotesto via bot")
##      elif ns=="Principale":
##         if not "/" in i.title():
##            testo=i.get().replace("{{Raccolta","{{raccolta")
##            raccolta=find_stringa(testo,"{{raccolta|","}}")
##            #print raccolta
##            if not raccolta=="":
##            
##               if leggi_pagina("Discussione:"+raccolta) != "":
##                  pagDiscussione="Discussione:"+i.title()
##                  if leggi_pagina(pagDiscussione) == "":
##                  #print "Scriverò su", pagDiscussione, "{{Discussione:"+raccolta+"}}"
##                     scrivi_pagina("{{Discussione:"+raccolta+"}}",False,pagDiscussione)
##                  else:
##                     print pagDiscussione, "esistente"
      if ns=="Pagina" or ns=="Principale":
         testoPagina=i.get()
         tp=apos(testoPagina)
         if tp != testoPagina:
            scrivi_pagina(tp,False,i.title(),commento="Correzione apostrofi via bot")
   return
               
                  

def nuovePagine(nPag=200, ns="Autore",repeat=False):
    nsn=wnamespaces[ns]
    #NewpagesPageGenerator(number = 100, get_redirect = False, repeat = False, site = None, namespace = 0):
    npag=pagegenerators.NewpagesPageGenerator(number=nPag,namespace=nsn)
    vecchiePagine=carica_pcl("nuove"+ns)
    nuovePagine=[]
    np=set('')
    for i in npag:
        if not i.title() in vecchiePagine:
            np.add(i)
            nuovePagine.append(i.title())
    if len(nuovePagine)>0:
        vecchiePagine=vecchiePagine+nuovePagine
        if len(vecchiePagine)>500:
            vecchiePagine=vecchiePagine[-500:]
        salva_pcl(vecchiePagine, "nuove"+ns)
        print "Salvato nuovo elenco ","nuove"+ns, "di",len(vecchiePagine),"elementi"
        
    return np

def richieste_bot():
    pr=list_in_cat("Bot calls")
    print pr
    if len(pr)>0:
        pagina=pr[0]
        testo_pagina=leggi_pagina(pagina)
        richiesta=find_stringa(testo_pagina,"{{ToAlebot","}}",1)
        #testo_pagina=testo_pagina.replace(richiesta,"")
        #scrivi_pagina(testo_pagina,False,pagina)
        risultato=esegui_richiesta(richiesta,pagina)
        print "Richiesta eseguita"
    else:
        print "Nessuna richiesta pendente"
    return 

def esegui_richiesta(richiesta,pagina_richiesta):
    r=find_stringa(richiesta,"{{ToAlebot","}}").split("|")
    r_user=""
    r_page=""
    
    for i in range(len(r)):
        if r[i].lower().startswith("user="):
            r_user=r[i]
        if r[i].lower().startswith("page="):
            r_page=r[i]
    rx=r[:]
    r=[]
    for i in rx:
        if i!= r_user and i!=r_page:
            r.append(i)
    print "Richiesta da eseguire:",r[0]

    ## routine intersection
    if r[0].lower()=="intersection":
        intersection(richiesta,pagina_richiesta,r,r_user,r_page)
    elif r[0].lower()=="agginfotesto":
        aggiungiInfotesto(richiesta,pagina_richiesta,r, r_user,r_page)
    else:
        print "Richiesta non comprensibile"

    return

def aggiungiInfotesto(richiesta,pagina_richiesta,r, r_user,r_page):
    aggInfotesto()
    testoPaginaRichiesta=leggi_pagina(pagina_richiesta).replace(richiesta,"")
    scrivi_pagina(testoPaginaRichiesta,False,pagina_richiesta, commento="Cancellata la richiesta ToAlebot via bot")
    
    return

def aggInfotesto():
    lista=list_in_cat("Pagine senza pagina di discussione")
    print "Numero pagine: ",len(lista)
    for i in lista:
        #print i
        if "/" in i:
            testoDiscussione=leggi_pagina("Discussione:"+i)
            testoPagina=leggi_pagina(i)
            
            if testoDiscussione=="":
                scrivi_pagina("{{IncludiInfotesto}}",False,"Discussione:"+i,commento="Aggiunto tl IncludiInfoTesto via bot")
            
            if not "[[" in testoPagina:
                scrivi_pagina("\n{{Conteggio pagine|[[Speciale:Statistiche]]}}",True,i,commento="Aggiunto tl ConteggioPagine via bot")
            elif testoDiscussione !="":
                scrivi_pagina(testoPagina, False,i,commento="Forzatura aggiornamento Categoria")
    return

def intersection(richiesta,pagina_richiesta,r, r_user,r_page):
    print r
    lista='''\n===Risultato query: intersezione categorie===\nDalla intersezione di '''
    info=r[1:]
    for i in range(len(info)):
        info[i]=" '''"+info[i]+"''' "
    lista+="&".join(info)
    lista+= "\nrisulta il seguente elenco di pagine:\n"
    lista_pagine=query(r)
    for i in lista_pagine:
        lista+="* {{testo|"+i+"}}\n"
    if r_page=="":
        pagina_risposta="Wikisource:Pagina delle prove"
    if pagina_risposta==pagina_richiesta:
        testoPaginaRisposta=leggi_pagina(pagina_richiesta).replace(richiesta,lista)
        #print testoPaginaRisposta
        scrivi_pagina(testoPaginaRisposta,False,pagina_risposta,commento="Scrittura risposta query intersection via bot")
    else:
        print "pagina risposta:",pagina_risposta
        scrivi_pagina(lista,True,pagina_risposta,commento="Scrittura risposta query intersection via bot")
        testoPaginaRichiesta=leggi_pagina(pagina_richiesta).replace(richiesta,"")
        scrivi_pagina(testoPaginaRichiesta,False,pagina_richiesta,commento="Cancellazione richiesta query intersection via bot")
    return

def query(r):
    print r
    l=set(list_in_cat(r[1])) # estrazione dati prima categoria
    print r[1], len(l)
    for i in range(2,len(r)): # estrazione dati altre categorie e intersezione con la prima
        c=set(list_in_cat(r[i]))
        print r[i], len(c)
        l=l & c
    ls=[]
    for i in l:
        ls.append(i)
    ls.sort()
##    s=u""
##    for i in ls:
##        s=s+"* {{testo|"+i+"}}\n"
    return ls # restituisce la lista delle pagine

class MailBot:
    def __init__(self, destinationUser, subject, message, copyToMe):
        self.destinationUser = destinationUser
        self.subject = subject
        self.message = message
        self.copyToMe = copyToMe

        # valido per it.wikisource (servirebbe una lista da cui scegliere secondo wikipedia.getSite() ...)
        self.sendEmailPage = "/wiki/Speciale:InviaEMail/" 
        self.sendEmailPagePOST = "/w/index.php?title=Speciale:InviaEMail&target=%s&action=submit" 

    def run(self):
        # get any page to get token parameter
        mailToPage = wikipedia.getSite().getUrl(self.sendEmailPage + self.destinationUser)
        token=find_stringa(mailToPage,u'<input name="wpEditToken" type="hidden" value="','"')
        print token 
        if token=="":
            print "Fail: token not found"
            return

        # create post parameters
        subject = self.subject.encode(wikipedia.getSite().encoding())
        message = self.message.encode(wikipedia.getSite().encoding())
        if self.copyToMe:
            copyToMe = '1'
        else:
            copyToMe = '0'
        predata = {
            'wpSubject': subject,
            'wpText': message,
            'wpCCMe': copyToMe,
            'wpEditToken' : token
        }

        # do a post request
        postUrl = self.sendEmailPagePOST % self.destinationUser
        response, data = wikipedia.getSite().postForm(postUrl, predata)
        
        if response.status == 302: # redirect code
            print "Mail (probably) sent"
        else:
            print "Fail: http status code is %s, error reason is %s" % (str(response.status), response.reason)


def mailto(utente=u"Alex_brollo",oggetto=u"Prova invio",messaggio=u"Testo messaggio prova", cc=False ):
	bot = MailBot(utente, oggetto, messaggio, cc)
	bot.run()



def oggi():
    oggi=date.today()
    oggi=oggi.isoformat().split("-")
    print oggi
    mesi=["gennaio","febbraio","marzo","aprile","maggio","giugno", "luglio","agosto","settembre","ottobre","novembre","dicembre"]
    mese=oggi[1]
    if mese.startswith("0"):
        mese=mese[1:]
    mese=eval(mese)-1
    oggi=oggi[2] +" "+ mesi[mese] +" "+oggi[0]
    return oggi





def list_in_cat(category_name,site="it"):
    site = wikipedia.getSite()
    cat = catlib.Category(site,'Category:'+category_name)
    gen = pagegenerators.CategorizedPageGenerator(cat)
    page_list=[]
    for page in gen:
    #Do something with the page object, for example:
        page_list.append(page.title())
    return page_list

      
def sposta_pagina(nome_pagina,nuovo_nome_pagina,motivo):
    site = wikipedia.getSite()
    page = wikipedia.Page(site, nome_pagina)
    try:
        text = page.move(nuovo_nome_pagina,reason=motivo,
      throttle=False, deleteAndMove=False, safe=True, fixredirects=False, leaveRedirect=False) # Taking the text of the page
    except wikipedia.NoPage: # First except, prevent empty pages
        text = ''
    except wikipedia.IsRedirectPage: # second except, prevent redirect
        text = "#REDIRECT"
        # output(u'%s is a redirect!' % pagename)
        
    except wikipedia.Error: # third exception, take the problem and print
        output(u"Some error, skipping..")
    #wikipedia.stopme()
    return text
   
   
                      
def leggi_pagina(nome_pagina=u"Utente:Alex brollo",site="it"):
    #site = wikipedia.getSite()
    page = wikipedia.Page(site, nome_pagina)
    try:
        text = page.get() # Taking the text of the page
    except wikipedia.NoPage: # First except, prevent empty pages
        text = ''
    except wikipedia.IsRedirectPage: # second except, prevent redirect
        text = "#REDIRECT"
        # output(u'%s is a redirect!' % pagename)
        
    except wikipedia.Error: # third exception, take the problem and print
        output(u"Some error, skipping..")
    #wikipedia.stopme()
    return text
                  

# Writes into it.wikisource a unicode string into a named page (full name), adding to previous content (aggiungi=True)
# or replacing it (aggiungi=False)
def scrivi_pagina(testo="",aggiungi=True,nome_pagina="Utente:Alex brollo/Sandbox",commento="Edit by Alebot",code="it"):
    site = wikipedia.getSite(code)
    page = wikipedia.Page(site, nome_pagina)
    
    
    if aggiungi:
        contenuto = page.get()
        try:
            page.put(newtext=contenuto+u"\n\n"+testo,comment=commento,minorEdit=False)
            
        except wikipedia.LockedPage:
            return "Pagina bloccata"
    else:
        try:
            page.put(newtext=testo,comment=commento,minorEdit=False)
        except wikipedia.LockedPage:
            return "Pagina bloccata"
    wikipedia.stopme()
    return "Fatto"


def list_in_cat(category_name,site="base"):
    site = wikipedia.getSite()
    cat = catlib.Category(site,'Category:'+category_name)
    gen = pagegenerators.CategorizedPageGenerator(cat)
    page_list=[]
    for page in gen:
    #Do something with the page object, for example:
        page_list.append(page.title())
    return page_list
# Routine generiche
# dumps a variable

## General string management routines for RegEx ignorants :-(

# finds a substring beginning with idi and ending with idf; returns it
# with (dc=1) or without (default dc=0) idi and idf; used for xml managing too

def find_stringa(stringa,idi,idf,dc=0,side="left"):
    if side=="right":
        idip=stringa.rfind(idi)
    else:
        idip=stringa.find(idi)
    idfp=stringa.find(idf,idip+len(idi))+len(idf)
    if idip>-1 and idfp>0:
        if dc==0:
            vvalore=stringa[idip+len(idi):idfp-len(idf)]
        else:
            vvalore=stringa[idip:idfp]
    else:
        vvalore=""
    return vvalore

# variant; as find_stringa, but searches into stringa from offset (default 0);
# returns substring without and with delimiters, the absolute offset of the
# second delimiter, the indices of the substring (null strings if not found)

def find_next(stringa,idi,idf,offset=0):
    idip=stringa.find(idi,offset)
    idfp=stringa.find(idf,idip+len(idi))+len(idf)
    if idip>-1 and idfp>0:
        
        stringa_i=stringa[idip+len(idi):idfp-len(idf)]
        stringa_t=stringa[idip:idfp]
##        if stampa:
##            print stringa_t,
        offset=idfp-len(idf)
    else:
        stringa_i=''
        stringa_t=''
    return stringa_i,stringa_t,offset,idip,idfp

# appoggiandosi a find_next, produce una lista di tutte le istanze della
# sottostringa idi...idf, contenente per ciascun valore i dati:
# stringa_i,stringa_t,offset,idip,idfp

def find_all(stringa,idi,idf):
    lista=[]
    offset=0
    while True:
        r=find_next(stringa,idi,idf,offset)
        if r[0]!="":
            lista.append(r)
            offset=r[2]
        else:
            return lista


# restituisce la stringa idi...ifd "a cavallo" di offset
# senza (dc=0) o con (dc!=0) i delimitatori idi...idf
        
def find_r(stringa,idi,idf,offset,dc=1):
    idip=stringa.rfind(idi,0,offset)
    idfp=stringa.find(idf,idip+len(idi))+len(idf)
    if idip>-1 and idfp>0:
        if dc==0:
            vvalore=stringa[idip+len(idi):idfp-len(idf)]
        else:
            vvalore=stringa[idip:idfp]
    else:
        vvalore=""
    return vvalore
    
        
# replaces the first substring idi...idf into string with new; returns
# a tuple with whole replaced string and substring that has been removed/replaced

def el_st(stringa,idi,idf,new=""):
    idip=stringa.find(idi)
    idfp=stringa.find(idf,idip)+len(idf)
    if idip>-1 and idfp>0:
        vvalore=stringa[idip:idfp]
        valore=stringa.replace(vvalore,new,1)
    else:
        vvalore=""
        valore=stringa
    return valore, vvalore

# returns a list of all substrings (beginning with idi and ending with idf)
# of a string; ; used for xml data managing too

def produci_lista(testo,idi,idf,dc=0):
    t=testo[:]
    lista=[]
    while not find_stringa(t,idi,idf)=="":
        el=find_stringa(t,idi,idf,1)
        t=t.replace(el,"")
        #print el
        if dc==0:
            el=find_stringa(el,idi,idf,0)
        #print el
        #print
        lista.append(el)
    return lista

def produci_lista1(testo,idi,idf,dc=0):
    t=testo[:]
    lista=[]
    while not find_stringa(t,idi,idf)=="":
        el=find_stringa(t,idi,idf,1)
        t=t.replace(el,"",1)
        #print el
        if dc==0:
            el=find_stringa(el,idi,idf,0)
        #print el
        #print
        lista.append(el)
    return lista

def carica_pcl(nome_file, folder="dati/"):
    nome_file=folder+nome_file+".pcl"
    f=open(nome_file)
    contenuto=pickle.load(f)
    f.close()
    return contenuto
def salva_pcl(variabile,nome_file="dato",folder="dati/"):
    nome_file=folder+nome_file+".pcl"
    f=open(nome_file,"w")
    pickle.dump(variabile, f)
    f.close()
    return "Variabile salvata nel file "+nome_file
def imagepage(titolo): #restituisce un oggetto ImagePage da Commons
   #famiglia=wikipedia.Family("commons")
   commons=wikipedia.getSite("commons",wikipedia.Family("commons"))
   paginaImmagine=wikipedia.ImagePage(commons,titolo)
   return paginaImmagine
   
      
def leggi_pagina_html(nome_pagina=u"Utente:Alex brollo"):
    site = wikipedia.getSite()
    page = wikipedia.Page(site, nome_pagina)
    try:
        text = site.getUrl(nome_pagina) # Taking the text of the page
    except wikipedia.NoPage: # First except, prevent empty pages
        text = ''
    except wikipedia.IsRedirectPage: # second except, prevent redirect
        text = "#REDIRECT"
        # output(u'%s is a redirect!' % pagename)
        
    except wikipedia.Error: # third exception, take the problem and print
        output(u"Some error, skipping..")

    wikipedia.stopme()
    return text

def creaPagina(nome):
   site = wikipedia.getSite()
   page = wikipedia.Page(site, nome)
   return Autore(page)


def elencoPagineIndice(indice):
    #elenco_pagine=[]
    #inizializzazione oggetto Page su pagina indice
    site=wikipedia.getSite()
    page=wikipedia.Page(site,indice)

    # calcolo nome x url
    nomeindice="/wiki/"+page.urlname()
    
    #lettura HTML originario (prima delle alterazioni js)
    testo=leggi_pagina_html(nomeindice)
    
    #ricerca di tutti i tag <a href..>...</a> e salvataggio su file
    pagine=produci_lista(testo,'<a href="',"</a>",1)
    titoli=[]
    for i in pagine:
        if ('title="Pagina:' in i) and ("class=" in i):
            titolo=find_stringa(i,'title="','"').replace(" (tuttora non scritto)","")
            #qp=find_stringa(i,'class="','"')
            if not titolo in titoli:
                #elenco_pagine.append([titolo,qp])
                titoli.append(titolo)

    return titoli
   
def azzeraDumpNuovePagine(ns="Pagina"):
   if ns in ["Autore","Principale","Indice","Pagina"]:
      salva_pcl([],"nuove"+ns)
   else:
      print ns,' : parametro errato (usa uno fra ["Autore","Principale","Indice","Pagina"]'
   return

def aggiornaAutore(pagina,commento="Aggiornamento autore via Alebot"):
   wikipedia.setAction=commento
   pagina.page.put(pagina.testo,comment=commento)
   wikipedia.stopme()
   return "Fatto"
   

"""File downloading from the web.
"""

   
def download(url):
	"""Copy the contents of a file from a given URL
	to a local file.
	"""
	import urllib
	webFile = urllib.urlopen(url)
	localFile = open("immagini/"+url.split('/')[-1], 'w')
	localFile.write(webFile.read())
	webFile.close()
	localFile.close()

if __name__ == '__main__':
	import sys
	if len(sys.argv) == 2:
		try:
			download(sys.argv[1])
		except IOError:
			print 'Filename not found.'
	else:
		import os
		print 'usage: %s http://server.com/path/to/filename' % os.path.basename(sys.argv[0])

def go(secondi=1800, cicli=20):
   ''' ciclo timer che chiama leggi_richieste ogni n secondi per m volte

   Utilizzato nel bot interattivo'''
   rcSession()
   for i in range(cicli):
      t=Timer(secondi, rcSession)
      t.start()
      t.cancel()
   return
### Parte attiva del programma
vai=raw_input("Avvio il bot?")
if vai.lower() in ["s","si"]:
    secondi= raw_input("Secondi fra i cicli:")
    if secondi=='':
       secondi=1800
    else:
       secondi=eval(secondi)
    
    numeroCicli=raw_input("Numero cicli:")
    if numeroCicli=='':
       numeroCicli=20
    else:
       numeroCicli=eval(numeroCicli)
       
    #scrivi_pagina("In questo momento sono ''online'' (lettura ogni "+str(secondi)+" secondi)",\
    #     False,"Utente:Alebot/Stato",commento="Aggiornamento stato Alebot via bot")
    go(secondi,numeroCicli)