2011-02-25 21 views
68

Bastante simple pregunta: He creado una pequeña aplicación que básicamente es solo una de las favoritas que se encuentra en la bandeja de mi sistema para que pueda abrir sitios/carpetas/archivos de uso frecuente desde el mismo lugar. Obtener los iconos predeterminados de mi sistema para los tipos de archivos conocidos no es demasiado complicado, pero no sé cómo obtener el favicon de un sitio web. (SO tiene el ícono de pila gris> naranja en la barra de direcciones, por ejemplo)¿Cómo puedo obtener el favicón de un sitio web?

¿Alguien sabe cómo podría hacerlo?

Respuesta

154

Usted querrá hacer frente a esto unas cuantas maneras:

  1. Busca la favicon.ico en la raíz del dominio

    www.domain.com/favicon.ico

  2. busque la etiqueta <link> con el rel="shortcut icon" atributo

    <link rel="shortcut icon" href="/favicon.ico" />

  3. Look para una etiqueta de <link> con el rel="icon" atributo

    <link rel="icon" href="/favicon.png" />

Los dos últimos generalmente producir una imagen de mayor calidad.


sólo para cubrir todas las bases, existen dispositivos específicos de archivos de iconos que pueden producir imágenes de mayor calidad, ya que estos dispositivos suelen tener iconos grandes en el dispositivo que un navegador necesitarían:

<link rel="apple-touch-icon" href="images/touch.png" />

<link rel="apple-touch-icon-precomposed" href="images/touch.png" />


y para descargar el icono sin preocuparse de lo que el icono se puede utilizar au tilidad como http://www.google.com/s2/favicons que hacer todo el trabajo pesado:

var client = new System.Net.WebClient(); 

client.DownloadFile(
    @"http://www.google.com/s2/favicons?domain=stackoverflow.com", 
    "stackoverflow.com.ico"); 

Espero que ayude!

+1

¿Sigue funcionando GetFavIcon? cuando ejecuto su ejemplo me sale un error de 400 – Julien

+7

parece que Google tiene un servicio similar ahora: http://www.google.com/s2/favicons?domain_url=stackoverflow.com – hunter

+5

si alguien quiere una alternativa a Google, DuckDuckGo tiene Otra solución: http://icons.duckduckgo.com/ip2/www.stackoverflow.com.ico –

5

Lo primero que debe buscar es /favicon.ico en la raíz del sitio; algo como WebClient.DownloadFile() debería funcionar bien. Sin embargo, también se puede establecer el icono de metadatos - por lo que esta es:

<link rel="shortcut icon" 
    href="http://sstatic.net/stackoverflow/img/favicon.ico"> 

y tenga en cuenta que los iconos alternativos podrían estar disponibles; el "toque" tiende a ser más grandes y más altos res, por ejemplo:

<link rel="apple-touch-icon" 
    href="http://sstatic.net/stackoverflow/img/apple-touch-icon.png"> 

por lo que habría que analizar, ya sea en la agilidad del paquete de HTML o XmlDocument (si XHTML) y el uso de cliente Web.DownloadFile()

Aquí hay un código que he usado para obtener datos con el paquete de agilidad:

var favicon = "/favicon.ico"; 
var el=root.SelectSingleNode("/html/head/link[@rel='shortcut icon' and @href]"); 
if (el != null) favicon = el.Attributes["href"].Value; 

Nota el icono es de ellos, no el suyo.

+1

Gracias Marc. Aprecio el ejemplo. Con las imágenes, no tengo la intención de modificarlas o usarlas para nada que no sean iconos en el menú contextual junto a la etiqueta del atajo. –

3

Yo puedo obtener la URL de favicon del HTML del sitio web.

Aquí es la etiqueta favicon:

<link rel="icon" type="image/png" href="/someimage.png" /> 

se debe utilizar una expresión regular aquí. Si no se encuentra ninguna etiqueta, busque "favicon.ico" en el directorio raíz del sitio. Si no se encuentra nada, el sitio no tiene un favicon.

2
 HttpWebRequest w = (HttpWebRequest)HttpWebRequest.Create("http://stackoverflow.com/favicon.ico"); 

     w.AllowAutoRedirect = true; 

     HttpWebResponse r = (HttpWebResponse)w.GetResponse(); 

     System.Drawing.Image ico; 
     using (Stream s = r.GetResponseStream()) 
     { 
      ico = System.Drawing.Image.FromStream(s); 
     } 

     ico.Save("favicon.ico"); 
10

Aquí hay 2 opciones, he probado más de 100 URL y obtuve resultados diferentes que cada opción. Tenga en cuenta que esta solución no es C#, pero C# puede no ser necesario.

<img height="16" width="16" src='http://grabicon.com/edocuments.co.uk' /> 

<img height="16" width="16" src='http://www.google.com/s2/favicons?domain=www.edocuments.co.uk' /> 
+3

grabicon.com ahora es servicio pagado a partir de $ 9/mes – janot

+1

Otro: http://favicon.allesedv.com/

1

Ésta es una respuesta tardía, pero está completo: es bastante difícil conseguir ni siquiera cerca de 90% de ir a buscar todos los iconos de favoritos.

Hace un tiempo escribí un plugin de WordPress: http://wordpress.org/extend/plugins/wp-favicons/ que intenta acercarse.

a. comienza mirando repositorios de favicon como google favicons, getfavicons, etc. ...

b. si ninguno de ellos devuelve un ícono (lo compruebo haciendo coincidir con el icono predeterminado que devuelven) empiezo por intentar obtener el ícono yo mismo

c. esto implica atravesar las páginas, pero también revisar las redirecciones con NO autoredirect así como atravesar los 404 porque también en los 404's podría estar presente un ícono. Al final significa que tendrá que analizar los redireccionamientos en el encabezado html así como los redireccionamientos de JavaScript para estar más cerca de ser 100%

d. después de eso, realizo algunas inspecciones en el archivo de imagen física, porque a veces en algunos servidores (probé 300.000+) los archivos se devuelven con el tipo de mime incorrecto, etc.

El código aún no es perfecto porque en los detalles se vuelve loco, encontrará muchas situaciones extrañas: las personas tienen rutas codificadas incorrectamente (img/favicon.ico donde img NO está en la raíz), encabezados duplicados en la salida html, diferentes respuestas del servidor de una cabeza y cuerpo, etc ...

el núcleo de la pieza es ir a buscar aquí: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/server/class-http.php para que pueda técnicas de ingeniería inversa, pero tenga en cuenta que la validación de la respuesta realmente debe hacerse (control de tipo de archivo de imagen, mimo, etc ..)

2

Puede hacerlo sin programar. Simplemente abra el sitio web, haga clic con el botón derecho y seleccione "ver fuente" para abrir el código HTML de ese sitio.A continuación, en la búsqueda de editor de texto para "favicon" - le dirigirá a algo parecido a

<link rel="icon" href='/SOMERELATIVEPATH/favicon.ico' type="image/x-icon" /> 

tomar la cadena en href y lo añaden a la URL base del sitio web (supongamos que es "http://WEBSITE/"), por lo que parece

http://WEBSITE/SOMERELATIVEPATH/favicon.ico

que es la ruta absoluta al favicon. Si no lo encontraste de esta manera, también puede estar en la raíz, en cuyo caso la URL es http://WEBSITE/favicon.ico.

Tome la URL que determina e insertarlo en el código siguiente:

<html> 
    <head> 
    <title>Capture Favicon</title> 
    </head> 
    <body> 
    <a href='http://WEBSITE/SOMERELATIVEPATH/favicon.ico' alt="Favicon"/>Favicon</a> 
    </body> 
</html> 

Guardar este código HTML a nivel local (por ejemplo en el escritorio) como GetFavicon.html y haga doble clic en él para abrirlo. Mostrará solo un enlace llamado Favicon. Haga clic derecho en este enlace y seleccione "Guardar destino como ..." para guardar el Favicon en su PC local, ¡y listo!

0

Puede utilizar Getfv.co:

To retrieve a favicon you can hotlink it at... http://g.etfv.co/[URL]

Ejemplo público: http://g.etfv.co/https://stackoverflow.com/questions/5119041/how-can-i-get-a-web-sites-favicon

Descargar contenido y vamos!

Editar:

Getfv.co y fvicon.com parecen muertos. Si lo desea, he encontrado una alternativa no gratuita: grabicon.com.

+1

Enlace muerto, error: no encontrado – tttony

+0

@tttony Indeed. fvicon.com parece muerto también. Editaré mi comentario con contenido pago. si encuentras un enlace libre de trabajo, ¡por favor compártelo! – aloisdg

1

He encontrado que el 'SHGetFileInfo' (Compruebe 'www.pinvoke.net' para la firma) le permite recuperar un ícono grande o pequeño, como si estuviera tratando con un archivo/carpeta/elemento de Shell .

Jens;)

Cuestiones relacionadas