Можете ли вы определить, находится ли Chrome в режиме инкогнито с помощью сценария? - PullRequest
100 голосов
/ 26 мая 2010

Можно ли определить, находится ли Google Chrome в режиме инкогнито с помощью скрипта?

Редактировать: Я действительно имел в виду, возможно ли это через пользовательский скрипт, но ответы предполагают, что JavaScript работает на веб-странице. Я повторно задал вопрос здесь относительно пользовательских сценариев.

Ответы [ 8 ]

216 голосов
/ 06 января 2015

Да. Вплоть до Chrome 76 API-интерфейс FileSystem отключался в режиме инкогнито. Проверьте 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"));
    }
18 голосов
/ 26 мая 2010

Один из способов - посетить уникальный URL-адрес, а затем проверить, обрабатывается ли ссылка на этот URL-адрес как посещенная CSS.

Пример этого можно увидеть в «Обнаружении инкогнито» (Мертвая ссылка) .

Исследовательская статья того же автора для замены ссылки Обнаружение инкогнито выше

В 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 = '';
}

Затем в test.html, которые загружаются в iFrame:

<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». Это будет работать с веб-сервером.

8 голосов
/ 26 мая 2010

В JavaScript вы можете увидеть ответ Джарры . За исключением того, что ссылки не выделяются, все в режиме инкогнито не сохраняют историю просмотра и куки. Со страницы справки Google :

  • Открытые веб-страницы и файлы, загруженные во время инкогнито не записываются в вашем браузере и истории загрузок.
  • Все новые куки удаляются после закрытия всех окон инкогнито что вы открыли.

Как вы видите, различия между обычным просмотром и инкогнито происходят после того, как вы посещаете веб-страницу, следовательно, браузер не взаимодействует с сервером в этом режиме.

Вы можете увидеть, что именно ваш браузер отправляет на сервер, используя один из множества анализаторов HTTP-запросов, например здесь . Сравните заголовки между обычным сеансом и инкогнито, и вы не увидите никакой разницы.

4 голосов
/ 26 мая 2010

Если вы разрабатываете расширение, вы можете использовать API вкладок, чтобы определить, является ли окно / вкладка инкогнито.

Более подробную информацию можно найти здесь .

Если вы просто работаете с веб-страницей, это нелегко, и она разработана таким образом. Тем не менее, я заметил, что все попытки открыть базу данных (window.database) терпят неудачу при работе в режиме incongnito, это потому, что при работе в режиме инкогнито не разрешается оставлять никаких данных на компьютере пользователя.

Я не проверял это, но я подозреваю, что все вызовы localStorage тоже терпят неудачу.

2 голосов
/ 30 марта 2018

При этом используется обещание дождаться, пока асинхронный код установит флаг, чтобы мы могли использовать его синхронно после этого.

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');
0 голосов
/ 20 октября 2018

Вот предлагаемый ответ, написанный в синтаксисе 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)
0 голосов
/ 30 апреля 2017

Функция быстрого копирования-вставки на основе Ответ Алока (примечание: это асинхронно)

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') });
0 голосов
/ 26 мая 2010

В документации для режима инкогнито специально сказано, что веб-сайты не будут вести себя по-другому. Я считаю, что это означает, что ответ - нет.

...