Introduction à la contrib pour Spip 1.8.3
Cette méthode [2] ne touche pas au noyau de Spip. Si, à première vue, elle semble compliquée, c’est parce que l’installation touche à plusieurs fichiers :
- ecrire/mes_options.php3 (script pour transformer les liens) ;
- mes_javascripts.js (script pour décoder les liens) ;
- commat.gif (image d’une arobase) ;
- création d’une squelette « version imprimable » ;
- squelette(s) (ajouter 2 lignes : inclusion de mes_javascripts.js et lien pour appeler la version imprimable).
Ces 5 étapes sont décrites en détail plus bas.
Description
La page à l’écran
Un raccourci e-mail [->quelquun@autre.part.org]
est d’habitude converti en HTML de la façon suivante :<a href="mailto:quelquun@autre.part.org" class="spip_out">quelquun@autre.part.org</a>
— ce qui laisse le champ ouvert pour les robots spam.
Intercepté par le code que nous mettons dans mes_options.php3
ce lien va être réécrit pour devenir :
<a href="#" title="quelquun..åt..autre.part.org" onClick="location.href = dolink(this.title); return false;">[Email]</a>
Il n’y a plus d’arobase ni de « mailto» pour orienter les robots. Lorsque le visiteur clique sur le lien c’est le JavaScript onClick
qui est exécuté. Ce script reconstitue le lien.
Et si le visiteur n’a pas JavaScript ? (Il s’agit vraiment de très peu de personnes.) C’est certain : ils ne pourront pas utiliser le lien. Ils peuvent pourtant lire l’adresse en survolant le lien avec la souris. Pour aider ceux qui ont ce problème, je mets un mot explicatif sur la page « technique » du site :
Parce que le spam est devenu un problème grandissant, nous sommes très prudents dans la manière de mettre publiquement à disposition des adresses e-mail. Celles-ci ne figurent pas sur les pages de ce site, mais sont créées uniquement au moment où le visiteur clique sur un lien. Les visiteurs qui n’ont pas Javascript ou un programme e-mail ne pourront pas utiliser le lien. Cependant, quand le curseur passe sur le lien, un « infobulle » apparaît avec l’adresse e-mail (sous une forme difficile à lire pour les robots spam, mais dont la plupart des visiteurs pourront faire usage).
La version imprimable
Cela ne sert à rien d’imprimer une page d’informations avec les adresses e-mail cachées. Cette page, par exemple, ne vaudrait pas grand-chose reproduite sur du papier.
Pour la version imprimable donc (cliquer sur le lien « version imprimable ») on transforme le lien autrement. On rend l’adresse e-mail visible (dans le cas où elle a été cachée derrière le lien) en remplaçant l’arobase avec une petite image d’arobase. L’adresse s’imprime donc sur papier, mais il n’y pas de lien cliquable à l’écran de cette version imprimable. Tant qu’on y est, on fait la même chose pour les liens web. [3]
Installation
1. Le script principal
Dans un fichier mes_options.php3 (à créer, si tu n’en a pas déjà, dans le répertoire /ecrire) ajouter cette fonction [4] :
<?php
function apres_propre($texte) {
// Antispam
// Dernière mise à jour : 1/12/2005
//
// Variables qui peuvent être modifiées à volonté mais si $arobase est modifiée
// if faut aussi modifier la fonction JavaScript "dolink"
$arobase = '..åt..'; // tip visible OnMouseOver
$affichage = '[Email]'; // affichage par défaut d'un lien mail sans texte
// *** pour version imprimable
if ($_GET['printver']) {
$masque = '<img src="IMG/commat.gif" alt="" width="13" height="13" style="vertical-align: middle;" />';
preg_match_all('/<a[\\s]{1}[^>]*href=["\']?([^>\\s"\']+)["\']?[^>]*>([^<]*)<\\/a>/is', $texte, $found);
$total = count($found[0]);
for($i=0; $i < $total; $i++) {
if (preg_match("/^mailto:(.*)/",$found[1][$i],$link)) {
// *** alors il s'agit d'un lien email
$href = $link[1];
} else {
// *** c'est une adresse web
$href = $found[1][$i];
}
$linktext = $found[2][$i];
// *** si le texte du lien contient déjà l'adresse ou s'il s'agit d'une
// *** ancre locale on peut jeter l'adresse.
if ($linktext == $href || strpos($href,"#") === 0) { $href = "";}
// *** sinon l'ajouter entre crochets.
if ($href > "") { $href = "[". trim(str_replace("@", $masque,$href)) ."]";}
if (preg_match("/\s*\S+[\w_-]@[\w_-]\S+\s*/",$linktext)) {
// *** attention : détecter précisément une adresse mail pour éviter de
// *** corrompre des raccourcis comme [<imgXX>->quelquun@nullepart.net]
// *** où Spip code la première partie dans un format
// *** comme : @@SPIP_SOURCEPROPRE2@@
$linktext = trim(str_replace("@", $masque,$linktext)." ".$href);
} else {
$linktext = trim($linktext." ".$href);
}
$texte = str_replace($found[0][$i], $linktext, $texte);
}
} else {
// *** pour la page à l'écran
// *** agir seulement sur les emails
preg_match_all("/[\"\']mailto:([^@\"']*)@([^\"']*)[\"\']/",$texte,$found);
$total = count($found[0]);
for($i=0; $i < $total; $i++) {
// *** extraire les deux parties de l' adresse (avant et après l'arobase)
// *** et réécrire le lien
$part1 = $found[1][$i];
$part2 = $found[2][$i];
$newstr ='"#" title="' . $part1 . $arobase . $part2 . '" onClick="location.href = dolink(this.title); return false;"';
$texte = str_replace($found[0][$i], $newstr, $texte);
}
// *** si le texte d'un lien contient une adresse email, le remplacer par le texte choisi
preg_match_all("/>\s*\S+[\w_-]@[\w_-]\S+\s*<\/a/",$texte,$found);
$total = count($found[0]);
for($i=0; $i < $total; $i++) {
$texte = str_replace($found[0][$i],">$affichage</a",$texte);
}
}
return $texte;
}
?>
2. Le JavaScript qui recrée le lien
Mettre cette fonction dans un fichier mes_javascripts.js
[5] annexe qui sera reliée depuis vos squelettes :
function dolink(ad){
link = 'mailto:' + ad.replace(/\.\..+t\.\./,"@");
return link;
}
3. L’image de l’arobase (pour version imprimable)
Placer l’image de l’arobase (commat.gif) [6] dans le répertoire /IMG
.
4. Squelette « version imprimable »
Créer un couple de fichiers pour le squelette de version imprimable (imprim.php3
et imprim.html
). Pour ce qui concerne l’antispam ce squelette n’a besoin de rien en particulier.
5. Dans tes squelettes [7]
- Dans la partie <head>
de ton squelette, mettre la ligne [8] :
<script type="text/javascript" src="mes_javascripts.js"></script>
- Ajouter un lien qui appellera l’article avec le squelette de « version imprimable ». Par exemple :
<a href="imprim.php3?id_article=#ID_ARTICLE" target="_blank" onClick="javascript:window.open('imprim.php3?id_article=#ID_ARTICLE&printver=1', 'print_version', 'scrollbars=yes, resizable=yes, menubar=yes, width=740, height=580'); return false;"><:ver_imprimer:></a>
Note : Cette méthode va attraper presque tous les adresses e-mail : celles résultantes d’un raccourci SPIP, comme celles entrées à la main en HTML [9]. Pour une sécurité plus grande, il est possible d’ajouter le filtre
|antispam
à toutes les balises qui sont susceptibles de contenir des adresses e-mail, et ceci aussi bien dans le squelette normal que dans le squelette « imprim.html ». Par exemple,[(#TEXTE|antispam)]
. Ce filtre inclus dans SPIP transforme toutes les arobases en une série aléatoire de 3 caractères.
Fichiers à télécharger
Dans le fichier ci-joint se trouvent les fichiers avec tout le code noté ci-dessus.
Pour mieux comprendre ou améliorer le système
Regarder les lignes marquées par des commentaires avec trois étoiles *** dans le fichier mes_options.php3
et dans le squelette article.html
.
Discussions par date d’activité
13 discussions
Bonjour,
Est ce que ce plugin va être adapté à spip 2.1 ?
Et est ce que le code a insérer dans mes_options fonctionne pour spip 2.1 ?
Merci
PS : mon but est de pouvoir installer ce plugin sans devoir passer par le couteau suisse
Non. En tout cas, pas par moi. J’utilise le Couteau Suisse qui marche mieux et qui est bien maintenu par Pat.
Je ne pense pas.
Répondre à ce message
Bonjour,
J’ai chaque mailto derrière une image. Le problème c’est que le « alt » affiche correctement les adresses mail sous IE7, mais sous Firefox (2.0 ou 3.0), le même « alt » s’affiche pour tous, en l’occurrence le premier...
Ma page est ici : http://www.lpp.fr/spip.php?rubrique6
Ce n’est pas du « alt » mais du « title » dont je voulais parler, bien sûr.
J’ai remarqué un comportement similaire sur d’autres sites. Cela semble donc être la faute de Firefox...
Après divers tests (merci à la communauté Mozilla française), le problème vient du code javascript qui ne semble pas être standard, et qui produit donc des résultats différents à l’exécution.
Comme vous voyez en haut de cet article : « (24/09/2007) : Ce sont maintenant deux outils du plugin Couteau Suisse qui reprennent et améliorent le fonctionnement de ce plugin qui est désormais périmé. » je n’ai plus rien fait pour ça depuis longtemps. Moi-même j’utilise le mailcrypt incorporé au Couteau Suisse.
Répondre à ce message
Pour info le zip de l’article bug avec la 1.9.3 ; pour le telechargement auto
il demande un repertoire /lib a la racine du site avec les droits en 777 et se telecharge dedans ; donc coté interface plugins on ne peu le voir....
sinon il est dit : note (10/6/2007) : avec l’aide d’Alexis Roussel ce script a été converti en plugin pour Spip 1.9.x ; il est disponible sur la zone parmi les plugins stables.
ors le plugin ne se trouve pas coté « stable » mais coté « test » ; donc toujours pareil pour la mise a jour auto nada puisque l’adresse http://files.spip.org/spip-zone/mailcrypt.zip
n’existe pas.
Il serait interessant de préciser dans l’article que mailcrypt est une lame du couteau suisse ; d’ailleur je m’en vais l’installer pour voir ...
@micalement stéphane
Maintenant que la fonction pour les pages imprimables a été ajoutée au couteau suisse (voir ici), j’ai ajouté cette mention en tête d’article.
Répondre à ce message
Je reposte ce que j’ai posté dans le forum du couteau suisse, car je ne sais pas trop quel forum est le plus adapté...
Bonjour, j’utilise (entre autre) l’outil mailcrypt du couteau suisse.
J’ai une proposition d’amélioration lorsque on a un lien mail sans texte.
Imaginons que le mail soit
toto@truc.net
Au lieu de mettre [Email] comme texte on pourrait mettre :toto<span class="mc_invisible">..</span>@<span class="mc_invisible">..</span>truc.net
avec évidemment le style
span.mc_invisible { display: none; }
à l’affichage (et à l’impression ;-) ) ça affiche simplement le mail, le lien de type mailto: est toujours géré par le javascript et les robots (d’après http://aspirine.org/cgi-bin/trouvemail.pl ) ne trouvent pas le mail...
Bref, tout le monde est content !
Qu’en pensez-vous ?
Aedrin
PS : par contre je suis une bique en PHP donc je ne sais pas quoi proposer directement en code....
Bonjour, Je ne suis pas sûr que les robots ne sauraient pas lire des adresses comme ça. Dès qu’il il existe un « @ » en texte dans la page le danger de la récuperation de l’adresse est sensiblement plus grand.
Une solution avec des images se discute (voir ici, mais, pour l’instant je ne la trouve pas très convaincant.
Répondre à ce message
Bonjour,
comme cette contrib n’était apparemment pas écrit pour un plugin, si je comprend bien le début de cet article, je ne sais pas qu’est-ce qui est encore nécessaire à l’installation ou qu’est-ce qui diffère...
J’ai suivi la description en entier et les adresse mails fonctionnent bien.
Seulement la version imprimable ne fonctionne pas bien, l’image gif n’apparait pas. Dans le code source le src de l’image est vide
Qu’est-ce qui pourrait être le problème ?
Merci pour cette contrib et pour vos éventuels réponses.
Joz
Bonsoir, depuis quelque temps cette fonctionnalité est intégré dans le plugin « Couteau Suisse » http://www.spip-contrib.net/Le-Cout....
Je pense que c’est cette version là qu’il faudrait utilisée désormais.
ok, merci.
Est-ce que j’ai quand même besoin d’ajouter (ou plutôt le laisser puisque je l’ai déjà mis) tout ce qui est décrit ici plus haut (l’entrée dans mes options, le fichier javaScript, l’image @ etc) ou est-ce que tout cela est compris dans le couteau suisse ?
joz
Je crois que tout est intégré dans le couteau. (Je n’ai pas pu l’installer encore par manque de temps.)
Le couteau suisse comprend le système de filtrage des mails qui marche bien.
Avec le plugin mailcrypt comme avec le couteau suisse rien à faire d’autre qu’à activer soit la lame du couteau soit le plugin... Ca se fait en deux clics.
Par contre à ma connaissance le couteau suisse ne propose pas le js d’impression associé, qui moi me semble indispensable. Pour que ça fonctionne il faut que tu penses à mettre la balise (je ne sais plus le nom, c’est expliqué dans le plugin) dans tes squelettes.
Répondre à ce message
Bonjour,
J’ai installé le plugin mailcrypt avec spip 1.9.1 mais lorsque je clique sur l’adresse email de la personne à qui je veux écrire (dans un annuaire) il ne se passe rien. Par contre ca fonctionne dans l’espace privé. Y a t il une étape supplémentaire à effectuer après l’installation du plugin ?
Merci d’avance
Bonjour,
Je ne l’ai jamais utilisé avec 1.9.1 (et c’est pour cela qu’il n’y a pas de mot-clé 1.9.1 à cet article). Il est possible que pour cette version la balise #INSERT_HEAD soit nécessaire dans les squelettes (voir http://www.spip.net/en_article3471.html). Ceci dit, mieux vaut faire une mise à jour vers 1.9.2 qui corrige bcp. de bugs.
Si cela ne marche pas, éventuellement, donner un URL pour permettre une examination plus concrète.
Répondre à ce message
Dit moi dans un forum on doit toujours donner les points négatifs ???
Ahhh je suis rassuré.
Bravo .....Superbe..... Pfffffffff les spam vont me manquer ; nan je rigole.
Répondre à ce message
Voici une premiere proposition de plugin a tester.
quelques notes :
- le cryptage fonctionne sur 1.9.1 : A tester
- la balise #PRINT existe mais ne fait rien (travail necessaire sur le fichier print.php)
- les fichiers ne sont pas tres ordonnés
- le plugin n’existe pas encore sur http://trac.rezo.net/trac/spip-zone/browser/_plugins_/
- Il n’y a pas de licence.. cela sera GPL
Magnifique. Merci, Alexis !
Je regrette ne pas pouvoir spiper en ce moment. Je compte y revenir l’année prochaine !
Paolo
Un autre plugin est à disposition sur spip-contrib :
Plugin antispam générique
Merci d’y ajouter vos commentaires et remarques. L’idéal serait de mettre en commun nos ressources pour en faire LE plugin d’antispam.
Répondre à ce message
bonjour,
merci de me dire si je peux utiliser cette contrib avec eva 2.0 et spip 1.7.2 mon site est fait avec.
Si je ne me trompe pas le point d’entrée « apres_propre » n’existe pas avec Spip 1.7.2. En ce cas cette contrib n’y marchera pas.
Répondre à ce message
Super, merci, fonctionne très bien sur une 1.8.3.
Répondre à ce message
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |