Jak mogę uzyskać favicon witryny internetowej?

115

Dość proste pytanie: stworzyłem małą aplikację, która jest w zasadzie tylko ulubionymi, która znajduje się w moim zasobniku systemowym, dzięki czemu mogę otwierać często używane witryny / foldery / pliki z tego samego miejsca. Pobieranie domyślnych ikon z mojego systemu dla znanych typów plików nie jest strasznie skomplikowane, ale nie wiem, jak pobrać favicon ze strony internetowej. (SO ma na przykład szarą-> pomarańczową ikonę stosu na pasku adresu)

Czy ktoś wie, jak mogę się do tego zabrać?

Steven Evers
źródło
1
Nie jestem pewien, jak łatwe (lub możliwe) byłoby zautomatyzowanie ładowania / analizowania tej strony, ale wydaje się, że ma wszystko: Favicon-Checker . Przynajmniej możesz użyć go jako odniesienia / sprawdzenia.
Kevin Fegan
Możesz po prostu użyć Statvoo Favicon API , które byłoby dość szybkie i bezbolesne.
AO_
Zestaw Favicon umożliwia pobieranie i osadzanie ikon ulubionych, takich jak zwykłe obrazy, w rozmiarach znacznie większych niż 16 pikseli , jeśli są dostępne. (Ujawnienie: jestem autorem)
AndreasPizsa

Odpowiedzi:

235

Będziesz chciał rozwiązać ten problem na kilka sposobów:

  1. Poszukaj favicon.icow katalogu głównym domeny

    www.domain.com/favicon.ico

  2. Poszukaj <link>tagu z rel="shortcut icon"atrybutem

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

  3. Poszukaj <link>tagu z rel="icon"atrybutem

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

Te dwa ostatnie zwykle dają obraz o wyższej jakości.


Aby objąć wszystkie podstawy, istnieją pliki ikon dla konkretnego urządzenia, które mogą dawać obrazy o wyższej jakości, ponieważ te urządzenia mają zwykle większe ikony na urządzeniu, niż potrzebuje przeglądarka:

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

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


Aby pobrać ikonę bez dbania o to, co to za ikona, możesz użyć narzędzia takiego jak http://www.google.com/s2/favicons, które wykona wszystkie ciężkie czynności:

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

client.DownloadFile(
    @"http://www.google.com/s2/favicons?domain=stackoverflow.com",
    "stackoverflow.com.ico");
myśliwy
źródło
1
czy GetFavIcon nadal działa? kiedy uruchomię twój przykład, otrzymuję błąd 400
Julien
17
wygląda na to, że Google ma teraz podobną usługę: google.com/s2/favicons?domain_url=stackoverflow.com
hunter
20
jeśli ktoś chce alternatywy dla Google, DuckDuckGo ma inne rozwiązanie: icons.duckduckgo.com/ip2/www.stackoverflow.com.ico
Jose Serodio.
1
@hunter google.com/s2/faviconsto ikona z 16x16 to okropna ikona. Czy wiesz, gdzie wziąć większą ikonę?
nideba
1
@JoseSerodio - Cóż ... to była pierwsza rzecz, którą wypróbowałem, ale dla domeny, którą sprawdzałem, właśnie uzyskałem „ciemny / matowy” obraz strzałki skierowanej w prawo (większej niż) wewnątrz koła wewnątrz kwadratu . Wyglądało to tak , ale sprawdziłem, czy poprawnie napisałem „domain.com.ico”. Teraz, cuda internetu, działa poprawnie ... idź rysunek =), więc nieważne.
Kevin Fegan
19

Zaktualizowano 2020

Oto trzy usługi, z których możesz korzystać w 2020 roku

<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
źródło
4
grabicon.com jest teraz usługą płatną od 9 $ /
mies.
1
Kolejny: favicon.allesedv.com <img width = "144" height = "144" src = "// f3.allesedv.com/144/www.stackoverflow.com" />
Martin Seitl
Ta usługa już nie działa. Możesz użyć api.statvoo.com/favicon/?url=stackoverflow.com . Używam go od kilku lat i nigdy mnie nie zawiódł.
AO_
Dzięki @AO_, obecnie używam duckduckgo, zaktualizowałem odpowiedź
Blowsie
1
@saintvixalien Uważam, że ostatnio zmieniło się to dla osób, które nie inicjalizują się za pomocą klucza API, ponieważ serwery były wbijane;) Używam usługi podstawowej z kluczem API i otrzymuję odpowiedzi bezpośrednio bez wrappera. Zrobiłem test bez klucza API i przekierowuje do usługi Google, jak powiedziałeś ...
AO_
6

Pierwszą rzeczą, której należy szukać, jest /favicon.ico w katalogu głównym witryny; coś takiego jak WebClient.DownloadFile () powinno wystarczyć. Możesz jednak ustawić ikonę również w metadanych - w przypadku SO jest to:

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

i pamiętaj, że mogą być dostępne alternatywne ikony; „dotykowy” ma tendencję do bycia większym i wyższą rozdzielczością, na przykład:

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

więc przeanalizowałbyś to w HTML Agility Pack lub XmlDocument (jeśli xhtml) i użył WebClient.DownloadFile ()

Oto kod, którego użyłem, aby uzyskać to za pośrednictwem pakietu agility:

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

Zauważ, że ikona należy do nich, a nie do Ciebie.

Marc Gravell
źródło
1
Dzięki Marc. Doceniam przykład. Pisząc obrazy, nie zamierzam ich modyfikować ani używać do niczego innego niż ikony w menu kontekstowym obok etykiety skrótu.
Steven Evers,
3

Możesz uzyskać adres URL favicon z kodu HTML witryny.

Oto tag favicon:

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

Powinieneś tutaj użyć wyrażenia regularnego. Jeśli nie znaleziono tagu, poszukaj „favicon.ico” w katalogu głównym witryny. Jeśli nic nie zostało znalezione, witryna nie ma ikony ulubionych.

OOO „MMM”
źródło
2

Możesz to zrobić bez programowania . Wystarczy otworzyć witrynę internetową, kliknąć prawym przyciskiem myszy i wybrać opcję „Wyświetl źródło”, aby otworzyć kod HTML tej witryny. Następnie w edytorze tekstu wyszukaj „favicon” - skieruje Cię do czegoś podobnego

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

weź ciąg hrefi dołącz go do podstawowego adresu URL witryny internetowej (załóżmy, że tak jest "http://WEBSITE/"), tak to wygląda

http://WEBSITE/SOMERELATIVEPATH/favicon.ico

która jest absolutną ścieżką do favicon. Jeśli nie znalazłeś tego w ten sposób, może również znajdować się w katalogu głównym, w którym to przypadku jest to adres URLhttp://WEBSITE/favicon.ico .

Weź podany adres URL i wstaw go do następującego kodu:

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

Zapisz ten kod HTML lokalnie (np. Na pulpicie) jako, GetFavicon.htmla następnie kliknij go dwukrotnie, aby go otworzyć. Wyświetli tylko link o nazwie Favicon . Kliknij prawym przyciskiem myszy to łącze i wybierz „Zapisz element docelowy jako…”, aby zapisać ikonę Favicon na lokalnym komputerze - i gotowe!

Matt
źródło
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
źródło
1

To późna odpowiedź, ale dla kompletności: dość trudno jest nawet zbliżyć się do 90% pobrania wszystkich faviconów.

Jakiś czas temu napisałem wtyczkę do WordPressa: http://wordpress.org/extend/plugins/wp-favicons/, która próbuje się zbliżyć.

za. zaczyna się od przejrzenia repozytoriów favicon, takich jak favicony google, getfavicons itp.

b. jeśli żaden z nich nie zwraca ikony (sprawdzam to, dopasowując do domyślnej ikony, którą zwracają), zaczynam od próby samodzielnego uzyskania ikony

do. Obejmuje to przechodzenie przez strony, ale także sprawdzanie przekierowań bez automatycznego przekierowania, a także przechodzenie z błędami 404, ponieważ również na błędach 404 może być obecna ikona. W końcu oznacza to, że będziesz musiał przeanalizować również przekierowania w nagłówku html, a także przekierowania javascript, aby zbliżyć się do 100%

re. potem przeprowadzam inspekcje fizycznego pliku obrazu, ponieważ czasami na niektórych serwerach (testowałem ponad 300 000) pliki są zwracane z nieprawidłowym typem MIME itp.

Kod nadal nie jest doskonały, ponieważ w szczegółach robi się szalony, znajdziesz wiele dziwnych sytuacji: ludzie mają źle zakodowane ścieżki (img / favicon.ico, gdzie img NIE jest w katalogu głównym), zduplikowane nagłówki w wyjściu html, różne odpowiedzi serwera z głowy i ciała itp ...

rdzeń części pobierającej znajduje się tutaj: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/server/class-http.php, więc możesz ją odtworzyć, ale pamiętaj, że weryfikacja odpowiedzi powinna naprawdę gotowe (sprawdzanie typu pliku obrazu, mime itp.)

edelwater
źródło
1

Zauważyłem, że „SHGetFileInfo” (sprawdź „www.pinvoke.net” pod kątem podpisu) umożliwia pobranie małej lub dużej ikony, tak jakbyś miał do czynienia z plikiem / folderem / elementem powłoki.

Jens;)

Jens
źródło
0

Możesz użyć Getfv.co :

Aby pobrać favikonę, możesz połączyć ją przez hotlink pod adresem ... http://g.etfv.co/[URL]

Przykład dla tej strony: http://g.etfv.co//programming/5119041/how-can-i-get-a-web-sites-favicon

Pobierz zawartość i chodźmy!

Edytować :

Getfv.co i fvicon.com wyglądają na martwe. Jeśli chcesz, znalazłem płatną alternatywę: grabicon.com .

aloisdg przenosi się na codidact.com
źródło
1
Link nie żyje, błąd: nie znaleziono
tttony
@tttony Indeed. fvicon.com też wygląda na martwą. Zmienię swój komentarz za pomocą płatnych treści. jeśli znajdziesz działający bezpłatny link, udostępnij go!
aloisdg przenosi się na codidact.com
0

Korzystanie z jquery

var favicon = $("link[rel='shortcut icon']").attr("href") ||
              $("link[rel='icon']").attr("href") || "";
Wiceprezes
źródło
0

W 2020 roku, korzystając z usługi duckduckgo.com z poziomu CLI

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

Przykład

curl -v https://icons.duckduckgo.com/ip2/www.cdc.gov.ico > favicon.ico
Alex Nolasco
źródło