Como posso obter o favicon de um site?

115

Pergunta bastante simples: criei um pequeno aplicativo que é basicamente apenas um favorito que fica na bandeja do sistema para que eu possa abrir sites / pastas / arquivos usados ​​com frequência no mesmo lugar. Obter os ícones padrão do meu sistema para tipos de arquivo conhecidos não é terrivelmente complicado, mas não sei como obter o favicon de um site. (SO tem o ícone cinza-> pilha laranja na barra de endereço, por exemplo)

Alguém sabe como posso fazer isso?

Steven Evers
fonte
1
Não tenho certeza de quão fácil (ou possível) seria automatizar o carregamento / análise desta página, mas parece que tem tudo: Favicon-Checker . No mínimo, você pode usá-lo como uma referência / verificação.
Kevin Fegan
Você poderia apenas usar a API Statvoo Favicon , que seria muito rápido e indolor.
AO_
O Favicon Kit permite obter e incorporar favicons como imagens normais, em tamanhos muito maiores do que 16 pixels , se disponíveis. (Divulgação: eu sou o autor)
AndreasPizsa

Respostas:

234

Você vai querer resolver isso de algumas maneiras:

  1. Procure favicon.icona raiz do domínio

    www.domain.com/favicon.ico

  2. Procure uma <link>tag com o rel="shortcut icon"atributo

    <link rel="shortcut icon" href="https://stackoverflow.com/favicon.ico" />

  3. Procure uma <link>tag com o rel="icon"atributo

    <link rel="icon" href="https://stackoverflow.com/favicon.png" />

Os dois últimos geralmente produzirão uma imagem de qualidade superior.


Apenas para cobrir todas as bases, existem arquivos de ícone específicos do dispositivo que podem produzir imagens de qualidade superior, uma vez que esses dispositivos geralmente têm ícones maiores no dispositivo do que um navegador precisaria:

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

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


E para baixar o ícone sem se importar com o que ele é, você pode usar um utilitário como http://www.google.com/s2/favicons que fará todo o trabalho pesado:

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

client.DownloadFile(
    @"http://www.google.com/s2/favicons?domain=stackoverflow.com",
    "stackoverflow.com.ico");
caçador
fonte
1
GetFavIcon ainda funciona? quando executo seu exemplo, obtenho um erro 400
Julien
17
parece que o Google tem um serviço semelhante agora: google.com/s2/favicons?domain_url=stackoverflow.com
hunter
20
se alguém quiser uma alternativa ao Google, DuckDuckGo tem outra solução: icons.duckduckgo.com/ip2/www.stackoverflow.com.ico
Jose Serodio
1
@hunter google.com/s2/faviconsé um ícone com 16x16 é um ícone terrível, você sabe para onde tirar o ícone maior?
nideba
1
@JoseSerodio - Bem ... foi a primeira coisa que tentei, mas para o domínio que estava verificando, acabei de obter uma imagem "fraca / opaca" de uma seta apontando para a direita (maior que) dentro de um círculo dentro de um quadrado . Parecia assim , mas verifiquei para ter certeza de que "domain.com.ico" estava escrito corretamente. Agora, pelas maravilhas da internet, está funcionando corretamente ... vai entender =) então, deixa pra lá.
Kevin Fegan
18

Atualizado em 2020

Aqui estão três serviços que você pode usar de 2020 em diante

<img height="16" width="16" src='https://icons.duckduckgo.com/ip3/www.google.com.ico' />

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

<img height="16" width="16" src='https://api.statvoo.com/favicon/?url=google.com' />
Blowsie
fonte
4
grabicon.com agora é serviço pago a partir de US $ 9 / mo
janot
1
Outro: favicon.allesedv.com <img width = "144" height = "144" src = "// f3.allesedv.com/144/www.stackoverflow.com" />
Martin Seitl
Este serviço não funciona mais, você pode usar api.statvoo.com/favicon/?url=stackoverflow.com . Eu o usei por alguns anos e nunca me decepcionou.
AO_
Obrigado @AO_, estou usando duckduckgo atualmente. Atualizei minha resposta
Blowsie
1
@saintvixalien Acredito que isso mudou recentemente para pessoas que não inicializam com uma chave de API, pois os servidores estavam sendo sobrecarregados;) Eu uso o serviço primário com uma chave de API e obtenho respostas diretamente sem o wrapper. Fiz teste sem uma chave API e ela redireciona para o serviço do Google como você disse ..
AO_
6

A primeira coisa a procurar é /favicon.ico na raiz do site; algo como WebClient.DownloadFile () deve servir. No entanto, você também pode definir o ícone nos metadados - para SO é:

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

e observe que ícones alternativos podem estar disponíveis; o "touch" tende a ser maior e com maior resolução, por exemplo:

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

então você deve analisar isso no HTML Agility Pack ou no XmlDocument (se xhtml) e usar WebClient.DownloadFile ()

Aqui está um código que usei para obter isso por meio do pacote de agilidade:

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

Observe que o ícone é deles, não seu.

Marc Gravell
fonte
1
Obrigado Marc. Agradeço o exemplo. Com as imagens, não pretendo modificá-las ou usá-las para nada além de ícones no menu de contexto ao lado do rótulo do atalho.
Steven Evers
3

Você pode obter o URL do favicon no HTML do site.

Aqui está a tag favicon:

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

Você deve usar uma expressão regular aqui. Se nenhuma tag for encontrada, procure "favicon.ico" no diretório raiz do site. Se nada for encontrado, o site não possui um favicon.

OOO '' MMM ''
fonte
2

Você pode fazer isso sem programação . Basta abrir o site, clicar com o botão direito e selecionar "ver fonte" para abrir o código HTML desse site. Em seguida, no editor de texto, pesquise "favicon" - ele o direcionará para algo parecido com

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

pegue a string hrefe anexe-a ao URL base do site (vamos supor que seja "http://WEBSITE/"), para que pareça

http://WEBSITE/SOMERELATIVEPATH/favicon.ico

que é o caminho absoluto para o favicon. Se não o encontrou desta forma, também pode estar na raiz, caso em que o URL está http://WEBSITE/favicon.ico.

Pegue o URL que você determinou e insira-o no seguinte código:

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

Salve este código HTML localmente (por exemplo, em sua área de trabalho) como GetFavicon.htmle clique duas vezes nele para abri-lo. Ele exibirá apenas um link chamado Favicon . Clique com o botão direito neste link e selecione "Salvar destino como ..." para salvar o Favicon em seu PC local - e pronto!

Matt
fonte
1
        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");
pmcilreavy
fonte
1

Esta é uma resposta tardia, mas para completar: é muito difícil chegar perto de 90% da obtenção de todos os favicons.

Há algum tempo, escrevi um plugin para WordPress: http://wordpress.org/extend/plugins/wp-favicons/ que tenta se aproximar.

uma. começa olhando para repositórios de favicon, como favicons do google, getfavicons etc ...

b. se nenhum deles retornar um ícone (eu verifico isso combinando com o ícone padrão que eles retornam), eu começo tentando obter o ícone sozinho

c. isso envolve percorrer as páginas, mas também verificar redirecionamentos SEM autoredirecionamento, bem como percorrer 404 porque também no 404 pode haver um ícone. No final, isso significa que você terá que analisar também os redirecionamentos no cabeçalho html, bem como os redirecionamentos javascript para ficar mais perto de ser 100%

d. depois disso, faço algumas inspeções no arquivo de imagem física, porque também às vezes em alguns servidores (testei mais de 300.000) os arquivos são retornados com o tipo MIME incorreto etc.

O código ainda não é perfeito porque nos detalhes fica louco, você encontrará muitas situações estranhas: pessoas têm caminhos codificados incorretamente (img / favicon.ico onde img NÃO está na raiz), cabeçalhos duplicados na saída html, respostas de servidor diferentes de uma cabeça e corpo etc ...

o núcleo da parte de busca está aqui: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/server/class-http.php para que você possa fazer a engenharia reversa, mas esteja ciente de que a validação da resposta deve realmente feito (verificando o tipo de arquivo da imagem, mímica etc.)

Edelwater
fonte
1

Descobri que o 'SHGetFileInfo' (marque 'www.pinvoke.net' para a assinatura) permite que você recupere um ícone pequeno ou grande, como se estivesse lidando com um arquivo / pasta / item Shell.

Jens;)

Jens
fonte
0

Você pode usar Getfv.co :

Para recuperar um favicon, você pode fazer um hotlink em ... http://g.etfv.co/[URL]

Exemplo para esta página: http://g.etfv.co//programming/5119041/how-can-i-get-a-web-sites-favicon

Baixe o conteúdo e vamos lá!

Editar:

Getfv.co e fvicon.com parecem mortos. Se você quiser, encontrei uma alternativa não gratuita: grabicon.com .

aloisdg mudando para codidact.com
fonte
1
Link
inativo
@tttony certamente. fvicon.com também parece morto. Vou editar meu comentário com conteúdo pago. se você encontrar um link gratuito funcionando, compartilhe-o!
aloisdg mudando para codidact.com
0

Usando jquery

var favicon = $("link[rel='shortcut icon']").attr("href") ||
              $("link[rel='icon']").attr("href") || "";
VP
fonte
0

Em 2020, usando o serviço duckduckgo.com da CLI

curl -v https://icons.duckduckgo.com/ip2/<website>.ico > favicon.ico

Exemplo

curl -v https://icons.duckduckgo.com/ip2/www.cdc.gov.ico > favicon.ico
Alex Nolasco
fonte