source: spip-zone/_dev_/univers_spip/inc/univers.php

Last change on this file was 113560, checked in by marcimat@…, 2 years ago

Petit travail collaboratif avec James de nettoyage : on passe à la poubelle les sites dont les urls sont en doublon, en conservant de préférence les sites https.
Un petit génie y travaillera régulièrement.

File size: 8.0 KB
Line 
1<?php
2
3/**
4 * Plugin Univers SPIP
5 * (c) 2010 Cedric
6 * Distribue sous licence GPL
7 */
8
9include_spip('inc/filtres');
10include_spip('inc/distant');
11include_spip('inc/meta');
12
13/**
14 * Proposer un site en l'enregistrant en base.
15 *
16 * @param      string   $url    URL du site propose
17 *
18 * @return     integer  0 (false) ou l'id en base du site propose
19 */
20function univers_proposer_site($url) {
21        $parts = parse_url($url);
22        // pas d'IP fixe !
23        if (preg_match(';^[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}$;', $parts['host'])) {
24                return 0;
25        }
26        // pas de fausse url venant de feedburner ou google !
27        // on pourrait faire mieux en suivant la redirection pour
28        // attraper le vrai nom du site
29        if (preg_match(',(feeds\.feedburner\.com|feedproxy\.google\.com),i', $parts['host'])) {
30                return 0;
31        }
32       
33        $base = $parts['scheme'] . '://' . $parts['host'] . $parts['path'];
34        $base = univers_nettoyer_url($base);
35        $base = preg_replace(',(spip[.]php3?).*$,i', '\\1', $base);
36        $url_clean = univers_url_clean($base);
37
38        if ($id_website = sql_getfetsel('id_website', 'spip_websites', 'url='.sql_quote($base)) or
39                $id_website = sql_getfetsel(
40                        'id_website',
41                        'spip_websites',
42                        'url_clean='.sql_quote($url_clean), '', 'date DESC', '0,1'
43                )
44        ) {
45                return $id_website;
46        }
47
48        $id_website = sql_insertq(
49                'spip_websites',
50                array(
51                        'url' => $base,
52                        'url_clean' => $url_clean,
53                        'descriptif' => '',
54                        'date' => date('Y-m-d H:i:s')
55                )
56        );
57
58        // relire et verifier
59        $url = sql_getfetsel('url', 'spip_websites', 'id_website='.intval($id_website));
60        if ($url !== $base) {
61                // il y a eu un caractere exotique dans l'url, on la vire
62                sql_delete('spip_websites', 'id_website='.intval($id_website));
63                return 0;
64        }
65
66        return $id_website;
67}
68
69/**
70 * Reparer les urls mal formees.
71 *
72 * @param      string  $url    URL a nettoyer
73 *
74 * @return     string  URL nettoyee
75 */
76function univers_nettoyer_url($url) {
77        $url = preg_replace(',(IMG|local)/cache.+spip[.]php,', 'spip.php', $url);
78        $url = preg_replace(',(index|spip)[.]php/.+,i', 'spip.php', $url);
79        $url = preg_replace(',(index|spip|forum|article)[.]php3/.+,i', '', $url);
80        $url = preg_replace(',/(plugins|ecrire|IMG|local|squelettes)/.+[.]php,i', '', $url);
81        return $url;
82}
83
84/**
85 * Calculer une url nettoyée du protocole, /, spip.php
86 * qui permet de mieux gérer les doublons
87 */
88function univers_url_clean($url) {
89        $url = preg_replace('#^https?://#i', '', $url);
90        $url = preg_replace('#^www[.]#i', '', $url);
91        $url = preg_replace('#spip[.]php$#i', '', $url);
92        $url = rtrim($url, '/');
93        return $url;
94}
95
96/**
97 * Nettoyage en base des URLs enregistrees malformees.
98 */
99function univers_nettoyer_urls() {
100        // urls mal formees
101        $res = sql_select(
102                'id_website,url',
103                'spip_websites',
104                "url REGEXP '(index|spip)[.]php/.+'"
105                                        ." OR url REGEXP '/(plugins|ecrire|IMG|local|squelettes)/.+[.]php$'"
106        );
107        while ($row = sql_fetch($res)) {
108                $url = univers_nettoyer_url($row['url']);
109                if ($url!=$row['url']) {
110                        spip_log('nettoyage '.$row['id_website'].':'.$row['url']." => $url", 'universclean');
111                        sql_updateq('spip_websites', array('url'=>$url), 'id_website='.intval($row['id_website']));
112                }
113        }
114
115        // urls refusees (feed google/feedburner)
116        sql_delete('spip_websites', 'url LIKE'.sql_quote('http://feeds.feedburner.com%'));
117        sql_delete('spip_websites', 'url LIKE'.sql_quote('http://feedproxy.google.com%'));
118
119        // nettoyage des liens morts (suite a delete ci-dessus)
120        $res = sql_select(
121                'P.id_website',
122                'spip_websites_plugins AS P LEFT JOIN spip_websites AS W ON P.id_website = W.id_website',
123                'W.id_website IS NULL'
124        );
125        while ($row = sql_fetch($res)) {
126                sql_delete('spip_websites_plugins', 'id_website='.intval($row['id_website']));
127        }
128}
129
130/**
131 * Tache periodique d'analyse des referers de contrib depuis une date donnee.
132 *
133 * @param      string  $date   Date au format Y-m-d (SQL)
134 */
135function univers_rechercher_referers($date) {
136        $res = sql_select(
137                'referer',
138                'spip_referers',
139                'date='.
140                        sql_quote($date).
141                        " AND referer LIKE '%spip.php%' AND referer NOT LIKE 'https://contrib.spip.net%'".
142                        " AND referer NOT LIKE '%localhost%'"
143        );
144        spip_log("Import depuis les referer du $date : %spip.php% , ".sql_count($res), 'universreferers');
145        while ($row = sql_fetch($res)) {
146                spip_log('Import referer : '.$row['referer'], 'universreferers');
147                univers_proposer_site($row['referer']);
148        }
149
150        $res = sql_select(
151                'referer',
152                'spip_referers',
153                'date='.
154                        sql_quote($date).
155                        " AND referer LIKE '%/ecrire/%' AND referer NOT LIKE 'https://contrib.spip.net%'".
156                        " AND referer NOT LIKE '%localhost%'"
157        );
158        spip_log("Import depuis les referer du $date : %/ecrire/% , ".sql_count($res), 'universreferers');
159        while ($row = sql_fetch($res)) {
160                spip_log('Import referer : '.$row['referer'], 'universreferers');
161                univers_proposer_site(preg_replace(',/ecrire/.*$,Uims', '/spip.php', $row['referer']));
162        }
163}
164
165function univers_rechercher_sites_spip($req, $start = 0, $max = 10, $step = 10, $var = 'start') {
166        $urls = array();
167        while ($start<$max) {
168                $url = parametre_url($req, $var, $start, '&');
169                $page = recuperer_page($url);
170                $h3 = extraire_balises($page, 'h3');
171                foreach ($h3 as $h) {
172                        $a = extraire_balise($h, 'a');
173                        $href = extraire_attribut($a, 'href');
174                        if (preg_match(';^([a-z]{3,5})://;i', $href)
175                                and strpos($href, 'inurl:')===false
176                                and strpos($href, 'google')===false
177                                and strpos($href, 'spip.php')!==false) {
178                                $href = preg_replace(',spip[.]php?.*$,i', 'spip.php', $href);
179                                $urls[$href] = textebrut($a);
180                        }
181                }
182                $start+=$step;
183        }
184        return $urls;
185}
186
187/**
188 * Recuperer les URLs des sites a verifier.
189 *
190 * @param      sintrg   $url      Adresse du flux RSS
191 *
192 * @return     array    Liste des sites a verifier
193 */
194function univers_twitter_extraire_feed_urls($url) {
195        $long = array();
196        $urls = array();
197        $page = recuperer_page($url);
198        $page = str_replace('&lt;b&gt;', '', $page);
199        $page = str_replace('&lt;/b&gt;', '', $page);
200
201        $titles = extraire_balises($page, 'title');
202        $page = preg_replace(',</?title>,ims', "\n", implode($titles));
203
204        preg_match_all(",https?://[^?\"'#;:\s]*,ims", $page, $regs, PREG_SET_ORDER);
205        $urls = array_map('reset', $regs);
206        foreach ($urls as $k => $url) {
207                if (!preg_match(",https?://[^?\"'#;:]*spip[.]php3?,Uims", $url)) {
208                        // essayer de l'elargir
209                        if (!isset($long[$url])) {
210                                $long[$url] = recuperer_lapage($url, false, 'GET', 100000);
211                                $long[$url] = (is_string($long[$url]) ? $long[$url] : false);
212                        }
213                        if ($long[$url]) {
214                                $urls[$k] = $url = $long[$url];
215                        }
216                }
217                if (!preg_match(",https?://[^?\"'#;:]*spip[.]php3?,Uims", $url)) {
218                        unset($urls[$k]);
219                }
220        }
221        $urls = array_unique($urls);
222       
223        return $urls;
224}
225
226/**
227 * Recuperer les URLs des sites a verifier.
228 *
229 * @param      strng  $url    Adresse du flux RSS
230 *
231 * @return     array   Liste des sites a verifier
232 */
233function univers_spipnet_extraire_feed_urls($url) {
234        $urls = array();
235        $page = recuperer_page($url);
236        $links = extraire_balises($page, 'link');
237        foreach ($links as $link) {
238                if (preg_match(',<link>(.*)</link>,Uims', $link, $reg)) {
239                        $urls[] = trim($reg[1]);
240                }
241        }
242        $urls = array_unique($urls);
243
244        return $urls;
245}
246
247/**
248 * Vérifie un coup sur 2 les flux RSS du blog et du site officiel.
249 */
250function univers_feed_watch() {
251        $explore = array(
252                'twitter' => 'https://blog.spip.net/?page=backend-twitter-spip',
253                'spipnet'=>'https://www.spip.net/?page=backend-sites-sous-spip&id_article=884',
254        );
255
256        // Alternance des flux a verifier
257        $feed = 0;
258        if (isset($GLOBALS['meta']['univers_feedwatch'])) {
259                $feed = $GLOBALS['meta']['univers_feedwatch'];
260        }
261
262        $i = 0;
263        while ($i++<$feed) {
264                list($type, $url) = each($explore);
265        }
266
267        //Verification d'un flux
268        list($type, $url) = each($explore);
269        if (function_exists($f = "univers_$type".'_extraire_feed_urls')) {
270                spip_log($s = "Analyse Feed $url", 'univers');
271                $liste = $f($url);
272
273                foreach ($liste as $url) {
274                        spip_log($s = "$url", 'univers');
275                        univers_proposer_site($url);
276                }
277        }
278
279        // Alternance des flux a verifier
280        $feed++;
281        if ($feed>=count($explore)) {
282                $feed = 0;
283        }
284        ecrire_meta('univers_feedwatch', $feed);
285
286        // un coup de netoyage sur les urls mal formees
287        univers_nettoyer_urls();
288}
Note: See TracBrowser for help on using the repository browser.