Archive

Hacker et cloacker son flux RSS WordPress en 2 minutes

p>Article mis à jour le 02 mars 2013 : ajout de l’exemple n°3 qui va un peu plus loin…

Voilà un petit « hack » pour prendre facilement la main sur votre flux quelque soit le CMS utilisé. Ca peut-être utile :

  • Lorsque vous changer l’url de votre blog, mais que votre ancien flux est repris par des agrégateurs ou des services pour lesquels vous ne pouvez pas effectuer de changement d’URL.
  • Si vous souhaitez modifier très simplement votre flux et avoir la main sur ce qu’il affiche ou n’affiche pas… Mais pour le coup on ne parle pas de cloacking pour Google…
  • Assembler deux flux en un seul (voir exemple n°3)

La méthode est très simple :

  1. On ajoute une ligne au .htaccess
  2. On paramètre son fichier PHP qui renverra le XML (le RSS)

1. Ajout de la ligne au htaccess

L’exemple est donné pour un site sous WordPress avec la réécriture par défaut qui place le flux : http://example.com/feed. Nous appellerons dans l’exemple le fichier qui gère le flux « feed.php ». La redirection n’est pas visible, il s’agit d’une RewriteRule vers un fichier qui est présent dans le même dossier que votre site. Ainsi http://example.com/feed sera toujours accessible et affichera le contenu de feed.php dans l’exemple :

RewriteRule /feed feed.php

Pour les utilisateurs de WordPress mieux vaut placer la Rule avant les règles WP.

2. Paramétrage du fichier feed.php

Exemple n°1 : charger le flux d’un autre site

<?php

header (‘Content-Type:text/xml’);

$file = @file_get_contents(‘http://exemple.com/feed’);

print_r($file);

Exemple n°2 : cloacking sur User Agent

<?php

header (‘Content-Type:text/xml’);

// C’est juste pour l’exemple hein…
$ua = (isset($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : null;

$url_feed = ‘http://exemple.com/feed’;

if(strpos($ua,’CrawlerPatapouf’) !== false) $url_feed = ‘http://exemple.com/feed_cloacked.php’;

$file = @file_get_contents($url_feed);

print_r($file);

Si tu as déjà entendu parlé de SEO et de backlink, tu peux avoir une idée de ce à quoi un tel cloacking sur UA peut servir…

Exemple n°3 : assembler les flux de plusieurs sites

Dans mon cas j’ai divisé mon ancien blog qui commençait à dater… 2008, c’est plus tout jeune en deux blogs. J’ai donc assemblé les deux flux des nouveaux sites en un seul pour le présenter à mes anciens abonnés.

<?php
header (« Content-Type:text/xml »);

$xmlHeader = ‘<?xml version= »1.0″ encoding= »UTF-8″?>
<rss version= »2.0″
xmlns:content= »http://purl.org/rss/1.0/modules/content/ »
xmlns:wfw= »http://wellformedweb.org/CommentAPI/ »
xmlns:dc= »http://purl.org/dc/elements/1.1/ »
xmlns:atom= »http://www.w3.org/2005/Atom »
xmlns:sy= »http://purl.org/rss/1.0/modules/syndication/ »
xmlns:slash= »http://purl.org/rss/1.0/modules/slash/ »
>

<channel>
<title>Votre title</title>
<atom:link href= »http://example.com/feed/ » rel= »self » type= »application/rss+xml » />
<link>http://example.com</link>
<description>Ma description</description>
<lastBuildDate>’.date(‘D, d M Y H:i:s O’).’</lastBuildDate>
<language>fr-FR</language>
<sy:updatePeriod>hourly</sy:updatePeriod>
<sy:updateFrequency>1</sy:updateFrequency>
<generator>http://wordpress.org/?v=3.4.2</generator>
<xhtml:meta xmlns:xhtml= »http://www.w3.org/1999/xhtml » name= »robots » content= »noindex » />
‘;

echo $xmlHeader;

// On charge les différents flux

$feeds[] = @simplexml_load_file(‘http://example1.com/feed’);
$feeds[] = @simplexml_load_file(‘http://example2.com/feed’);

// On les stocks dans un tableau

$allItems = array();
foreach($feeds as $feed)
if(empty($feed)) continue;
foreach($feed->channel->item as $i)
$allItems[strtotime($i->pubDate)][] = $i;

// On tri pour afficher les plus récents en premier

krsort($allItems,SORT_REGULAR);

foreach($allItems as $dates)
foreach($dates as $item)
$xml = simplexml_import_dom($item);
echo $xml->asXML();

echo ‘</channel></rss>’;

Dans l’idéal il faudrait stocker le flux assemblé en cache, au delà de 2 flux le temps de chargement commence à être assez long… Cette solution n’est donc qu’une implémentation fonctionnelle, mais qu’on peut largement améliorer avant mise en production.

Attention également à bien vérifier que les flux assemblés soient compatibles sinon ça risque de bugguer au niveau du XML.

Exemple n°4 : soyez créatifs…

J’ai décris ici l’utilisation que je fais de ce petit « hack », mais la seule limite c’est votre imagination…

Astuce n°1 : pour détecter l’User-Agent d’un robot de crawl ou d’un agrégateur, le plus simple est de consulter vos logs. Accessibles via le manager OVH ou chez la plupart des hébergeurs. Vous pouvez aussi faire un cloacking sur IP, GEOIP ou autre, il suffit de bien analyser votre cible pour savoir quelle sera la meilleure détection.

Astuce n°2 : pour présenter un lien HTML vous pouvez utiliser ce formatage dans la balise <description> par exemple :

<![CDATA[
Lorem ipsum <a href="http://www.example.com/">mon ancre</a> atmet bla bla bla [...]
]]>

Attention : il existe peut-être des solutions plus « propres » pour WordPress ou d’autres CMS, cette solution a le mérite de fonctionner quelque soit votre système. Elle a été testée pour un feed sur WordPress, vous pouvez l’adapter assez facilement sur autre chose.

Par « hack » on entend par exemple une technique qui n’utilise pas un module ou une implémentation réglementaire d’un CMS, ce terme m’est resté de l’époque ou je développais sous Joomla ! C’était pour la petite histoire et pour éviter tout troll sur l’utilisation du terme.