如何获得网站的收藏夹图标?


115

问题很简单:我已经创建了一个小应用程序,它基本上只是位于系统托盘中的收藏夹,因此我可以从同一位置打开常用的网站/文件夹/文件。从我的系统中获取已知文件类型的默认图标并不十分复杂,但是我不知道如何从网站获取该图标。(例如,SO在地址栏中具有灰色->橙色堆栈图标)

有人知道我该怎么做吗?


1
我不确定自动执行此页面的加载/解析将有多么容易(或可能),但似乎具备一切:Favicon-Checker。至少,您可以将其用作参考/检查。
凯文·费根

您可以只使用Statvoo Favicon API,这将非常快捷,轻松
AO_

Favicon工具包可让您获取和嵌入像常规图像一样的Favicon,其尺寸远大于16像素(如果有)。(披露:我是作者)
AndreasPizsa

Answers:


234

您将通过以下几种方法解决此问题:

  1. 寻找favicon.ico域的根

    www.domain.com/favicon.ico

  2. 寻找<link>具有rel="shortcut icon"属性的标签

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

  3. 寻找<link>具有rel="icon"属性的标签

    <link rel="icon" href="https://stackoverflow.com/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");

1
GetFavIcon仍然有效吗?当我运行您的示例时,出现400错误
Julien 2015年

17
看起来Google现在也提供了类似的服务:google.com/s2/favicons?
猎人

20
如果有人想要Google的替代产品,DuckDuckGo还有另一个解决方案:icons.duckduckgo.com/ip2/www.stackoverflow.com.ico
Jose Serodio

1
@hunter google.com/s2/favicons这是一个16x16的图标,这是可怕的图标,您知道在哪里拿较大的图标吗?
nideba '19

1
@JoseSerodio-嗯...这是我尝试的第一件事,但是对于我正在检查的域,我只是在圆圈内-正方形内看到了右指向箭头(大于)的“暗淡/暗淡”图像。看起来像这样,但是我检查以确保正确拼写了“ domain.com.ico”。现在,通过互联网的奇观,它可以正常工作...如图=)所以,没关系。
凯文·费根

19

2020年更新

这是2020年以后可以使用的三项服务

<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' />

4
目前,grabicon.com的付费服务起价为$ 9 /月
janot

1
另一个:favicon.allesedv.com <img width =“ 144” height =“ 144” src =“ // f3.allesedv.com/144/www.stackoverflow.com” />
Martin Seitl,

该服务不再起作用,您可以使用api.statvoo.com/favicon/?url=stackoverflow.com。我已经使用了两年了,它从未让我失望。
AO_

谢谢@AO_,这些天我实际上是在使用duckduckgo,我已经更新了我的答案
Blowsie

1
@saintvixalien我相信对于那些不使用API​​密钥进行初始化的人来说,这已经发生了变化,因为服务器越来越重;)我使用具有API密钥的主要服务,而无需包装就可以直接获取响应。我做了测试没有API密钥,它像你说的重定向到谷歌的服务..
AO_


6

首先要查找的是站点根目录中的/favicon.ico。WebClient.DownloadFile()之类的东西应该可以正常工作。但是,您也可以在元数据中设置图标-因此,这是:

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

请注意,图标是他们的,而不是您的。


1
谢谢马克。我赞赏这个例子。写这些图像时,除了快捷菜单标签旁边的上下文菜单中的图标以外,我无意对其进行修改或使用它们。
史蒂文·埃弗斯


3

您可以从网站的HTML获取网站图标URL。

这是favicon标签:

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

您应该在此处使用正则表达式。如果未找到标签,请在网站根目录中查找“ favicon.ico”。如果未找到任何内容,则该站点没有网站图标。


2

无需编程就可以做到。只需打开网站,右键单击并选择“查看源代码”即可打开该网站的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保存在本地PC上,您就完成了!


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");

1

这是一个较晚的答案,但出于完整性考虑:要获取所有网站图标的比例接近90%几乎是困难的。

不久前,我写了一个WordPress插件:http : //wordpress.org/extend/plugins/wp-favicons/,它试图变得更近一些。

一个。首先查看favicon存储库,例如google favicons,getfavicons等。

b。如果它们都不返回图标(我通过与它们返回的默认图标匹配来检查),我首先尝试自己获取图标

C。这涉及遍历页面,还检查没有自动重定向的重定向以及遍历404,因为在404上也可能会出现一个图标。最后,这意味着您还必须解析html标头中的重定向以及javascript重定向,以使其接近100%

d。之后,我对物理映像文件进行了一些检查,因为有时在某些服务器(我测试了300.000+)上,文件返回的MIME类型也不正确,等等。

代码仍然不是完美的,因为在细节上变得疯狂,您会发现许多奇怪的情况:人们错误地编码了路径(img / favicon.ico,其中img不在根目录中),html输出中的重复标题,不同的服务器响应从头部和身体等...

获取部分的核心在这里:http : //plugins.svn.wordpress.org/wp-favicons/trunk/includes/server/class-http.php,因此您可以对其进行反向工程,但要注意验证响应应该真的完成了(检查图像文件类型,mime等。)


1

我发现“ SHGetFileInfo”(检查签名为“ www.pinvoke.net”)使您可以检索大小的图标,就像处理文件/文件夹/ Shell项一样。

詹斯;)



0

您可以使用Getfv.co

要检索收藏夹图标,可以在以下位置对其进行热链接:http: //g.etfv.co/[URL ]

此页面的示例: http //g.etfv.co/https //stackoverflow.com/questions/5119041/how-can-i-get-a-web-sites-favicon

下载内容,开始吧!

编辑:

Getfv.co和fvicon.com看起来已经死了。如果您愿意的话,我找到了一个非免费的替代方法:grabicon.com


1
链接已死,错误:未找到
tttony

@tttony确实。fvicon.com看起来也死了。我将用付费内容编辑我的评论。如果您找到免费的有效链接,请分享!
aloisdg移至codidact.com,2016年

0

使用jQuery

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

0

2020年,使用CLI的duckduckgo.com服务

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

curl -v https://icons.duckduckgo.com/ip2/www.cdc.gov.ico > favicon.ico
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.