为啥 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 连接失败。规则集不允许连接”?

为啥我的 Django 管理站点没有样式/CSS 加载?

为啥在 bash if 语句中未设置的变量被评估为 0

为啥在使用 HttpWebRequest 时某些链接上出现“(304)未修改”错误?

为啥执行某些命令后 Pexpect 会间歇性挂起(未检测到 EOF)?

为啥在某些 CPU 上 SSE 对齐读取 + shuffle 比未对齐读取慢,而在其他 CPU 上则不然?