User:Alex brolloBot/Python scripts
Appearance
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+", "+self.nome
riga+="]]'''''</td>"
if self.a_nascita=="":
if self.a_morte=="":
if self.secolo=="":
riga+="<td> </td>"
else:
riga+="<td>"+self.secolo+"</td>"
else:
if self.gm_morte=="":
riga+=u"<td>???? – "+self.a_morte+"</td>"
else:
riga+=u"<td>???? – {{DataGiorno|"+self.gm_morte+"}} "+self.a_morte+"</td>"
else:
if self.a_morte=="":
if self.gm_nascita=="":
riga+="<td>"+self.a_nascita+u" – ...</td>"
else:
riga+="{{DataGiorno|"+self.gm_nascita+u"}} "+self.a_nascita+u" – ...</td>"
else:
if self.gm_morte=="":
if self.gm_nascita=="":
riga+="<td>"+self.a_nascita+u" – "+self.a_morte+"</td>"
else:
riga+="<td>{{DataGiorno|"+self.gm_nascita+"}} "+self.a_nascita+u" – "+self.a_morte+"</td>"
else:
if self.gm_nascita=="":
riga+="<td>"+self.a_nascita+u" – {{DataGiorno|"+self.gm_morte+u"}} "+self.a_morte+"</td>"
else:
riga+="<td>{{DataGiorno|"+self.gm_nascita+"}} "+self.a_nascita+\
u" – {{DataGiorno|"+self.gm_morte+"}} "+self.a_morte+"</td>"
if self.prof_naz=="":
riga+=u"<td> </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+", "+self.nome
riga+="]]'''''</td>" # cella 1
if self.gm_nascita!="":
riga+="<td>[[Wikisource:Ricorrenze/"+self.gm_nascita+"|"+ self.gm_nascita+"]]</td>"
else:
riga+="<td> </td>"
if self.a_nascita!="":
riga+="<td>"+self.a_nascita+"</td>"
else:
riga+="<td> </td>"
if self.gm_morte!="":
riga+="<td>[[Wikisource:Ricorrenze/"+self.gm_morte+"|"+ self.gm_morte+"]]</td>"
else:
riga+="<td> </td>"
if self.a_nascita!="":
riga+="<td>"+self.a_morte+"</td>"
else:
riga+="<td> </td>"
if self.a_nascita!="":
riga+="<td>"+self.secolo+"</td>"
else:
riga+="<td> </td>"
if self.prof_naz!="":
riga+="<td>"+self.prof_naz+"</td></tr>\n"
else:
riga+="<td> </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)