Why
DNT 即 Do Not Track
。是一个让用户可以通过设置浏览器,使浏览器向网站发起的 HTTP 请求头包含特定字段,让网站得知用户是否不想被追踪的约定。详细可以参见 W3C 的文档。
这里的追踪器我认为也包括 百度统计、Google Analytics 等统计模块
How
只需要在你的统计模块代码上添加一个判断即可:
1 2 3 4
| let dnt = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack || ''; if (!dnt.startsWith('1') && !dnt.startsWith('yes') && !dnt.startsWith('on')) { }
|
如果是 Google Analytics 需要一个单独的 <script src=...>
的话可以这样:
1 2 3 4 5 6 7 8 9
| let sc=document.createElement('script'); sc.async=true; sc.src='https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX'; document.body.appendChild(sc); window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-XXXXXXXXXX');
|
如果用到了多个统计模块则可以将多个 <script>
标签合并成一个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| let dnt = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack || ''; if (!dnt.startsWith('1') && !dnt.startsWith('yes') && !dnt.startsWith('on')) {
(function(c,l,a,r,i,t,y){ c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); })(window, document, "clarity", "script", "xxxxxxxxxx");
var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
let sc=document.createElement('script'); sc.async=true; sc.src='https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX'; document.body.appendChild(sc); window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-XXXXXXXXXX'); }
|
DNT 有点类似于对爬虫约定的 robots.txt,但目前尊重、支持 DNT 的网站少之又少。我认为有以下几点原因:
添加支持需要稍微花一些时间 许多爬虫库遵从 robots.txt 只需要设置一个布尔值甚至是默认遵从
许多浏览器、脚本插件都默认设置了 DNT 却未问过用户的想法,这让 DNT 约定毫无意义
遵从 DNT 似乎对网站所有者没有好处,只会让统计信息不准确
这里还要要点名批评几个浏览器:
对于部分默认开启 DNT 的浏览器:
如果大家都默认开启,那这约定还有谁去遵守?