site.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2014 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined("_ECRIRE_INC_VERSION")) return;
  12. // http://code.spip.net/@analyser_site
  13. function analyser_site($url) {
  14. include_spip('inc/filtres');
  15. include_spip('inc/distant');
  16. // Accepter les URLs au format feed:// ou qui ont oublie le http://
  17. $url = preg_replace(',^feed://,i', 'http://', $url);
  18. if (!preg_match(',^[a-z]+://,i', $url)) $url = 'http://'.$url;
  19. $texte = recuperer_page($url, true);
  20. if (!$texte) return false;
  21. include_spip('inc/syndic');
  22. cdata_echappe($texte, $echappe_cdata);
  23. if (preg_match(',<(channel|feed)([\:[:space:]][^>]*)?'
  24. .'>(.*)</\1>,ims', $texte, $regs)) {
  25. $result['syndication'] = 'oui';
  26. $result['url_syndic'] = $url;
  27. $channel = $regs[3];
  28. // Pour recuperer l'entete, on supprime tous les items
  29. $b = array_merge(
  30. extraire_balises($channel, 'item'),
  31. extraire_balises($channel, 'entry')
  32. );
  33. $header = str_replace($b,array(),$channel);
  34. if ($t = extraire_balise($header, 'title')) {
  35. cdata_echappe_retour($t, $echappe_cdata);
  36. $result['nom_site'] = filtrer_entites(supprimer_tags($t));
  37. }
  38. if ($t = extraire_balises($header, 'link')) {
  39. cdata_echappe_retour($t, $echappe_cdata);
  40. foreach ($t as $link) {
  41. $u = supprimer_tags(filtrer_entites($link));
  42. if (!strlen($u))
  43. $u = extraire_attribut($link, 'href');
  44. if (strlen($u)) {
  45. // on installe l'url comme url du site
  46. // si c'est non vide, en donnant la priorite a rel=alternate
  47. if (preg_match(',\balternate\b,', extraire_attribut($link, 'rel'))
  48. OR !isset($result['url_site']))
  49. $result['url_site'] = filtrer_entites($u);
  50. }
  51. }
  52. }
  53. $result['url_site'] = url_absolue($result['url_site'], $url);
  54. if ($a = extraire_balise($header, 'description')
  55. OR $a = extraire_balise($header, 'tagline')) {
  56. cdata_echappe_retour($a, $echappe_cdata);
  57. $result['descriptif'] = filtrer_entites(supprimer_tags($a));
  58. }
  59. if (preg_match(',<image.*<url.*>(.*)</url>.*</image>,Uims',
  60. $header, $r)
  61. AND preg_match(',(https?://.*/.*(gif|png|jpg)),ims', $r[1], $r)
  62. AND $image = recuperer_infos_distantes($r[1])) {
  63. if (in_array($image['extension'], array('gif', 'jpg', 'png'))) {
  64. $result['format_logo'] = $image['extension'];
  65. $result['logo'] = $r[1];
  66. }
  67. else if ($image['fichier']) {
  68. spip_unlink($image['fichier']);
  69. }
  70. }
  71. }
  72. else {
  73. $result['syndication'] = 'non';
  74. $result['url_site'] = $url;
  75. if (preg_match(',<head>(.*(description|title).*)</head>,Uims', $texte, $regs)) {
  76. $head = filtrer_entites($regs[1]);
  77. } else
  78. $head = $texte;
  79. if (preg_match(',<title[^>]*>(.*),i', $head, $regs))
  80. $result['nom_site'] = filtrer_entites(supprimer_tags(preg_replace(',</title>.*,i', '', $regs[1])));
  81. if ($a = array_merge(
  82. extraire_balises($head, 'meta'),
  83. extraire_balises($head, 'http-equiv')
  84. )) {
  85. foreach($a as $meta) {
  86. if (extraire_attribut($meta, 'name') == 'description') {
  87. $desc = trim(extraire_attribut($meta, 'content'));
  88. if (!strlen($desc))
  89. $desc = trim(extraire_attribut($meta, 'value'));
  90. $result['descriptif'] = $desc;
  91. }
  92. }
  93. }
  94. // Cherchons quand meme un backend
  95. include_spip('inc/distant');
  96. include_spip('inc/feedfinder');
  97. $feeds = get_feed_from_url($url, $texte);
  98. // si on a a trouve un (ou plusieurs) on le note avec select:
  99. // ce qui constitue un signal pour exec=sites qui proposera de choisir
  100. // si on syndique, et quelle url.
  101. if (count($feeds)>=1) {
  102. spip_log("feedfinder.php :\n".join("\n", $feeds));
  103. $result['url_syndic'] = "select: ".join(' ',$feeds);
  104. }
  105. }
  106. cdata_echappe_retour($result, $echappe_cdata);
  107. return $result;
  108. }
  109. ?>