Ce projet doit permettre de publier sur le wiki via IRC, grâce au robot quoibot (cf.
ModeDEmploiDuCanalIRC).
- Il y a en fait deux "journalisations" possibles du canal IRC :
- quoibot qui, si j'ai bien compris est une installation du "chump bot" et permet d'écrire des brèves sur le canal IRC.
- logger qui enregistre l'intégralité de ce qui se passe sur le canal IRC.
- Ces deux robots ont des besoins différents : quoibot permet de corriger ce qui a déjà été créé alors que logger est une simple historisation au fil de l'eau. -- EricVanDerVlist
Solutions
On verra les discussions sur
WikiNi (
WikiNi:AjoutDInformationViaLURL (interwiki)), proposant des solutions pour alimenter le wiki autrement que par une action directe d'un humain (Éditer cette page).
Pour mettre en oeuvre une solution j'ai besoin de savoir ce que le robot est capable de faire :
- envoyer une requête GET HTTP ?
- envoyer une requête POST HTTP ?
- gérer des cookies ?
--
CharlesNepote
Ces deux robots sont écrits en Python. Ils ne gèrent pas cette fonctionnalité qui est donc à écrire et sont donc capables, virtuellement, de tout faire!
Je propose que nous commencions par "logger" qui est plus simple (historisation au fil de l'eau).
J'ai commencé à faire des essais sur
BacAsableIrc et ai quelques problèmes avec le code que tu proposes.
C'est grave, docteur? --
EricVanDerVlist
- Bon, j'ai publié un nouveau code ci-dessous qui devrait fonctionner correctement (j'ai testé ; le code est un peu crado mais je vais le retravailler). Le fonctionnement est toujours incorrect si tu ne passes aucun paramètre (mais nous verrons plus tard ; ça te permet déjà de faire joujou avec ton robot :). -- CharlesNepote
Suggestions d'amélioration
Je pense qu'il serait intéressant d'ajouter une ancre à chaque phrase qui commence une nouvelle minute. Les ancres ne seraient pas répétées pour les phrases suivantes de la même minute. On aurrait par exemple :
<a name="[21:21]">[21:21]</a> <chn> Une petite revolution est passee inapercue dans le noyau Linux 2.6 :
<a name="[21:22]">[21:22]</a> <chn> http://freshmeat.net/projects/posixaclsforlinux/
[21:22] <chn> Il s'agit de la generalisation en standard, a tous les systemes de fichier, des Extended Attributes...
[21:22] <Ganf> j'avais une redhat qui gérait déjà les ACL
<a name="[21:22]">[21:23]</a> <chn> ... metadonnees libres pour chaque fichier
Je ne suis pas sûr que cela soit simple à réaliser...
--
CharlesNepote
- C'est assez simple à réaliser, mais je n'aime pas du tout le mélange de wiki et de XHTML vers lequel on se dirige. Je me demande si nous n'aurions pas intérêt à passer tout en XHTML (mais alors l'intérêt du wiki n'est plus très évident, son markup devient au contraire un handicap) ou tout en wiki (et dans ce cas, il faudrait trouver un moyen de spécifier des ancres). -- EricVanDerVlist (perplexe)
Sécurité des ajouts
Attention, avec ce code il devient très facile d'engorger le wiki... C'est la raison pour laquelle je demandais s'il est possible de gérer les POST et/ou les cookies par les robots : on peut alors inclure des tests pour vérifier que n'importe qui ne publie pas n'importe quoi (voir
WikiNi:AjoutDInformationViaLURL (interwiki)). --
CharlesNepote
- Effectivement, cela fonctionne beaucoup mieux, merci! Au niveau de la sécurité, est-ce qu'il ne serait pas plus simple de réserver cela à un utilisteur (ou une classe d'utilisateurs) particulier et de demander au robot de s'authentifier de manière classique? En ce qui concerne l'engorgement, tu as raison et même les robots des moteurs de recherche risquent de rajouter du contenu s'ils suivent un lien tel que http://websemantique.org/BacAsableIrc/append?content=foo&submit=direct !!! -- EricVanDerVlist
- Oui. Côté serveur c'est assez simple de réserver l'utilisation de ce handler à un ou plusieurs utilisateurs : il suffit d'ajouter une variable dans le fichier de configuration "appendRights" => "TelRobot?", "TelAutre?", ; et de faire un test sur cette valeur ($this->GetConfigValue?("appendRights")). Mais comment va-tu faire pour que le robot s'authentifie de manière classique ? Ca complique pas mal la conception du robot : cela veut dire qu'il faut que tu développes pour le robot l'authentification et la gestion des cookies... Est-ce que tu vois côté serveur, une technique qui te faciliterai la tâche ? Je veux bien développer des fonctionnalités permettant à d'autres robots de s'authentifier de manière générique. -- CharlesNepote
- Je viens de mettre en place une première version (très rudimentaire) qui journalise sur BacAsableIrc en utilisant un POST (du coup j'ai supprimé la possibilité de publier de cette manière avec une méthode GET). Le problème est que le texte publié est interprété comme du texte Wiki. Aurais-tu un document décrivant les "échappements" à utiliser pour éviter cela? Au niveau de l'authentification, Python dispose de deux bibliothèques standards implémentant des clients HTTP et je pense m'appuyer dessus. -- EricVanDerVlist
- Pour échapper du texte, il faut le mettre entre deux doubles cochets par exemple : **MotWiki**. Tu peux aussi utilise le double pourcent qui te créée une fenêtre de code <pre></pre>. Il y aussi la possibilité d'afficher la page au format raw : http://websemantique.org/BacAsableIrc/raw . Mais du coup, dans un cas comme dans l'autre, les URL publiées sur la canal ne seront pas converties en hyperliens sur le wiki... C'est pour cela que je milite plus pour une solution côté serveur avec un handler du type append : on peut, du coup, plus facilement gérer qui publie et ce qu'on publie. -- CharlesNepote
- Oui, mais du coup on n'aurait plus la possibilité d'utiliser la balisage wiki pour forcer un effet particulier... Pas simple la vie :) Je vais essayer de règler cela à coup d'expressions régulières. -- EricVanDerVlist
- Cela a un peu progressé suite à nos expérimentations! Le robot journalise maintenant sur http://websemantique.org/JournalIrc20040203 . En ce qui concerne l'authentification, je viens seulement de comprendre ce que tu voulais dire! Je n'ai pas de problème pour utiliser l'authentification HTTP classique et c'est ce que je voulais dire. Si utiliser l'authentification wikini suppose de simuler un utilisateur pour récupérer les cookies, c'est une autre paire de manches mais cela semble faisable. J'arrive maintenant à m'authentifier et ai intégré cela dans le robot... En principe, il devrait maintenant protéger ses (nouvelles) pages en écriture. -- EricVanDerVlist
- Bravo pour les résultats obtenus. Je trouve cependant un peu dommage que tu ais fait autant de travail côté client (ton robot) alors qu'on aurait intérêt à modifier le plus possible WikiNi afin qu'il offre un comportement générique pour d'autres robots. Par exemple, je pense que l'authenfication des robots doit être simplifiée côté WikiNi afin de pouvoir supporter plus facilement d'autres robots : j'hésite encore sur l'authentification HTTP de base (je ne sais pas si elle est possible) et l'authentification à l'intérieur du formulaire "POST", les nom d'utilisateur et mot-de-passe étant envoyés en même temps que les données du "append". Dans tous les cas, on aurai donc plus besoin d'utiliser des cookies pour identifier les robots. Le problème est le même pour la protection des pages. -- CharlesNepote
- On pourra voir cela par la suite, pour le moment c'est plus rapide de progresser sur un seul front (le client) et cela reste limité à quelques lignes de Python! J'ai créé une classe du gère l'interface avec le wiki et ce sera facile à modifier si on veut le faire et quand on aura une meilleure idée de nos besoins (pour l'instant les idées bouillonnent et je ne sais pas trop jusqu'où cela va nous conduire)... -- EricVanDerVlist
Rotation des journeaux
En dehors de cela, il faudra voir comment gérer la rotation journaux. --
EricVanDerVlist
- Et bien, quant ton robot ajoute une chaine, il n'a qu'à l'ajouter à la page <date du jour><nom_de_page>, ce qui donnerai par exemple : 20040203IRC, 20040204IRC, etc. (attention mes exemples ne sont pas des MotWiki) -- CharlesNepote
- Hmmm... je viens de tester et http://websemantique.org/BacAsableIrc2/append?content=foo&submit=direct crée effectivement une nouvelle page. La seule restriction que je vois est qu'il serait intéressant d'avoir (comme les autres systèmes de ce type) une adresse générique pour la journée en cours qui redirige sur (ou soit identique à) la page de la date du jour. -- EricVanDerVlist
- Avec WikiNi, c'est très simple de développer une petite action (macro) de ce genre (mettons 1 heure de boulot tout compris). On pourrait avoir une macro du genre : {{redirect prefix="today" page="IRC"}}, à insérer dans une page générique comme SurIRCAujourdHui?... (les paramètres de l'action sont à creuser...). -- CharlesNepote
- Oui, ce serait bien! -- EricVanDerVlist
- Tu peux essayer de remplacer l'action redirect.php par le code ci-dessous dans /actions/.
- Pour l'utiliser {{redirect page="NomDePage" suffix="today"}} qui va te donner une redirection vers NomDePage20040204 pour aujourd'hui. (Tu peux aussi utiliser {{redirect page="NomDePage" prefix="today"}} pour préfixer plutôt que suffixer). -- CharlesNepote
- C'est en place (page JournalIrcDuJour) avec une toute petite modification pour tenir compte de la réécriture des URLs. -- EricVanDerVlist
- Je ne comprends pas pourquoi tu tu as fait cette modification pour tenir compte de la réécriture des URLs : sur mon site de test (intranet), la réécriture d'URL fonctionne bien avec le redirect.php initial, sans modification. Peux-tu m'en dire un peu plus car je compte intégrer ces modifications dans la prochaine version de WikiNi (cf. WikiNi:ActionRedirect (interwiki). -- CharlesNepote
- Le redirect initial marche, mais il renvoie sur l'URL en waka.php?... et ce sont des URLs que je souhaiterais ne pas exposer! -- EricVanDerVlist
<?php
# Permet de faire une redirection vers une autre pages Wiki du site
#
# Parametres : page : nom wiki de la page vers laquelle ont doit rediriger (obligatoire)
#
# exemple : {{redirect page="BacASable"}}
#
# copyrigth Eric Feldstein 2003 mailto:garfield_fr@tiscali.fr
#
# Licence GPL, vous etes libre d'utiliser et de modifier ce code a condition de
# laisser le copyright d'origine. Vous pouvez bien sur vous ajouter a la liste
# des auteurs.
#
# Installation : copier le fichier dans le repertoire "actions" de WikiNi
//recuperation du parametres
$redirPageName = $this->GetParameter("page");
if ($this->GetParameter("suffix") == "today") $redirPageName .= date("Ymd");
if ($this->GetParameter("prefix") == "today") $redirPageName = date("Ymd").$redirPageName;
if (!$this->GetParameter("page")){
echo $this->Format("//Le paramêtre \"page\" est manquant.//");
}else{
if (eregi("^".$redirPageName."$",$this->GetPageTag())){
echo $this->Format("//Impossible à une page de se rediriger vers elle même.//");
}else{
$fromPages = array();
$fromPages = explode(":",$_COOKIE['redirectfrom']);
if (in_array($this->GetPageTag(),$fromPages)){
echo $this->Format("//Redirection circulaire.//");
}else{
$fromPages[] = $this->GetPageTag();
SetCookie('redirectfrom', implode(":",$fromPages), time() + 30, "/");
// $this->Redirect("wakka.php?wiki=$redirPageName");
$this->Redirect("/$redirPageName");
}
}
}
?>
Code du handler append
Un deuxième petit jet de code à retravailler. (avec modifs pour gérer UTF-8 et invalider GET) --
EricVanDerVlist
<?php
// append.php version 0.03 (04/02/2004)
// par Charles Népote et Éric van der Vlist
// Licence GPL.
//vérification de sécurité
if (!eregi("wakka.php", $_SERVER['PHP_SELF'])) {
die ("accès direct interdit");
}
// /append&submit=direct&content=khhjkhhjk
// Tests pour valider la demande
// Actions avant la publication
// Publication
// Action après la publication
// Si interactif : Redirect
// Tests pour valider la demande
// Alimente les variables
if ($_POST["content"])
{
$content = mb_convert_encoding($_POST["content"], "ISO-8859-15", "UTF-8");
$submit = $_POST["submit"];
}
//else if ($_GET["content"])
//{
// $content = $_GET["content"];
// $submit = $_GET["submit"];
//}
else break;
//
if ($this->HasAccess("write") && $this->HasAccess("read"))
{
//echo "UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU", $submit;
AppendContent($content, $submit);
}
else echo "<i>Vous n'avez pas accès en écriture à cette page !</i>\n";
//------------------------------------------------------------
function AppendContent($content, $submit)
{
global $wiki;
$page = $wiki->LoadPage($wiki->tag);
$body = $page["body"];
//echo "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY";
// only if saving:
if ($submit == "direct")
{
//echo "Direct";
// store
if (!$error)
{
//echo "888888888888",$body,"9999999999999";
$body = $body."\n".$content;
//echo "00000000000000000000000",$body;
// add page (revisions)
$wiki->SavePage($wiki->tag, $body);
// now we render it internally so we can write the updated link table.
$wiki->ClearLinkTable();
$wiki->StartLinkTracking();
$dummy = $wiki->Header();
$dummy .= $wiki->Format($body);
$dummy .= $wiki->Footer();
$wiki->StopLinkTracking();
$wiki->WriteLinkTable();
$wiki->ClearLinkTable();
// forward
$wiki->Redirect($wiki->href());
}
}
}
?>
--
CharlesNepote