Как я могу получить значок сайта? - PullRequest
87 голосов
/ 25 февраля 2011

Достаточно простой вопрос: я создал небольшое приложение, которое в основном просто избранное, которое находится в моем системном трее, чтобы я мог открывать часто используемые сайты / папки / файлы из одного места.Получение значков по умолчанию из моей системы для известных типов файлов не очень сложно, но я не знаю, как получить значок с веб-сайта.(Так, например, в адресной строке отображается серый стек> оранжевый значок)

Кто-нибудь знает, как мне поступить?

Ответы [ 13 ]

190 голосов
/ 25 февраля 2011

Вы можете решить эту проблему несколькими способами:

  1. Ищите favicon.ico в корне домена

    www.domain.com/favicon.ico

  2. Найдите тег <link> с атрибутом rel="shortcut icon"

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

  3. Найдите тег <link> с атрибутом rel="icon"

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

Последние два обычно дают более высокое качество изображения.


Чтобы охватить все базы, существуют файлы значков для конкретных устройств, которые могут давать изображения более высокого качества, поскольку эти устройства обычно имеют большие значки на устройстве, чем требуется браузеру:

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

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


И чтобы загрузить значок, не обращая внимания на то, что это за значок, вы можете использовать утилиту типа http://www.google.com/s2/favicons, которая выполнит всю тяжелую работу:

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

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

Надеюсь, это поможет!

10 голосов
/ 29 мая 2012

Вот 2 варианта, я протестировал более 100 URL и получил разные результаты, которые каждый вариант. Обратите внимание, что это решение не на C #, но C # может не понадобиться.

<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' />
8 голосов
/ 19 февраля 2014
6 голосов
/ 25 февраля 2011

Первое, что нужно искать, это /favicon.ico в корне сайта; что-то вроде WebClient.DownloadFile () должно работать нормально. Тем не менее, вы также можете установить значок в метаданных - для SO это:

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

и обратите внимание, что альтернативные значки могут быть доступны; «касание» имеет тенденцию быть больше и выше, например:

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

так что вы можете разобрать это в HTML Agility Pack или XmlDocument (если xhtml) и использовать WebClient.DownloadFile ()

Вот некоторый код, который я использовал для получения этого с помощью пакета гибкости:

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

Обратите внимание, что значок их, а не ваш.

4 голосов
/ 11 февраля 2016

Хорошей практикой является минимизация количества запросов, необходимых каждой странице.Так что если вам нужно несколько иконок, Яндекс может сделать спрайт из значков в одном запросе.Вот пример http://favicon.yandex.net/favicon/google.com/stackoverflow.com/yandex.net/

3 голосов
/ 25 февраля 2011

Вы можете получить URL-адрес значка из HTML-кода веб-сайта.

Вот тег favicon:

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

Вы должны использовать регулярное выражение здесь. Если тег не найден, ищите «favicon.ico» в корневом каталоге сайта. Если ничего не найдено, на сайте нет значка избранного.

2 голосов
/ 02 июля 2013

Вы можете сделать это без программирования .Просто откройте веб-сайт, щелкните правой кнопкой мыши и выберите «просмотреть исходный код» , чтобы открыть HTML-код этого сайта.Затем в текстовом редакторе найдите "favicon" - он направит вас к чему-то похожему на

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

, возьмите строку в href и добавьте ее к базовому URL веб-сайта.(предположим, что это "http://WEBSITE/"), поэтому он выглядит как

http://WEBSITE/SOMERELATIVEPATH/favicon.ico

, который является абсолютным путем к значку.Если вы не нашли его таким образом, он также может быть в корне, и в этом случае URL будет http://WEBSITE/favicon.ico.

Возьмите определенный вами URL и вставьте его в следующий код:

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

Сохраните этот HTML-код локально (например, на рабочем столе) как GetFavicon.html, а затем дважды щелкните его, чтобы открыть его.Будет отображаться только ссылка с именем Favicon .Щелкните правой кнопкой мыши по этой ссылке и выберите «Сохранить объект как ...» , чтобы сохранить Favicon на локальном ПК - и все готово!

2 голосов
/ 25 февраля 2011
        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");
1 голос
/ 12 ноября 2013

Я обнаружил, что «SHGetFileInfo» (проверьте «www.pinvoke.net» для подписи) позволяет получить маленький или большой значок, как если бы вы имели дело с элементом file / folder / Shell.

Йенс;)

1 голос
/ 24 февраля 2013

Это поздний ответ, но для полноты: довольно сложно даже приблизиться к 90% выборки всех значков.

Некоторое время назад я написал плагин для WordPress: http://wordpress.org/extend/plugins/wp-favicons/, который пытается приблизиться.

а. он начинается с просмотра репозиториев favicon, таких как favicons google, getfavicons и т. д. *

б. если ни один из них не возвращает значок (я проверяю это по значку, который они возвращают по умолчанию) я начинаю с попытки получить значок сам

с. это включает в себя обход страниц, а также проверку перенаправлений без автоматической перенаправления, а также обход 404-х, потому что также на 404-й иконке может присутствовать значок. В конце концов, это означает, что вам придется анализировать и перенаправления в заголовке html, и перенаправления javascript, чтобы приблизиться к 100%

д. после этого я делаю некоторые проверки физического файла образа, потому что иногда на некоторых серверах (я проверял более 300 000) файлы возвращаются с неверным типом mime и т. д.

Код все еще не совершенен, потому что в деталях он сходит с ума, вы найдете много странных ситуаций: люди имеют неправильно закодированные пути (img / favicon.ico, где img НЕ находится в корне), дублирующие заголовки в выводе html, разные ответы сервера от головы и тела и т.д ...

ядро ​​извлекаемой части находится здесь: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/server/class-http.php, так что вы можете выполнить обратный инжиниринг, но помните, что проверка ответа действительно должна быть выполнена (проверка типа файла изображения, MIME и т. Д.)

...