Ce qu’il y a de merveilleux, avec CodeIgniter, c’est sa légèreté. Bien sûr, comme le diraient certains, il n’y a rien de mieux que Ruby On Rails (non, je ne vise personne), mais dans le cas qui se présente, la légèreté de CI est un atout non-négligeable.
J’étais donc occupé à développer un petit système de commentaire pour un projet, et la question du spam est bien entendue venue me titiller les neurones. La façon la plus simple de traiter un problème étant parfois de demander son avis à Google, j’ai trouvé la librairie Akismet pour CodeIgniter.
Exemple :
class Comment extends Controller { function Comment() { parent::Controller(); $this->load->library('akismet'); } function save() { # Récupération des données saisies dans le formulaire $comment = array( 'id_object' => $this->input->post('object_id'), 'author' => $this->input->post('author'), 'website' => $this->input->post('website'), 'email' => $this->input->post('email'), 'ip' => $this->input->ip_address(), 'text' => $this->input->post('text'), 'created_at'=> unix_to_mysql(now()) ); # Configuration de la librairie Akismet $config = array( 'blog_url' => base_url(), 'api_key' => 'xxxxxxxxxxxx', 'comment' => $comment ); $this->akismet->init($config); # Si akismet retourne une erreur if ( $this->akismet->errors_exist() ) { # Clé invalide if ( $this->akismet->is_error('AKISMET_INVALID_KEY') ) { log_message('info', '[Comment] La clé Akismet est invalide'); } # Pas de réponse du serveur elseif ( $this->akismet->is_error('AKISMET_RESPONSE_FAILED') ) { log_message('info', '[Comment] Le serveur Akismet ne répond pas'); } # Le serveur n'a pas été trouvé elseif ( $this->akismet->is_error('AKISMET_SERVER_NOT_FOUND') ) { log_message('info', '[Comment] Le serveur Akismet n'a pas été trouvé'); } # On enregistre le commentaire avec statut invalide pour validation manuelle log_message('info', '[Comment] Impossible d'obtenir une réponse du serveur Akismet, enregistrement du commentaire avec statut invalide'); $comment['available'] = 0; $comment['is_spam'] = 0; $this->db->insert('comments', $comment); } # Si on a obtenu une réponse du serveur else { # Si Akismet pense que c'est un spam if ( $this->akismet->is_spam() ) { # Enregistrement du commentaire avec statut is_spam à TRUE log_message('info', '[Comment] Akismet : spam detected'); $comment['available'] = 0; $comment['is_spam'] = 1; $this->db->insert('comments', $comment); } # Sinon, ce n'est pas un spam, tout va pour le mieux dans le meilleur des monde... else { # Enregistrement du commentaire et publication immédiate log_message('info', '[Comment] Akismet : comment clean, saving'); $comment['available'] = 1; $comment['is_spam'] = 0; $this->db->insert('comments', $comment); } } } }
Il ne reste plus qu’a notifier l’administrateur par e-mail et l’utilisateur de l’action qui à été effectuée.
Tags: