WebView - 在每个请求上定义 User-Agent
WebView - Define User-Agent on every request
目前我正在设置请求消息的User-Agent如下:
var rm = new HttpRequestMessage(HttpMethod.Post, new Uri("http://example.com"));
rm.Headers.Add("User-Agent", "UserAgentString");
webView.NavigateWithHttpRequestMessage(rm);
一切正常。
但是,当我导航到另一个页面时,例如通过单击站点上的 link,User-Agent 将重置为默认值 WebView
。
是否有任何方法可以永久设置用户代理或在每个请求时更改它?
谢谢,
乔治
NavigationStarting
在 webview 导航到新内容之前发生。您可以取消该操作获取 args.Uri
并使用 HttpRequestMessage
导航。还有FrameNavigationStarting
。
WebView wb = new WebView();
wb.NavigationStarting += A_NavigationStarting;
private void A_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
{
//this will throw `WhosebugException` so you have to add a condition here
if(handled)
{
args.Cancel = true;
var rm = new HttpRequestMessage(HttpMethod.Post, args.Uri);
rm.Headers.Add("User-Agent", "UserAgentString");
sender.NavigateWithHttpRequestMessage(rm);
}
}
我能够相当可靠地工作的唯一方法是使用 NavigationStarting 事件取消页面加载并获取当前 url,然后使用自定义事件触发新的使用正确的 UA 加载页面。
public sealed partial class MainPage : Page
{
private bool headerSent;
private Uri uri;
private delegate void NavigateHandler(object sender, EventArgs e);
private event NavigateHandler OnNavigate;
public MainPage()
{
this.InitializeComponent();
this.OnNavigate += new NavigateHandler(Navigate);
this.headerSent = false;
this.webview.Navigate(new Uri("https://netflix.com"));
}
private void Navigate(object sender, EventArgs e)
{
this.headerSent = true;
var rm = new HttpRequestMessage(HttpMethod.Post, this.uri);
rm.Headers.Add("User-Agent", @"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136");
this.webview.NavigateWithHttpRequestMessage(rm);
}
private void webview_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
{
if (!headerSent)
{
args.Cancel = true;
this.uri = args.Uri;
OnNavigate(this, new EventArgs());
}
else if (headerSent)
{
headerSent = false;
}
}
}
不漂亮,但它似乎有效。
我找到了 this trick by Matt Dot。这将永久更改 user-agent 字符串。任何 WebView
请求,无论是手动请求还是通过 HTML 中的 link-click,都会将您的值作为 User-Agent header.
发送
如果 link 死了,这里是来源。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace UA
{
public static class UserAgent
{
const int URLMON_OPTION_USERAGENT = 0x10000001;
[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(int dwOption, string pBuffer, int dwBufferLength, int dwReserved);
[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkGetSessionOption(int dwOption, StringBuilder pBuffer, int dwBufferLength, ref int pdwBufferLength, int dwReserved);
public static string GetUserAgent()
{
int capacity = 255;
var buf = new StringBuilder(capacity);
int length = 0;
UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, buf, capacity, ref length, 0);
return buf.ToString();
}
public static void SetUserAgent(string agent)
{
var hr = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, agent, agent.Length, 0);
var ex = Marshal.GetExceptionForHR(hr);
if(null != ex)
{
throw ex;
}
}
public static void AppendUserAgent(string suffix)
{
SetUserAgent(GetUserAgent() + suffix);
}
}
}
您可以在应用中的任何位置更改此值,但如果您希望永久设置它,请使用 App.xaml.cs
构造函数:
public App()
{
UA.UserAgent.SetUserAgent("Firefox ;)");
// ...
}
目前我正在设置请求消息的User-Agent如下:
var rm = new HttpRequestMessage(HttpMethod.Post, new Uri("http://example.com"));
rm.Headers.Add("User-Agent", "UserAgentString");
webView.NavigateWithHttpRequestMessage(rm);
一切正常。
但是,当我导航到另一个页面时,例如通过单击站点上的 link,User-Agent 将重置为默认值 WebView
。
是否有任何方法可以永久设置用户代理或在每个请求时更改它?
谢谢, 乔治
NavigationStarting
在 webview 导航到新内容之前发生。您可以取消该操作获取 args.Uri
并使用 HttpRequestMessage
导航。还有FrameNavigationStarting
。
WebView wb = new WebView();
wb.NavigationStarting += A_NavigationStarting;
private void A_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
{
//this will throw `WhosebugException` so you have to add a condition here
if(handled)
{
args.Cancel = true;
var rm = new HttpRequestMessage(HttpMethod.Post, args.Uri);
rm.Headers.Add("User-Agent", "UserAgentString");
sender.NavigateWithHttpRequestMessage(rm);
}
}
我能够相当可靠地工作的唯一方法是使用 NavigationStarting 事件取消页面加载并获取当前 url,然后使用自定义事件触发新的使用正确的 UA 加载页面。
public sealed partial class MainPage : Page
{
private bool headerSent;
private Uri uri;
private delegate void NavigateHandler(object sender, EventArgs e);
private event NavigateHandler OnNavigate;
public MainPage()
{
this.InitializeComponent();
this.OnNavigate += new NavigateHandler(Navigate);
this.headerSent = false;
this.webview.Navigate(new Uri("https://netflix.com"));
}
private void Navigate(object sender, EventArgs e)
{
this.headerSent = true;
var rm = new HttpRequestMessage(HttpMethod.Post, this.uri);
rm.Headers.Add("User-Agent", @"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136");
this.webview.NavigateWithHttpRequestMessage(rm);
}
private void webview_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
{
if (!headerSent)
{
args.Cancel = true;
this.uri = args.Uri;
OnNavigate(this, new EventArgs());
}
else if (headerSent)
{
headerSent = false;
}
}
}
不漂亮,但它似乎有效。
我找到了 this trick by Matt Dot。这将永久更改 user-agent 字符串。任何 WebView
请求,无论是手动请求还是通过 HTML 中的 link-click,都会将您的值作为 User-Agent header.
如果 link 死了,这里是来源。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace UA
{
public static class UserAgent
{
const int URLMON_OPTION_USERAGENT = 0x10000001;
[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(int dwOption, string pBuffer, int dwBufferLength, int dwReserved);
[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkGetSessionOption(int dwOption, StringBuilder pBuffer, int dwBufferLength, ref int pdwBufferLength, int dwReserved);
public static string GetUserAgent()
{
int capacity = 255;
var buf = new StringBuilder(capacity);
int length = 0;
UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, buf, capacity, ref length, 0);
return buf.ToString();
}
public static void SetUserAgent(string agent)
{
var hr = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, agent, agent.Length, 0);
var ex = Marshal.GetExceptionForHR(hr);
if(null != ex)
{
throw ex;
}
}
public static void AppendUserAgent(string suffix)
{
SetUserAgent(GetUserAgent() + suffix);
}
}
}
您可以在应用中的任何位置更改此值,但如果您希望永久设置它,请使用 App.xaml.cs
构造函数:
public App()
{
UA.UserAgent.SetUserAgent("Firefox ;)");
// ...
}