[英]Can you determine if Chrome is in incognito mode via a script?
此答案的功能取決於 Chrome 版本。 最近的評論是這適用於v90
是的。 FileSystem API 在隱身模式下被禁用。 當您處於和未處於隱身模式時,請查看https://jsfiddle.net/w49x9f1a/ 。
示例代碼:
var fs = window.RequestFileSystem || window.webkitRequestFileSystem; if (!fs) { console.log("check failed?"); } else { fs(window.TEMPORARY, 100, console.log.bind(console, "not in incognito mode"), console.log.bind(console, "incognito mode")); }
在 Chrome 74 到 84.0.4147.135 中,您可以通過估計可用的文件系統存儲空間來確定這一點
查看jsfiddle
if ('storage' in navigator && 'estimate' in navigator.storage) {
const {usage, quota} = await navigator.storage.estimate();
console.log(`Using ${usage} out of ${quota} bytes.`);
if(quota < 120000000){
console.log('Incognito')
} else {
console.log('Not Incognito')
}
} else {
console.log('Can not detect')
}
一種方法是訪問唯一的 URL,然后檢查該 URL 的鏈接是否被 CSS 視為訪問過。
你可以在“Detecting Incognito” (死鏈接)中看到一個例子。
在main.html
添加一個 iframe,
<iframe id='testFrame' name='testFrame' onload='setUniqueSource(this)' src='' style="width:0; height:0; visibility:hidden;"></iframe>
,以及一些 JavaScript 代碼:
function checkResult() {
var a = frames[0].document.getElementById('test');
if (!a) return;
var color;
if (a.currentStyle) {
color = a.currentStyle.color;
} else {
color = frames[0].getComputedStyle(a, '').color;
}
var visited = (color == 'rgb(51, 102, 160)' || color == '#3366a0');
alert('mode is ' + (visited ? 'NOT Private' : 'Private'));
}
function setUniqueSource(frame) {
frame.src = "test.html?" + Math.random();
frame.onload = '';
}
然后在加載到 iFrame 的test.html
中:
<style>
a:link { color: #336699; }
a:visited { color: #3366A0; }
</style>
<script>
setTimeout(function() {
var a = document.createElement('a');
a.href = location;
a.id = 'test';
document.body.appendChild(a);
parent.checkResult();
}, 100);
</script>
注意:從文件系統嘗試這個會讓 Chrome 抱怨“不安全的 Javascript”。 但是,它將從網絡服務器提供服務。
如果您正在開發擴展,那么您可以使用選項卡 API 來確定窗口/選項卡是否隱身。
可以在此處找到更多信息。
如果你只是在處理一個網頁,這並不容易,而且它就是這樣設計的。 但是,我注意到在隱身模式下打開數據庫(window.database)的所有嘗試都失敗了,這是因為在隱身模式下,不允許在用戶計算機上留下任何數據痕跡。
我還沒有測試過,但我懷疑所有對 localStorage 的調用也失敗了。
更新這似乎不再起作用了
這使用了一個 promise 來等待異步代碼設置一個標志,因此我們可以在之后同步使用它。
let isIncognito = await new Promise((resolve, reject)=>{
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) reject('Check incognito failed');
else fs(window.TEMPORARY, 100, ()=>resolve(false), ()=>resolve(true));
});
那么我們可以做
if(isIncognito) alert('in incognito');
else alert('not in incognito');
基於Alok's Answer 的快速功能(注意:這是異步的)
更新- 不再工作
function ifIncognito(incog,func){
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) console.log("checking incognito failed");
else {
if(incog) fs(window.TEMPORARY, 100, ()=>{}, func);
else fs(window.TEMPORARY, 100, func, ()=>{});
}
}
用法:
ifIncognito(true, ()=>{ alert('in incognito') });
// or
ifIncognito(false, ()=>{ alert('not in incognito') });
這是用 ES6 語法編寫並稍微清理的建議答案。
const isIncognito = () => new Promise((resolve, reject) => {
const fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
reject('Cant determine whether browser is running in incognito mode!');
}
fs(window.TEMPORARY, 100, resolve.bind(null, false), resolve.bind(null, true));
});
// Usage
isIncognito()
.then(console.log)
.catch(console.error)
對於那些尋求解決方案的人,以下是截至 2021 年 10 月在各種瀏覽器中檢測隱私瀏覽模式的當前方法的簡要概述:
Chromium:類似於 Vinnie James 的回答,調用 navigator.storage.estimate(),獲取配額屬性並將其與 performance.memory.jsHeapSizeLimit 進行比較。 如果配額屬性小於 jsHeapSizeLimit,則為隱身。 如果未定義 jsHeapSizeLimit,請使用 1073741824 (1 GiB)。
適用於 macOS 的 Safari:在不存在的推送服務器上使用 safari.pushNotification.requestPermission 並獲取錯誤。 如果“手勢”沒有出現在錯誤中,則它處於私密模式。
iOS 版 Safari:創建 iframe 並在 iframe 上使用 contentWindow.applicationCache 添加錯誤事件偵聽器。 如果錯誤跳閘,則處於私有模式。
Firefox:navigator.serviceWorker 將在私人窗口中未定義。
Internet Explorer:在 InPrivate 模式下,window.indexedDB 將是未定義的。
您可以在我在 GitHub 上提供的detectIncognito腳本中查看這些方法的實現。
其他答案在最近的 chrome 版本中似乎不再有效。
這個想法是找出存儲估計以確定選項卡是否隱身。 隱身標簽的存儲空間較小。
在正常和隱身模式下運行此代碼 window 並記下配額大小。
const {quota} = await navigator.storage.estimate();
console.log(quota);
使用配額大小差異來實現隱身模式檢測的邏輯。
以下邏輯適用於Chrome v105 :
const { quota } = await navigator.storage.estimate();
if (quota.toString().length === 10) {
console.log("gotcha: this is incognito tab"); //quota = 1102885027
} else {
console.log("this is a normal tab"); //quota = 296630877388
}
此外,查看此解決方案以獲得更廣泛的支持(也包括其他瀏覽器) detectIncognito.ts
是否可以通過腳本確定Google Chrome瀏覽器是否處於隱身模式?
編輯:我的意思是實際上可以通過用戶腳本來實現,但是答案假定JavaScript正在網頁上運行。 我在這里重新提出了有關用戶腳本的問題。
這在 2021 年 5 月有效: https : //jsfiddle.net/2b1dk8oa/
該腳本必須在網頁中執行,該網頁位於 iframe 中。
try{
var ls = localStorage;
alert("You are not in Incognito Mode.");
}
catch(e) { alert("You are in Incognito Mode."); }
是否可以通過腳本確定Google Chrome瀏覽器是否處於隱身模式?
編輯:我的意思是實際上可以通過用戶腳本來實現,但是答案假定JavaScript正在網頁上運行。 我在這里重新提出了有關用戶腳本的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.