【问题标题】:Windows 8 App - Webview control (C#). Injecting JavaScript to change User Agent stringWindows 8 应用程序 - Webview 控件 (C#)。注入 JavaScript 以更改用户代理字符串
【发布时间】:2012-12-19 03:03:47
【问题描述】:

我正在尝试更改 Windows 8 应用程序中 Webview 的用户代理。目前,我正在这样做:

    [DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
    private static extern int UrlMkSetSessionOption(int dwOption, 
    string pBuffer, int dwBufferLength, int dwReserved);
    const int URLMON_OPTION_USERAGENT = 0x10000001;

那么如果我需要将UA更改为iPhone例如:

            string ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X)" + 
"AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25";
            UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);

这非常有效。但不幸的是,如果我要将此应用程序提交到 Windows 应用商店,我将无法使用此方法,因为 Windows 8 应用程序不正式支持 UrlMkSetSessionOption

在寻找替代品时,我遇到了this。然而,尽管这样可行,但页面呈现非常糟糕,几乎没有显示任何图像或其他元素。

所以我希望另一种方法是使用 WebView.InvokeScript 方法并注入一些 JavaScript 来更改 UA。说实话,问题在于我是 JavaScript 的初学者。

我做了更多的搜索,显然这样的 (found here) 会起作用:

navigator.__defineGetter__('userAgent', function(){
return 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25' // customized user agent
});

navigator.userAgent; // 'foo'

但就像我说的,我完全是 Javascript 的初学者。那么我应该什么时候注入代码呢?我是否需要在 JavaScript 中侦听在触发时运行此代码的事件?

【问题讨论】:

  • Tha JS 解决方案无法工作恕我直言,因为 UserAgent 已经与第一个 HTTP GET 一起发送到服务器 - 早在执行任何 JS 之前!
  • 你确定吗?这是我找到 JS 代码的地方,根据那些用户的说法,它似乎可以工作。 stackoverflow.com/a/1307088/1949034
  • 是的,我确定...该解决方案适用于“JS 单元测试”——即在运行 JS 时在页面内部——在收到任何 HTML/JS 之前它(根据定义)无法工作...浏览器在 HTTP 请求中发送用户代理,这发生在任何 JS 甚至可以运行之前!
  • 好的,我明白了。我想我必须等到有官方支持 WinRT 的解决方案可用。感谢您的帮助。

标签: c# javascript windows-8 windows-store-apps windows-store


【解决方案1】:

这很容易。

 string ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X)" + "AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25";
            Uri targetUri = new Uri(url);
            HttpRequestMessage hrm=new HttpRequestMessage(HttpMethod.Get,targetUri);
            hrm.Headers.Add("User-Agent",ua);
            webView1.NavigateWithHttpRequestMessage(hrm);

【讨论】:

  • 这是否也适用于所有子请求请求?我的意思是所有对 .js、.css、.json 等的调用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多