Mise en route du suivi.
[aidenligne_francais_universite.git] / ecrire / inc / statistiques.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13
14 if (!defined("_ECRIRE_INC_VERSION")) return;
15
16 // Les deux fonctions suivantes sont adaptees du code des "Visiteurs",
17 // par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/)
18
19 // http://doc.spip.org/@stats_load_engines
20 function stats_load_engines() {
21 // le moteur de recherche interne
22 $arr_engines = Array();
23
24 $file_name = 'engines-list.txt';
25 if ($fp = @fopen($file_name, 'r'))
26 {
27 while ($data = fgets($fp, 256))
28 {
29 $data = trim(chop($data));
30
31 if (!ereg('^#', $data) && $data != '')
32 {
33 if (ereg('^\[(.*)\]$', $data, $engines))
34 {
35 // engine
36 $engine = $engines[1];
37
38 // query | dir
39 if (!feof($fp))
40 {
41 $data = fgets($fp, 256);
42 $query_or_dir = trim(chop($data));
43 }
44 }
45 else
46 {
47 $host = $data;
48 $arr_engines[] = Array($engine, $query_or_dir, $host);
49 }
50 }
51 }
52 fclose($fp);
53 }
54 return $arr_engines;
55 }
56
57 // http://doc.spip.org/@stats_show_keywords
58 function stats_show_keywords($kw_referer, $kw_referer_host) {
59 static $arr_engines;
60 static $url_site;
61
62 if (!$arr_engines) {
63 // Charger les moteurs de recherche
64 $arr_engines = stats_load_engines();
65
66 // initialiser la recherche interne
67 $url_site = $GLOBALS['meta']['adresse_site'];
68 $url_site = strtolower(eregi_replace("^((https?|ftp)://)?(www\.)?", "", $url_site));
69 }
70
71 $url = @parse_url( $kw_referer );
72 $query = $url['query'];
73 $host = strtolower($url['host']);
74 $path = $url['path'];
75
76 // Cette fonction affecte directement les variables selon la query-string !
77 parse_str($query);
78
79 $keywords = '';
80 $found = false;
81
82
83 if (strpos('-'.$kw_referer, eregi_replace("^(https?:?/?/?)?(www\.)?", "",$url_site))) {
84 if (eregi("(s|search|r|recherche)=([^&]+)", $kw_referer, $regs))
85 $keywords = urldecode($regs[2]);
86
87
88 else
89 return '';
90 } else
91 for ($cnt = 0; $cnt < sizeof($arr_engines) && !$found; $cnt++)
92 {
93 if ($found = (ereg($arr_engines[$cnt][2], $host)) OR $found = (ereg($arr_engines[$cnt][2], $path)))
94 {
95 $kw_referer_host = $arr_engines[$cnt][0];
96
97 if (ereg('=', $arr_engines[$cnt][1])) {
98
99 // Fonctionnement simple: la variable existe
100 $keywords = ${str_replace('=', '', $arr_engines[$cnt][1])};
101
102 // Si on a defini le nom de la variable en expression reguliere, chercher la bonne variable
103 if (! strlen($keywords) > 0) {
104 if (ereg($arr_engines[$cnt][1]."([^\&]*)", $query, $vals)) {
105 $keywords = urldecode($vals[2]);
106 }
107 }
108 } else {
109 $keywords = "";
110 }
111
112 if (( ($kw_referer_host == "Google")
113 || ($kw_referer_host == "AOL" && !ereg('enc=iso', $query))
114 || ($kw_referer_host == "MSN")
115 )) {
116 include_spip('inc/charsets');
117 if (!$cset = $ie) $cset = 'utf-8';
118 $keywords = importer_charset($keywords,$cset);
119 }
120 $buffer["hostname"] = $kw_referer_host;
121 }
122 }
123
124 $buffer["host"] = $host;
125 if (!$buffer["hostname"])
126 $buffer["hostname"] = $host;
127
128 $buffer["path"] = substr($path, 1, strlen($path));
129 $buffer["query"] = $query;
130
131 if ($keywords != '')
132 {
133 if (strlen($keywords) > 150) {
134 $keywords = spip_substr($keywords, 0, 148);
135 // supprimer l'eventuelle entite finale mal coupee
136 $keywords = preg_replace('/&#?[a-z0-9]*$/', '', $keywords);
137 }
138 $buffer["keywords"] = trim(entites_html(urldecode(stripslashes($keywords))));
139 }
140
141 return $buffer;
142
143 }
144
145 //
146 // Afficher les referers d'un article (ou du site)
147 //
148 // http://doc.spip.org/@aff_referers
149 function aff_referers ($result, $limit, $plus) {
150 global $spip_lang_right, $source_vignettes;
151 // Charger les moteurs de recherche
152 $arr_engines = stats_load_engines();
153 $nbvisites = array();
154 $aff = '';
155 while ($row = spip_fetch_array($result)) {
156 $referer = interdire_scripts($row['referer']);
157 $visites = $row['vis'];
158 $tmp = "";
159
160 $buff = stats_show_keywords($referer, $referer);
161
162 if ($buff["host"]) {
163 $numero = substr(md5($buff["hostname"]),0,8);
164
165 $nbvisites[$numero] = $nbvisites[$numero] + $visites;
166
167 if (strlen($buff["keywords"]) > 0) {
168 $criteres = substr(md5($buff["keywords"]),0,8);
169 if (!$lescriteres[$numero][$criteres])
170 $tmp = " &laquo;&nbsp;".$buff["keywords"]."&nbsp;&raquo;";
171 $lescriteres[$numero][$criteres] = true;
172 } else {
173 $tmp = $buff["path"];
174 if (strlen($buff["query"]) > 0) $tmp .= "?".$buff['query'];
175
176 if (strlen($tmp) > 30)
177 $tmp = "/".substr($tmp, 0, 27)."...";
178 else if (strlen($tmp) > 0)
179 $tmp = "/$tmp";
180 }
181
182 if ($tmp)
183 $lesreferers[$numero][] = "<a href='".quote_amp($referer)."'>".quote_amp(urldecode($tmp))."</a>" . (($visites > 1)?" ($visites)":"");
184 else
185 $lesliensracine[$numero] += $visites;
186 $lesdomaines[$numero] = $buff["hostname"];
187 $lesurls[$numero] = $buff["host"];
188 $lesliens[$numero] = $referer;
189 }
190 }
191
192 if (count($nbvisites) > 0) {
193 arsort($nbvisites);
194
195 $aff = '';
196 for (reset($nbvisites); $numero = key($nbvisites); next($nbvisites)) {
197 if ($lesdomaines[$numero] == '') next;
198
199 $visites = pos($nbvisites);
200 $ret = "\n<li style='clear:$spip_lang_right;'>";
201
202 if (strlen($source_vignettes) > 0) $ret .= "\n<a href=\"http://".$lesurls[$numero]."\"><img src=\"$source_vignettes".rawurlencode($lesurls[$numero])."\"\nstyle=\"float: $spip_lang_right; margin-bottom: 3px; margin-left: 3px;\" alt='' /></a>";
203
204 if ($visites > 5) $ret .= "<span style='color: red'>$visites "._T('info_visites')."</span> ";
205 else if ($visites > 1) $ret .= "$visites "._T('info_visites')." ";
206 else $ret .= "<span style='color: #999999'>$visites "._T('info_visite')."</span> ";
207
208 if ($lesdomaines[$numero] == "(email)") {
209 $aff .= $ret;
210 $aff .= "<b>".$lesdomaines[$numero]."</b>";
211 }
212 else if ((count($lesreferers[$numero]) > 1) || ((substr(supprimer_tags($lesreferers[$numero][0]),0,1) != '/') && (count($lesreferers[$numero]) > 0))) {
213 global $couleur_foncee;
214 $referers = join ("</li><li>",$lesreferers[$numero]);
215 $aff .= $ret;
216 $aff .= "<a href='http://".quote_amp($lesurls[$numero])."'><span style='color: $couleur_foncee; font-weight: bold;'>".$lesdomaines[$numero]."</span></a>";
217 if ($rac = $lesliensracine[$numero]) $aff .= " <span class='spip_x-small'>($rac)</span>";
218 $aff .= "\n<ul style='font-size:x-small;'><li>$referers</li></ul>\n";
219 $aff .= "</li></ul>\n<ul style='font-size:small;clear:$spip_lang_right;'>\n";
220 } else {
221 $aff .= $ret;
222 $lien = $lesreferers[$numero][0];
223 if (eregi("^(<a [^>]+>)([^ ]*)( \([0-9]+\))?", $lien, $regs)) {
224 $lien = quote_amp($regs[1]).$lesdomaines[$numero].$regs[2];
225 if (!strpos($lien, '</a>')) $lien .= '</a>';
226 } else
227 $lien = "<a href='http://".$lesdomaines[$numero]."'>".$lesdomaines[$numero]."</a>";
228 $aff .= "<b>".quote_amp($lien)."</b>";
229 $aff .= "</li>\n";
230 }
231 }
232
233 if (preg_match(",</ul>\s*<ul style='font-size:small;'>\s*$,",$aff,$r))
234 $aff = substr($aff,0,(0-strlen($r[0])));
235 if ($aff) $aff = "<ul>$aff</ul>";
236
237 // Le lien pour en afficher "plus"
238 if ($plus AND (spip_num_rows($result) == $limit)) {
239 $aff .= "<div style='text-align:right;'><b><a href='$plus'>+++</a></b></div>";
240 }
241 }
242
243 return $aff;
244 }
245
246 ?>