Làm cách nào để tôi có được biểu tượng yêu thích của một trang web?


115

Câu hỏi đủ đơn giản: Tôi đã tạo một ứng dụng nhỏ về cơ bản chỉ là một ứng dụng yêu thích nằm trong khay hệ thống của tôi để tôi có thể mở các trang web / thư mục / tệp thường được sử dụng từ cùng một nơi. Lấy các biểu tượng mặc định từ hệ thống của tôi cho các loại tệp đã biết không quá phức tạp, nhưng tôi không biết cách lấy biểu tượng yêu thích từ một trang web. (Ví dụ: SO có biểu tượng ngăn xếp màu xám-> màu cam trong thanh địa chỉ)

Có ai biết làm thế nào tôi có thể đi về điều đó?


1
Tôi không chắc sẽ dễ dàng (hoặc có thể) như thế nào để tự động hóa tải / phân tích cú pháp của trang này, nhưng dường như nó có mọi thứ: Favicon-Checker . Ít nhất, bạn có thể sử dụng nó như một tài liệu tham khảo / kiểm tra.
Kevin Fegan,

Bạn chỉ có thể sử dụng API Statvoo Favicon , điều này sẽ khá nhanh chóng và không gây đau đớn.
AO_

Favicon Kit cho phép bạn lấy và nhúng các biểu tượng yêu thích như hình ảnh thông thường, với kích thước lớn hơn nhiều 16 pixel , nếu có. (Tiết lộ: Tôi là tác giả)
AndreasPizsa

Câu trả lời:


234

Bạn sẽ muốn giải quyết vấn đề này theo một số cách:

  1. Tìm kiếm favicon.icoở gốc của miền

    www.domain.com/favicon.ico

  2. Tìm <link>thẻ có rel="shortcut icon"thuộc tính

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

  3. Tìm <link>thẻ có rel="icon"thuộc tính

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

Hai cái sau thường sẽ mang lại hình ảnh chất lượng cao hơn.


Chỉ để bao gồm tất cả các cơ sở, có các tệp biểu tượng dành riêng cho thiết bị có thể mang lại hình ảnh chất lượng cao hơn vì các thiết bị này thường có biểu tượng lớn hơn trên thiết bị so với trình duyệt cần:

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

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


Và để tải xuống biểu tượng mà không cần quan tâm đến biểu tượng đó là gì, bạn có thể sử dụng một tiện ích như http://www.google.com/s2/favicons , tiện ích này sẽ thực hiện tất cả các công việc nặng nhọc:

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

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

1
GetFavIcon có còn hoạt động không? khi tôi chạy ví dụ của bạn, tôi gặp lỗi 400
Julien

17
có vẻ như Google hiện có một dịch vụ tương tự: google.com/s2/favicons?domain_url=stackoverflow.com
hunter

20
nếu ai đó muốn một giải pháp thay thế cho Google, DuckDuckGo có một giải pháp khác: icon.duckduckgo.com/ip2/www.stackoverflow.com.ico
Jose Serodio

1
@hunter google.com/s2/faviconsnó là một biểu tượng với 16x16 nó là một biểu tượng khủng khiếp bạn có biết nơi để lấy biểu tượng lớn hơn?
nideba

1
@JoseSerodio - Chà ... đó là điều đầu tiên tôi thử, nhưng đối với miền tôi đang kiểm tra, tôi chỉ nhận được hình ảnh "mờ / mờ" của một mũi tên trỏ sang phải (lớn hơn) bên trong một hình tròn - bên trong một hình vuông . Nó trông giống như thế này , nhưng tôi đã kiểm tra để đảm bảo rằng tôi đã viết đúng chính tả "domain.com.ico". Bây giờ, bởi sự kỳ diệu của internet, nó đang hoạt động chính xác ... hãy xem thử =) vậy, Đừng bận tâm.
Kevin Fegan

19

Cập nhật năm 2020

Dưới đây là ba dịch vụ bạn có thể sử dụng từ năm 2020 trở đi

<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 hiện là dịch vụ trả phí bắt đầu từ $ 9 / tháng
janot 19/02/16

1
Một cái khác: favicon.allesedv.com <img width = "144" height = "144" src = "// f3.allesedv.com/144/www.stackoverflow.com" />
Martin Seitl

Dịch vụ này không còn hoạt động nữa, bạn có thể sử dụng api.statvoo.com/favicon/?url=stackoverflow.com . Tôi đã sử dụng nó trong một vài năm và nó chưa bao giờ khiến tôi thất vọng.
AO_

Cảm ơn @AO_, tôi thực sự đang sử dụng duckduckgo những ngày này, tôi đã cập nhật câu trả lời của mình
Blowsie

1
@saintvixalien Tôi tin rằng điều này gần đây đã thay đổi đối với những người không khởi tạo bằng khóa API, vì các máy chủ đang hoạt động mạnh;) Tôi sử dụng dịch vụ chính với khóa API và nhận phản hồi trực tiếp mà không cần trình bao bọc. Tôi đã kiểm tra mà không có khóa API và nó chuyển hướng đến dịch vụ của Google như bạn đã nói ..
AO_


6

Điều đầu tiên cần tìm là /favicon.ico trong thư mục gốc của trang web; một cái gì đó như WebClient.DownloadFile () sẽ hoạt động tốt. Tuy nhiên, bạn cũng có thể đặt biểu tượng trong siêu dữ liệu - đối với SO, đây là:

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

và lưu ý rằng các biểu tượng thay thế có thể có sẵn; "touch" có xu hướng lớn hơn và độ phân giải cao hơn, ví dụ:

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

vì vậy bạn sẽ phân tích cú pháp đó trong HTML Agility Pack hoặc XmlDocument (nếu xhtml) và sử dụng WebClient.DownloadFile ()

Đây là một số mã tôi đã sử dụng để lấy nó thông qua gói 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;

Lưu ý biểu tượng là của họ, không phải của bạn.


1
Cảm ơn Marc. Tôi đánh giá cao ví dụ. Tạo hình ảnh, tôi không có ý định sửa đổi chúng hoặc sử dụng chúng cho bất kỳ thứ gì khác ngoài các biểu tượng trong menu ngữ cảnh bên cạnh nhãn của phím tắt.
Steven Evers


3

Bạn có thể lấy URL biểu tượng yêu thích từ HTML của trang web.

Đây là thẻ favicon:

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

Bạn nên sử dụng một biểu thức chính quy ở đây. Nếu không tìm thấy thẻ, hãy tìm "favicon.ico" trong thư mục gốc của trang web. Nếu không tìm thấy gì, trang web không có biểu tượng yêu thích.


2

Bạn có thể làm điều đó mà không cần lập trình . Chỉ cần mở trang web, nhấp chuột phải và chọn "xem nguồn" để mở mã HTML của trang web đó. Sau đó, trong trình soạn thảo văn bản tìm kiếm "favicon" - nó sẽ hướng bạn đến một cái gì đó giống như

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

lấy chuỗi vào hrefvà nối nó vào URL cơ sở của trang web (giả sử "http://WEBSITE/"như vậy), vì vậy nó trông giống như

http://WEBSITE/SOMERELATIVEPATH/favicon.ico

là đường dẫn tuyệt đối đến biểu tượng yêu thích. Nếu bạn không tìm thấy nó theo cách này, nó cũng có thể nằm trong thư mục gốc trong trường hợp đó là URL http://WEBSITE/favicon.ico.

Lấy URL bạn đã xác định và chèn nó vào đoạn mã sau:

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

Lưu mã HTML này cục bộ (ví dụ: trên màn hình của bạn) dưới dạng GetFavicon.htmlvà sau đó nhấp đúp vào mã đó để mở. Nó sẽ chỉ hiển thị một liên kết có tên Favicon . Nhấp chuột phải vào liên kết này và chọn "Lưu mục tiêu thành ..." để lưu Favicon trên PC cục bộ của bạn - và bạn đã hoàn tất!


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

Đây là một câu trả lời muộn, nhưng để hoàn thiện: rất khó để đạt được gần 90% việc tìm nạp tất cả các biểu tượng yêu thích.

Một thời gian trước, tôi đã viết một plugin WordPress: http://wordpress.org/extend/plugins/wp-favicons/ để cố gắng tiếp cận gần hơn.

a. nó bắt đầu bằng cách xem các kho lưu trữ favicon như google favicons, getfavicons, v.v.

b. nếu không ai trong số họ trả lại biểu tượng (tôi kiểm tra điều này bằng cách khớp với biểu tượng mặc định mà họ trả về), tôi bắt đầu bằng cách cố gắng tự lấy biểu tượng

c. điều này liên quan đến việc duyệt qua các trang nhưng cũng kiểm tra các chuyển hướng KHÔNG tự động sửa lỗi cũng như duyệt qua 404 vì cũng có thể có biểu tượng trên 404. Cuối cùng, điều đó có nghĩa là bạn sẽ phải phân tích cú pháp cũng như chuyển hướng trong tiêu đề html cũng như chuyển hướng javascript để tiến gần hơn đến 100%

d. sau đó tôi thực hiện một số kiểm tra đối với tệp hình ảnh vật lý, vì đôi khi trên một số máy chủ (tôi đã thử nghiệm hơn 300.000) tệp bị trả về với loại mime không chính xác, v.v.

Mã vẫn chưa hoàn hảo bởi vì trong chi tiết nó trở nên điên rồ, bạn sẽ thấy nhiều tình huống kỳ lạ: mọi người đã mã hóa sai đường dẫn (img / favicon.ico trong đó img KHÔNG có trong thư mục gốc), trùng lặp tiêu đề trong đầu ra html, phản hồi máy chủ khác nhau từ đầu và cơ thể, v.v.

cốt lõi của phần tìm nạp là ở đây: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/server/class-http.php để bạn có thể thiết kế ngược lại nhưng lưu ý rằng việc xác thực phản hồi phải thực sự được thực hiện (kiểm tra loại tệp hình ảnh, mime, v.v.)


1

Tôi thấy rằng 'SHGetFileInfo' (Kiểm tra chữ ký 'www.pinvoke.net') cho phép bạn truy xuất một biểu tượng nhỏ hoặc lớn, giống như thể bạn đang xử lý một tệp / thư mục / mục Shell.

Jens;)



0

Bạn có thể sử dụng Getfv.co :

Để truy xuất một biểu tượng yêu thích, bạn có thể liên kết nóng nó tại ... http://g.etfv.co/[URL]

Ví dụ cho trang này: http://g.etfv.co//programming/5119041/how-can-i-get-a-web-sites-favicon

Tải xuống nội dung và bắt đầu!

Biên tập :

Getfv.co và fvicon.com đã chết. Nếu bạn muốn, tôi đã tìm thấy một giải pháp thay thế không miễn phí: grabicon.com .


1
Liên kết chết, Lỗi: Không tìm thấy
tttony

@tttony Thật vậy. fvicon.com trông cũng chết. Tôi sẽ chỉnh sửa bình luận của mình với nội dung trả phí. Nếu bạn tìm thấy một liên kết miễn phí hoạt động, hãy chia sẻ nó!
aloisdg chuyển sang codidact.com

0

Sử dụng jquery

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

0

Vào năm 2020, sử dụng dịch vụ của duckduckgo.com từ CLI

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

Thí dụ

curl -v https://icons.duckduckgo.com/ip2/www.cdc.gov.ico > favicon.ico
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.