❯~/pixelastic

Caracole - Gestion des flux RSS

Cela faisait quelques temps que je souhaitais ajouter une gestion des flux RSS à Caracole. J'ai donc recherché du coté du RssHelper intégré à cakePHP et l'ai quelque peu modifié pour qu'il s'adapte à mes besoins.

En effet, il manquait selon moi quelques fonctions extremement importantes pour la génération d'un flux complet, par exemple la possibilité de spécifier des attributs aux différents noeuds, ou encore de passer le contenu entre balises

.

Mais surtout la possibilité d'ajouter des noeuds de façons récursive, la fonction RssHelper::item() ne permettant d'ajouter des noeuds qu'à un seul niveau.

Bref, j'ai revu tout cela dans ma propre version du Helper, avec une autre fonction pratique pour ajouter un thumbnail à un post. Pour voir ce que cela donne, et il vous suffit de vous abonner aux flus disponibles sur les pages du blog ou sur la page Réalisations

J'ai découvert la syntaxe d'un flux RSS il y a seulement quelques jours, et je n'ai testé le résultat qu'avec Netvibes, je pense donc qu'il me faut me livrer à quelques tests supplémentaires.

En tout cas, il me suffit maintenant d'ajouter une variable $rssFeed à un modèle pour qu'un flux RSS lui soit automatiquement généré (on peut préciser bien sur les informations devant être affichées pour chaque modèle). Voila qui encore un pas de plus pour Caracole :)

Caracole - Antispam des adresses mails

Attention : Ce post n'est plus d'actualité. Je n'utilise plus du tout cette technique pour masquer les adresses mails car elle bloquait complétement la lisibilité aux personnes sans Javascript. Je n'ai pas encoe trouvé de meilleure alternative pour le moment, néanmoins.

Pour faire suite au billet précédent, un autre problème que j'ai rencontré dans le développement des sites était un moyen sûr d'empecher qu'une adresse mail exposée sur un site ne soit récupérée par des robots crawlers et ne deviennent la cible de leurs spams.

Je parse donc chaque texte affiché afin de remplacer les adresses mails par une version cryptée, que Javascript décryptera à l'affichage. A chaque affichage la clé de cryptage est différente. Bon, l'algorithme de cryptage est extremement simple, c'est juste une permutation alphabétique, chaque lettre est remplacée par une autre. Et la clée est indiqué dans l'attribut title de mon code généré.

Il suffit d'étudier le Javascript pour réussir à comprendre comment décrypter les mails, mais cela demande que le robot ai intégré mon codage dans ses paramètres, ce qui n'est à priori pas le cas. Et quand bien même se serait le cas, je changerai la façon de crypter la clé.

Jetez un oeil au code source de cette page si vous le souhaitez pour voir comment cette adresse : blabla@somewhere.com est écrite.

Cela devrait être quelque chose de la forme :

<span title="97tasbw84fv6_q3pn5yirchya15nq.p9b_jziggtc40lfolwxxk@meo26m70zj2d-sur@hev8u1-dk.3" class="protectFromSpam">
  <span class="noscript">
    <span class="icon icon_notice"></span>
    Cette adresse mail est protégée contre le spam, vous devez activer Javascript pour pouvoir la voir.
  </span>
  <span class="cryptedMail">ageh9gxvw1bag4342e</span>
</span>

Bon alors bien sur, cela nécessite Javascript activé, c'est un gros défaut, je l'admets. Un message permet de ne pas laisser l'utilisateur sans JS dans l'incompréhension, mais ça reste problématique malgré tout. Je n'ai pas réussi à faire mieux pour le moment.

Caracole - Spam sur les commentaires

Les trois derniers sites que j'ai fait avec Caracole avaient tous un formulaire de contact (nom, mail et texte, pour contacter le propriétaire du site).

Et tous les trois se sont fait spammer rapidement une fois que le site est arrivé dans les moteurs de recherche. J'ai donc cherché moyen d'empecher cela, une façon de detecter les spammeurs.

Alors, il existe bien sur Akismet, qui marche du tonnerre, mais qui est payant pour un usage professionnel, j'ai donc d'abord cherché du coté des solutions gratuites.

Il y a le projet reCaptcha, qui en plus d'empecher le spam, permet d'aider la numérisation de vieux livres, donc une assez bonne idée mais qui ne semble pas disponible en français. C'est malheureusement un impératif sur les sites que je développais.

J'ai donc plutot retourné le problème dans ma tête et cherché un moyen facile et ingénieux de faire la différence entre un humain et un bot. J'ai finalement opté pour un champ caché au sein du formulaire qui doit absolument rester vide. Un bot le remplira automatiquement, un humain le laissera vide.

J'avais tout d'abord mis ce champ en type="hidden" et cela semblait fonctionner, mais de plus récents spams me l'ont fait passer en  display:none par CSS et je n'ai pas eu de nouveau spam depuis. Je continuerai de peaufiner le système jusqu'à ce que je trouve un blocage parfait ou que j'en ai marre et que je me tourne vers Akismet :)

Pour le moment, je loggue toutes les demandes de contact avec les informations du Header, afin d'identifier certains patterns qui pourraient me permettre de trouver plus facilement les spammeurs dans le lot.

Caracole - Export des adresses mails

Je viens de rajouter une petite fonctionnalité sur Caracole qui permet d'exporter une liste d'adresses mails (actuellement les personnes souhaitant s'abonner à une newsletter) dans un format exploitable par les logiciels de messagerie et les webmail.

La liste peut être exportée sous format vCard, ou encore CSV exploitable par Outlook ou GMail.

Validation et génération de numero de SIRET

Pour le projet sur lequel je travaille actuellement, je dois tester la validatée d'un numero de SIRET. D'après [Wikipédia](http://fr.wikipedia.org/wi ki/Syst%C3%A8med%E2%80%99identification_du_r%C3%A9pertoire_des%C3%A9tablisse ments) les numéros de SIRET possèdent une clé finale permettant de vérifier qu'ils soient biens formés.

J'ai donc retranscris ce calcul sous une règle de validation pour cakePHP, le voici :

function validateSiret($data, $field) {
  $siret = r(' ', '', $data[$field]);
  $sum = 0;
  for($i=0;$i!=14;$i++) {
    $tmp = ((($i+1)%2)+1) * intval($siret[$i]);
    if ($tmp>=10) $tmp-=9;
    $sum+=$tmp;
  }
  return ($sum%10===0);
}

Tout d'abord, je m'assure que le siret ne contienne pas d'espace. Puis je passe nombre après nombre pour calculer la somme (je multiplie par deux les nombres d'index pair et par un ceux d'index impair). Si le résultat est supérieur à 10, j'additionne chaque chiffre entre eux (ce qui équivant à soustraire 9).

Si le résultat final est congru à 10, alors le numero de SIRET est valide.

Il ne reste plus qu'à l'ajouter à mes régles de validation :

var $validate = array(
  'siret' => array(
    'rule' => array('validateSiret', 'siret'),
    'message' => "Le numero de SIRET indiqué n'est pas valide."
  )
);

Mais ce n'est pas tout. Comme pour mes tests je crée à la volée des dizaines d'enregistrements, j'avais besoin d'un générateur automatique de numero de SIRET valides. Voici ce que j'ai fini par écrire :

public function siret() {
  //On génère le début du numero de siret
  $siret = '';
  $sum = 0;
  for($i=0;$i!=8;$i++) {
    $rand = mt_rand(0,9);
    $siret.=$rand;
    //On ajoute une fois le résultat si index impair, deux fois sinon
    $tmp = $rand * (1+($i+1)%2);
    if ($tmp>=10) $tmp-=9;
    $sum+=$tmp;
  }
  //On ajoute 4 zeros
  $siret.="0000";
  //On regarde combien il me manque pour etre congru à 10
  $diff = 10-($sum%10);
  if ($diff>2) {
    $first = floor($diff/3);
    $second = $diff-(2*$first);
    $siret.=$first.$second;
  } else {
    $siret.='0'.$diff;
  }

  return preg_replace("/([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{5})/", "$1 $2 $3 $4", $siret);
 }

Le principe consiste à générer les 8 premiers nombres de façon complétement aléatoire et d'en calculer la "somme" (selon le principe évoqué au dessus). Puis on ajoute des zero pour combler l'espace jusqu'à ajouter la clé de vérification.

Bien sur, la clé on va la créer pour que la somme de (2 x le premier chiffre)

  • (1 x le second) soit égal à ce qu'il nous manque pour être congru à 10.

Et on fini par retourner le numero de façon lisible, par exemple : 774 082 010 00034.

J'ai fait une petite recherche sur societe.com, aucun de mes numeros générés ne semble donner de résultat, malgré tout ils sont syntaxiquement valides.