Discussioni progetto:WikiAfrica/30.000/Somma

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Creazione bot[modifica wikitesto]

Per il momento il bot cerca su it, en,e fr con i relativi wikizionari oltre se su commons le categorie che iniziano con WikiAfrica. Quindi se viene creata una nuova categoria che inizia così viene automaticamente intercettata. Se questo non va bene sarebbe opportuno creare una categoria specifica, ad esempio, Categoria:WikiAfrica Report e inserire lì le categorie che dovranno essere conteggiate. Ho suddiviso per NS le pagine perché mi sembra che così si capisca meglio cosa include una categoria, inoltre nell'ultima riga ho inserito i totali di pagine distinte perché ho visto che alcune pagine sono presenti in più categorie. Per ora non lo faccio girare in attesa di definire con precisione come operare. --Abisys (msg) 00:16, 8 ott 2011 (CEST)[rispondi]

Grazie mille Abisys, è un gran bel lavoro. Adesso ne parliamo un po', precisiamo meglio le esigenze e poi ti facciamo sapere. Grazie ancora. --MarcoK (msg) 21:40, 11 ott 2011 (CEST)[rispondi]
Di nulla, da quello che posso vedere e leggere nella mia talk, il modo migliore è la creazione di una categoria nascosta Categoria:WikiAfrica Report in questa categoria come ho detto sopra si possono inserire le categorie che contengono le pagine da conteggiare. Mi serve sapere su quali progetti deve girare il bot e se ad esempio devo filtrare qualche NS. Quando create la categoria mettete una nota che è una categoria di servizio legata al progetto WikiAfrica e che non deve essere rimossa anche se vuota. Ora il bot sta girando cercando tutte le categorie che iniziano con WikiAfrica, se provate ad inserire e/o rimuovere una pagina da queste categorie vedrete che la tabella si aggiorna ogni 10 minuti, appena inserita la categoria nascosta modificherò il bot per lavorare su quella categoria invece che cercare quelle che iniziano per WikiAfrica. Leggere l'elenco delle categorie da una pagina è possibile ma più lento, Wiki è ottimizzata per l'uso delle categorie come indice di pagine. Poi mi sembrava vi servisse anche poter includere in alcune pagine il totale, va bene il totale di tutte le wiki o i deve essere solo quello di it.wiki? --Abisys (msg) 22:57, 11 ott 2011 (CEST)[rispondi]
✔ Fatto. Visto che non arrivavano suggerimenti ho creato io le categorie e ora il bot gira sulle wiki elencate in fondo al report cercando la categoria Categoria:WikiAfrica report, se avete altre categorie da inserire nel conteggio è sufficiente che le inseriate in questa categoria. Se poi volete utilizzare il totale è sufficiente che inseriate nella pagina
{{Progetto:WikiAfrica/30.000/Somma}}
e vi restituisce 32457. --Abisys (msg) 23:35, 12 ott 2011 (CEST)[rispondi]
Molte grazie. Mi scuso per il ritardo, ma nel progetto si sta chiarendo la possibilità di separare due risultati (pagine legate all'Africa e non legate). Un dubbio: commons:Category:Artgate_Fondazione_Cariplo è indicato dal bot con 495 elementi, mentre la categoria in realtà ne contiene 853. Grazie. --M.casanova (msg) 08:48, 13 ott 2011 (CEST)[rispondi]
Non sono riconosciuto come bot su commons quindi posso estrarre solo 500 voci per volta, hai fatto bene a segnalarmelo implementerò un loop la prossima settimana. --Abisys (msg) 16:52, 13 ott 2011 (CEST)[rispondi]

Sistemazioni[modifica wikitesto]

Dalla categoria su Commons ho eliminato elementi duplicati (artisti già presenti sotto categoria Doual'art). --M.casanova (msg) 08:55, 13 ott 2011 (CEST)[rispondi]

Devo limitare il conteggio ai NS 1,5 e 6? Ti è utile che conteggi anche le categorie? --Abisys (msg) 16:52, 13 ott 2011 (CEST)[rispondi]
Penso sia ragionevole limitarsi a 1, 5 e 6. Grazie. --M.casanova (msg) 18:12, 13 ott 2011 (CEST)[rispondi]

Dalla categoria su it.wiki ho tolto elementi di Epoché (già presenti sotto categoria Griot). --M.casanova (msg) 12:18, 14 ott 2011 (CEST)[rispondi]


Ci sono problemi con Wikiversità? Ho aggiunto la categoria Wikiafrica report e ho visto sparire i valori della tabella finale. Saluti. --M.casanova (msg) 14:12, 19 ott 2011 (CEST)[rispondi]


Una richiesta: è possibile aggiungere anche es.wikipedia.org per cui stiamo creando alcuni template? Molte grazie. (Nonostante diverse prove non riesco ad ospitare direttamente bot) --M.casanova (msg) 09:45, 7 nov 2011 (CET)[rispondi]

Gestione bot[modifica wikitesto]

È possibile avere copia del bot per gestire pagina somma o è un problema? Saluti. --M.casanova (msg) 18:08, 18 ott 2011 (CEST)[rispondi]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using WikiFunctions;
using WikiFunctions.API;
using System.IO;
using System.Xml;

namespace WikiAfricaSrv
{
    public partial class WikiAfrica : ServiceBase
    {
        List<Wiki> ElencoWiki = new List<Wiki>(10);

        // Timer per il ciclo 10 minuti
        System.Timers.Timer Timer = new System.Timers.Timer(600000);

        public WikiAfrica()
        {
            InitializeComponent();
            Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
        }

        public String Log
        {
            set
            {
                File.AppendAllText(@"C:\WikiAfrica\WikiAfricaSrv.log", DateTime.Now.ToLocalTime() + ": " + value + "\r\n");
            }
        }

        public class Pagina
        {
            Wiki Wiki;
            public Int32 NS, ID;

            public Pagina(Wiki W, Int32 n, Int32 I)
            {
                Wiki = W;
                NS = n;
                ID = I;
            }
        }

        public class Categoria
        {
            public String Titolo;
            public String ID;
            Wiki Wiki;
            public List<Pagina> pagine = new List<Pagina>(100);

            public Categoria(Wiki W, String T, String I)
            {
                Wiki = W;
                Titolo = T;
                ID = I;
            }

            public Int32 PagineInNS(Int32 ns)
            {
                int i = 0;
                foreach (Pagina p in pagine)
                    if (p.NS == ns)
                        i++;
                return i;
            }

            public String WikiLink
            {
                get
                {
                    return "[[" + Wiki.prefisso + Titolo + "|" + Titolo + "]]";
                }
            }
        }

        public class Wiki
        {
            public String Descrizione;
            public ApiEdit Api;
            List<Categoria> categorie = new List<Categoria>(100);
            public List<Pagina> pagine = new List<Pagina>(1000);
            Pagina p;
            Int32 ns, id;
            public String prefisso;
            List<Int32> NSattivi = new List<int>();

            public Wiki(String descrizione, String wiki, String pref)
            {
                Descrizione = descrizione;
                prefisso = pref;
                Api = new ApiEdit(wiki);
            }

            public void CaricaWiki()
            {
                Api.Login("<username>", "<password>");
                String query, cmcontinue = "";

                // Cerca le categorie incluse in  "Wikiafrica report"
                try
                {
                    query = "&list=categorymembers&cmlimit=max&cmtitle=Category:WikiAfrica_report&cmnamespace=14";
                    do
                    {
                        using (StringReader sr = new StringReader(Api.QueryApi(query + cmcontinue)))
                        using (XmlTextReader xml = new XmlTextReader(sr))
                        {
                            xml.WhitespaceHandling = WhitespaceHandling.None;
                            if (xml.ReadToFollowing("cm"))
                            {
                                while (xml.Name == "cm")
                                {
                                    categorie.Add(new Categoria(this, xml.GetAttribute("title"), xml.GetAttribute("pageid")));
                                    xml.ReadToNextSibling("cm");
                                }
                            }
                            if (xml.ReadToFollowing("query-continue"))
                            {
                                xml.ReadToFollowing("categorymembers");
                                cmcontinue = "&cmcontinue=" + xml.GetAttribute("cmcontinue");
                            }
                            else
                                cmcontinue = "";
                        }
                    } while (cmcontinue != "");
                }
                catch
                {
                    // Se la categoria "Wikiafrica report" non esiste esco subito
                    return;
                }

                // Per ciascuna categoria include le pagine
                foreach (Categoria c in categorie)
                {
                    query = "&list=categorymembers&cmlimit=max&cmnamespace=1|5|6&cmpageid=" + c.ID;
                    cmcontinue = "";
                    do
                    {
                        using (StringReader sr = new StringReader(Api.QueryApi(query + cmcontinue)))
                        using (XmlTextReader xml = new XmlTextReader(sr))
                        {
                            xml.WhitespaceHandling = WhitespaceHandling.None;
                            if (xml.ReadToFollowing("cm"))
                            {
                                while (xml.Name == "cm")
                                {
                                    p = null;
                                    ns = Convert.ToInt32(xml.GetAttribute("ns"));
                                    id = Convert.ToInt32(xml.GetAttribute("pageid"));

                                    // Se la pagina è già esistente la mette in p ...
                                    foreach (Pagina p1 in pagine)
                                        if (p1.ID == id)
                                        {
                                            p = p1;
                                            break;
                                        }

                                    // ... altrimenti crea la pagina
                                    if (p == null)
                                    {
                                        p = new Pagina(this, ns, id);
                                        pagine.Add(p);
                                    }

                                    //inserisce la pagina nella categoria
                                    c.pagine.Add(p);
                                    xml.ReadToNextSibling("cm");
                                }
                            }
                            if (xml.ReadToFollowing("query-continue"))
                            {
                                xml.ReadToFollowing("categorymembers");
                                cmcontinue = "&cmcontinue=" + xml.GetAttribute("cmcontinue");
                            }
                            else
                                cmcontinue = "";
                        }
                    } while (cmcontinue != "");
                }
            }

            public Int32 PagineInNS(Int32 ns)
            {
                // Totalizza le pagine in un determinato NS
                int i = 0;
                foreach (Pagina p in pagine)
                    if (p.NS == ns)
                        i++;
                return i;
            }

            public void VerificaNS()
            {
                // Verifica quale NS è attivo sulla determinata wiki
                for (Int32 i = 0; i < 16; i++)
                    if (PagineInNS(i) > 0)
                        NSattivi.Add(i);
            }

            public String Report()
            {
                CaricaWiki();
                VerificaNS();

                // Genera il report per una determinata wiki
                // Se non ci sono categorie esce subito
                if (categorie.Count == 0) return "";
                String s = "== Categorie presenti su " + Descrizione + " ==\r\n{| class=\"wikitable sortable\"\r\n! Titolo voce !!";

                // Crea le colonne
                foreach (Int32 ns in NSattivi)
                    s += "NS:" + ns.ToString() + " !! ";
                s += "Totale\r\n";

                // Genera le righe
                foreach (Categoria c in categorie)
                {
                    s += "|-\r\n| " + c.WikiLink + " || ";
                    foreach (Int32 ns in NSattivi)
                        s += "style=\"text-align:right\" | " + c.PagineInNS(ns) + " || ";
                    s += "style=\"text-align:right\" | " + c.pagine.Count.ToString() + "\r\n";
                }

                // Inserisce i totali di colonna
                s += "|-\r\n! Pagine distinte !! ";
                foreach (Int32 ns in NSattivi)
                    s += "style=\"text-align:right\" | " + PagineInNS(ns) + " !! ";

                // Totale per la wiki
                s += "style=\"text-align:right\" | " + pagine.Count.ToString() + "\r\n|}\r\n\r\n";

                // Libera le risorse
                foreach (Categoria c in categorie)
                    c.pagine.Clear();
                pagine.Clear();
                categorie.Clear();
                NSattivi.Clear();

                return s;
            }
        }

        protected override void OnStart(string[] args)
        {
            Log = "Avvio del servizio";

            // Elenco delle wiki con Descrizione, Url e prefisso interwiki
            // La prima deve essere it.wiki
            ElencoWiki.Add(new Wiki("Wikipedia in lingua italiana", "http://it.wikipedia.org/w/", ":"));
            ElencoWiki.Add(new Wiki("Wikizionario in lingua italiana", "http://it.wiktionary.org/w/", ":wikt:"));
            ElencoWiki.Add(new Wiki("Wikisource in lingua italiana", "http://it.wikisource.org/w/", ":s:"));
            ElencoWiki.Add(new Wiki("Wikiversità in lingua italiana", "http://it.wikiversity.org/w/", ":v:"));
            ElencoWiki.Add(new Wiki("Wikiquote in lingua italiana", "http://it.wikiquote.org/w/", ":q:"));
            ElencoWiki.Add(new Wiki("Wikipedia in lingua inglese", "http://en.wikipedia.org/w/", ":en:"));
            ElencoWiki.Add(new Wiki("Wikizionario in lingua inglese", "http://en.wiktionary.org/w/", ":en:wikt:"));
            ElencoWiki.Add(new Wiki("Wikipedia in lingua francese", "http://fr.wikipedia.org/w/", ":fr:"));
            ElencoWiki.Add(new Wiki("Wikizionario in lingua francese", "http://fr.wiktionary.org/w/", ":fr:wikt:"));
            ElencoWiki.Add(new Wiki("Commons", "http://commons.wikimedia.org/w/", ":commons:"));
            Timer.Start();
            Log = "Effettuata inizializzazione";
        }

        protected override void OnStop()
        {
            Timer.Stop();
            foreach (Wiki w in ElencoWiki)
                w.Api.Logout();
            Log = "Servizio arrestato";
        }

        void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            Int32[] NS = new Int32[16];
            List<Int32> NSattivi = new List<int>(10);
            Int32 Totale = 0;
            String report = "";

            Log = "Avvio scansione dati da wiki";

            // Genera il report con i totali
            report += "== Totali interwiki ==\r\n{| class=\"wikitable sortable\"\r\n! Wiki !!";
            foreach (Int32 ns in NSattivi)
                report += "NS:" + ns.ToString() + " !! ";
            report += "Totale\r\n";

            // Per ciascuna wiki .. 
            foreach (Wiki w in ElencoWiki)
            {

                // ... inserisce il nome ...
                report += "|-\r\n| " + w.Descrizione + " || ";

                // ... inserisce i vari NS ...
                foreach (Int32 ns in NSattivi)
                    report += "style=\"text-align:right\" | " + w.PagineInNS(ns) + " || ";

                // ... inserisce il totale della riga
                report += "style=\"text-align:right\" | " + w.pagine.Count.ToString() + "\r\n";
            }

            // Report generale: totali di colonne
            report += "|-\r\n| '''Pagine distinte''' || ";
            foreach (Int32 ns in NSattivi)
                report += "style=\"text-align:right\" | '''" + NS[ns] + "''' || ";

            // Totale generale. Il tag <onlyinclude> serve per far si che solo totale viene inserito se si include questa pagina
            report += "style=\"text-align:right\" | '''<onlyinclude>" + Totale + "</onlyinclude>'''\r\n|}\r\n\r\n[[Categoria:Progetto WikiAfrica]]\r\n";

            // Apre la pagina su it.wiki che deve essere il primo progetto inserito in elenco
            ElencoWiki[0].Api.Open("Progetto:WikiAfrica/30.000/Somma");
            if (!ElencoWiki[0].Api.Save(report, "Aggiornamento statistiche", false, WatchOptions.Unwatch).NoChange)
                Log = "Report salvato";

            // Libera le risorse
            NSattivi.Clear();

            Log = "Termine scansione";
        }
    }
}
Ecco il codice, è configurato per essere un servizio di windows che attualmente gira su un mio server, se lo volete utilizzare direttamente disattivo il servizio altrimenti fa un RB delle vostre modifiche. --Abisys (msg) 20:25, 18 ott 2011 (CEST)[rispondi]
Non essendo un esperto di bot, preferisco prima fare qualche prova con una sandbox per evitare problemi di configurazione.
Al momento il bot è attivo? Ho fatto modifiche ieri aggiungendo commons:Category:Archivio Pietro Pensa su Commons, ma non è ancora aggiornato. Grazie mille. --M.casanova (msg) 08:27, 19 ott 2011 (CEST)[rispondi]

Richiesta per modifica[modifica wikitesto]

Avrei una richiesta di modifica per la visualizzazione della somma. Ho spostato alcune categorie da WikiAfrica report a SYK report perché riguardano materiale inserito per il progetto Share Your Knowledge non legato all'Africa. È possibile ripetere di seguito i conteggi anche per quella categoria nei vari wiki? È già presente per it.wiki, en.wiki e commons.
Il risultato potrebbe essere il seguente:

  1. Categorie relative all'Africa su Wikipedia in lingua italiana -- qui categoria:WikiAfrica report
  2. Categorie relative all'Africa su Wikisource in lingua italiana
  3. Categorie relative all'Africa su Wikiversità in lingua italiana
  4. Categorie relative all'Africa su Wikipedia in lingua inglese
  5. Categorie relative all'Africa su Wikipedia in lingua francese
  6. Categorie relative all'Africa su Wikipedia in lingua spagnola
  7. Categorie relative all'Africa su Commons
  8. Totali interwiki per categorie relative all'Africa
  9. Altre categorie su Wikipedia in lingua italiana -- da qui categoria:SYK report
  10. Altre categorie su Wikisource in lingua italiana
  11. Altre categorie su Wikiversità in lingua italiana
  12. Altre categorie su Wikipedia in lingua inglese
  13. Altre categorie su Wikipedia in lingua francese
  14. Altre categorie su Wikipedia in lingua spagnola
  15. Altre categorie su Commons
  16. Totali interwiki per altre categorie

Ogni suggerimento è benvenuto. Grazie ancora per l'aiuto. --M.casanova (msg) 16:37, 13 dic 2011 (CET)[rispondi]

Ok appena potrò lo modificherò ma devi dirmi che cifra vuoi che riporti come totale quando includi questa pagina in un'altra. Deve essere il totale delle Categorie relative all'Africa su Commons o il totale generale incluse le altre categorie? --Abisys (msg) 18:21, 21 dic 2011 (CET)[rispondi]
Se è possibile, sarebbe bello avere entrambi i risultati (1. Totale categorie relative all'Africa - 2. Tutte le categorie). Altrimenti va bene il totale generale. --M.casanova (msg) 12:03, 24 dic 2011 (CET)[rispondi]

Arresto bot[modifica wikitesto]

Ho arrestato il bot in quanto non mi sembra utile per WP, sempre pronto a riavviarlo ma devo capire a che scopo questo conteggio possa essere utile, pensavo servisse a coinvolgere diversi utenti in una sorta di gara ma ... forse mi ero sbagliato. --Abisys (msg) 22:37, 21 gen 2012 (CET)[rispondi]