如何从 403 页面获取网站图标

Posted

技术标签:

【中文标题】如何从 403 页面获取网站图标【英文标题】:How to get the favicon from a 403 page 【发布时间】:2016-10-13 09:37:20 【问题描述】:

我正在编写一个允许用户输入 URL 的工具,程序通过尝试显示该网站的图标来响应该 URL。我在许多网站上都有这个工作,但给我带来麻烦的一个网站是我的自托管 Trac 网站。似乎 Trac 的正常行为,直到最终用户被 autenticated,是显示自定义 403 页面(禁止),邀请用户登录。从 Web 浏览器访问 Trac,favicon 显示在浏览器的选项卡中,即使我'未登录(例如,Firebug 显示页面内容的 403)。如果我从浏览器查看源代码,则图标的位置就在源代码中。但是,在我的应用程序中,使用 request.GetResponse() 请求 Trac 网站会引发包含 403 的 WebException,让我没有机会阅读包含查找网站图标所需的重要信息的响应流。

我已经有代码可以下载网站的 html 并提取其网站图标的位置。我坚持的是下载网站的 HTML,即使它以 403 响应。

我玩过HttpWebRequest 对象的各种UserAgentAcceptAcceptLanguage 属性,但没有帮助。当我在某处读到 .NET 做得不好时,我也尝试自己跟踪任何重定向。仍然没有运气。

这是我所拥有的:

public static MemoryStream DownloadHtml(
        string urlParam, 
        int timeoutMs = DefaultHttpRequestTimeoutMs, 
        string userAgent = "", 
        bool silent = false
)

    MemoryStream result = null;

    HttpWebRequest request = null;
    HttpWebResponse response = null;

    try
    
        Func<string, HttpWebRequest> createRequest = (urlForFunc) =>
        
            var requestForAction = (HttpWebRequest)HttpWebRequest.Create(urlForFunc);

            // This step is now required by Wikipedia (and others?) to prevent periodic or 
            // even constant 403's (Forbidden).
            requestForAction.UserAgent = userAgent;

            requestForAction.Accept = "text/html";
            requestForAction.AllowAutoRedirect = false;
            requestForAction.Timeout = timeoutMs;

            return requestForAction;
        ;

        string urlFromResponse = "";
        string urlForRequest = "";

        do
        
            if(response == null)
            
                urlForRequest = urlParam;
            
            else
            
                urlForRequest = urlFromResponse;

                response.Close();
            

            request = createRequest(urlForRequest);
            response = (HttpWebResponse)request.GetResponse();

            urlFromResponse = response.Headers[HttpResponseHeader.Location];
        
        while(urlFromResponse != null 
                && urlFromResponse.Length > 0 
                && urlFromResponse != urlForRequest);

        using(var stream = response.GetResponseStream())
        
            result = new MemoryStream();
            stream.CopyTo(result);
        
    
    catch(WebException ex)
    
        // Things like 404 and, well, all other web-type exceptions.

        Debug.WriteLine(ex.Message);
        if(ex.InnerException != null) Debug.WriteLine(ex.InnerException.Message);
    
    catch(System.Threading.ThreadAbortException)
    
        // Let ac.Thread handle some cleanup.
        throw;
    
    catch(Exception)
    
        if(!silent) throw;
    
    finally
    
        if(response != null) response.Close();
    

    return result;

【问题讨论】:

【参考方案1】:

流内容存储在 Exception 对象中。

var resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();

【讨论】:

就在异常中,开枪!我没看过的一个地方,包括它的文档。谢谢!

以上是关于如何从 403 页面获取网站图标的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以以编程方式从网站 URL 中获取徽标图标?

在 Chrome 中查看源代码时如何设置网站图标?

如何获取给定 URL 的高分辨率网站徽标(图标)

如何从网站获取 Facebook 身份验证令牌

java 如何设置网站图标?

仿站技术——获取和使用某些网站的iconfont图标字体