Discussioni utente:Qualc1: differenze tra le versioni

Contenuti della pagina non supportati in altre lingue.
Da Wikisource.
Contenuto cancellato Contenuto aggiunto
→‎Viaggio in corso: nuova sezione
Riga 398: Riga 398:
:::::Prego. arrivata! <small>Si, se riesci a mageggiare direttamente con le richieste GET e POST puoi accedere direttamente a qualunque funzionalità che hai "da browser", ma nessuno ha implementato in pywikipedia...</small> --[[User:Qualc1|qualc1]] ([[User talk:Qualc1|disc.]]) 13:57, 7 mag 2009 (CEST)
:::::Prego. arrivata! <small>Si, se riesci a mageggiare direttamente con le richieste GET e POST puoi accedere direttamente a qualunque funzionalità che hai "da browser", ma nessuno ha implementato in pywikipedia...</small> --[[User:Qualc1|qualc1]] ([[User talk:Qualc1|disc.]]) 13:57, 7 mag 2009 (CEST)
::::::: Per esercizio, trasformerò il codice da codice a oggetti a codice di tipo procedurale; giusto per capire senza ombra di dubbio cosa fa riga per riga. Poi vediamo.... peccato che mi manchi il tempo...:-( . Ho dato a Jayvdb il link a questa pagina. --[[User:Alex brollo|Alex brollo]] ([[User talk:Alex brollo|disc.]]) 17:11, 7 mag 2009 (CEST)
::::::: Per esercizio, trasformerò il codice da codice a oggetti a codice di tipo procedurale; giusto per capire senza ombra di dubbio cosa fa riga per riga. Poi vediamo.... peccato che mi manchi il tempo...:-( . Ho dato a Jayvdb il link a questa pagina. --[[User:Alex brollo|Alex brollo]] ([[User talk:Alex brollo|disc.]]) 17:11, 7 mag 2009 (CEST)

== Viaggio in corso ==

Volevo avvisarti che ho iniziato il ''vero'' viaggio nel mondo pywikipedia; per ora ho usato il software in maniera diciamo un pochino ''superficiale''... adesso voglio capirlo, riga per riga, sto combattendo con il terribile category.py con qualche piccolo successo, adesso sto esplorando per bene la classe Page... in poche parole, ho già allertato PietroDn anticipandogli qualche richiesta disperata di aiuto; posso mettere anche te fra i tools di emergenza? ;-) --[[User:Alex brollo|Alex brollo]] ([[User talk:Alex brollo|disc.]]) 10:49, 31 ago 2009 (CEST)

Versione delle 10:49, 31 ago 2009

Archivi di questa pagina discussione


Lasciate qui sotto i vostri messaggi

Bot

Grande Qualc1, ottimo lavoro. Che tu ti ricordi, abbiamo lasciato indietro qualche pagina di discussione (Il Cortigiano lhai fatto tu ieri)? Non so se quella ricerca sul dump la possa fare solo tu, magari se mi insegni divento indipendente ;-) Gran lavoro davvero! --Aubrey McFato 10:28, 30 ago 2008 (CEST)[rispondi]

Cervello informatico cercasi

Se hai tempo, qui si parla di te: http://it.wikisource.org/wiki/Discussioni_utente:Alex_brollo#Sfrucugliamenti. Aubrey McFato 09:01, 1 set 2008 (CEST)[rispondi]

Altra listona per il progetto template.

caro Qualc1,

nella mia ignoranza provo a chiederti qualcosa di grosso per il progetto template. Uno degli obiettivi da raggiungere è la scrittura di tutte le documentazioni dei template. nulla impedisce di usare Speciale:Allpages manualmente, ma prima volevo sapere se è possibile generare una lista di template prive della sottopagina {{{nometemplate}}}/doc, questa lidsta permetterebbe di organizzare il lavoro più razionalmente. Intanto grazie per l'attenzione e come al solito se non ti comodasse o non ti fosse possibile rispondermi non me la prendo, in quanto sono io a disturbare te. - εΔω 15:09, 23 ott 2008 (CEST)[rispondi]

Il risultato della ricerca dei template che non hanno la sottopagina doc è qui.
Ho tolto dalla lista anche i template che iniziavano con "Template:Utente"; tolgo anche quelli il cui titolo si trova anche nel namespace "Autore"? --qualc1 (disc.) 16:04, 16 dic 2008 (CET)[rispondi]
Dato che i template con il nome degli autori sono creati e gestiti in automatico dai bot non vedo la necessità di dotarli di documentazione maggiore di quella che già hanno, dunque direi di sì. - εΔω 16:14, 16 dic 2008 (CET)[rispondi]

Scriptino per bot

Caro Qualc1,

ho avuto una intuizione interessante che però non risco a concretizzare: prova a vedere la pagina Indice:Poesie inedite di Silvio Pellico. Volevo richiedere l'OCR delle trecento e passa pagine ancora da creare. È una richiesta che può esser fatta solo in fase di creazione, chiamata dal pulsante in basso a sinistra della finestra di editing. Premendo quel pulsante un javascript

  • Inserisce il testo {{OCR}} della pagina,
  • gli assegna un SAL 25%, e
  • nel campo oggetto scrive [[{{PAGENAME}}#OCR|OCR]]

Uno script potrebbe effettuare tale richiesta per tutti i link rossi presenti nelle pagine indice di quel testo (o di tutti i testi che ci interessino, a me in questo momento premeva buttare avanti Pellico), in modo da non intasare le Ultime Modifiche con un lavoro fatto a mano, e sollvando gli utenti "umani" da lavori ripetitivi tipicamente "botteschi". Alla fin fine dovrebbe esseruna variante dell'infotesto.py, ma quello che per me e Aubrey è piuttosto esoterico, contutta probabilità per te è questione di due minuti.

Se dalla sfacchinata della tua tesi potessi ricavare questi due minuti saresti veramente benemerito! - 79.10.248.5 16:27, 2 dic 2008 (CET)[rispondi]

Ok, domani lo faccio.(così inizio a scaldare il bot... visto tesi è praticamente finita...)
--qualc1 (disc.) 16:40, 3 dic 2008 (CET)[rispondi]
Caro Qualc1, come apprendista stregone sto lavorando con Alebot e ho scoperto che creando una pagina Pagina:, scrivendo solo ed esclusivamente {{OCR}}, il software parte bene...richiama l'OCR, crea i codici header e footer, assegna il SAL 25%; mentre invece se si scrive lo stesso template su una pagina già creata non succede un bel niente. Il problema è che ho creato le pagine dalla 100 alla 300 di Indice:Poesie inedite di Silvio Pellico con un altro contenuto, poi mi sono pentito e ho inserito il template {{OCR}}... niente da fare. Come si rimedia? Occorre cancellare/far cancellare le pagine e crearle di nuovo con il solo template? Grazie!
PS: scusami se mi sono sovrapposto a una cosa che tu avresti fatto a regola d'arte... probabilmente Edo ha sottovalutato la mia velocità nel pasticciare con Python ;-) --Alex brollo (disc.) 22:29, 8 dic 2008 (CET)[rispondi]
Per la creazione del header e del footer dovrebbe bastare che modifichi il testo da inserire da: {{OCR}} a:


<noinclude>{{PageQuality|1|Un1c0s_bot}}<div class="pagetext">
</noinclude>


{{OCR}}
<noinclude>
<references/></div></noinclude>


Per "richiama l'OCR" intendi che quando crei la pagina col bot, ti inserisce già il testo "generato" dall'immagine? Se sì, non so come si possa richiamare questa funzionalità...
Ho visto che ThomasV sa farlo ([1]), ma cercando velocemente non ho trovato come: puoi informati tu e poi farmi sapere...
Ps. Non preoccuparti per l' "intromissione" :D
--qualc1 (disc.) 10:46, 9 dic 2008 (CET)[rispondi]
Grazie. Ho interpellato lo stesso ThomasV sul suo account di en.source; appena mi risponde vi so dire. Poi magari tiriamo le fila della questione in Progetto:Scansioni, dove vorrei anche scambiare qualche esperienza su Tesseract. --Alex brollo (disc.) 16:04, 9 dic 2008 (CET)[rispondi]

Pagine 1.0

Ciao Qualc1, volevo chiederti se c'era modo di sapere dal dump quali pagine mancassero del SAL 2.0: in molte opere c'è segnalata solo la pagina principale, ma non le sottopagine. Se potessi dirmelo mi faresti un favore, dato che ho rispolverato il bottolo. Sappimi dire, a presto. --Aubrey McFato 20:58, 20 dic 2008 (CET)[rispondi]

Nei prossimi giorni cerco di generarti la lista... ciao. --qualc1 (disc.) 13:48, 21 dic 2008 (CET)[rispondi]
Ho creato la lista: eccola.
Forse sono riuscito a trovare un modo abbastanza semplice e comodo per estrarre informazioni dal dump xml (tramite il database Sedna e il progetto WikiXMLDB). Faccio ancora un po' di prove e poi ti dico... Comunque quella lista l'ho generata tramite questa query:
declare default element namespace "http://www.mediawiki.org/xml/export-0.3/";

let $ns := ('Media', 'Speciale', 'Discussione', 'Utente', 'Discussioni utente', 'Wikisource', 'Discussioni Wikisource', 'File', 'Discussioni file', 'MediaWiki', 'Discussioni MediaWiki', 'Template', 'Discussioni template', 'Aiuto', 'Discussioni aiuto', 'Categoria', 'Discussioni categoria', 'Autore', 'Discussioni autore', 'Progetto', 'Discussioni progetto', 'Portale', 'Discussioni portale', 'Pagina', 'Discussioni pagina', 'Indice', 'Discussioni indice')

for $page in doc("wiki")/mediawiki/page
    where not ( $page/revision/text/template[@head='Qualità'])
        and not ($page/revision/text/redirect)
        and empty(index-of($ns, substring-before($page/title, ':')))
            return $page/title
--qualc1 (disc.) 23:03, 18 gen 2009 (CET)[rispondi]

Tre scriptini python

Caro Qualc1, ti propogo tre scriptini che ho scritto e che, nella loro semplicità, uso e riuso continuamente come strumento fai-da-te per parsare html e xml e mille altre cose. Non dubito che script molto più sofisticati siano incorporati in ogni modulo che si occupa di queste cose, e che analogo risultato si possa ottenere molto più elegantemente con le RE, ma come sai ogni scarafone ecc. e non si sa mai che tu li trovi utili. Con questi due scriptini ho scritto in un tempo veramente breve un programmino python che estrae dai file ...djvu.xml di Internet Archive il testo pronto a essere post.elaborato e ficcato nelle pagine Pagina (v. Indice:Lettere autografe Colombo.djvu. da te vorrei sapere se sono totalmente inutili, e se sì, con quale funzione python, altrettanto facile da capire, posso rimpiazzarli.

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

# finds the first substring into a string 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):
    idip=stringa.find(idi)
    idfp=stringa.find(idf,idip)+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

# returns a tuple of the first substring (beginning with idi and ending with idf)
# of a string and of original string with the substring erased (defalut) or replaced with a new string.
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. The original string is unchanged. 

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)
        lista.append(el)
    return lista

--Alex brollo (disc.) 23:45, 12 gen 2009 (CET)[rispondi]

Di sicuro non sono inutili :)
Non ci sono funzioni standard del python che si possono usare per sostituire direttamente queste. Come hai detto anche tu sarebbe possibile scriverle anche usando le espressioni regolari, ma anche in questo caso sarebbero complicate e richederebbero comunque più di una espressione regolare...
Un altro modo per leggere le informazioni da file xml è usare delle librerie apposite per la gestione dell'xml. Io avevo provato ad usare lxml (sito ufficiale, il loro tutorial), ma avevo problemi a caricare file delle dimensioni del dump di wikisource.
Proprio questa mattina ho scoperto questo progetto: WikiXMLDB.
Utilizzando Sedna, un database basato su xml, dovrebbe permette di eseguire velocemente operazioni di ricerca sul dump. Sul loro sito mostrano esempi che utilizzano en.wikipedia, provo a vedere se riesco a utilizzarlo per wikisource ed ad utilizzarlo tramite python. Poi ti faccio sapere...
--qualc1 (disc.) 12:01, 18 gen 2009 (CET)[rispondi]

Indicizzazione python dei dump xml di wiki

caro Qualc1, non si sa mai che trovi qualcosa di buono in questo breve script python, che legge sequenzialmente il dump xml di una wiki e indicizza le singole pagine nel fle, producendo una lista elementi, uno per pagna, che sono a loro volta liste di tre elementi:

  1. l'offset della pagina, da usare con il metodo seek() dei file;
  2. la lunghezza della pagina in byte, da usare con il parametro opzionale nel metodo read() dei file;
  3. il titolo della pagina.

Con questi elementi, il contenuto di qualsiasi pagina scritto nel file xml viene recuperato istantaneamente; immaginando che ci sia in memoria la lista indice l e che in f sia aperto in lettura il file itwikisource.xml, i comando che restituiscono la pagina completa i sono semplicemente:

f.seek(l[i][0])
pagina=f.read(l[i][1])

Ecco il listato:

def index (filei="itwikisource.xml"):
    fi=open(filei)
    pos=0
    l=[]
    for i in fi:
        if "<page>" in i:
            posi=pos
        if "</page>" in i:
            lenf=pos-posi+len(i)
            l.append([posi,lenf])
        pos=pos+len(i)
    fi.close()
    print "eseguito parsing"
    for i in range(len(l)):
        f.seek(l[i][0])
        pagina=f.read(l[i][1])
        tipo=find_stringa(pagina,"<title>","</title>")
        l[i].append(tipo)
    print "eseguito caricamento titoli pagina"
    return l

find_stringa è una routine per RE-ignorants che mi sembra ti ho già passato, altrimenti la trovi sotto Utente:Alebot/Scripts. Non lo pubblico altrove, per ora, perchè è impresentabile per assenza di doc e perchè non saprei se può interessare a qualcuno! Ciao! --Alex brollo (disc.) 11:20, 15 gen 2009 (CET)[rispondi]

Lo trovo molto buono: bella idea!
Se non ti dispiace lo espanderei un po' per farlo diventare più facile da riutilizzare; cioè creerei una classe Indice utilizzabile in questo modo:
ind = Indice("itwikisource.xml") # questo richiamerebbe la tua funzione
testoDiAltraPagina = ind.textByNumber(10) # come il tuo esempio lseek
testoDiUnaPagina = ind.textByTitle("Asolani/Libro primo/XII")
for page in ind:
    print "titolo: ", page.title
    print "testo: ", page.text
--qualc1 (disc.) 13:53, 18 gen 2009 (CET)[rispondi]
Grazie! So cosa sono le classi, ma aimè: il mio cervello non pensa per classi... pensa per funzioni. Oltre che essere RE-ignorant, sono pure Class-ignorant. Ed è stato un passo terribilmente difficile, passare da pensare per procedure a pensare per funzioni. :-( Effetto dell'età.
Rifletterò sul tuo codice (se mi ci metto dovrei capirlo), al primo sguardo non lo colgo. Nel frattempo ho scoperto buzhug, un semplice database in python nativo... adesso devo padroneggiarlo, e poi, per classi o per funzioni, lo metto all'opera e gli carico tutti i dati dei template e tutti i dati degli infotesto e tutti i dati delle intestazioni, e poi vediamo cosa succede. :-) --Alex brollo (disc.) 17:45, 18 gen 2009 (CET)[rispondi]

Bot interattivo in funzione

Caro Qualc1 (per inciso: il tuo nick mi ricorda "Kual Kuno Pokanzi", un utente fantasma di forum a cui attribuivamo le citazioni di eventuali sciocchezze per non quotarle con il vero nick per delicatezza: Kual Kuno Pokanzi ha detto...."), gira e funziona Alebot in forma interattiva, ossia: ogni 10 minuti (se il mio PC è acceso come adesso, a casa) legge la sua pagina di discussione Discussioni utente:Alebot, legge eventuali richieste, le esegue, e eseguite le spunta. Al momento l'unica richiesta che esegue è quella di aggiornare il databox autori (ossia, di creare/aggiornare la pagina [[Template:NomeAutore/Dati]]), "capendo" una richiesta del tipo:

* Richiesta: verifica databox autore: [[Autore:NomeAutore]] --~~~~

a cui aggiunge un Fatto! appena finito.

Ovvio che man mano che aggiungerò nuove procedure attivabili, aggiungerò altre sintassi di richiesta; non ci sono limiti alle cose fattibili, compresa l'interrogazione di un database python buzhug che ho appena integrato nel software del bot. Consideralo un test, un "Hello world"; se la cosa piacerà potrà essere resa più "professionale" ma ci vuole qualcuno come te che non sia un apprendista stregone come me... Ciao! --Alex brollo (disc.) 10:50, 22 gen 2009 (CET)[rispondi]

Bene, bene... ci farà sicuramente risparmiare tempo. Visto che si potrebbe usare anche per altri bot, hai usato qualche script "apposito" tra quelli di pywikipedia o hai fatto tutto direttamente tu? --qualc1 (disc.) 11:48, 28 gen 2009 (CET)[rispondi]

Cosa è wikisource ?

potrei sapere quale è il compito di wikisouce ? io per il momento collaboravo solo alla wikipedia e wikizionario !--217.201.161.88 21:51, 25 gen 2009 (CET)--Puxanto (disc.) 21:54, 25 gen 2009 (CET)[rispondi]

Le informazioni principali su cos'è wikisource e quali sono gli obiettivi li puoi trovare nelle pagine: Wikisource:Wikisource e Wikisource:Cos'è_Wikisource?.
Per qualsiasi precisazione puoi chiede a me o ad altri utenti (o amministratori) che vedi attivi. --qualc1 (disc.) 10:04, 28 gen 2009 (CET)[rispondi]

Prova tecnica di sostituzione massiccia

Caro Qualc1,

provo a metterti una pulce nella ventola :)

Il nome "Archimede" è invariabile, non ha cognomi o strane appendici e finalmente è divenuto un autore presente anche qui Perché non cercare di circondare tutte le ricorrenze di tale nome con il template {{AutoreCitato}}?

L'esercizio di analisi che porti ala soluzione di questo problemino potrebbe rendersi assai utile anche per altri autori dal nome semplice. Per quel che ne ho capito abbiamo le seguenti tipologie

  • Il semplice nome (seguito da spazio o da altri separatori). Il caso ideale --> aggiunta del codice del template.
  • Il nome circondato da doppie quadre (cioè [[Autore:Archimede|Archimede]])--> semplice sostituzione di caratteri
  • Il nome già circondato dal template AutoreCitato (cioè {{AutoreCitato|Archimede}} o {{AutoreCitato|Archimede|Archimede}})--> vanno ignorati
  • Il nome all'interno di altri template (intestazioni o capitoli)--> vanno ignorati

Spero di aver dato un'idea di quello che un bot debba riconoscere per effettuare una sostituzione di massa. Che dici? - εΔω 19:24, 28 gen 2009 (CET)[rispondi]

Provo ad "approfondire" e a mettere in pratica il suggerimento... La richiesta capita al momento giusto per poter sperimentare il database xml citato un paio di messaggi fa :) --qualc1 (disc.) 18:03, 29 gen 2009 (CET)[rispondi]
Mitici... era una cosa che io pensavo da tempo incommensurabile, avevo anche provato senza molto successo una regex per trovare i nomi che iniziano con la maiuscola ma che non sono dopo un punto.... Ma con il database xml degli autori la cosa è decisamente fatta meglio. Sarebbe veramente un grosso colpo. Ditemi se posso essere utile. --Aubrey McFato 20:40, 29 gen 2009 (CET)[rispondi]
Mi inserisco.... stasera ho fatto dei grossi passi avanti. In questo momento, il mio bottino sta passandosi gli autori e aggiornando le tavole cronologiche... è molto umano, ci fa sopra tutta una serie di controlli e di ragionamenti. ;-)
Ho dato una scrollata anche al sistema di lettura dell'xml, adesso ho un agile indice di tutte le pagine "buone" (autori e namespace principale), e ho "semantizzato" i template Intestazione, il che significa che potenzialmente posso incrociare opere e autori. Per il problema segnalato datemi qualche giorno per rifinire qualche particolare, con i programmi un po' complicati bisogna battere il ferro finchè è caldo. Comunque è una cosa fattibile, anche se sono assolutamente sicuro che qualche inaspettato pasticcio nascerebbe; in particolare, il caso "il semplice nome" è ostico perchè spessissimo ci sarà il solo cognome o ci saranno imprecisioni; è il wikilink che con le sue "colorazioni" conferma che la citazione è esatta. Ci vorrà una verifica preliminare che non esistano autori o personaggi di opere letterarie di nome "Archimede Rossi" o "Virgilio Bianchi" altrimenti restiamo fregati e direi che qualche piccola fregatura è da mettere in conto. --Alex brollo (disc.) 02:00, 30 gen 2009 (CET)[rispondi]
Visto che il mio bottolo continua a lavorare, una nota... Edo fa presto a dire:
«
  • Il nome è già circondato dal template AutoreCitato (cioè {{AutoreCitato|Archimede}} o {{AutoreCitato|Archimede|Archimede}})--> vanno ignorati
  • Il nome è all'interno di altri template (intestazioni o capitoli)--> vanno ignorati»
Si tratta di un problema abbastanza spinoso, ma ha la stessa soluzione dell'altro, di trasformare gli apostrofi tipografici in uncinati ignorandone alcuni (quelli di markup, quelli all'interno di template e wikilink). La soluzione è nelle mie due routinette magiche find_stringa() e el_st() che ho passato a Qualc1 e che uso in continuazione! Mi è costato sangue concepirle anni fa ma sono ancora come nuove. ;-) --Alex brollo (disc.) 02:08, 30 gen 2009 (CET)[rispondi]

Mi inserisco anch'io per un breve istante. Ci sono almeno due casi come quello descritto da Alex: ne Don Zeno: Il sovversivo di Dio/II, ad un certo punto si parla di un tale Don Archimede Gaddi, mentre nei Verbali del Consiglio dei Ministri della Repubblica Sociale uno dei firmatari si chiama Generale di Corpo d’Armata Mischi Archimede. Non so se sia possibile, ma se si fa girare un bottolo potrebbe essere una buona idea escludere queste due opere... Ciao, e buon lavoro! Snark (disc.)

Exoteric trip: find_stringa() e et_st()

Visto che siamo nella pagina di qualcuno approfitto per fissare le idee sulla questione delle "sostituzioni massive ma non distruttive", usando le routine python il cui codice è riportato pochi messaggi fa.

Per escludere da una sostituzione di massa in una stringa tutte le evenienze di una sottostringa, ignorando però quelle che sono in un determinato "contesto", bisogna innanzitutto definire (saper riconoscere) questi "contesti" da ignorare. Ad esempio, nel caso degli apostrofi, bisogna ignorare:

  1. i doppi apostrofi consecutivi
  2. i tripli apostrofi consecutivi
  3. gli apostrofi che fanno parte di un link html non taggato senza quadre : identificatore: inizia con html://, finisce con spazio
  4. gli apostrofi che fanno parte di un wikilink taggato da doppie quadre
  5. gli apostrofi che fanno parte di un link html taggato da quadre semplici
  6. gli apostrofi che fanno parte di una chiamata a template taggati da doppia graffa
  7. gli apostrofi che fanno parte di un parametro taggato da tripla graffa
  8. gli apostrofi che fanno parte di un tag HTML delimitato da < e >

L'algoritmo che userei io, sfruttando le due routinette, è il seguente:

  1. per ognuna delle eventualità enumerate sopra:
    1. identifica le sottostringhe da salvaguardare
    2. caricale in un dizionario
    3. sostituiscile nel testo con una opportuna chiave del dizionario (es: #el1#, #el2#....)
  2. esegui sostituzione di massa sul testo rimpiazzato
  3. elemento per elemento nel dizionario creato al passo 1.2:
    1. esegui sostituzione degli elementi #el1#, #el2#... con il testo originale

--Alex brollo (disc.) 10:26, 30 gen 2009 (CET)[rispondi]

Ho il prototipo ma ci sono due problemi chiari e uno da chiarire.
  • c'è un bug nel sistema di restituzione degli elementi salvati, che fallisce in alcuni casi, mentre gira perfettamente su sepmlici stringhe test. Questo lo dovrei chiarire e risolvere in breve (punte 3.1 dell'algoritmo).
  • niente impedisce che larghe porzioni di testo, perfino l'intera pagina, siano contenute in un template (es: Template:§). Questi testi sfuggiranno alla correzione, a meno che non enumeri questi template "mangiatesto" e preveda una loro trattazione separata e personalizzata.
  • niente impedisce che ci siano tag annidati e qui il sistema potrebbe dare risultati assai imprevedibili.
Insomma, un bel problema. :-) --Alex brollo (disc.) 08:25, 2 feb 2009 (CET)[rispondi]
Più che una risposta, vi dico come stavo provando a fare...
Prima di tutto volevo provare ad usare il database sedna per fare una prima selezione tra pagine contenenti "Archimede" e pagine da ignorare completamente.
Il tentativo è fallito:
  • Ho scoperto che la "Full-text search" (per la ricerca "istantanea" di testo) in realtà è supportata solo se si installa dtsearch, che è sia proprietario che a pagamento...
  • La query per la ricerca di testo "normale", mandava in crash sedna... (ho segnalato il bug e dovrebbe venire corretto prossimamente)
Avevo un bot che faceva qualcosa di simile, l'ho reso un po' più generico per fare questo tipo di ricerca: appena lo commento lo copio su wikisource...


Per la sostituzione non distruttiva stavo provando a spezzettare la "stringona" che contiene tutto il testo della pagina in una lista di parti della pagina (più o meno si otterrebbe la stessa struttura che Alex ottiene con la sostituzione di parti di testo con #el1#, e mettendo le parti nel dizionario); con
  • ogni parte può essere un template, link, testo semplice (parole?, punteggiatura?... e tante altre cose ci sarebbero...)
  • ogni parte che a sua volta può contenere una lista di parti (per cercare di gestire elementi annidati)
Da questa struttura si potrebbero trovare/modificare più facilmente le parti richieste e poi riconcatenare tutte le parti per riottenere la "stringona" della pagina.
Provo a vedere se riesco ad ottenere qualcosa di sufficientemente funzionante... (non ho molto tempo a disposizione) --qualc1 (disc.) 19:59, 4 feb 2009 (CET)[rispondi]
Ho messo in una sottopagina il bot per cercare nel file di dump le pagine contenenti una stringa o che matchano una espressione regolare. --qualc1 (disc.) 12:47, 5 feb 2009 (CET)[rispondi]
Ho ripetutamente provato il script apostrofi e devo dire che.. funziona. Ho aggiunto una routine che "capisce" il numero delle pagine di un Indice: di nuovo tipo, in cui c'è, nel codice, solo un triste e muto tag pagelist. Quindi lo script è in grado, datogli il nome base di un'opera in ns0 o in nsIndice, di rovistare in tutte le sottopagine.
Un problema logico molto intricato è questo: come trovare l'apostrofo in questa espressione: l'apostrofo, codice l'''apostrofo''? La mia routine scarta i doppi e tripli apostrofi come elementi del markup... :-( Non si crea un errore ma l'apostrofo dattilografico resta intatto. Peccato che il markup wiki non sia stato creato dopo la diffusione dei principi dell'xml... questi tag che non si sa bene quando si aprano e quando si chiudano, sono un problema spinoso. Risolvibile ma con gran fatica... :-(
Ti segnalo, a proposito di dump, che candidamente la nuova utente Lagrande ha detto che "usa Visual Basic accoppiato con Access". Niente meno!!!! In teoria, può quindi importare il dump SQL in un vero database... e farci quello che si vuole. Le mie routine leggono sì il dump xml, classificando le pagine e i contenuti, ma avere un vero database dei contenuti sarebbe tutt'un'altra cosa. --Alex brollo (disc.) 18:38, 15 apr 2009 (CEST)[rispondi]

Infotesto bot

Caro Qualc1, su richiesta (vecchia) di Aubrey e riciclando e rifinendo le mie routine che "passano le pagine", ho un abbozzo di script per l'aggiunta dell'infotesto dove manca. Penso di inserirlo fra le opzioni del "bot interattivo", dopo che l'avrò sperimentato un po' a mano. Come al solito, programmazione python sui generis... temo che Edo (che mi ha chiesto di passare ad altri alcuni script, come quello che "aggiusta gli apostrofi"), non si renda conto della distanza fra il mio codice e quello fatto da uno che ne capisce veramente; e di quanto è intricato capire un codice "sui generis" e ricavarne qualcosa di decente. Io in genere preferisco riscrivere ex novo. Comunque, appena scritta la routine ripubblico gli script in blocco nella pagina Utente:Alebot/Scripts interattivi. Vedi cosa puoi ricavarne (ma sono pessimista). --Alex brollo (disc.) 18:22, 15 apr 2009 (CEST)[rispondi]

Ok, gli darò un occhiata (così anche se non riesco ad essere "produttivo", cerco almeno di seguire le novità sui bot...). --qualc1 (disc.) 21:53, 20 apr 2009 (CEST)[rispondi]

Accesso a Speciale:EmailUser via bot

Jayvdb mi dice che dovrebbe essere possibile e "semplice" accedere via bot a Speciale:EmailUser.... senza spammare ovvio. Hai qualche dritta su come fare? --Alex brollo (disc.) 14:31, 4 mag 2009 (CEST)[rispondi]

Mmm... Dando un occhiata veloce agli script di pywikipedia non trovo niente di già fatto... Più che essere "difficile", c'è il problema che non essendoci niente di già fatto che utilizzi Speciale:EmailUser bisogna fare cose più a basso livello rispetto a quello che di solito si fa negli altri bot: cioè creare un richiesta HTTP con i parametri che si passerebbero nei campi della pagina (per avere un esempio puoi vedere come viene implementato in wikipedia.py il metodo delete della classe page).
Domani provo a fare uno scriptino per semplificare l'inivio di mail tramite bot... ciao. --qualc1 (disc.) 22:33, 5 mag 2009 (CEST)[rispondi]
(Stranamente) sono riuscito a risponderti a tempo di record :D
# -*- coding: utf-8  -*-
"""
send mail to user
"""

import re
import wikipedia


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)
	    tokenR = re.compile(r'\<input name="wpEditToken" type="hidden" value="(.*?)"')
	    tokenloc = tokenR.search(mailToPage)
	    if tokenloc:
		    token = tokenloc.group(1)
	    else:
		    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 (problably) sent"
	    else:
		print "Fail: http status code is %s, error reason is %s" % (str(response.status), response.reason)


def main():
	bot = MailBot(u"Qualc1",  u"un oggetto", u"ultimo messaggio DI KKKK prova da inviare...", False)
	bot.run()


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

Il main è solo di esempio, per utilizzarlo in un altro bot basta copiare la classe dove la devi usare (o salvarla altrove e importarla) e poi richiamarlo con:
bot = MailBot("destinatario",  "oggetto", "messaggio", False)
bot.run()
L'ultimo parametro dovrebbe indicare se abilitare l'opzione "Invia in copia al mio indirizzo." che si trova nella pagina di invio di email ma mi sembra che non funzioni... magari a fare un po' di prove anche te riesci a capire perchè... fammi sapere... ciao --qualc1 (disc.) 20:02, 6 mag 2009 (CEST)[rispondi]
GRAZIE! Sarà anche la spinta necessaria perchè (finalmente) mi decida a capire il funzionamento delle classi ;-).
Immaginavo che ci dovesse essere un meccanismo per inviare al sistema qualcosa con il metodo GET, ma non sapevo da dove cominciare, avendo per ora utilizzato esclusivamente le funzioni di lettura e scrittura di una pagina (e non avendo avuto il coraggio di studiarne il codice). Penso quindi che capendo bene questo codice mi si dischiudano delle opportunità piuttosto ampie! --Alex brollo (disc.) 22:47, 6 mag 2009 (CEST)[rispondi]
Siccome le regex proprio non le reggo, ho modificato due righe di run:
    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

Dovrebbe esserti arrivata "la prova che funziona". Ciao e grazie ancora. --Alex brollo (disc.) 00:26, 7 mag 2009 (CEST)[rispondi]

Prego. arrivata! Si, se riesci a mageggiare direttamente con le richieste GET e POST puoi accedere direttamente a qualunque funzionalità che hai "da browser", ma nessuno ha implementato in pywikipedia... --qualc1 (disc.) 13:57, 7 mag 2009 (CEST)[rispondi]
Per esercizio, trasformerò il codice da codice a oggetti a codice di tipo procedurale; giusto per capire senza ombra di dubbio cosa fa riga per riga. Poi vediamo.... peccato che mi manchi il tempo...:-( . Ho dato a Jayvdb il link a questa pagina. --Alex brollo (disc.) 17:11, 7 mag 2009 (CEST)[rispondi]

Viaggio in corso

Volevo avvisarti che ho iniziato il vero viaggio nel mondo pywikipedia; per ora ho usato il software in maniera diciamo un pochino superficiale... adesso voglio capirlo, riga per riga, sto combattendo con il terribile category.py con qualche piccolo successo, adesso sto esplorando per bene la classe Page... in poche parole, ho già allertato PietroDn anticipandogli qualche richiesta disperata di aiuto; posso mettere anche te fra i tools di emergenza? ;-) --Alex brollo (disc.) 10:49, 31 ago 2009 (CEST)[rispondi]