Utilisateur:PamputtBot/article sans intervention humaine.cpp

    Définition, traduction, prononciation, anagramme et synonyme sur le dictionnaire libre Wiktionnaire.

    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 article_sans_intervention_humaine.cpp.

    Le programme crée un fichier liste.txt qui contient une liste de tous les articles qui ont été modifiés uniquement par des bots.

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
     
    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.at(i).find("bot")==string::npos &&
           contributeur.at(i).find("Bot")==string::npos &&
           contributeur.at(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 verif_laurent_bouvier(vector <string> contributeur) {
      //renvoie "vrai" si Laurent Bouvier a cree l'article et qu'aucun humain n'a touche a l'article par la suite
      
      //si Laurent Bouvier a fait la premiere edition
      bool firstLaurentBouvier=false;
      if(contributeur.size() > 0 && contributeur.at(0).find("Laurent Bouvier")!=string::npos)
        firstLaurentBouvier=true;
    
      bool onlyBot=true;
      for(unsigned i=1 ; i<contributeur.size() ; ++i) {
        if(contributeur.at(i).find("bot")==string::npos &&
           contributeur.at(i).find("Bot")==string::npos &&
           contributeur.at(i).find("Interwicket")==string::npos) { //on n'a pas trouvé le mot "bot"
          onlyBot=false;
        }
      }
      if(firstLaurentBouvier && onlyBot)
        return true;
      
      return false;
    }
     
    int main(int argc, char **argv) {
      //https://dumps.wikimedia.org/frwiktionary/latest/frwiktionary-latest-pages-meta-history.xml.7z
      ifstream infile("/home/pamputt/wiki/frwiktionary-latest-pages-meta-history.xml",ifstream::in);
      if(! infile.is_open()) {
        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("liste.txt",ofstream::out);
      if(!out) {
        cout << "Probleme avec le fichier de sortie" << endl;
        return 0;
      }
     
      ofstream outLB("listeLB.txt",ofstream::out);
      if(!outLB) {
        cout << "Probleme avec le fichier de sortie" << endl;
        return 0;
      }
     
      string titre, titre_prec;
      vector <string> contributeur;
      vector <string> texte;
      bool flexion = false, redirect = false;
     
      string line;
      size_t pos1, pos2;
      unsigned int cmpt = 0, cmpt2 = 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
    
    	bool botOnly=verif_bot(contributeur);
    	bool LBandBot=verif_laurent_bouvier(contributeur);
    	
    	if(botOnly || LBandBot) { // aucun humain n’a modifie l’article
    	  bool ok = true;
     
              // ****************************************************
              // on peut commenter ou decommenter chaque ligne « if »
              // suivant ce qu’on veut exclure
              // ****************************************************
     
    	  //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 rimes
    	  if(titre_prec.find("Annexe:Rimes")!=string::npos)       ok = false;
    	  //retrait des pages de projet
    	  if(titre_prec.find("Projet:")!=string::npos)            ok = false;
    	  //retrait des pages de catégorie
    	  if(titre_prec.find("Catégorie")!=string::npos)          ok = false;
    	  //retrait des pages de discussion
    	  if(titre_prec.find("Discussion")!=string::npos)         ok = false;
    	  //retrait des pages de traduction
    	  if(titre_prec.find("Translations")!=string::npos)       ok = false;
    	  //retrait des pages de l'espace Wiktionnaire
    	  if(titre_prec.find("Wiktionnaire")!=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;
    	    if(botOnly) {
    	      out   << titre_prec << endl;
    	      cmpt++;
    	    }
    	    if(LBandBot) {
    	      outLB << titre_prec << endl;
    	      cmpt2++;
    	    }
    	  }
    	}
    	flexion  = false;
    	redirect = false;
    	contributeur.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);
        }
     
        //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();
      outLB.close();
     
      cout << cmpt << " articles trouves sans intervention humaine" << endl;
      cout << cmpt2 << " articles crees par Laurent Bouvier puis sans intervention humaine" << endl;
      return 1;
    }