feat: 0.1.12

This commit is contained in:
tackchen 2021-12-24 16:03:28 +08:00
parent 62eaa7b87a
commit 9a4aec39f1
31 changed files with 14309 additions and 142 deletions

View File

@ -106,7 +106,7 @@ declare interface optionStatic {
md5?: string; // 绕过禁用的md5值详情见3.2,默认不启用绕过禁用
url?: string; // 关闭页面失败时的跳转页面默认值为localhost
tkName?: string; // 绕过禁用时的url参数名称默认为 ddtk
ondevtoolopen?(type: DetectorType): void; // 开发者面板打开的回调启用时url参数无效type 为监测模式详见3.5
ondevtoolopen?(type: DetectorType, next: Function): void; // 开发者面板打开的回调启用时url参数无效type 为监测模式详见3.5
interval?: number; // 定时器的时间间隔 默认200ms
disableMenu?: boolean; // 是否禁用右键菜单 默认为true
stopIntervalTime?: number; // 在移动端时取消监视的等待时长

View File

@ -105,7 +105,7 @@ declare interface optionStatic {
md5?: string; // Bypass the disabled md5 value, see 3.2 for details, the bypass disable is not enabled by default
url?: string; // Jump to the page when closing the page fails, the default value is localhost
tkName?: string; // Bypass the url parameter name when disabled, the default is ddtk
ondevtoolopen?(type: DetectorType): void; // Callback for opening the developer panel, the url parameter is invalid when it is enabled, and the type is the monitoring mode, see 3.5 for details
ondevtoolopen?(type: DetectorType, next: Function): void; // Callback for opening the developer panel, the url parameter is invalid when it is enabled, and the type is the monitoring mode, see 3.5 for details
interval?: number; // Timer interval is 200ms by default
disableMenu?: boolean; // Whether to disable the right-click menu The default is true
clearIntervalWhenDevOpenTrigger?: boolean; // Whether to stop monitoring after triggering The default is false

View File

@ -73,4 +73,9 @@
1. Fix the problem that sizeDetector is accidentally injured in browser zoom mode
## 0.1.11
1. Fix the accidental injury caused by the third-party hack console.log method
1. Fix the accidental injury caused by the third-party hack console.log method
## 0.1.12
1. Add the second parameter of config.ondevtoolopen next
2. Added shortcut key operations for prohibiting reviewing elements and saving web pages
3. Refactor the code
4. Fix the problem caused by the method on the console cannot be cached by ie

View File

@ -73,4 +73,10 @@
1. 修复sizeDetector在浏览器缩放模式下误伤的问题
## 0.1.11
1. 修复第三方 hack console.log方法 导致的误伤
1. 修复第三方 hack console.log方法 导致的误伤
## 0.1.12
1. 增加 config.ondevtoolopen 第二个参数 next
2. 增加 禁止审查元素和保存网页的快捷键操作
3. 重构代码
4. 修复ie不能缓存console上的方法导致的问题

View File

@ -182,7 +182,7 @@ declare type DETECTOR_TYPE = -1 | 0 | 1 | 2 | 3;</code></p>
<script
disable-devtool-auto
md5='1aabac6d068eef6a7bad3fdf50a05cc8'
src='https://cdn.jsdelivr.net/npm/disable-devtool@0.1.11/disable-devtool.min.js#use'
src='https://cdn.jsdelivr.net/npm/disable-devtool@0.1.12/disable-devtool.min.js#use'
></script>
<!-- <script disable-devtool-auto md5='1aabac6d068eef6a7bad3fdf50a05cc8' src='./npm/disable-devtool.min.js'></script> -->
<script>

View File

@ -105,7 +105,7 @@ declare interface optionStatic {
md5?: string; // Bypass the disabled md5 value, see 3.2 for details, the bypass disable is not enabled by default
url?: string; // Jump to the page when closing the page fails, the default value is localhost
tkName?: string; // Bypass the url parameter name when disabled, the default is ddtk
ondevtoolopen?(type: DetectorType): void; // Callback for opening the developer panel, the url parameter is invalid when it is enabled, and the type is the monitoring mode, see 3.5 for details
ondevtoolopen?(type: DetectorType, next: Function): void; // Callback for opening the developer panel, the url parameter is invalid when it is enabled, and the type is the monitoring mode, see 3.5 for details
interval?: number; // Timer interval is 200ms by default
disableMenu?: boolean; // Whether to disable the right-click menu The default is true
clearIntervalWhenDevOpenTrigger?: boolean; // Whether to stop monitoring after triggering The default is false

File diff suppressed because one or more lines are too long

2
npm/index.d.ts vendored
View File

@ -4,7 +4,7 @@ declare interface optionStatic {
md5?: string; // 绕过禁用的md5值详情见3.2,默认不启用绕过禁用
url?: string; // 关闭页面失败时的跳转页面默认值为localhost
tkName?: string; // 绕过禁用时的url参数名称默认为 ddtk
ondevtoolopen?(type: DETECTOR_TYPE): void; // 开发者面板打开的回调启用时url参数无效
ondevtoolopen?(type: DETECTOR_TYPE, next: Function): void; // 开发者面板打开的回调启用时url参数无效
interval?: number; // 定时器的时间间隔 默认200ms
disableMenu?: boolean; // 是否禁用右键菜单 默认为true
stopIntervalTime?: number; // 在移动端时取消监视的等待时长

View File

@ -1,6 +1,6 @@
{
"name": "disable-devtool",
"version": "0.1.11",
"version": "0.1.12",
"description": "Disable web developer tools from the f12 button, right-click and browser ",
"main": "disable-devtool.min.js",
"unpkg": "disable-devtool.min.js",

14154
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "disable-devtool",
"version": "0.1.11",
"version": "0.1.12",
"description": "Disable web developer tools from the f12 button, right-click and browser ",
"main": "disable-devtool.min.js",
"unpkg": "disable-devtool.min.js",

View File

@ -1,7 +1,6 @@
import disableDevtool from '../src';
// import disableDevtool from '../npm';
// debugger;
disableDevtool({
md5: '0b9e05caf5000360ec1c263335bd83fe', // ddtk
@ -9,8 +8,10 @@ disableDevtool({
ondevtoolopen: (type) => {
// window.location.href = 'https://www.qq.com';
document.body.innerHTML = 'devtool opened!; type =' + type;
history.back();
// next();
// console.log(next);
},
clearIntervalWhenDevOpenTrigger: true,
interval: 1000,
// tkName: 'ddtk',
disableMenu: false,
@ -19,4 +20,15 @@ disableDevtool({
});
// console.log(disableDevtool.version);
// console.log(disableDevtool.md5('xx'));
// console.log(disableDevtool.md5('xx'));
// import {log} from '../src/log';
// setTimeout(() => {
// log(111);
// debugger;
// }, 3000);
// window.log = log;

View File

@ -7,9 +7,9 @@
* @Description: Coding something
*/
import {registInterval} from '../interval';
import {registInterval} from '../utils/interval';
import {DETECTOR_TYPE, triggerOnDevOpen} from './detector';
import {log} from '../util';
import {clearLog, log} from '../utils/log';
export default function detector () {
let count = 0;
@ -22,7 +22,7 @@ export default function detector () {
const checkIsOpen = () => {
count = 0;
log(date);
console.clear();
clearLog();
if (count >= 2) {
triggerOnDevOpen(DETECTOR_TYPE.DATE_TO_STRING);
}

View File

@ -7,7 +7,7 @@
* @Description: Coding something
*/
import {registInterval} from '../interval';
import {registInterval} from '../utils/interval';
import {DETECTOR_TYPE, triggerOnDevOpen} from './detector';
export default function detector () {

View File

@ -2,12 +2,12 @@
* @Author: theajack
* @Date: 2021-07-24 23:15:49
* @LastEditor: theajack
* @LastEditTime: 2021-07-25 16:46:36
* @LastEditTime: 2021-12-24 13:23:55
* @Description: Coding something
*/
import {DETECTOR_TYPE, triggerOnDevOpen} from './detector';
import {registInterval} from '../interval';
import {log} from '../util';
import {registInterval} from '../utils/interval';
import {log} from '../utils/log';
export default function detector () {
const div = document.createElement('div');

View File

@ -2,11 +2,11 @@
* @Author: theajack
* @Date: 2021-07-24 23:16:34
* @LastEditor: theajack
* @LastEditTime: 2021-11-16 08:48:48
* @LastEditTime: 2021-12-24 15:17:10
* @Description: Coding something
*/
import {config} from '../config';
import {config} from '../utils/config';
import RegToStringDetector from './reg-to-string';
import DefineIdDetector from './define-id';
import SizeDetector from './size';
@ -14,7 +14,8 @@ import DateToStringDetector from './date-to-string';
import FuncToStringDetector from './func-to-string';
// import DebuggerDetector from './debugger'; // 会debuger显示devtool
// import LogTimeDetector from './log-time'; // 不准确 容易误伤
import {clearDDInterval, clearDDTimeout} from '../interval';
import {clearDDInterval, clearDDTimeout} from '../utils/interval';
import {closeWindow} from '../utils/close-window';
const detectorList = [];
@ -60,5 +61,5 @@ export function triggerOnDevOpen (type = DETECTOR_TYPE.UNKONW) {
clearDDInterval();
}
clearDDTimeout();
config.ondevtoolopen(type);
config.ondevtoolopen(type, closeWindow);
}

View File

@ -7,9 +7,9 @@
* @Description: Coding something
*/
import {registInterval} from '../interval';
import {registInterval} from '../utils/interval';
import {DETECTOR_TYPE, triggerOnDevOpen} from './detector';
import {log} from '../util';
import {log, clearLog} from '../utils/log';
export default function detector () {
let count = 0;
@ -22,7 +22,7 @@ export default function detector () {
const checkIsOpen = () => {
count = 0;
log(func);
console.clear();
clearLog();
if (count >= 2) {
triggerOnDevOpen(DETECTOR_TYPE.FUNC_TO_STRING);
}

View File

@ -2,20 +2,20 @@
* @Author: theajack
* @Date: 2021-07-24 23:15:22
* @LastEditor: theajack
* @LastEditTime: 2021-12-09 08:00:47
* @LastEditTime: 2021-12-24 14:07:31
* @Description: Coding something
*/
// import {DETECTOR_TYPE, triggerOnDevOpen} from './detector';
// import {registInterval} from '../interval';
// import {log} from '../util';
// import {registInterval} from '../utils/interval';
// import {log, clearLog} from '../utils/log';
// function logTime () {
// const d = new Date();
// for (let i = 0; i < 2000; i++) {
// log(1);
// }
// console.clear();
// clearLog();
// if (new Date() - d > 100) {
// console.warn(new Date() - d);
// triggerOnDevOpen(DETECTOR_TYPE.LOG_TIME);

View File

@ -2,18 +2,19 @@
* @Author: theajack
* @Date: 2021-07-24 23:15:01
* @LastEditor: theajack
* @LastEditTime: 2021-12-09 07:58:29
* @LastEditTime: 2021-12-24 13:19:18
* @Description: Coding something
*/
import {registInterval} from '../interval';
import {isFirefox, isQQBrowser, log} from '../util';
import {registInterval} from '../utils/interval';
import {isFirefox, isQQBrowser} from '../utils/util';
import {log} from '../utils/log';
import {DETECTOR_TYPE, triggerOnDevOpen} from './detector';
// 这个方法在chrome 中无论是否打开都会触发
export default function detector () {
const isQQ = isQQBrowser();
const isFF = isFirefox();
const isQQ = isQQBrowser;
const isFF = isFirefox;
if (!isQQ && !isFF) return;
let lastTime = 0;
const reg = /./;

View File

@ -2,12 +2,12 @@
* @Author: theajack
* @Date: 2021-07-24 23:15:54
* @LastEditor: theajack
* @LastEditTime: 2021-11-26 11:08:33
* @LastEditTime: 2021-12-24 15:18:29
* @Description: Coding something
* @FilePath: \disable-devtool\src\detector\size.js
* @FilePath: /disable-devtool/src/detector/size.js
*/
import {isInIframe} from '../util';
import {isInIframe} from '../utils/util';
import {DETECTOR_TYPE, triggerOnDevOpen} from './detector';
function checkWindowSizeUneven () {
@ -39,7 +39,7 @@ function countScreenZoomRatio () {
};
export default function detector () {
if (isInIframe()) {
if (isInIframe) {
console.warn('SizeDetector is disabled in IFrame');
return;
}

2
src/index.d.ts vendored
View File

@ -4,7 +4,7 @@ declare interface optionStatic {
md5?: string; // 绕过禁用的md5值详情见3.2,默认不启用绕过禁用
url?: string; // 关闭页面失败时的跳转页面默认值为localhost
tkName?: string; // 绕过禁用时的url参数名称默认为 ddtk
ondevtoolopen?(type: DETECTOR_TYPE): void; // 开发者面板打开的回调启用时url参数无效
ondevtoolopen?(type: DETECTOR_TYPE, next: Function): void; // 开发者面板打开的回调启用时url参数无效
interval?: number; // 定时器的时间间隔 默认200ms
disableMenu?: boolean; // 是否禁用右键菜单 默认为true
stopIntervalTime?: number; // 在移动端时取消监视的等待时长

View File

@ -1,27 +0,0 @@
import {config} from './config';
import {isMacOs} from './util';
export function disableKeyAndMenu () {
let key1 = 'shiftKey', key2 = 'ctrlKey';
if (isMacOs()) {
key1 = 'metaKey';
key2 = 'altKey';
}
window.addEventListener('keydown', (e) => {
e = e || window.event;
const keyCode = e.keyCode || e.which;
if (keyCode === 123 || (e[key1] && e[key2] && e.keyCode === 73)) {
e.returnValue = false;
e.preventDefault();
return false;
}
}, true);
if (config.disableMenu) {
window.addEventListener('contextmenu', (e) => {
e = e || window.event;
e.returnValue = false;
e.preventDefault();
return false;
}, true);
}
}

View File

@ -1,8 +1,9 @@
import {disableKeyAndMenu} from './key-menu';
import {initInterval} from './interval';
import {formatName, getUrlParam} from './util';
import {mergeConfig, config} from './config';
import md5 from './md5';
import './utils/log';
import {disableKeyAndMenu} from './utils/key-menu';
import {initInterval} from './utils/interval';
import {formatName, getUrlParam} from './utils/util';
import {mergeConfig, config} from './utils/config';
import md5 from './utils/md5';
import version from './version';
import {DETECTOR_TYPE, initDetectors} from './detector/detector';

31
src/utils/close-window.js Normal file
View File

@ -0,0 +1,31 @@
/*
* @Author: tackchen
* @Date: 2021-12-24 15:14:06
* @LastEditors: tackchen
* @LastEditTime: 2021-12-24 15:14:25
* @FilePath: /disable-devtool/src/close-window.js
* @Description: Coding something
*/
import {config} from './config';
import {clearDDInterval} from './interval';
export function closeWindow () {
clearDDInterval();
if (config.url) {
window.location.href = config.url;
} else {
try {
window.opener = null;
window.open('', '_self');
// 需要是由js跳转到这个页面才可以关闭这个页面
window.close();
window.history.back();
} catch (e) {
console.log(e);
}
setTimeout(() => {
// 否则执行跳转到 url
window.location.href = `https://tackchen.gitee.io/404.html?h=${encodeURIComponent(location.host)}`;
}, 500);
}
}

View File

@ -1,4 +1,4 @@
import {closeWindow} from './util';
import {closeWindow} from './close-window';
export const config = {
md5: '',
@ -6,7 +6,7 @@ export const config = {
url: '',
tkName: 'ddtk',
interval: 200,
disableMenu: true, // 该参数ie下无效ie 右键菜单会阻塞线程影响debug延迟计算 禁用右键菜单
disableMenu: true, // 是否禁用右键菜单
stopIntervalTime: 5000, // 在移动端时取消监视的等待时长
clearIntervalWhenDevOpenTrigger: false, // 是否在触发之后停止监控
detectors: 'all',

View File

@ -1,4 +1,5 @@
import {config} from './config';
import {clearLog} from './log';
import {hackAlert, isPC, onPageShowHide} from './util';
let interval = null, timer = null;
@ -15,7 +16,7 @@ export function initInterval () {
interval = window.setInterval(() => {
if (_pause) return;
calls.forEach(fn => {fn(time++);});
console.clear();
clearLog();
}, config.interval);
// stopIntervalTime 之后判断 如果不是pc去掉定时器interval为了优化移动端的性能
// 如果控制面板被打开了该定时器timer会被清除

38
src/utils/key-menu.js Normal file
View File

@ -0,0 +1,38 @@
import {config} from './config';
import {isMacOs} from './util';
export function disableKeyAndMenu () {
// let key1 = 'shiftKey', key2 = 'ctrlKey';
// 'metaKey'; // mac 的 commond
// 'altKey'; // mac 的 option
const KEY = {I: 73, U: 85, S: 83, F12: 123};
const isOpenDevToolKey = isMacOs ?
((e, code) => (e.metaKey && e.altKey && code === KEY.I)) :
((e, code) => (e.ctrlKey && e.shiftKey && code === KEY.I));
const isViewSourceCodeKey = isMacOs ?
((e, code) => (e.metaKey && e.altKey && code === KEY.U) || (e.metaKey && code === KEY.S)) :
((e, code) => (e.ctrlKey && (code === KEY.S || code === KEY.U)));
window.addEventListener('keydown', (e) => {
e = e || window.event;
const keyCode = e.keyCode || e.which;
if (
keyCode === KEY.F12 || // 禁用f12
isOpenDevToolKey(e, keyCode) || // 禁用 ctrl + shift + i
isViewSourceCodeKey(e, keyCode) // 禁用 ctrl + u 和 ctrl + s 查看和保存源码
) {
e.returnValue = false;
e.preventDefault();
return false;
}
}, true);
if (config.disableMenu) {
window.addEventListener('contextmenu', (e) => {
e = e || window.event;
e.returnValue = false;
e.preventDefault();
return false;
}, true);
}
}

24
src/utils/log.js Normal file
View File

@ -0,0 +1,24 @@
/*
* @Author: tackchen
* @Date: 2021-12-24 13:18:23
* @LastEditors: tackchen
* @FilePath: /disable-devtool/src/log.js
* @Description: Coding something
*/
import {isIE} from './util';
const console = window.console || {
log: function () {
return;
}
};
export const log = (() => {
// ie 不支持缓存使用 log等方法
return isIE ? ((...args) => {return console.log(...args);}) : console.log;
})();
export const clearLog = (() => {
// ie 不支持缓存使用 log等方法
return isIE ? (() => {return console.clear();}) : console.clear;
})();

View File

@ -1,31 +1,7 @@
import {config} from './config';
import {clearDDInterval} from './interval';
export function isPC () {
return !/(iphone|ipad|ipod|ios|android)/i.test(navigator.userAgent.toLowerCase());
}
export function closeWindow () {
clearDDInterval();
if (config.url) {
window.location.href = config.url;
} else {
try {
window.opener = null;
window.open('', '_self');
// 需要是由js跳转到这个页面才可以关闭这个页面
window.close();
window.history.back();
} catch (e) {
console.log(e);
}
setTimeout(() => {
// 否则执行跳转到 url
window.location.href = `https://tackchen.gitee.io/404.html?h=${encodeURIComponent(location.host)}`;
}, 500);
}
}
export function getNowTime () {
return new Date().getTime();
}
@ -107,28 +83,24 @@ export function hackAlert (before, after) {
window.prompt = mod(_prompt);
}
export function isQQBrowser () {
return hasUaName('qqbrowser');
}
export function isFirefox () {
return hasUaName('firefox');
}
export function isMacOs () {
return hasUaName('macintosh');
}
function hasUaName (name) {
return navigator.userAgent.toLocaleLowerCase().indexOf(name) !== -1;
}
export function isInIframe () {
export const isInIframe = (() => {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
}
})();
export const log = console.log;
export const isQQBrowser = hasUaName('qqbrowser');
export const isFirefox = hasUaName('firefox');
export const isMacOs = hasUaName('macintosh');
export const isOldEdge = hasUaName('edge') && !hasUaName('chrome');
export const isIE = isOldEdge || hasUaName('trident') || hasUaName('msie');

View File

@ -1 +1 @@
export default '0.1.11';
export default '0.1.12';