アプリケーションにWindowsフォームWebブラウザコントロールが埋め込まれています。WebBrowserまたはHtmlDocumentAPIのいずれかを使用してWebページファビコンを取得する方法はありますか?ローカルファイルシステムから取得するだけでも十分です。別の操作としてアイコンをダウンロードすることは、最後の手段になります...
ありがとう。
アプリケーションにWindowsフォームWebブラウザコントロールが埋め込まれています。WebBrowserまたはHtmlDocumentAPIのいずれかを使用してWebページファビコンを取得する方法はありますか?ローカルファイルシステムから取得するだけでも十分です。別の操作としてアイコンをダウンロードすることは、最後の手段になります...
ありがとう。
GETなどを使用して/favicon.icoファイルをダウンロードするだけです(他のファイルの場合と同じように)。ページを解析して、pngである可能性
のあるファビコンを見つけることもできます。デフォルトでは、ICOファイルです。
ファビコンファイルの場所は通常、ページ<link rel="shortcut icon" href="/favicon.ico" />
の<head>
ノードにあります。
また、一部のブラウザは、デフォルトで/favicon.ico(つまり、Webサイトのルートフォルダにあるfavicon.icoファイル)をその要素のページをチェックせずにダウンロードしようとします。
他のアイデアは、GoogleのS2を使用することです:
http://www.google.com/s2/favicons?domain=youtube.com
(試してみてください)
これにより、YouTubeのICOファビコンの16x16PNG画像が得られます。
http://www.google.com/s2/favicons?domain=stackoverflow.com
(試してみてください)
これにより、同じ形式のstackoverflowファビコンが取得されます。
素晴らしいように見えるかもしれませんが、忘れないでください。このGoogleサービスは公式にはサポートされておらず、いつでも削除される可能性があります。
また、Webブラウザコントロールにはアドレスバーがないため、ファビコンなどのアドレスバー機能用のアプリケーションプログラミングインターフェイスがありません。
は別のファイルですfavicon
。これはページHTMLの一部ではありません。
別の呼び出しでそれをフェッチする必要があります。
私もこれをする必要があったので、これを書きました。.NetWrapperの代わりにネイティブのWebBrowserCOMコントロールを使用していることに注意してください。したがって、.Net Wrapperを使用している場合は、若干の調整が必要になります。
private void axWebBrowser1_DocumentComplete( object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e )
{
try
{
Uri url = new Uri((string)e.uRL);
string favicon = null;
mshtml.HTMLDocument document = axWebBrowser1.Document as mshtml.HTMLDocument;
if( document != null )
{
mshtml.IHTMLElementCollection linkTags = document.getElementsByTagName("link");
foreach( object obj in linkTags )
{
mshtml.HTMLLinkElement link = obj as mshtml.HTMLLinkElement;
if( link != null )
{
if( !String.IsNullOrEmpty(link.rel) && !String.IsNullOrEmpty(link.href) &&
link.rel.Equals("shortcut icon",StringComparison.CurrentCultureIgnoreCase) )
{
//TODO: Bug - Can't handle relative favicon URL's
favicon = link.href;
}
}
}
}
if( String.IsNullOrEmpty(favicon) && !String.IsNullOrEmpty(url.Host) )
{
if( url.IsDefaultPort )
favicon = String.Format("{0}://{1}/favicon.ico",url.Scheme,url.Host);
else
favicon = String.Format("{0}://{1}:{2}/favicon.ico",url.Scheme,url.Host,url.Port);
}
if( !String.IsNullOrEmpty(favicon) )
{
WebRequest request = WebRequest.Create(favicon);
request.BeginGetRequestStream(new AsyncCallback(SetFavicon), request);
}
}
catch
{
this.Icon = null;
}
}
private void SetFavicon( IAsyncResult result )
{
WebRequest request = (WebRequest)result.AsyncState;
WebResponse response = request.GetResponse();
Bitmap bitmap = new Bitmap(Image.FromStream(response.GetResponseStream()));
this.Icon = Icon.FromHandle(bitmap.GetHicon());
}