Utilisateur:PamputtBot/cree par PiedBot.cpp

Ce code c++ lit ligne par ligne le dump d’historique complet du Wiktionnaire que l’on a précédemment récupéré ici et décompressé dans le dossier de cree_par_PiedBot.cpp.

On compile le programme avec la commande suivante

  • g++ cree_par_PiedBot.cpp -o piedbot.exe

puis on l’exécute en tapant « ./piedbot.exe ».

Le programme crée un fichier PiedBot.txt qui contient une liste de tous les articles créés par Utilisateur:PiedBot et qui n’ont été modifiés par aucun humain depuis. On utilise ensuite le script add_text.py de pywikibot qui s’utilise comme ça :

  • python pwb.py scripts/add_text.py -file:../PiedBot.txt -summary:"Bot: ajout de {{vérifier création automatique}}" -text:"{{vérifier création automatique}}" -except:"\{\{vérifier création automatique" -up

Note : il est possible de passer un argument nommé « lang » au programme de cette façon

./piedbot.exe lang

Cela ajoutera, en plus du titre de l’article, le code de la langue concernée. Cela peut être utile si on veut passer le code de la langue comme paramètre à {{vérifier création automatique}}.

Ce programme peut être utilisé en association avec enlever_bandeau_creation_automatique.cpp qui permet de générer une liste des articles qui ont un bandeau {{vérifier création automatique}} alors qu’un humain est repassé sur l’article depuis l’apposition du modèle.

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <boost/algorithm/string.hpp>

using namespace std;

bool verif_bot(vector <string> contributeur) {
  //renvoie "vrai" si aucun humain n'a touche a l'article
  for(unsigned int i=0 ; i<contributeur.size() ; i++) {
    if(contributeur[i].find("bot")==string::npos &&
       contributeur[i].find("Bot")==string::npos &&
       contributeur[i].find("BOT")==string::npos &&
       contributeur[i].find("Interwicket")==string::npos) { //on n'a pas trouvé le mot "bot"
      return false;
    }
  }
  return true; // aucun humain n'a édité l'article
}

bool estPiedBot(vector <string> contributeur) {
  if(contributeur.size()==0) // aucun contributeur (utile pour le premier passage)
    return false;

  if(contributeur[0].find("PiedBot")!=string::npos && // le premier contributeur est PiedBot
     verif_bot(contributeur)) {
    return true;
  }
  return false;
}

int main(int argc, char *argv[]) {
  bool erreur = false;
  bool lang=false;

  //si le programme a un argument, on verifie que c'est "langue"
  // si ce n'est pas le cas, on renvoie une erreur pour expliquer
  // le fonctionnement du programme
  if(argc==2) {
    string param = argv[1];
    ifparam=="lang")
      lang = true;
    else
      erreur = true;
  }

  if(argc<1 || argc>2)
    erreur = true;

  if(erreur) {
    cout << "Usage : \"./piedbot.exe\" genere une liste avec seulement le nom de l'article" << endl
	 << "        \"./piedbot.exe lang\" genere une liste avec le nom de l'article et le code langue de celui-ci" << endl;
    return 0;
  }

  //https://dumps.wikimedia.org/frwiktionary/latest/frwiktionary-latest-pages-meta-history.xml.7z
  ifstream infile("frwiktionary-latest-pages-meta-history.xml",ifstream::in);
  if(!infile) {
    cout << "Pas de fichier d’historique" << endl
         << "Telecharger le à https://dumps.wikimedia.org/frwiktionary/latest/frwiktionary-latest-pages-meta-history.xml.7z" << endl;
    return 0;
  }

  ofstream out("PiedBot.txt",ofstream::out);
  if(!out) {
    cout << "Probleme avec le fichier de sortie" << endl;
    return 0;
  }

  string titre, titre_prec;
  vector <string> contributeur;
  vector <string> texte;
  vector <string> langue;
  bool flexion = false, redirect = false;

  string line;
  size_t pos1, pos2;
  unsigned int cmpt = 0;

  while(getline(infile,line)) {
    if(line.find("<title>")!=string::npos) {
      // on extrait le titre des balises <title>
      pos1 = line.find("<title>");
      pos2 = line.find("</title>");
      titre= line.substr(pos1+7,pos2-pos1-7);
      
      if(titre!=titre_prec) {
	// on change de titre
	if(estPiedBot(contributeur)) {
	  bool ok = true;

	  //retrait des pages utilisateur
	  if(titre_prec.find("tilisateur:")!=string::npos)        ok = false;
	  //retrait des pages de conjugaison
	  if(titre_prec.find("Annexe:Conjugaison")!=string::npos) ok = false;
	  //retrait des pages de catégorie
	  if(titre_prec.find("Catégorie")!=string::npos)          ok = false;
	  //retrait des pages de flexion
	  if(flexion)                                             ok = false;
	  //retrait des pages REDIRECT
	  if(redirect) 
	  ok = false;

	  if(ok) { // on remplit le fichier de sortie
	    // cout << titre_prec << endl;
            out << titre_prec;
	    if(langue.size()==1)
	      out << "\t" << langue[0];
	    // else
	    //   cout << titre_prec << endl;
	    out << endl;
            cmpt++;
	  }
	}
	flexion  = false;
	redirect = false;
	contributeur.clear();
	langue.clear();
	titre_prec = titre;
      }
    }
 
    // on recupere le nom du contributeur
    if(line.find("<username>")!=string::npos) {
      pos1 = line.find("<username>");
      pos2 = line.find("</username>");
      line = line.substr(pos1+10,pos2-pos1-10);
      contributeur.push_back(line);
    }
    // ou l’IP qui a servi a contribué
    if(line.find("<ip>")!=string::npos) {
      pos1 = line.find("<ip>");
      pos2 = line.find("</ip>");
      line = line.substr(pos1+4,pos2-pos1-4);
      contributeur.push_back(line);
    }
 
    // on recupere le(s) langue(s) de l'article
    // ça permettra de spécifier éventuellement 
    // un paramètre à {{vérifier création automatique}}
    if(lang && line.find("{{langue|")!=string::npos) {
      pos1 = line.find("{{langue|");
      pos2 = line.find("}}");
      line = line.substr(pos1+9,pos2-pos1-9);

      bool langueAbsente = true;
      for(unsigned int i=0 ; i<langue.size() ; i++)
	if(boost::iequals(line,langue[i])) {//comparaison sans tenir de la casse
	  langueAbsente = false;
	  break;
	}
      if(langueAbsente)
	langue.push_back(line);
      else
	langue.back() = line; // on remplace le code par le dernier code de langue utilisé.
                              // utile lorsque le code a changé au cours du temps comme gsw-FR -> gsw-fr
    }

    //si le mot "flexion" apparait alors on le note pour éventuellement exclure l'article
    if(line.find("flexion")!=string::npos)
      flexion = true;

    //si le mot "redirect" apparait alors on le note pour éventuellement exclure l'article
    if(line.find("REDIRECT")!=string::npos || line.find("redirect")!=string::npos)
      redirect = true;
  }
  infile.close();
  out.close();
  
  cout << cmpt << " articles trouves" << endl;
  return 1;
}