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

Last change on this file since 112586 was 112586, checked in by james@…, 4 months ago

Commentaires, Docblocks, code mort again

File size: 7.4 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        $base_short = preg_replace(',spip[.]php.*$,i', '', $base);
37
38        if ($id_website = sql_getfetsel('id_website', 'spip_websites', 'url='.sql_quote($base)) or
39                ($base_short!==$base and
40                        $id_website = sql_getfetsel('id_website', 'spip_websites', 'url='.sql_quote($base_short))
41                )
42        ) {
43                return $id_website;
44        }
45
46        $id_website = sql_insertq('spip_websites', array('url'=>$base, 'descriptif'=> '', 'date'=>date('Y-m-d H:i:s')));
47
48        // relire et verifier
49        $url = sql_getfetsel('url', 'spip_websites', 'id_website='.intval($id_website));
50        if ($url !== $base) {
51                // il y a eu un caractere exotique dans l'url, on la vire
52                sql_delete('spip_websites', 'id_website='.intval($id_website));
53                return 0;
54        }
55
56        return $id_website;
57}
58
59/**
60 * Reparer les urls mal formees.
61 *
62 * @param      string  $url    URL a nettoyer
63 *
64 * @return     string  URL nettoyee
65 */
66function univers_nettoyer_url($url) {
67        $url = preg_replace(',(IMG|local)/cache.+spip[.]php,', 'spip.php', $url);
68        $url = preg_replace(',(index|spip)[.]php/.+,i', 'spip.php', $url);
69        $url = preg_replace(',(index|spip|forum|article)[.]php3/.+,i', '', $url);
70        $url = preg_replace(',/(plugins|ecrire|IMG|local|squelettes)/.+[.]php,i', '', $url);
71
72        return $url;
73}
74
75/**
76 * Nettoyage en base des URLs enregistrees malformees.
77 */
78function univers_nettoyer_urls() {
79        // urls mal formees
80        $res = sql_select(
81                'id_website,url',
82                'spip_websites',
83                "url REGEXP '(index|spip)[.]php/.+'"
84                                        ." OR url REGEXP '/(plugins|ecrire|IMG|local|squelettes)/.+[.]php$'"
85        );
86        while ($row = sql_fetch($res)) {
87                $url = univers_nettoyer_url($row['url']);
88                if ($url!=$row['url']) {
89                        spip_log('nettoyage '.$row['id_website'].':'.$row['url']." => $url", 'universclean');
90                        sql_updateq('spip_websites', array('url'=>$url), 'id_website='.intval($row['id_website']));
91                }
92        }
93
94        // urls refusees (feed google/feedburner)
95        sql_delete('spip_websites', 'url LIKE'.sql_quote('http://feeds.feedburner.com%'));
96        sql_delete('spip_websites', 'url LIKE'.sql_quote('http://feedproxy.google.com%'));
97
98        // nettoyage des liens morts (suite a delete ci-dessus)
99        $res = sql_select(
100                'P.id_website',
101                'spip_websites_plugins AS P LEFT JOIN spip_websites AS W ON P.id_website = W.id_website',
102                'W.id_website IS NULL'
103        );
104        while ($row = sql_fetch($res)) {
105                sql_delete('spip_websites_plugins', 'id_website='.intval($row['id_website']));
106        }
107}
108
109function univers_rechercher_referers($date) {
110        $res = sql_select(
111                'referer',
112                'spip_referers',
113                'date='.
114                        sql_quote($date).
115                        " AND referer LIKE '%spip.php%' AND referer NOT LIKE 'https://contrib.spip.net%'".
116                        " AND referer NOT LIKE '%localhost%'"
117        );
118        spip_log("Import depuis les referer du $date : %spip.php% , ".sql_count($res), 'universreferers');
119        while ($row = sql_fetch($res)) {
120                spip_log('Import referer : '.$row['referer'], 'universreferers');
121                univers_proposer_site($row['referer']);
122        }
123
124        $res = sql_select(
125                'referer',
126                'spip_referers',
127                'date='.
128                        sql_quote($date).
129                        " AND referer LIKE '%/ecrire/%' AND referer NOT LIKE 'https://contrib.spip.net%'".
130                        " AND referer NOT LIKE '%localhost%'"
131        );
132        spip_log("Import depuis les referer du $date : %/ecrire/% , ".sql_count($res), 'universreferers');
133        while ($row = sql_fetch($res)) {
134                spip_log('Import referer : '.$row['referer'], 'universreferers');
135                univers_proposer_site(preg_replace(',/ecrire/.*$,Uims', '/spip.php', $row['referer']));
136        }
137}
138
139function univers_rechercher_sites_spip($req, $start = 0, $max = 10, $step = 10, $var = 'start') {
140        $urls = array();
141        while ($start<$max) {
142                $url = parametre_url($req, $var, $start, '&');
143                $page = recuperer_page($url);
144                $h3 = extraire_balises($page, 'h3');
145                foreach ($h3 as $h) {
146                        $a = extraire_balise($h, 'a');
147                        $href = extraire_attribut($a, 'href');
148                        if (preg_match(';^([a-z]{3,5})://;i', $href)
149                                and strpos($href, 'inurl:')===false
150                                and strpos($href, 'google')===false
151                                and strpos($href, 'spip.php')!==false) {
152                                $href = preg_replace(',spip[.]php?.*$,i', 'spip.php', $href);
153                                $urls[$href] = textebrut($a);
154                        }
155                }
156                $start+=$step;
157        }
158        return $urls;
159}
160
161/**
162 * Recuperer les URLs des sites a verifier.
163 *
164 * @param      sintrg   $url      Adresse du flux RSS
165 *
166 * @return     array    Liste des sites a verifier
167 */
168function univers_twitter_extraire_feed_urls($url) {
169        $long = array();
170        $urls = array();
171        $page = recuperer_page($url);
172        $page = str_replace('&lt;b&gt;', '', $page);
173        $page = str_replace('&lt;/b&gt;', '', $page);
174
175        $titles = extraire_balises($page, 'title');
176        $page = preg_replace(',</?title>,ims', "\n", implode($titles));
177
178        preg_match_all(",https?://[^?\"'#;:\s]*,ims", $page, $regs, PREG_SET_ORDER);
179        $urls = array_map('reset', $regs);
180        foreach ($urls as $k => $url) {
181                if (!preg_match(",https?://[^?\"'#;:]*spip[.]php3?,Uims", $url)) {
182                        // essayer de l'elargir
183                        if (!isset($long[$url])) {
184                                $long[$url] = recuperer_lapage($url, false, 'GET', 100000);
185                                $long[$url] = (is_string($long[$url]) ? $long[$url] : false);
186                        }
187                        if ($long[$url]) {
188                                $urls[$k] = $url = $long[$url];
189                        }
190                }
191                if (!preg_match(",https?://[^?\"'#;:]*spip[.]php3?,Uims", $url)) {
192                        unset($urls[$k]);
193                }
194        }
195        $urls = array_unique($urls);
196       
197        return $urls;
198}
199
200/**
201 * Recuperer les URLs des sites a verifier.
202 *
203 * @param      strng  $url    Adresse du flux RSS
204 *
205 * @return     array   Liste des sites a verifier
206 */
207function univers_spipnet_extraire_feed_urls($url) {
208        $urls = array();
209        $page = recuperer_page($url);
210        $links = extraire_balises($page, 'link');
211        foreach ($links as $link) {
212                if (preg_match(',<link>(.*)</link>,Uims', $link, $reg)) {
213                        $urls[] = trim($reg[1]);
214                }
215        }
216        $urls = array_unique($urls);
217
218        return $urls;
219}
220
221/**
222 * Vérifie un coup sur 2 les flux RSS du blog et du site officiel.
223 */
224function univers_feed_watch() {
225        $explore = array(
226                'twitter' => 'https://blog.spip.net/?page=backend-twitter-spip',
227                'spipnet'=>'https://www.spip.net/?page=backend-sites-sous-spip&id_article=884',
228        );
229
230        // Alternance des flux a verifier
231        $feed = 0;
232        if (isset($GLOBALS['meta']['univers_feedwatch'])) {
233                $feed = $GLOBALS['meta']['univers_feedwatch'];
234        }
235
236        $i = 0;
237        while ($i++<$feed) {
238                list($type, $url) = each($explore);
239        }
240
241        //Verification d'un flux
242        list($type, $url) = each($explore);
243        if (function_exists($f = "univers_$type".'_extraire_feed_urls')) {
244                spip_log($s = "Analyse Feed $url", 'univers');
245                $liste = $f($url);
246
247                foreach ($liste as $url) {
248                        spip_log($s = "$url", 'univers');
249                        univers_proposer_site($url);
250                }
251        }
252
253        // Alternance des flux a verifier
254        $feed++;
255        if ($feed>=count($explore)) {
256                $feed = 0;
257        }
258        ecrire_meta('univers_feedwatch', $feed);
259
260        // un coup de netoyage sur les urls mal formees
261        univers_nettoyer_urls();
262}
Note: See TracBrowser for help on using the repository browser.