2009-08-14 14 views
7

Para cualquier "example.domain.tld" determinado sitio o simplemente "domain.tld" Tengo que hacer lo siguiente en PHP:PHP - conseguir el favicon de un sitio y su conversión a PNG si es necesario

  • Si el sitio tiene un favicon, conseguirlo dondequiera que sea
    • Si no es ya un PNG, convertirlo a PNG
    • Guardar a /favicons/example.domain.tld.png
  • Si el sitio no tiene favicon, no hacer nada.

¿Alguna idea? El formato de archivo no confiable y la ubicación de los favicons me dejan perplejo, pero si es posible, quiero evitar descargar toda la fuente de la página con file_get_contents para encontrarlo en los encabezados. También la conversión a png parece no trivial.

Gracias,

Mala

Respuesta

26

Como es típico, he encontrado una solución aceptable, poco después de hacer la pregunta - Deja que Google haga el trabajo por usted:

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

devuelve un 16x16 png

+0

que es como escribirte: www.domain.com/favicon.ico. Lo he comprobado y es lo mismo ... – vsync

+5

No, en realidad, antes que nada, devuelve un png, no un ico. En segundo lugar, los favicons se pueden ubicar en una miríada de caminos, esto lo estandariza y deja el trabajo en google. Finalmente, si no se encuentra un favicon, devuelve una imagen de marcador de posición, en lugar de aterrizar con una imagen rota. – Mala

+3

Pero al igual que con todas las soluciones centrales: tenga en cuenta que Google puede conectarse con usted y con ese grupo de URL ahora. Si eso no te molesta, esto se ve bien. –

0

Si el favicon no se encuentra en /favicon.ico Creo que se tienen que analizar el código HTML.

Para la detección de tipo de archivo, puede usar this extension, que detecta el tipo de archivo mediante el uso de bytes mágicos.

Puede convertir a PNG utilizando la biblioteca de GD, se puede encontrar un ejemplo en here.

0

coverting a PNG no es tan difícil.

No entiendo la pregunta por completo, ¿es este el icono favorito en su sitio o en otros sitios? Si está en otros sitios, tendrá que analizar el HTML obtenido y luego, de alguna manera, cargar el favicon.

+0

Mi sitio tiene que aceptar cualquier URL (por ejemplo, http://www.amazon.com) y luego favicon del sitio - en el momento en que estoy usando file_get_contents ($ site/favicon.ico) pero el problema es que a algunos sitios les gusta tener otros iconos de formato o almacenarlos en otros lugares. Me preguntaba si hay una forma genérica de llegar al favicon – Mala

0

Si su instalación de PHP incluye la biblioteca de GD, puede convertir una imagen a PNG usando la función imagepng.

4

encontré esto: http://www.controlstyle.com/articles/programming/text/php-favicon/

Estoy a punto de probarlo para mi proyecto y le informaré si funciona.

Saludos

Iain

+0

¡Esto realmente funciona! Pero hasta ahora no parece tan inteligente sobre el análisis de favicons en ubicaciones no estándar. Excavaré y publicaré la fuente si encuentro una solución. -Iain –

+0

¡Oopsy! Resulta que lo estaba haciendo mal. La clase es A-Okay! –

+0

Esta clase no parece funcionar bien en las nuevas versiones de php. – Maelish

2

Como dijo Iain Fraser, la clase de Favicon controlstyle.com no funciona con todos los casos de prueba.

Básicamente, si se proporciona, la etiqueta de icono <link> acceso directo puede contener diferentes tipos de URL:

  • completo URL absoluta: http://www.domain.com/images/fav.ico
  • URL absoluta con el esquema de relación: //www.domain.com/images/fav.ico
  • ruta absoluta: /images/fav.ico
  • URL relativa: ../images/fav.ico

Además, la página web puede contener un atributo <base href="..." /> que cambia cómo tratar con dirección URL relativa y la ruta absoute ...

Así que he escrito una clase PHP que funciona con todos estos casos. En primer lugar, intenta obtener la URL de favicon del atributo <link> y recurrir al URI de favicon predeterminado (//www.domain.com/favicon.ico) en caso de error.

Puede agarrarlo en mi sitio web aquí: http://www.finalclap.com/faq/477-php-favicon-find-download o instalarlo usando el compositor: composer require vincepare/favicon-downloader.

Modo de empleo:

<?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

Buena clase. Solo una nota: su script finalclap.com tiene muchos errores de espacio, que son difíciles de encontrar, y rompe el código. Una vez arreglado, funciona genial. ¿Planes futuros para convertir .ico a .png? –

+0

Sé que este problema de espacio está causado por http://alexgorbatchev.com/SyntaxHighlighter/, que se usa para mostrar el código en mi sitio web. Deberías descargar la clase desde aquí: http://www.finalclap.com/download/item/76-favicondownloader-php-class en lugar de copiar y pegar el código fuente de la página del tutorial. No planeo agregar características de conversión de imagen porque creo que hay mejores herramientas para lograr esto, como imagemagick. – Vince

Cuestiones relacionadas