为啥 DotNetBrowser 未设置某些站点授予的权限?
Posted
技术标签:
【中文标题】为啥 DotNetBrowser 未设置某些站点授予的权限?【英文标题】:Why DotNetBrowser not set permission granted in some site?为什么 DotNetBrowser 未设置某些站点授予的权限? 【发布时间】:2021-01-21 06:52:43 【问题描述】:创建一个Engine
实例:
engine = EngineFactory.Create(new EngineOptions.Builder
RenderingMode = RenderingMode.HardwareAccelerated,
UserDataDirectory = folderBrowser,
LicenseKey = lic,
UserAgent = UA,
GoogleApiKey = "input key",
GoogleDefaultClientId = "put client id",
GoogleDefaultClientSecret = "put secret"
.Build());
为所有权限请求授予权限:
engine.Permissions.RequestPermissionHandler =
new Handler<RequestPermissionParameters, RequestPermissionResponse>(p =>
return RequestPermissionResponse.Grant();
);
当我在https://browserleaks.com/geo 或https://geolocation.com/ 中检查地理位置时 我看到授予了地理位置权限,并且看到了我的实际坐标:
但是,如果我打开其他网站,例如 https://google.com 或 https://yandex.ru - 我看到该权限 - 被拒绝并且地理定位不起作用。 为了检查权限,我创建了以下 JS:
string perm = @"
var res;
var test = function(e)res=e;
navigator.permissions.query( name: 'geolocation' ).then(result =>
test(result.state)
)
res
";
Google 或 Yandex 页面下载后,我执行此 JS 进行检查:
string permiss = I.ActiveTab.browser.MainFrame.Executejavascript<string>(perm).Result;
string res = I.ActiveTab.browser.MainFrame.ExecuteJavaScript<string>("res").Result;
对于https://browserleaks.com/geo 或https://geolocation.com/,我始终授予“res”变量,但在 Google 或 Yandex 中,我始终拒绝“res”。
为什么会这样?如果我在创建“engine.Permissions.RequestPermissionHandler”时没有为 URL 创建filtr
。
我看到导航到页面https://browserleaks.com/geo,DotNetBrowser 没有进入这段代码:
new Handler<RequestPermissionParameters, RequestPermissionResponse>(p =>
return RequestPermissionResponse.Grant();
);
并且在页面中所有权限都被拒绝。
我需要做什么才能每次进入RequestPermissionHandler
每个网页?
【问题讨论】:
【参考方案1】:地理定位在同一页面中不起作用的问题,因为某些页面没有发送 navigator.geolocation.getCurrentPosition(success, error, options); if navigator.permissions.query( name: 'geolocation' ) - 返回拒绝并且不发送请求此页面的权限,并且在发送请求之前在 DotNetBrowser 中所有权限都被拒绝。
现在我用js做这样的字符串:
public static string askpermissiongeo = @"
var options =
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
;
function success(pos)
var crd = pos.coords;
console.log('Your current position is:');
console.log(`Latitude : $crd.latitude`);
console.log(`Longitude: $crd.longitude`);
console.log(`More or less $crd.accuracy meters.`);
function error(err)
console.warn(`ERROR($err.code): $err.message`);
window.onload = navigator.geolocation.getCurrentPosition(success, error, options);
";
并注入此代码,当需要在某些页面中打开地理定位时:
b.InjectJsHandler = new Handler<InjectJsParameters>(args =>
IJsObject askperm = args.Frame.ExecuteJavaScript<IJsObject>(askpermissiongeo).Result;
);
在 DotNetBrowser 操作后转到代码:
engine.Permissions.RequestPermissionHandler =
new Handler<RequestPermissionParameters, RequestPermissionResponse>(p =>
return RequestPermissionResponse.Grant();
);
一切顺利
【讨论】:
以上是关于为啥 DotNetBrowser 未设置某些站点授予的权限?的主要内容,如果未能解决你的问题,请参考以下文章
为啥某些 .onion 站点会出现“SOCKS 连接失败。规则集不允许连接”?
为啥在使用 HttpWebRequest 时某些链接上出现“(304)未修改”错误?