Utilisateur:PamputtBot/article sans intervention humaine.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 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;
}