2009-08-14 8 views
7

Pour un site donné « example.domain.tld » ou simplement « domain.tld » Je dois faire ce qui suit en PHP:PHP - obtenir le favicon d'un site et de le convertir au format PNG si nécessaire

  • Si le site a une favicon, obtenir partout où il est
    • Si ce n'est pas déjà un PNG, convertir en PNG
    • Enregistrer à /favicons/example.domain.tld.png
  • Si le site n'a pas favicon, ne fais rien.

Des idées? Je suis troublé par le format de fichier peu fiable et l'emplacement des favicons, mais si possible, je veux éviter de télécharger la source entière de la page avec file_get_contents afin de le trouver dans les en-têtes. La conversion en png semble également non triviale.

Merci,

Mala

Répondre

26

Comme il est typique, je trouve une solution passable peu après avoir posé la question - laisser Google faire le travail pour vous:

http://www.google.com/s2/favicons?domain=URL

retourne un 16x16 .png

+0

c'est comme si vous écrivez vous-même: www.domain.com/favicon.ico. J'ai vérifié et c'est la même chose .. – vsync

+5

Pas vraiment - tout d'abord, il renvoie un png, pas un ico. Deuxièmement, les favicons peuvent être situés dans une myriade de chemins - cela standardise, et laisse le travail à google. Enfin, si un favicon n'est pas trouvé, il renvoie une image d'espace réservé, au lieu de vous poser une image brisée. – Mala

+3

Mais comme pour toutes les solutions centrales: sachez que Google peut vous connecter à ce groupe d'URL maintenant. Si cela ne vous dérange pas, ça a l'air bien. –

0

Si le favicon ne se trouve pas à /favicon.ico Je suppose que vous devez analyser le code HTML.

Pour la détection de type de fichier, vous pouvez utiliser this extension, qui détecte le type de fichier en utilisant des octets magiques.

Vous pouvez convertir au format PNG en utilisant la bibliothèque GD, un exemple peut être trouvé here.

0

Coverting to PNG n'est pas si difficile.

Je ne comprends pas complètement la question, est-ce que cette icône de fav est sur votre site ou sur d'autres sites? Si sur d'autres sites, vous devrez analyser le HTML récupéré et ensuite charger le favicon.

+0

Mon site doit accepter une URL (par exemple, http://www.amazon.com) puis obtenir le favicon du site - au moment j'utilise file_get_contents ($ site/favicon.ico) mais le problème est que certains sites aiment avoir d'autres icônes de format, ou les stocker dans d'autres endroits. Je me demandais s'il y avait une façon générique d'accéder à la favicon – Mala

0

Si votre installation PHP inclut la bibliothèque GD, vous pouvez convertir une image en format PNG à l'aide de la fonction .

4

trouvé ceci: http://www.controlstyle.com/articles/programming/text/php-favicon/

Je suis sur le point de l'essayer pour mon projet et je vous rapporterai et vous dirai si cela fonctionne!

Vive

Iain

+0

Cela fonctionne réellement! Mais jusqu'à présent, il ne semble pas si intelligent d'analyser les favicons dans des endroits non standard. Je vais creuser et posterai la source si je trouve une solution. -Iain –

+0

Oopsy! Il s'avère que je le faisais mal. La classe est A-Okay! –

+0

Cette classe ne semble pas fonctionner correctement dans les nouvelles versions de php. – Maelish

2

Comme Iain Fraser a dit, la classe favicon de controlstyle.com ne fonctionne pas avec tous les cas de test.

En gros, si elle est fournie, l'étiquette d'icône de raccourci <link> peut contenir différents types d'URL:

  • URL complète absolue: http://www.domain.com/images/fav.ico
  • URL absolue avec le schéma relatif: //www.domain.com/images/fav.ico
  • chemin absolu: /images/fav.ico
  • relative URL: ../images/fav.ico

De plus, la page Web peut contenir un attribut <base href="..." /> qui change la façon de traiter avec l'URL relative et chemin absoute ...

J'ai écrit une classe PHP qui fonctionne avec tous ces cas. Tout d'abord, il essaie d'obtenir l'URL de favicon à partir de l'attribut <link>, et de se rabattre sur l'URI favicon par défaut (//www.domain.com/favicon.ico) en cas d'échec.

Vous pouvez l'obtenir sur mon site Web ici: http://www.finalclap.com/faq/477-php-favicon-find-download ou l'installer en utilisant composer: composer require vincepare/favicon-downloader.

Comment utiliser:

<?php 
require 'FaviconDownloader.class.php'; 
$favicon = new FaviconDownloader('http://stackoverflow.com/questions/19503326/bug-with-chrome-tabs-create-in-a-loop'); 

if($favicon->icoExists){ 
    echo "Favicon found : ".$favicon->icoUrl."\n"; 

    // Saving favicon to file 
    $filename = 'favicon-'.time().'.'.$favicon->icoType; 
    file_put_contents($filename, $favicon->icoData); 
    echo "Saved to ".$filename."\n\n"; 
} else { 
    echo "No favicon for ".$favicon->url."\n\n"; 
} 
?> 
+0

Belle classe. Juste une note: votre script finalclap.com a beaucoup d'erreurs d'espacement, qui sont difficiles à trouver, et briser le code. Une fois fixé, cela fonctionne très bien. Projets futurs pour convertir .ico en .png? –

+0

Je sais, ce problème d'espacement est causé par http://alexgorbatchev.com/SyntaxHighlighter/, utilisé pour afficher le code sur mon site Web. Vous devriez plutôt télécharger la classe d'ici: http://www.finalclap.com/download/item/76-favicondownloader-php-class au lieu de copier et coller le code source de la page du tutoriel. Je ne prévois pas d'ajouter des fonctionnalités de conversion d'image car je pense qu'il existe de meilleurs outils pour y parvenir, comme imagemagick. – Vince