Parfois on fait un site pour quelqu'un et magré vos efforts, ce site ne mérite aucun trafic ou alors quelques égarés. Et parfois, un bon référencement n'y fait rien. Parfois les clients jugent la valeur la qualité de la prestation qui leur a été fournie à l'empleur du traffic de leur site. Parfois quand rien n'y fait, il faut appeller perl au secours.
Shibuya est une place au japon où il y a beaucoup de monde mais peut être toujours les mêmes
Générer du traffic sur un site est facile avec le module LWP qui permet de récupérer des pages sur un site comme le ferait un browser. Cependant deux difficultés apparaissent si on y réfléchit un peu.
La première est qu'il ne faut pas que tous les hits se concentrent sur la page d'acceuil. Ainsi il faudra lire la page d'acceuil et par exemple, suivre tous les liens qu'elle propose, générant ainsi une cession plausible.
Le second problème est identitaire. Si tous les hits sont générés par un même agent LWP, cela revient à faire toutes les demandes à partir de la même machine, et donc cela n'augementera pas correctement les statistiques du site si son logiciel d'analyse de traffic est à peine correct. Pour simuler la multiplicité de visiteurs, on va donc choissir de passer par de multiples proxy qui chacun donnera l'impression d'un visiteur unique, même s'ils sont tous dirigés par un seul hôte. Pour se fournir une liste de proxy utilisables, on ira par exemple sur ce site. On stocke toutes les addresses sous la forme site:port dans un fichier text nomé "proxies.txt" avec une entrée par ligne.
Pour raffiner et être plus furtif, on fera varier les noms des user-agents entre les principaux browser connus. on trouvera des exemples sur ce site.
Même si l'on peut faire confiance à une liste de proxies ou une autre, nous allons commencer par une phase de test, histoire d'éliminer les plus lents. Cette phase est facultative mais hautement recomandée. On va procédér à ce test en utilisant le module Benchmark:
open (FILEIN, "< proxies.txt") or die ("Pb fichier proxies.txt $!");
while ($proxy = <FILEIN>) {
chomp($proxy);
$beginn = new Benchmark;
my $agent;
$agent = new LWP::UserAgent;
$agent -> timeout (10);
$uag = 'Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)';
$agent->agent($uag);
$agent->proxy(http => "http://$proxy");
$request = new HTTP::Request('GET','http://www.google.com');
$dapage = $agent->request($request);
$ending = new Benchmark;
$ittook = timediff($beginn,$ending);
$usr = timestr($ittook);
($rawtime) = ($usr =~ /\((\S*) /);
$ttaken{$proxy} = $rawtime;
}
close (FILEIN);
Maintenant que nous avons stocké dans un hash les performances des proxies, on vas reproduire les résultats dans un nouveau fichier "proxok.txt" en classant les proxies par ordre de performance de manière à commencer par la suite par les plus rapides, quitte à interrompre le traitement manuellement lorsque l'on atteint les plus lents.
@proxok = reverse sort {$ttaken{$a} <=> $ttaken{$b}} (keys %ttaken);
open (FILEOUT, "> proxok.txt") or die ("Pb fichier proxok.txt $!");
foreach (@proxok) {
print FILEOUT "$_\n";
}
close (FILEOUT);
On commence par charger la liste des user-agents du fichier "uas.txt" dans un tableau @uas. Ensuite on introduit la boucle entre les entrées du fichier "proxok.txt" (ou "proxies.txt" si vous avez sauté la phase de raffinage)
$aim = 'http://www.roux.to/';
open (UAS, "< uas.txt") or die ("Pb fichier uas.txt $!");
while (<UAS>) { push (@uas, $_); }
close (UAS);
open (FILEIN, "< proxok.txt") or die ("Pb fichier proxok.txt $!");
while ($proxy = <FILEIN>) {
chomp($proxy);
On génère à présent l'agent http avec le proxy désigné et un user-agent alléatoire, puis on récupère le contenu de la page voulue dans une variable $content. Afin de renforcer un peu la schizophrénie de notre agent, on lui assigne une fausse addresse s'identfiant conformément à la RFC822 en utilisant la propriété from (voir la procédure de création de nom en fin de programme.
my $agent;
$agent = new LWP::UserAgent;
$agent -> timeout (10);
$uag = $uas[int rand(@uas)];
$agent->agent($uag);
$fromail = fakemail;
$agent->from($fromail);
$agent->proxy(http => "http://$proxy");
$request = new HTTP::Request('GET',$aim);
$dapage = $agent->request($request);
$content = $dapage->content;
Maintenant on va analyser la page html récupérée pour générer d'autres hits sur le même site visisté par l'agent http construit. On vas donc identifier toutes les pages vers lesquelles il y a des liens et les visiter, ceci en détectant les href d'une manière qui exclut les mailto. on utilise ensuite deux filtres pour exclure d'une part les liens vers d'autres sites et suivant le type de fichier destination:
@pothrefs = ();
@pothrefs = ($content =~ /href ?= ?"([\w\.\/]+)"/gi);
@hrefs=();
foreach (@pothrefs) {
next if /http/;
next unless (/html/ or /cgi/ or /htm/);
s/^\///g;
push (@hrefs,$_);
}
foreach (@hrefs) {
$request = new HTTP::Request('GET',"$aim$_");
$dapage = $agent->request($request);
}
Afin de rendre ces hits plus furtifs, on va aussi générer des hits sur les images référencées dans la page d'acceuil avec la même méthode, une détection de tous les src puis un filtrage:
@potimages = ();
@potimages = ($content =~ /src ?= ?"([\w\.\/]+)"/gi);
@images = ();
foreach (@potimages) {
next if /http/;
next unless (/gif/ or /png/ or /jpg/ or /jpeg/);
s/^\///g;
push (@images,$_);
}
foreach (@images) {
$request = new HTTP::Request('GET',"$aim$_");
$dapage = $agent->request($request);
}
Voila la simple procédure de génération de fausses addresses email pour le champ from de notre agent:
sub fakemail {
my $email;
@pre=('info','admin','master','boss','slave','abuse','josh');
@doma=('free','random','first','alpha','post','pre','future');
@domb=('service','info','porn','mail','internet','music','stuff');
@ext=('com','net','org','fr','co.uk');
$email = $pre[int rand(@pre)]+'@'+$doma[int rand(@doma)];
$email .= "-" if (rand() > 0.5);
$email .= $domb[int rand(@domb)]+"."+$est[int rand(@ext)];
return $email;
}
L'agent Shibuya est effectif même s'il contient un certain nombre de limitations, avec les frames par exemple. Je suis ouvert à toutes sugestions d'amélioration de performance ou de qualité, n'hésitez par à me contacter.