Intégrer la Backlink Factory Wikio à votre site avec PHP


Les internautes qui fréquentent Websourcing.fr ont certainement remarqué le « Top référenceurs » présent en bas de page. Celui-ci me permet de remercier en permanence les blogueurs qui me font des rétroliens, en leur assurant une présence grâce à un lien direct vers leur site.

Jusqu’ici, ce classement était basé sur les « pings » que je recevais en commentaire.

Mais le problème de cette approche est que certaines plateformes de blog n’envoient pas ces pings (ou pas systématiquement). Résultat, certains référenceurs réguliers n’étaient jamais présents dans le classement. Gênant !

J’ai donc décidé de recoder le système en me basant sur la Backlink Factory de Wikio.

Le webware propose bien une API mais celles-ci ne permet pas de récupérer le classement. Je suis donc passé par un parseur HTML.

Je commence donc par récupérer la page HTML en m’appuyant sur cURL pour une compatibilité avec un maximum d’hébergements.

$date = date('Y-m-d', strtotime("-30 days"));

$target_url = 'http://labs.wikio.net/fr/factory/search/in/source/count/'.$date.'?url=http%3A%2F%2Fblog.websourcing.fr';
$userAgent = 'ScraperBot';

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // necessaire pour windows
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // necessaire pour windows
$html = curl_exec($ch);
curl_close($ch);

if (!$html)
{
	echo "ERROR NUMBER: ".curl_errno($ch);
	echo "ERROR: ".curl_error($ch);
	exit;
}

Vous remarquerez que je personnalise l’url pour ne récupérer que les liens qu’il me faut (ceux des 30 derniers jours).

Ensuite, je parse la page et je la charge dans un document DOM :

$dom = new DOMDocument();
@$dom->loadHTML($html);

Pour trouver les données qui m’intéressent, j’utilise le langage XPATH. Les noms des blogs, les urls et le nombre de liens se trouvent dans une table. Je récupère donc d’abord chacune des lignes de ce tableau :

$xpath = new DOMXPath($dom);
$elements = $xpath->query('//table/tbody/tr');

Pour chaque élément récupéré, je parcoure l’arbre DOM pour en extraire les données et les placer dans un tableau :

$results = array();
if (!is_null($elements)) {
	$i = 0;
	foreach ($elements as $element) {
		$nodes = $element->childNodes;
				
		//URL
		preg_match('/url=(.*)/', $nodes->item(2)->childNodes->item(1)->attributes->getNamedItem("href")->nodeValue, $matches);
		$url = urldecode($matches[1]);
		$results[$i]['url']= $url;
				
		//Site Name
		$results[$i]['site']= $nodes->item(2)->nodeValue;
				
		//Backlinks number
		$results[$i]['links']= $nodes->item(4)->nodeValue;
					
		$i++;
	}
}

Voila, l’ensemble des données (URL, Nom et Nombre de liens) est présent dans mon tableau. Je n’ai plus qu’à m’en servir comme bon me semble.

Attention, si vous faites trop de requêtes, le site Wikio vous bloquera. C’est de bonne guerre. J’ai donc intégré un cache réglable à mon système.
Si je remets tout ça ensemble, cela donne la fonction suivante :

function ws_wbl_parse($days, $timeout){
	$wtbopt = get_option("websourcing_wikio_backlinkers");
	$date = date('Y-m-d', strtotime("-".$days." days"));
	//$debug = true;
		
	if(mktime() > $wtbopt['lastcheck'] || $wtbopt['html'] == null || $wtbopt['html'] == '' || $debug) {

		$target_url = 'http://labs.wikio.net/fr/factory/search/in/source/count/'.$date.'?url=http%3A%2F%2Fblog.websourcing.fr';

		$ch = curl_init();
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_URL, $target_url);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
		$html = curl_exec($ch);
		curl_close($ch);

		if (!$html){
			echo "ERROR NUMBER: ".curl_errno($ch);
			echo "ERROR: ".curl_error($ch);
			exit;
		}
		
		$wtbopt['lastcheck'] = mktime() + $timeout; // next check after $timeout seconds
		$wtbopt['html'] = $html;
		
		//echo $html;
		
		update_option("websourcing_wikio_backlinkers",$wtbopt);
	}

	$dom = new DOMDocument();
	@$dom->loadHTML($wtbopt['html']);

	$xpath = new DOMXPath($dom);
	$elements = $xpath->query('//table/tbody/tr');

	$results = array();
	if (!is_null($elements)) {
		$i = 0;
		foreach ($elements as $element) {
			$nodes = $element->childNodes;
				
			//URL
			preg_match('/url=(.*)/', $nodes->item(2)->childNodes->item(1)->attributes->getNamedItem("href")->nodeValue, $matches);
			$url = urldecode($matches[1]);
			$results[$i]['url']= $url;
				
			//Site Name
			$results[$i]['site']= $nodes->item(2)->nodeValue;
				
			//Backlinks number
			$results[$i]['links']= $nodes->item(4)->nodeValue;
			
			$i++;
		}
	}
	return $results;
}	

Pour l’utiliser, il suffit de l’invoquer comme ceci :

$backlinks = ws_wbl_parse(30, 3600); // 30 jours et un cache de 3600 sec

Avec un peu de mise en page dans une liste HTML et les images qui vont bien, voila ce que ça donne :

Voila je suis content d’avoir pris le temps de réaliser ce petit bout de code qui me permet de n’oublier personne.

Si vous voulez apparaitre dans ce top, il ne vous reste plus qu’à vous inscrire à Wikio et à me faire un backlink.