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;
}