1

如何使用 Chromium Embedded Framework 获取 favicon 网站?我可以查看源代码并获取图标的 url,但是有些网站,例如 Facebook,不使用标准程序添加图标,那么,我如何获取图标?谢谢。

4

4 回答 4

4

favicon 的规则都在Wikipedia页面上进行了解释。

该标准在文档部分中使用带有 rel 属性的链接元素<head>来指定文件格式、文件名和可以为任何网站目录指定的位置。

您需要在元素内部查看<head>这种link形式的元素:

<link rel="shortcut icon" href="http://example.com/myicon.ico" />

或者

<link rel="icon" type="image/vnd.microsoft.icon"
    href="http://example.com/image.ico" />

如果您没有找到此类链接,则使用favicon.ico在根目录中查找的回退。


我不确定你为什么认为 Facebook 不遵循标准。我刚刚查看了一个包含以下内容的 FB 页面:

<link rel="shortcut icon" 
    href="http://static.ak.fbcdn.net/rsrc.php/yP/r/Ivn-CVe5TGK.ico" />

网站不可能使用其他机制将网站图标获取到浏览器。浏览器遵循明确定义的获取网站图标的规则。如果网站做了不同的事情,浏览器将找不到该网站图标。

于 2013-01-14T22:08:07.763 回答
3

从这个博客条目,跨浏览器支持的网站图标的最佳实践是包括

<link rel="icon" type="image/vnd.microsoft.icon" href="http://www.example.com/image.ico"> <!-- For good browsers. -->
<link rel="SHORTCUT ICON" href="http://www.example.com/image.ico"/> <!-- For Internet Explorer-->

第一个链接是真正的浏览器,第二个是垃圾。在某些网站上,您会type="image/x-icon"link标签中看到。曾几何时,这是正确的实现,但image/x-icon现在已被取代,现在已image/vnd.microsoft.icon成为 MIME 类型的 IANA 标准的一部分。

顺便说一句,旧版本的 ie 只是寻找一个/favicon.ico硬编码的文件名。如果您想要超级安全,您应该将您的网站图标命名为favicon.ico. 当然,如果您的域为不同目的托管多个网站,这对您没有帮助。

注意:如果您不需要支持 IE 的 favicon,那么您可以自由地为您的 favicon 使用 png、gif 和 jpg 格式,如下所示...

<link rel="icon" type="image/png" href="http://www.example.com/image.png">
<link rel="icon" type="image/gif" href="http://www.example.com/image.gif">
<link rel="icon" type="image/jpeg" href="http://www.example.com/image.jpg">
于 2013-01-15T07:29:35.763 回答
1

CEF1 有一个名为的回调OnFaviconURLChange,每当页面的 favicon URL 更改时都会调用该回调。根据CEF 问题跟踪器中的这个错误, CEF3 还不支持此回调。

于 2013-05-22T16:49:05.370 回答
0

您需要实现一个客户端处理程序和至少 CefDisplayHandler。此类具有 OnFaviconURLChange(不确定出现在哪个版本中,但肯定存在于分支 2357 及更高版本中)。C++原型是:

void OnFaviconURLChange(CefRefPtr<CefBrowser> browser, 
  const std::vector<CefString>& icon_urls);

icon_urls 通常包含一个条目(如果有),它是网站图标的 URL。

还要考虑检查 favicon URL 的安全性,我将 URL 传递给 HTMLayout 应用程序只是发现它位于自签名 https:// 资源上,并且各种 wininet 安全错误(例如 InternetErrorDlg)开始抛出所有的地方.

于 2016-02-15T08:24:47.757 回答